bug fix
[u/mrichter/AliRoot.git] / FMD / AliFMDAlignFaker.h
1 #ifndef ALIFMDALIGNFAKER_H
2 #define ALIFMDALIGNFAKER_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
4  * reserved. 
5  *
6  * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
7  *
8  * See cxx source for full Copyright notice                               
9  */
10 /** @file    AliFMDAlignFaker.h
11     @author  Christian Holm Christensen <cholm@nbi.dk>
12     @date    Sun Mar 26 18:26:39 2006
13     @brief   Make fake alignment 
14 */
15 //____________________________________________________________________
16 //
17 //  Class 
18 //  to 
19 //  make 
20 //  fake 
21 //  alignment
22 //  parameters 
23 //
24 #ifndef ROOT_TTask
25 # include <TTask.h>
26 #endif
27 #ifndef ROOT_TVector3
28 # include <TVector3.h>
29 #endif
30 class TClonesArray;
31 class TString;
32
33 /** @class AliFMDAlignFaker 
34     @brief This task creates fake alignment. 
35     Which alignment, depends on the bit mask passed to the
36     constructor, or added by `AddAlign'.
37
38     The default is to write all alignment parameters to a local
39     storage @c local://cdb which is a directory in the current
40     directory.
41     @ingroup FMD_util
42 */
43 class AliFMDAlignFaker : public TTask
44 {
45 public:
46   /** What to make alignments for */
47   enum EWhat {
48     /** MAke alignment for sensors */
49     kSensors =  1, 
50     /** Make alignment for half-rings */
51     kHalves
52   };
53   enum {
54     /** All types of alignment */
55     kAll             = (1<<kHalves|1<<kSensors)
56   };
57   /** Constructor 
58       @param mask Bit mask of what to make alignments for 
59       @param geo  File to read geometry from, if needed
60       @param loc  Where to store the result */
61   AliFMDAlignFaker(Int_t mask=kAll, 
62                    const char* geo="geometry.root",
63                    const char* loc="");
64   /** Destructor */
65   virtual ~AliFMDAlignFaker() {}
66   /** Add something to make alignment for 
67       @param w Bit of alignment mask */
68   void AddAlign(EWhat w) { SETBIT(fMask, w); }
69   /** Remove something to make alignment for 
70       @param w Bit of alignment mask */
71   void RemoveAlign(EWhat w) { CLRBIT(fMask, w); }
72   /** Set alignment select mask 
73       @param mask Bit mask */
74   void SetAlign(Int_t mask) { fMask = mask; }
75   /** Set the displacement (translation) of sensors.  The displacement
76       is selected random uniformly between the corresponding minimum
77       and maximum. 
78       @param x1 Minimum X displacement (in centimeters)
79       @param y1 Minimum Y displacement (in centimeters)
80       @param z1 Minimum Z displacement (in centimeters)
81       @param x2 Maximum X displacement (in centimeters)
82       @param y2 Maximum Y displacement (in centimeters)
83       @param z2 Maximum Z displacement (in centimeters) */
84   void SetSensorDisplacement(Double_t x1=0,   Double_t y1=0,   Double_t z1=0,
85                              Double_t x2=.01, Double_t y2=.01, Double_t z2=0);
86   /** Set the rotation of sensors.  The displacement is selected
87       random uniformly between the corresponding minimum and maximum.
88       @param x1 Minimum X rotation (in degrees)
89       @param y1 Minimum Y rotation (in degrees)
90       @param z1 Minimum Z rotation (in degrees)
91       @param x2 Maximum X rotation (in degrees)
92       @param y2 Maximum Y rotation (in degrees)
93       @param z2 Maximum Z rotation (in degrees) */
94   void SetSensorRotation(Double_t x1=0,  Double_t y1=0,  Double_t z1=0,
95                          Double_t x2=.5, Double_t y2=.5, Double_t z2=.5);
96   /** Set the displacement (translation) of half-rings.  The
97       displacement is selected random uniformly between the
98       corresponding minimum and maximum.
99       @param x1 Minimum X displacement
100       @param y1 Minimum Y displacement
101       @param z1 Minimum Z displacement
102       @param x2 Maximum X displacement
103       @param y2 Maximum Y displacement
104       @param z2 Maximum Z displacement */
105   void SetHalfDisplacement(Double_t x1=0,   Double_t y1=0,   Double_t z1=0,
106                            Double_t x2=.05, Double_t y2=.05, Double_t z2=.05);
107   /** Set the rotation of half-rings.  The displacement is selected
108       random uniformly between the corresponding minimum and maximum.
109       @param x1 Minimum X rotation (in degrees)
110       @param y1 Minimum Y rotation (in degrees)
111       @param z1 Minimum Z rotation (in degrees)
112       @param x2 Maximum X rotation (in degrees)
113       @param y2 Maximum Y rotation (in degrees)
114       @param z2 Maximum Z rotation (in degrees) */
115   void SetHalfRotation(Double_t x1=0, Double_t y1=0, Double_t z1=0,
116                        Double_t x2=0, Double_t y2=0, Double_t z2=0);
117   /** Set the output file name.  Should be a valid CDB URL.
118       @param file CDB URL */
119   void SetOutput(const char* file) { SetTitle(file); }
120   /** Set the file to read the geometry from. 
121       @param file File name */
122   void SetGeometryFile(const char* file) { SetName(file); }
123   /** Set the comment  */ 
124   void SetComment(const Char_t* comment="dummy data") { fComment = comment; }
125   /** Make the alignment objects. 
126       @param option Not used. */
127   void Exec(Option_t* option="");
128   /** Get the geometry */
129   static Bool_t GetGeometry(Bool_t toCdb=kFALSE, 
130                             const TString& storage=TString());
131 protected:
132   AliFMDAlignFaker(const AliFMDAlignFaker& o) 
133     : TTask(o), 
134       fMask(0), 
135       fSensorTransMin(0,0,0),
136       fSensorTransMax(0,0,0),
137       fSensorRotMin(0,0,0),
138       fSensorRotMax(0,0,0),
139       fHalfTransMin(0,0,0),
140       fHalfTransMax(0,0,0),
141       fHalfRotMin(0,0,0),
142       fHalfRotMax(0,0,0),
143       fRunMin(0), 
144       fRunMax(0),
145       fArray(0),
146       fComment("")
147 {}
148   AliFMDAlignFaker& operator=(const AliFMDAlignFaker&) { return *this; }
149   
150   /** Make the alignment object for a path
151       @param path   Node path.
152       @param volID  Volume identifier 
153       @param transX Translation in X
154       @param transY Translation in Y
155       @param transZ Translation in Z
156       @param rotX   Rotation around X axis
157       @param rotY   Rotation around Y axis
158       @param rotZ   Rotation around Z axis
159       @return @c true on success */
160   Bool_t MakeAlign(const TString& path, Int_t volID, 
161                    Double_t transX, Double_t transY, Double_t transZ,
162                    Double_t rotX, Double_t rotY, Double_t rotZ);
163   /** Align a sensor 
164       @param path of a sensor 
165       @param id Volume id */
166   Bool_t MakeAlignSensor(const TString& path, Int_t id);
167   /** Align a half-ring
168       @param path of a sensor 
169       @param id Volume id */
170   Bool_t MakeAlignHalf(const TString& path, Int_t id);
171   /** Write to CDB */
172   void   WriteToCDB();
173   /** Write to file */
174   void   WriteToFile();
175   Long_t        fMask;            // What to write 
176   TVector3      fSensorTransMin;  // Minimum translations of a sensor
177   TVector3      fSensorTransMax;  // Maximum translations of a sensor
178   TVector3      fSensorRotMin;    // Minimum rotation of a sensor
179   TVector3      fSensorRotMax;    // Maximum rotation of a sensor
180   TVector3      fHalfTransMin;    // Minimum translations of a half-ring
181   TVector3      fHalfTransMax;    // Maximum translations of a half-ring
182   TVector3      fHalfRotMin;      // Minimum rotation of a half-ring    
183   TVector3      fHalfRotMax;      // Maximum rotation of a half-ring 
184   Int_t         fRunMin;          // Run validity start 
185   Int_t         fRunMax;          // Run validity end
186   TClonesArray* fArray;           // Cache
187   TString       fComment;         // Comment on data
188   
189   ClassDef(AliFMDAlignFaker,0)
190 };
191
192 #endif
193 //____________________________________________________________________
194 //
195 // Local Variables:
196 //   mode: C++
197 // End:
198 //
199 // EOF
200 //
201