| 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 | Int_t fShape; // Spherical=0, Parabolic=1
|
|---|
| 28 |
|
|---|
| 29 | // MMirror *fNeighbors[964];
|
|---|
| 30 |
|
|---|
| 31 | public:
|
|---|
| 32 | MMirror() : fSigmaPSF(-1), fShape(0)
|
|---|
| 33 | {
|
|---|
| 34 | }
|
|---|
| 35 |
|
|---|
| 36 | // ----- Mirror basic functions -----
|
|---|
| 37 | TVector2 operator-(const MQuaternion &q) const;// { return TVector2(X()-q.X(), Y()-q.Y()); }
|
|---|
| 38 | TVector2 operator-(const MMirror &m) const;// { return TVector2(X()-m.X(), Y()-m.Y()); }
|
|---|
| 39 |
|
|---|
| 40 | void SetSigmaPSF(Double_t psf) { fSigmaPSF = psf; }
|
|---|
| 41 | void SetFocalLength(Double_t f) { fFocalLength = f; }
|
|---|
| 42 | void SetPosition(const TVector3 &v) { fPos = v; }
|
|---|
| 43 | void SetNorm(const TVector3 &n) {
|
|---|
| 44 | fNorm = n;
|
|---|
| 45 |
|
|---|
| 46 | fTilt = TRotation();
|
|---|
| 47 | // Can be simplified?? rotate the mirror along
|
|---|
| 48 | // perpendicular to its normal projected to x/y and z
|
|---|
| 49 | // by its "zenith angle"
|
|---|
| 50 | fTilt.Rotate(-n.Theta(), TVector3(-n.Y(), n.X(), 0));
|
|---|
| 51 | }
|
|---|
| 52 | void SetShape(Char_t c);
|
|---|
| 53 |
|
|---|
| 54 | void SetZ(Double_t z) { fPos.SetZ(z); }
|
|---|
| 55 |
|
|---|
| 56 | Double_t X() const { return fPos.X(); }
|
|---|
| 57 | Double_t Y() const { return fPos.Y(); }
|
|---|
| 58 | Double_t Z() const { return fPos.Z(); }
|
|---|
| 59 |
|
|---|
| 60 | Double_t Nx() const { return fNorm.X(); }
|
|---|
| 61 | Double_t Ny() const { return fNorm.Y(); }
|
|---|
| 62 | Double_t Nz() const { return fNorm.Z(); }
|
|---|
| 63 |
|
|---|
| 64 | TVector2 GetPosXY() const { return fPos.XYvector(); }
|
|---|
| 65 | const TVector3 &GetPos() const { return fPos; }
|
|---|
| 66 | const TVector3 &GetNorm() const { return fNorm; }
|
|---|
| 67 |
|
|---|
| 68 | Double_t GetFocalLength() const { return fFocalLength; }
|
|---|
| 69 | Double_t GetSigmaPSF() const { return fSigmaPSF; }
|
|---|
| 70 |
|
|---|
| 71 | Double_t GetDist() const { return fPos.Perp(); }
|
|---|
| 72 | Int_t GetShape() const { return fShape; }
|
|---|
| 73 |
|
|---|
| 74 | virtual Double_t GetMaxR() const=0;// { return TMath::Max(fMaxRX, fMaxRY); }
|
|---|
| 75 | virtual Double_t GetA() const=0;// { return TMath::Max(fMaxRX, fMaxRY); }
|
|---|
| 76 |
|
|---|
| 77 | TVector3 SimPSF(const TVector3 &n, Double_t F, Double_t psf) const;
|
|---|
| 78 | TVector3 SimPSF(const TVector3 &n) const
|
|---|
| 79 | {
|
|---|
| 80 | return SimPSF(n, fFocalLength, fSigmaPSF/10); // Convert from mm to cm
|
|---|
| 81 | }
|
|---|
| 82 |
|
|---|
| 83 | Bool_t ExecuteMirror(MQuaternion &p, MQuaternion &u) const;
|
|---|
| 84 |
|
|---|
| 85 | // ----- Basic function for parabolic mirror -----
|
|---|
| 86 | Bool_t ExecuteReflection(MQuaternion &p, MQuaternion &u) const;
|
|---|
| 87 |
|
|---|
| 88 | // ----- Mirror specialized functions -----
|
|---|
| 89 |
|
|---|
| 90 | virtual Bool_t HasHit(const MQuaternion &p) const=0;
|
|---|
| 91 | virtual Bool_t CanHit(const MQuaternion &p) const=0;
|
|---|
| 92 |
|
|---|
| 93 | virtual Int_t ReadM(const TObjArray &tok)=0;
|
|---|
| 94 | virtual void WriteM(std::ostream &out) const=0;
|
|---|
| 95 |
|
|---|
| 96 | // TObject
|
|---|
| 97 | void Print(Option_t *o) const;
|
|---|
| 98 |
|
|---|
| 99 | /*
|
|---|
| 100 | Bool_t IsSortable() const { return kTRUE; }
|
|---|
| 101 | Int_t Compare(const TObject *obj) const
|
|---|
| 102 | {
|
|---|
| 103 | MMirror &m = (MMirror&)*obj;
|
|---|
| 104 | return m.fPos.Mag2()<fPos.Mag2();
|
|---|
| 105 | }
|
|---|
| 106 | */
|
|---|
| 107 | ClassDef(MMirror, 2) // Base class to describe a mirror
|
|---|
| 108 | };
|
|---|
| 109 |
|
|---|
| 110 | #endif
|
|---|