Line data Source code
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 0 : 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 0 : 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 0 : const Int_t *GetPoints() const {return fPoints;}
93 0 : 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 0 : 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 0 : void SetInstance(AliTPCcalibAlign* const param){fgInstance = param;}
112 : static void Constrain1Pt(AliExternalTrackParam &t1, const AliExternalTrackParam &t2, Bool_t noField);
113 0 : 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 0 : THn * GetClusterDelta(Int_t index) const { return fClusterDelta[index];}
138 0 : 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 0 : 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 6 : ClassDef(AliTPCcalibAlign,7)
212 : };
213 :
214 :
215 : TLinearFitter* AliTPCcalibAlign::GetFitter12(Int_t s1,Int_t s2) {
216 0 : return static_cast<TLinearFitter*>(fFitterArray12[GetIndex(s1,s2)]);
217 : }
218 : TLinearFitter* AliTPCcalibAlign::GetFitter9(Int_t s1,Int_t s2) {
219 0 : return static_cast<TLinearFitter*>(fFitterArray9[GetIndex(s1,s2)]);
220 : }
221 : TLinearFitter* AliTPCcalibAlign::GetFitter6(Int_t s1,Int_t s2) {
222 0 : 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 0 : if (fitType==0) return static_cast<TMatrixD*>(fMatrixArray6[GetIndex(s1,s2)]);
227 0 : if (fitType==1) return static_cast<TMatrixD*>(fMatrixArray9[GetIndex(s1,s2)]);
228 0 : if (fitType==2) return static_cast<TMatrixD*>(fMatrixArray12[GetIndex(s1,s2)]);
229 0 : return 0;
230 0 : }
231 :
232 :
233 :
234 : #endif
|