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
|
---|