| 1 | #ifndef MARS_MMirror
|
|---|
| 2 | #define MARS_MMirror
|
|---|
| 3 |
|
|---|
| 4 | #ifndef ROOT_TRotation
|
|---|
| 5 | #include <TRotation.h>
|
|---|
| 6 | #endif
|
|---|
| 7 |
|
|---|
| 8 | class MQuaternion;
|
|---|
| 9 |
|
|---|
| 10 | class MMirror : public TObject
|
|---|
| 11 | {
|
|---|
| 12 | friend void operator/=(MQuaternion &, const MMirror &);
|
|---|
| 13 | friend void operator*=(MQuaternion &, const MMirror &);
|
|---|
| 14 | friend void operator-=(MQuaternion &, const MMirror &);
|
|---|
| 15 | friend void operator+=(MQuaternion &, const MMirror &);
|
|---|
| 16 |
|
|---|
| 17 | private:
|
|---|
| 18 | TVector3 fPos;
|
|---|
| 19 | TVector3 fNorm; // faster without
|
|---|
| 20 |
|
|---|
| 21 | TRotation fTilt;
|
|---|
| 22 |
|
|---|
| 23 | // ----- Spherical mirror data members -----
|
|---|
| 24 | Double_t fFocalLength;
|
|---|
| 25 | Double_t fSigmaPSF;
|
|---|
| 26 |
|
|---|
| 27 | // MMirror *fNeighbors[964];
|
|---|
| 28 |
|
|---|
| 29 | public:
|
|---|
| 30 | MMirror() : fSigmaPSF(-1)
|
|---|
| 31 | {
|
|---|
| 32 | }
|
|---|
| 33 |
|
|---|
| 34 | // ----- Mirror basic functions -----
|
|---|
| 35 | TVector2 operator-(const MQuaternion &q) const;// { return TVector2(X()-q.X(), Y()-q.Y()); }
|
|---|
| 36 | TVector2 operator-(const MMirror &m) const;// { return TVector2(X()-m.X(), Y()-m.Y()); }
|
|---|
| 37 |
|
|---|
| 38 | void SetSigmaPSF(Double_t psf) { fSigmaPSF = psf; }
|
|---|
| 39 | void SetFocalLength(Double_t f) { fFocalLength = f; }
|
|---|
| 40 | void SetPosition(const TVector3 &v) { fPos = v; }
|
|---|
| 41 | void SetNorm(const TVector3 &n) {
|
|---|
| 42 | fNorm = n;
|
|---|
| 43 |
|
|---|
| 44 | fTilt = TRotation();
|
|---|
| 45 | // Can be simplified?? rotate the mirror along
|
|---|
| 46 | // perpendicular to its normal projected to x/y and z
|
|---|
| 47 | // by its "zenith angle"
|
|---|
| 48 | fTilt.Rotate(-n.Theta(), TVector3(-n.Y(), n.X(), 0));
|
|---|
| 49 | }
|
|---|
| 50 |
|
|---|
| 51 | Double_t X() const { return fPos.X(); }
|
|---|
| 52 | Double_t Y() const { return fPos.Y(); }
|
|---|
| 53 |
|
|---|
| 54 | TVector2 GetPosXY() const { return fPos.XYvector(); }
|
|---|
| 55 | const TVector3 &GetPos() const { return fPos; }
|
|---|
| 56 | const TVector3 &GetNorm() const { return fNorm; }
|
|---|
| 57 |
|
|---|
| 58 | Double_t GetFocalLength() const { return fFocalLength; }
|
|---|
| 59 | Double_t GetSigmaPSF() const { return fSigmaPSF; }
|
|---|
| 60 |
|
|---|
| 61 | Double_t GetDist() const { return fPos.Perp(); }
|
|---|
| 62 |
|
|---|
| 63 | virtual Double_t GetMaxR() const=0;// { return TMath::Max(fMaxRX, fMaxRY); }
|
|---|
| 64 | virtual Double_t GetA() const=0;// { return TMath::Max(fMaxRX, fMaxRY); }
|
|---|
| 65 |
|
|---|
| 66 | TVector3 SimPSF(const TVector3 &n, Double_t F, Double_t psf) const;
|
|---|
| 67 |
|
|---|
| 68 | Bool_t ExecuteMirror(MQuaternion &p, MQuaternion &u) const;
|
|---|
| 69 |
|
|---|
| 70 | // ----- Basic function for parabolic mirror -----
|
|---|
| 71 | Bool_t ExecuteReflection(MQuaternion &p, MQuaternion &u) const;
|
|---|
| 72 |
|
|---|
| 73 | // ----- Mirror specialized functions -----
|
|---|
| 74 |
|
|---|
| 75 | virtual Bool_t HasHit(const MQuaternion &p) const=0;
|
|---|
| 76 | virtual Bool_t CanHit(const MQuaternion &p) const=0;
|
|---|
| 77 |
|
|---|
| 78 | virtual Int_t ReadM(const TObjArray &tok)=0;
|
|---|
| 79 |
|
|---|
| 80 | // TObject
|
|---|
| 81 | void Print(Option_t *o) const;
|
|---|
| 82 |
|
|---|
| 83 | /*
|
|---|
| 84 | Bool_t IsSortable() const { return kTRUE; }
|
|---|
| 85 | Int_t Compare(const TObject *obj) const
|
|---|
| 86 | {
|
|---|
| 87 | MMirror &m = (MMirror&)*obj;
|
|---|
| 88 | return m.fPos.Mag2()<fPos.Mag2();
|
|---|
| 89 | }
|
|---|
| 90 | */
|
|---|
| 91 | ClassDef(MMirror, 1) // Base class to describe a mirror
|
|---|
| 92 | };
|
|---|
| 93 |
|
|---|
| 94 | #endif
|
|---|