c48d1bf97bf9791478545119193b81b3ae6908ef
[u/mrichter/AliRoot.git] / TPC / Calib / AliTPCcalibAlign.h
1 #ifndef ALITPCCALIBALIGN_H
2 #define ALITPCCALIBALIGN_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               */
6
7 ////
8 ////
9 ////
10
11 class TFile;
12 class TGraphErrors;
13 class TH1;
14 class THnSparse;
15 class THnBase;
16 class THn;
17 #include <TLinearFitter.h>
18 #include <TMatrixDfwd.h>
19 class TObjArray;
20 class TTree;
21
22 #include "AliTPCcalibBase.h"
23 class AliExternalTrackParam;
24 class AliTPCPointCorrection;
25 class AliTPCseed;
26
27 class AliTPCcalibAlign:public AliTPCcalibBase {
28 public:
29   enum HistoType {kY=0, kZ =1, kPhi=2, kTheta=3, 
30                   kYPhi=4, kZTheta=5, 
31                   kYz=6,kZz=7,kPhiZ=8,kThetaZ=9};
32   enum FitType{ k6=0, k9=1, k12=2};
33   AliTPCcalibAlign();
34   AliTPCcalibAlign(const Text_t *name, const Text_t *title);
35   AliTPCcalibAlign(const AliTPCcalibAlign &align);
36   //
37   virtual ~AliTPCcalibAlign();
38   void     Process(AliESDEvent *event);
39   virtual void ProcessSeed(AliTPCseed *track);
40   virtual void Process(AliTPCseed */*track*/){ return ;}
41   virtual void Analyze();
42   virtual void Terminate();  
43   virtual Long64_t Merge(TCollection* const list);
44   void ExportTrackPoints(AliESDEvent *event);
45   //
46   //
47   void MakeReportDy(TFile *output); 
48   void MakeReportDyPhi(TFile *output);
49   //
50   void UpdatePointCorrection(AliTPCPointCorrection * correction);
51   //
52   virtual void EvalFitters(Int_t minPoints=20);
53   TH1 * GetHisto(HistoType type, Int_t s1, Int_t s2, Bool_t force=kFALSE);
54   void  MakeTree(const char *fname="alignTree.root", Int_t minPoints=20);
55   TGraphErrors * MakeGraph(Int_t sec0, Int_t sec1, Int_t dsec, 
56                            Int_t i0, Int_t i1, FitType type); 
57   Int_t  RefitLinear(const AliTPCseed * seed, Int_t isec, Double_t *fitParam, Int_t refSector, TMatrixD &param, TMatrixD&covar, Double_t xRef, Bool_t both=kFALSE);
58   
59   void ProcessTracklets(const AliExternalTrackParam &t1,
60                         const AliExternalTrackParam &t2,
61                         const AliTPCseed * seed,
62                         Int_t s1,Int_t s2);
63   
64   void UpdateClusterDeltaField(const AliTPCseed * seed);
65   void UpdateAlignSector(const AliTPCseed * seed,Int_t isec); 
66   Int_t GetIndex(Int_t s1,Int_t s2) const {return 72*s1+s2;}
67   //
68   inline const TMatrixD     * GetTransformation(Int_t s1,Int_t s2, Int_t fitType);
69   //
70   inline TLinearFitter* GetFitter12(Int_t s1,Int_t s2);
71   inline TLinearFitter* GetFitter9(Int_t s1,Int_t s2);
72   inline TLinearFitter* GetFitter6(Int_t s1,Int_t s2);
73   //
74   Bool_t GetTransformation12(Int_t s1,Int_t s2,TMatrixD &a);
75   Bool_t GetTransformation9(Int_t s1,Int_t s2,TMatrixD &a);
76   Bool_t GetTransformation6(Int_t s1,Int_t s2,TMatrixD &a);
77   Int_t  AcceptTracklet(const AliExternalTrackParam &tp1,
78                         const AliExternalTrackParam &tp2) const;
79   Int_t  AcceptTracklet(const Double_t *t1,
80                         const Double_t *t2) const;
81
82   void ProcessDiff(const AliExternalTrackParam &t1,
83                    const AliExternalTrackParam &t2,
84                    const AliTPCseed *seed,
85                    Int_t s1,Int_t s2);
86   void ProcessAlign(Double_t * t1, Double_t * t2, Int_t s1,Int_t s2);
87
88 //   Bool_t GetTransformationCovar12(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
89 //   Bool_t GetTransformationCovar9(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
90 //   Bool_t GetTransformationCovar6(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
91   void Add(AliTPCcalibAlign * align);
92   const Int_t *GetPoints() const {return fPoints;}
93   void     Process(AliESDtrack *const track, Int_t runNo=-1){AliTPCcalibBase::Process(track,runNo);};
94   TLinearFitter* GetOrMakeFitter12(Int_t s1,Int_t s2);
95   TLinearFitter* GetOrMakeFitter9(Int_t s1,Int_t s2);
96   TLinearFitter* GetOrMakeFitter6(Int_t s1,Int_t s2);
97   void Process12(const Double_t *t1, const Double_t *t2,
98                  TLinearFitter *fitter) const;
99   void Process9(const Double_t *const t1, const Double_t *const t2, TLinearFitter *fitter) const;
100   void Process6(const Double_t *const t1, const Double_t *const t2, TLinearFitter *fitter) const;
101   void GlobalAlign6(Int_t minPoints, Float_t sysError, Int_t niter);
102   //
103   // Cluster comparison Part
104   //
105   //
106   // For visualization and test purposes
107   //
108   Double_t Correct(Int_t type, Int_t value, Int_t s1, Int_t s2, Double_t x, Double_t y, Double_t z, Double_t phi,Double_t theta); 
109   static Double_t SCorrect(Int_t type, Int_t value, Int_t s1, Int_t s2, Double_t x, Double_t y, Double_t z, Double_t phi,Double_t theta){return Instance()->Correct(type,value,s1,s2,x,y,z,phi,theta);}
110   static AliTPCcalibAlign* Instance();
111   void SetInstance(AliTPCcalibAlign* const param){fgInstance = param;}
112   static void Constrain1Pt(AliExternalTrackParam &t1, const AliExternalTrackParam &t2, Bool_t noField);
113   void SetNoField(Bool_t noField){ fNoField=noField;}
114
115   //
116   // Kalman fileter for sectors
117   //
118   void MakeSectorKalman();
119   void UpdateSectorKalman(Int_t sector, Int_t quadrant0, Int_t quadrant1,  TMatrixD *const p0, TMatrixD *const c0, TMatrixD *const p1, TMatrixD *const c1);
120   void UpdateSectorKalman(TMatrixD &par0, TMatrixD &cov0, TMatrixD &para1, TMatrixD &cov1);
121   Double_t GetCorrectionSector(Int_t coord, Int_t sector, Double_t lx, Double_t ly, Double_t lz); 
122   static Double_t SGetCorrectionSector(Int_t coord, Int_t sector, Double_t lx, Double_t ly, Double_t lz); 
123
124   //
125   // Kalman filter for full TPC
126   //
127   void MakeKalman();
128   void UpdateKalman(Int_t sector0, Int_t sector1,  TMatrixD &p0, TMatrixD &c0, TMatrixD &p1, TMatrixD &c1);
129   void UpdateKalman(TMatrixD &par0, TMatrixD &cov0, TMatrixD &para1, TMatrixD &cov1);
130   //
131   //private:
132   static Int_t CheckCovariance(TMatrixD &covar);
133   //
134   //
135   void MakeResidualHistos();
136   void MakeResidualHistosTracklet();
137   THn * GetClusterDelta(Int_t index) const  { return fClusterDelta[index];}
138   THnSparse * GetTrackletDelta(Int_t index) const  { return fTrackletDelta[index];}
139 public:
140   
141   void FillHisto(const Double_t *t1,
142                  const Double_t *t2,
143                  Int_t s1,Int_t s2);
144   void FillHisto(AliExternalTrackParam *tp1,
145                  AliExternalTrackParam *tp2,
146                  Int_t s1,Int_t s2);
147
148   static void SetMergeEntriesCut(Double_t entriesCut){fgkMergeEntriesCut = entriesCut;}
149 protected:
150   THn     *fClusterDelta[2];  //clusters residuals
151   THnSparse     *fTrackletDelta[4]; //track residuals
152
153   TObjArray fDphiHistArray;    // array of residual histograms  phi      -kPhi
154   TObjArray fDthetaHistArray;  // array of residual histograms  theta    -kTheta
155   TObjArray fDyHistArray;      // array of residual histograms  y        -kY
156   TObjArray fDzHistArray;      // array of residual histograms  z        -kZ
157   //
158   TObjArray fDyPhiHistArray;      // array of residual histograms  y     -kYPhi
159   TObjArray fDzThetaHistArray;    // array of residual histograms  z-z   -kZTheta
160   //
161   TObjArray fDphiZHistArray;      // array of residual histograms  phi   -kPhiz
162   TObjArray fDthetaZHistArray;    // array of residual histograms  theta -kThetaz
163   TObjArray fDyZHistArray;        // array of residual histograms  y     -kYz
164   TObjArray fDzZHistArray;        // array of residual histograms  z     -kZz
165   //
166   //
167   TObjArray fFitterArray12;    // array of fitters
168   TObjArray fFitterArray9;     // array of fitters
169   TObjArray fFitterArray6;     // array of fitters
170   //
171   TObjArray fMatrixArray12;    // array of transnformtation matrix
172   TObjArray fMatrixArray9;     // array of transnformtation matrix
173   TObjArray fMatrixArray6;     // array of transnformtation matrix 
174   //
175   //
176   //
177   //
178   TObjArray fCombinedMatrixArray6;      // array  combeined transformation matrix
179   //
180   //
181   Int_t fPoints[72*72];        // number of points in the fitter 
182   Bool_t fNoField;             // flag - no field data
183   // refernce x
184   Double_t fXIO;               // OROC-IROC boundary
185   Double_t fXmiddle;           // center of the TPC sector local X
186   Double_t fXquadrant;         // x quadrant
187   //
188   // Kalman filter for sector internal  alignemnt
189   //
190   TObjArray fArraySectorIntParam; // array of sector alignment parameters
191   TObjArray fArraySectorIntCovar; // array of sector alignment covariances 
192   //
193   // Kalman filter for global alignment
194   //
195   TMatrixD  *fSectorParamA;     // Kalman parameter   for A side
196   TMatrixD  *fSectorCovarA;     // Kalman covariance  for A side 
197   TMatrixD  *fSectorParamC;     // Kalman parameter   for A side
198   TMatrixD  *fSectorCovarC;     // Kalman covariance  for A side 
199   //
200   //
201   //
202   Bool_t    fUseInnerOuter;         // flag- use Inner Outer sector for left righ alignment
203   
204   static AliTPCcalibAlign*   fgInstance; //! Instance of this class (singleton implementation)
205   static Double_t            fgkMergeEntriesCut;  //maximal number of entries for merging  -can be modified via setter
206 private:
207   AliTPCcalibAlign&  operator=(const AliTPCcalibAlign&);// not implemented
208
209   // IMPORTANT: If you change the data members, 
210   // please do not forget to increment the ClassDef and to update the Streamer in AliTPCcalibAlign.cxx
211   ClassDef(AliTPCcalibAlign,7)
212 };
213
214
215 TLinearFitter* AliTPCcalibAlign::GetFitter12(Int_t s1,Int_t s2) {
216   return static_cast<TLinearFitter*>(fFitterArray12[GetIndex(s1,s2)]);
217 }
218 TLinearFitter* AliTPCcalibAlign::GetFitter9(Int_t s1,Int_t s2) {
219   return static_cast<TLinearFitter*>(fFitterArray9[GetIndex(s1,s2)]);
220 }
221 TLinearFitter* AliTPCcalibAlign::GetFitter6(Int_t s1,Int_t s2) {
222   return static_cast<TLinearFitter*>(fFitterArray6[GetIndex(s1,s2)]);
223 }
224
225 const TMatrixD * AliTPCcalibAlign::GetTransformation(Int_t s1,Int_t s2, Int_t fitType){
226   if (fitType==0) return static_cast<TMatrixD*>(fMatrixArray6[GetIndex(s1,s2)]);
227   if (fitType==1) return static_cast<TMatrixD*>(fMatrixArray9[GetIndex(s1,s2)]);
228   if (fitType==2) return static_cast<TMatrixD*>(fMatrixArray12[GetIndex(s1,s2)]);
229   return 0;
230 }
231
232
233
234 #endif