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