Fix for raw ctp decoding (Marek)
[u/mrichter/AliRoot.git] / STEER / STEER / AliAlignObjParams.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 //-----------------------------------------------------------------
17 //   Implementation of the alignment object class through
18 //   the concrete representation of alignment object class
19 //   AliAlignObjParams derived from the base class AliAlignObj
20 //-----------------------------------------------------------------
21
22 #include "AliAlignObj.h"
23 #include "AliAlignObjParams.h"
24
25 ClassImp(AliAlignObjParams)
26
27 //_____________________________________________________________________________
28 AliAlignObjParams::AliAlignObjParams() : AliAlignObj()
29 {
30   // default constructor
31   //
32   fTranslation[0]=fTranslation[1]=fTranslation[2]=0.;
33   fRotation[0]=fRotation[1]=fRotation[2]=0.;
34 }
35
36 //_____________________________________________________________________________
37 AliAlignObjParams::AliAlignObjParams(const char* symname, UShort_t volUId, Double_t x, Double_t y, Double_t z, Double_t psi, Double_t theta, Double_t phi, Bool_t global) throw (const Char_t *) : AliAlignObj(symname,volUId)
38 {
39   // standard constructor with 3 translation + 3 rotation parameters
40   // If the user explicitly sets the global variable to kFALSE then the
41   // parameters are interpreted as giving the local transformation.
42   // This requires to have a gGeoMenager active instance, otherwise the
43   // constructor will fail (no object created)
44   // 
45   if(global){
46     SetPars(x, y, z, psi, theta, phi);
47   }else{
48     if(!SetLocalPars(x,y,z,psi,theta,phi)) throw "Alignment object creation failed (TGeo instance needed)!\n";
49   }
50 }
51
52 //_____________________________________________________________________________
53 AliAlignObjParams::AliAlignObjParams(const char* symname, UShort_t volUId, TGeoMatrix& m, Bool_t global) throw (const Char_t *) : AliAlignObj(symname,volUId)
54 {
55   // standard constructor with TGeoMatrix
56   // If the user explicitly sets the global variable to kFALSE then the
57   // parameters are interpreted as giving the local transformation.
58   // This requires to have a gGeoMenager active instance, otherwise the
59   // constructor will fail (no object created)
60   //
61
62   if (!SetMatrix(m)) throw "Alignment object creation failed (can't extract roll-pitch-yall angles from the matrix)!\n";
63
64   if (!global) {
65     if (!SetLocalPars(fTranslation[0],fTranslation[1],fTranslation[2],fRotation[0],fRotation[1],fRotation[2])) throw "Alignment object creation failed (TGeo instance needed)!\n";
66   }
67 }
68
69 //_____________________________________________________________________________
70 AliAlignObjParams::AliAlignObjParams(const AliAlignObj& theAlignObj) :
71   AliAlignObj(theAlignObj)
72 {
73   // copy constructor
74   //
75   Double_t tr[3];
76   theAlignObj.GetTranslation(tr);
77   SetTranslation(tr[0],tr[1],tr[2]);
78   Double_t rot[3];
79   if (theAlignObj.GetAngles(rot))
80     SetRotation(rot[0],rot[1],rot[2]);
81   else
82     fRotation[0]=fRotation[1]=fRotation[2]=0.;
83 }
84
85 //_____________________________________________________________________________
86 AliAlignObjParams &AliAlignObjParams::operator =(const AliAlignObj& theAlignObj)
87 {
88   // assignment operator
89   //
90   if(this==&theAlignObj) return *this;
91   ((AliAlignObj *)this)->operator=(theAlignObj);
92
93   Double_t tr[3];
94   theAlignObj.GetTranslation(tr);
95   SetTranslation(tr[0],tr[1],tr[2]);
96   Double_t rot[3];
97   if (theAlignObj.GetAngles(rot))
98     SetRotation(rot[0],rot[1],rot[2]);
99
100   return *this;
101 }
102
103 //_____________________________________________________________________________
104 AliAlignObjParams::~AliAlignObjParams()
105 {
106   // default destructor
107   //
108 }
109
110 //_____________________________________________________________________________
111 void AliAlignObjParams::SetTranslation(const TGeoMatrix& m)
112 {
113   // set the translation parameters extracting them from the matrix
114   // passed as argument
115   // 
116   if(m.IsTranslation()){
117     const Double_t* tr = m.GetTranslation();
118     fTranslation[0]=tr[0];  fTranslation[1]=tr[1]; fTranslation[2]=tr[2];
119   }else{
120     fTranslation[0] = fTranslation[1] = fTranslation[2] = 0.;
121   }
122 }
123
124 //_____________________________________________________________________________
125 Bool_t AliAlignObjParams::SetRotation(const TGeoMatrix& m)
126 {
127   // set the rotation parameters extracting them from the matrix
128   // passed as argument
129   // 
130   if(m.IsRotation()){
131     const Double_t* rot = m.GetRotationMatrix();
132     return MatrixToAngles(rot,fRotation);
133   }else{
134     fRotation[0] = fRotation[1] = fRotation[2] = 0.;
135     return kTRUE;
136   }
137 }
138
139 //_____________________________________________________________________________
140 void AliAlignObjParams::GetMatrix(TGeoHMatrix& m) const
141 {
142   // get the transformation matrix from the data memebers parameters
143   m.SetTranslation(&fTranslation[0]);
144   Double_t rot[9];
145   AnglesToMatrix(fRotation,rot);
146   m.SetRotation(rot);
147 }
148
149 //_____________________________________________________________________________
150 AliAlignObj& AliAlignObjParams::Inverse() const
151 {
152   // Return a temporary "inverse" of the alignment object, that is return
153   // an object with inverted transformation matrix.
154   //
155    static AliAlignObjParams a;
156    a = *this;
157
158    TGeoHMatrix m;
159    GetMatrix(m);
160    a.SetMatrix(m.Inverse());
161
162    return a;
163 }