]>
Commit | Line | Data |
---|---|---|
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 ¶m, 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 ¶1, 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 ¶1, 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 | ClassDef(AliTPCcalibAlign,6) | |
210 | }; | |
211 | ||
212 | ||
213 | TLinearFitter* AliTPCcalibAlign::GetFitter12(Int_t s1,Int_t s2) { | |
214 | return static_cast<TLinearFitter*>(fFitterArray12[GetIndex(s1,s2)]); | |
215 | } | |
216 | TLinearFitter* AliTPCcalibAlign::GetFitter9(Int_t s1,Int_t s2) { | |
217 | return static_cast<TLinearFitter*>(fFitterArray9[GetIndex(s1,s2)]); | |
218 | } | |
219 | TLinearFitter* AliTPCcalibAlign::GetFitter6(Int_t s1,Int_t s2) { | |
220 | return static_cast<TLinearFitter*>(fFitterArray6[GetIndex(s1,s2)]); | |
221 | } | |
222 | ||
223 | const TMatrixD * AliTPCcalibAlign::GetTransformation(Int_t s1,Int_t s2, Int_t fitType){ | |
224 | if (fitType==0) return static_cast<TMatrixD*>(fMatrixArray6[GetIndex(s1,s2)]); | |
225 | if (fitType==1) return static_cast<TMatrixD*>(fMatrixArray9[GetIndex(s1,s2)]); | |
226 | if (fitType==2) return static_cast<TMatrixD*>(fMatrixArray12[GetIndex(s1,s2)]); | |
227 | return 0; | |
228 | } | |
229 | ||
230 | ||
231 | ||
232 | #endif |