source: branches/Mars_IncreaseNsb/msimreflector/MMirror.h@ 19875

Last change on this file since 19875 was 9947, checked in by tbretz, 14 years ago
Implemented a new mirror type MMirrorHex90 and a possibility to write a file with a relfector definition.
File size: 3.2 KB
Line 
1#ifndef MARS_MMirror
2#define MARS_MMirror
3
4#ifndef ROOT_TRotation
5#include <TRotation.h>
6#endif
7
8class MQuaternion;
9
10class 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
17private:
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
31public:
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
Note: See TracBrowser for help on using the repository browser.