Conversion of survey data into alignable objects implemented
[u/mrichter/AliRoot.git] / TRD / AliTRDalignment.h
1 #ifndef ALITRDALIGNMENT_H
2 #define ALITRDALIGNMENT_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 ////////////////////////////////////////////////////////////////////////////
9 //                                                                        //
10 // AliTRDalignment class is an instrument for reading, writing, and       //
11 // manipulating of the TRD alignment data.                                //
12 // D.Miskowiec, November 2006                                             //
13 //                                                                        //
14 ////////////////////////////////////////////////////////////////////////////
15
16 #include <TObject.h>
17 #include <TRandom.h>
18 #include <TObjString.h>
19
20 #include <AliAlignObj.h>
21
22 class AliTRDalignment : public TObject {
23   
24  public:
25
26   AliTRDalignment();
27   AliTRDalignment(const AliTRDalignment& source);
28   AliTRDalignment& operator=(const AliTRDalignment& source);  
29   AliTRDalignment& operator*=(double fac);  
30   AliTRDalignment& operator+=(const AliTRDalignment& source);  
31   AliTRDalignment& operator-=(const AliTRDalignment& source);  
32   Bool_t operator==(const AliTRDalignment& source) const;  
33   virtual ~AliTRDalignment() {};
34
35   // setting 
36
37   void SetSmZero();                                  // reset to zero supermodule data
38   void SetChZero();                                  // reset to zero chamber data
39   void SetZero() {SetSmZero(); SetChZero();}         // reset to zero both
40   void SetSm(int sm, const double a[6])              {for (int i = 0; i < 6; i++) fSm[sm][i] = a[i];}
41   void SetCh(int ch, const double a[6])              {for (int i = 0; i < 6; i++) fCh[ch][i] = a[i];}
42   void SetSmRandom(double a[6]);                     // generate random gaussians with sigmas a
43   void SetChRandom(double a[6]);                     // generate random gaussians with sigmas a
44   void SetSmFull();                                  // set supermodule data to initial aka full 
45   void SetChFull();                                  // set chamber data to initial aka full 
46   void SetSmResidual();                              // set supermodule data to final aka residual
47   void SetChResidual();                              // set chamber data to final aka residual
48   void SetFull()                                     {SetSmFull(); SetChFull();}
49   void SetResidual()                                 {SetSmResidual(); SetChResidual();}
50   void SetComment(char *s)                           {fComment.SetString(s);} 
51
52   // dumping on screen
53
54   void PrintSm(int sm, FILE *fp = stdout) const;     // print data of a supermodule
55   void PrintCh(int sm, FILE *fp = stdout) const;     // print data of a chamber
56   void PrintSm(FILE *fp = stdout) const              {for (int i = 0; i <  18; i++)  PrintSm(i,fp);}
57   void PrintCh(FILE *fp = stdout) const              {for (int i = 0; i < 540; i++)  PrintCh(i,fp);}
58   void Print(FILE *fp = stdout) const                {PrintSm(fp); PrintCh(fp);                    }
59   void Print(Option_t *) const                       {Print();                                     } 
60
61   // reading-in from file
62
63   void ReadAscii(char *filename);                    // read from ascii file
64   void ReadRoot(char *filename);                     // read from root file
65   void ReadDB(char *filename);                       // read from DB file
66   void ReadDB(char *db, char *path, int run, int version=-1, int subversion=-1);
67   void ReadGeo(char *misaligned);                    // read from misaligned_geometry.root
68   void ReadSurveyReport(char *filename);             // read from survey report
69   void ReadAny(char *filename);                      // read from any kind of file
70
71   // writing on file
72
73   void WriteAscii(char *filename) const;             // store data on ascii file
74   void WriteRoot(char *filename);                    // store data on root file
75   void WriteDB(char *filename, int run0, int run1);  // store data on a local DB-like file
76   void WriteDB(char *db, char *path, int run0, int run1); 
77                                                      // store data on DB file
78   void WriteGeo(char *filename);                     // apply misalignment and store geometry 
79
80   // geometry and symbolic names getters
81
82   // phi-sector number of chamber ch, 0-17
83   int GetSec(int ch) const                           {return ch/30;}
84   // stack number, 0-4
85   int GetSta(int ch) const                           {return ch%30/6;}
86   // plane number, 0-5 
87   int GetPla(int ch) const                           {return ch%30%6;}
88   // module number, 0-89
89   int GetMod(int ch) const                           {return 5*GetSec(ch)+GetSta(ch);                           } 
90   // layer number, 9-14
91   int GetLay(int ch) const                           {return AliAlignObj::kTRD1+GetPla(ch);                     }
92   // volume id
93   UShort_t GetVoi(int ch) const                      {return AliAlignObj::LayerToVolUID(GetLay(ch),GetMod(ch)); }
94   // symbolic name of a supermodule
95   char *GetSmName(int sm) const                      {return Form("TRD/sm%02d",sm);                             }
96   // symbolic name of a chamber
97   char *GetChName(int ch) const                      {return Form("TRD/sm%02d/st%d/pl%d",GetSec(ch),GetSta(ch),GetPla(ch)); }
98
99   // data analysis
100
101   double GetSmRMS(int xyz) const;                    // calculate rms fSm[*][xyz]
102   double GetChRMS(int xyz) const;                    // calculate rms fCh[*][xyz]
103   void   PrintSmRMS() const;                         // print rms of fSm
104   void   PrintChRMS() const;                         // print rms of fCh
105   void   PrintRMS() const                            {PrintSmRMS(); PrintChRMS();}
106
107   double SurveyChi2(int i, double *a);               // compare survey with ideal, return chi2
108   double SurveyChi2(double *a)                       {return SurveyChi2(fIbuffer[0],a);}
109   void   SurveyToAlignment(int i, char *flag);       // determine alignment of supermodule i based on survey
110
111  protected:
112
113   void   ArToNumbers(TClonesArray *ar);              // read ar and fill fSm and fCh
114   void   NumbersToAr(TClonesArray *ar);              // build ar using fSm and fCh data
115   void   LoadIdealGeometry(char *filename);          // load ideal geometry from file
116   void   LoadIdealGeometry()                         {LoadIdealGeometry("geometry.root");} 
117
118  protected:
119
120   double     fSm[18][6];                             // supermodule data
121   double     fCh[540][6];                            // chamber data 
122   TObjString fComment;                               // info concerning origin of the data etc.
123   TRandom    fRan;                                   // random generator for fake alignment data
124
125   // Temporary storage for ideal position of the survey points and the survey data.
126   // The survey data are in master frame and in cm. Each supermodule has 8 survey marks. 
127   // The indices are sm number, z-end, radius, phi. 
128   // The ideal positions of survey points are in local frame of supermodule and in cm. 
129   // The indices are z-end, radius, phi. 
130   // The processed survey results are stored in fSm.
131   double fSurveyX[18][2][2][2];                      // supermodule survey point X
132   double fSurveyY[18][2][2][2];                      // supermodule survey point Y
133   double fSurveyZ[18][2][2][2];                      // supermodule survey point Z
134   double fSurveyE[18][2][2][2];                      // supermodule survey point error
135   double fSurveyX0[2][2][2];                         // ideal X position of the survey marks
136   double fSurveyY0[2][2][2];                         // ideal Y position of the survey marks
137   double fSurveyZ0[2][2][2];                         // ideal Z position of the survey marks
138   int    fIbuffer[1000];                             // generic buffer for misc. operations
139   double fDbuffer[1000];                             // generic buffer for misc. operations
140
141   ClassDef(AliTRDalignment,1)    
142
143 };
144     
145 #endif