The present commit corresponds to an important change in the way the
[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 #include <AliGeomManager.h>
20 class AliSurveyObj;
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 SetSm(int sm, const double a[6])              {for (int i = 0; i < 6; i++) fSm[sm][i] = a[i];}
40   void SetCh(int ch, const double a[6])              {for (int i = 0; i < 6; i++) fCh[ch][i] = a[i];}
41   void SetSmRandom(double a[6]);                     // generate random gaussians with sigmas a
42   void SetChRandom(double a[6]);                     // generate random gaussians with sigmas a
43   void SetSmFull();                                  // set supermodule data to initial aka full 
44   void SetChFull();                                  // set chamber data to initial aka full 
45   void SetSmResidual();                              // set supermodule data to final aka residual
46   void SetChResidual();                              // set chamber data to final aka residual
47   void SetZero()                                     {SetSmZero(); SetChZero();}
48   void SetIdeal()                                    {SetZero();}
49   void SetFull()                                     {SetSmFull(); SetChFull();}
50   void SetResidual()                                 {SetSmResidual(); SetChResidual();}
51   void SetComment(char *s)                           {fComment.SetString(s);} 
52
53   // dumping on screen
54
55   void PrintSm(int sm, FILE *fp = stdout) const;     // print data of a supermodule
56   void PrintCh(int ch, FILE *fp = stdout) const;     // print data of a chamber
57   void PrintSm(FILE *fp = stdout) const              {for (int i = 0; i <  18; i++)  PrintSm(i,fp);}
58   void PrintCh(FILE *fp = stdout) const              {for (int i = 0; i < 540; i++)  PrintCh(i,fp);}
59   void Print(FILE *fp = stdout) const                {PrintSm(fp); PrintCh(fp);                    }
60   void Print(Option_t *) const                       {Print();                                     } 
61
62   // reading-in from file
63
64   void ReadAscii(char *filename);                    // read from ascii file
65   void ReadCurrentGeo();                             // read from currently loaded geometry
66   void ReadRoot(char *filename);                     // read from root file
67   void ReadDB(char *filename);                       // read from DB file
68   void ReadDB(char *db, char *path, int run, int version=-1, int subversion=-1);
69   Bool_t DecodeSurveyPointName(TString pna, Int_t &sm, Int_t &iz,Int_t &ir, Int_t &iphi);
70   void ReadSurveyReport(char *filename);             // read from survey report
71   void ReadSurveyReport(AliSurveyObj *so);           // read from survey object 
72   void ReadAny(char *filename);                      // read from any kind of file
73
74   // writing on file
75
76   void WriteAscii(char *filename) const;             // store data on ascii file
77   void WriteRoot(char *filename);                    // store data on root file
78   void WriteDB(char *filename, int run0, int run1);  // store data on a local DB-like file
79   void WriteDB(char *db, char *pa, int r0, int r1);  // store data on DB file
80   void WriteGeo(char *filename);                     // apply misalignment and store geometry 
81
82   // geometry and symbolic names getters
83
84   // phi-sector number of chamber ch, 0-17
85   int GetSec(int ch) const           {return ch/30;}
86   // stack number, 0-4
87   int GetSta(int ch) const           {return ch%30/6;}
88   // plane number, 0-5 
89   int GetPla(int ch) const           {return ch%30%6;}
90   // module number, 0-89
91   int GetMod(int ch) const           {return 5*GetSec(ch)+GetSta(ch);} 
92   // layer number, 9-14
93   int GetLay(int ch) const           {return AliGeomManager::kTRD1+GetPla(ch);}
94   // volume id
95   UShort_t GetVoi(int ch) const      {return AliGeomManager::LayerToVolUID(GetLay(ch),GetMod(ch));}
96   // symbolic name of a supermodule
97   char *GetSmName(int sm) const      {return Form("TRD/sm%02d",sm);}
98   // symbolic name of a chamber
99   char *GetChName(int ch) const      {return Form("TRD/sm%02d/st%d/pl%d",GetSec(ch),GetSta(ch),GetPla(ch));}
100   // index of a supermodule 
101   int GetSmIndex(const char *name)   {for (int i=0; i<18; i++) if (strcmp(name,GetSmName(i))==0) return i; return -1;}
102   // index of a chamber
103   int GetChIndex(const char *name)   {for (int i=0; i<540; i++) if (strcmp(name,GetChName(i))==0) return i; return -1;}
104
105   // data analysis
106
107   double GetSmRMS(int xyz) const;                    // calculate rms fSm[*][xyz]
108   double GetChRMS(int xyz) const;                    // calculate rms fCh[*][xyz]
109   void   PrintSmRMS() const;                         // print rms of fSm
110   void   PrintChRMS() const;                         // print rms of fCh
111   void   PrintRMS() const                            {PrintSmRMS(); PrintChRMS();}
112
113   double SurveyChi2(int i, double *a);               // compare survey with ideal, return chi2
114   double SurveyChi2(double *a)                       {return SurveyChi2(fIbuffer[0],a);}
115   void   SurveyToAlignment(int i, char *flag);       // determine alignment of supermodule i based on survey
116   void   SurveyToAlignment(char *flag)               {for (int i=0; i<18; i++) SurveyToAlignment(i,flag);}
117
118  protected:
119
120   void   ArToNumbers(TClonesArray *ar);              // read ar and fill fSm and fCh
121   void   NumbersToAr(TClonesArray *ar);              // build ar using fSm and fCh data
122   int    IsGeoLoaded();                              // check if geometry is loaded
123
124  protected:
125
126   double     fSm[18][6];                             // supermodule data
127   double     fCh[540][6];                            // chamber data 
128   TObjString fComment;                               // info concerning origin of the data etc.
129   TRandom    fRan;                                   // random generator for fake alignment data
130
131   // Temporary storage for ideal position of the survey points and the survey data.
132   // The survey data are in master frame and in cm. Each supermodule has 8 survey marks. 
133   // The indices are sm number, z-end, radius, phi. 
134   // The ideal positions of survey points are in local frame of supermodule and in cm. 
135   // The indices are z-end, radius, phi. 
136   // The processed survey results are stored in fSm.
137   double fSurveyX[18][2][2][2];                      // supermodule survey point X
138   double fSurveyY[18][2][2][2];                      // supermodule survey point Y
139   double fSurveyZ[18][2][2][2];                      // supermodule survey point Z
140   double fSurveyEX[18][2][2][2];                     // supermodule survey point X error
141   double fSurveyEY[18][2][2][2];                     // supermodule survey point Y error
142   double fSurveyEZ[18][2][2][2];                     // supermodule survey point Z error
143   double fSurveyX0[2][2][2];                         // ideal X position of the survey marks
144   double fSurveyY0[2][2][2];                         // ideal Y position of the survey marks
145   double fSurveyZ0[2][2][2];                         // ideal Z position of the survey marks
146   int    fIbuffer[1000];                             // generic buffer for misc. operations
147   double fDbuffer[1000];                             // generic buffer for misc. operations
148
149   ClassDef(AliTRDalignment,1)    
150
151 };
152     
153 #endif