1 | #ifndef MARS_MReflection |
---|

2 | #define MARS_MReflection |
---|

3 | |
---|

4 | #ifndef ROOT_TRotation |
---|

5 | #include <TRotation.h> |
---|

6 | #endif |
---|

7 | |
---|

8 | class MReflection : public TRotation |
---|

9 | { |
---|

10 | private: |
---|

11 | MReflection(Double_t a, Double_t b, Double_t c, |
---|

12 | Double_t d, Double_t e, Double_t f, |
---|

13 | Double_t g, Double_t h, Double_t i) |
---|

14 | : TRotation(a,b,c,d,e,f,g,h,i) { } |
---|

15 | |
---|

16 | void Init(Double_t x, Double_t y, Double_t z) |
---|

17 | { |
---|

18 | // Normalize components of vector (including factor 2!) |
---|

19 | const Double_t n = -2./(x*x + y*y + z*z); |
---|

20 | |
---|

21 | // Expressed by the focal length |
---|

22 | //const Double_t n = -1./(2*F*F); |
---|

23 | |
---|

24 | // Construct rotation matrix to rotate the photon direction |
---|

25 | // around the axis defined by the normal vector. (This is |
---|

26 | // a simplified version of TVector3::Rotate(double, TVector3&) |
---|

27 | // The minus-sign does the relfection, i.e. flips the |
---|

28 | // direction of the vector. |
---|

29 | static_cast<TRotation&>(*this) = |
---|

30 | MReflection( |
---|

31 | 1+n*x*x, n*y*x, n*z*x, |
---|

32 | n*x*y, 1+n*y*y, n*z*y, |
---|

33 | n*x*z, n*y*z, 1+n*z*z |
---|

34 | ); |
---|

35 | |
---|

36 | // |
---|

37 | // n = ( x / y (UInt_t)-1;/ z ) // Normalenvektor |
---|

38 | // V = ( X / Y / Z ) // Photon to be reflected |
---|

39 | // |
---|

40 | // nV := -2 * ( x*X + y*Y + z*Z ) / ( x*x + y*y + z*z ) |
---|

41 | // |
---|

42 | // V' = nV * vec(n) + vec(V) |
---|

43 | // |
---|

44 | |
---|

45 | // return TVector2(X/Z, Y/Z); |
---|

46 | } |
---|

47 | |
---|

48 | public: |
---|

49 | // Normal vector of the reflecting surface |
---|

50 | MReflection(const TVector3 &v) |
---|

51 | { |
---|

52 | Init(v.X(), v.Y(), v.Z()); |
---|

53 | } |
---|

54 | // Normal vector of the reflecting surface |
---|

55 | MReflection(Double_t x, Double_t y, Double_t z) |
---|

56 | { |
---|

57 | Init(x, y, z); |
---|

58 | } |
---|

59 | |
---|

60 | ClassDef(MReflection, 0) // A TRotation derivative describing the reflection by the normal vector of the surface |
---|

61 | }; |
---|

62 | |
---|

63 | #endif |
---|