Use event specie to identufy laser events
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibAlign.h
CommitLineData
9318a5b4 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
3326b323 11class TFile;
8b3c60d8 12class TGraphErrors;
3326b323 13class TH1;
1d82fc56 14class THnSparse;
3326b323 15#include <TLinearFitter.h>
16#include <TMatrixDfwd.h>
17class TObjArray;
18class TTree;
19
20#include "AliTPCcalibBase.h"
21class AliExternalComparison;
22class AliExternalTrackParam;
774a5ee9 23class AliTPCPointCorrection;
3326b323 24class AliTPCseed;
9318a5b4 25
e4042305 26class AliTPCcalibAlign:public AliTPCcalibBase {
9318a5b4 27public:
bb6bc8f6 28 enum HistoType {kY=0, kZ =1, kPhi=2, kTheta=3,
29 kYPhi=4, kZTheta=5,
30 kYz=6,kZz=7,kPhiZ=8,kThetaZ=9};
31 enum FitType{ k6=0, k9=1, k12=2};
9318a5b4 32 AliTPCcalibAlign();
e149f26d 33 AliTPCcalibAlign(const Text_t *name, const Text_t *title);
bb6bc8f6 34 AliTPCcalibAlign(const AliTPCcalibAlign &align);
35 //
9318a5b4 36 virtual ~AliTPCcalibAlign();
774a5ee9 37 void Process(AliESDEvent *event);
b842d904 38 virtual void ProcessSeed(AliTPCseed *track);
39 virtual void Process(AliTPCseed */*track*/){ return ;}
7eaa723e 40 virtual void Analyze();
41 virtual void Terminate();
3326b323 42 virtual Long64_t Merge(TCollection* const list);
4de48bc7 43 void ExportTrackPoints(AliESDEvent *event);
7eaa723e 44 //
774a5ee9 45 //
46 void MakeReportDy(TFile *output);
47 void MakeReportDyPhi(TFile *output);
48 //
49 void UpdatePointCorrection(AliTPCPointCorrection * correction);
50 //
51 virtual void EvalFitters(Int_t minPoints=20);
8b3c60d8 52 TH1 * GetHisto(HistoType type, Int_t s1, Int_t s2, Bool_t force=kFALSE);
774a5ee9 53 void MakeTree(const char *fname="alignTree.root", Int_t minPoints=20);
8b3c60d8 54 TGraphErrors * MakeGraph(Int_t sec0, Int_t sec1, Int_t dsec,
55 Int_t i0, Int_t i1, FitType type);
774a5ee9 56 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);
57
e4042305 58 void ProcessTracklets(const AliExternalTrackParam &t1,
59 const AliExternalTrackParam &t2,
967eae0d 60 const AliTPCseed * seed,
e4042305 61 Int_t s1,Int_t s2);
774a5ee9 62
5b7417d2 63 void UpdateClusterDeltaField(const AliTPCseed * seed);
774a5ee9 64 void UpdateAlignSector(const AliTPCseed * seed,Int_t isec);
3326b323 65 Int_t GetIndex(Int_t s1,Int_t s2) const {return 72*s1+s2;}
972cf6f2 66 //
6f387311 67 inline const TMatrixD * GetTransformation(Int_t s1,Int_t s2, Int_t fitType);
68 //
972cf6f2 69 inline TLinearFitter* GetFitter12(Int_t s1,Int_t s2);
70 inline TLinearFitter* GetFitter9(Int_t s1,Int_t s2);
71 inline TLinearFitter* GetFitter6(Int_t s1,Int_t s2);
72 //
9318a5b4 73 Bool_t GetTransformation12(Int_t s1,Int_t s2,TMatrixD &a);
74 Bool_t GetTransformation9(Int_t s1,Int_t s2,TMatrixD &a);
75 Bool_t GetTransformation6(Int_t s1,Int_t s2,TMatrixD &a);
1d82fc56 76 Int_t AcceptTracklet(const AliExternalTrackParam &tp1,
3326b323 77 const AliExternalTrackParam &tp2) const;
774a5ee9 78 Int_t AcceptTracklet(const Double_t *t1,
3326b323 79 const Double_t *t2) const;
6f387311 80
967eae0d 81 void ProcessDiff(const AliExternalTrackParam &t1,
82 const AliExternalTrackParam &t2,
83 const AliTPCseed *seed,
84 Int_t s1,Int_t s2);
6f387311 85 void ProcessAlign(Double_t * t1, Double_t * t2, Int_t s1,Int_t s2);
967eae0d 86
972cf6f2 87// Bool_t GetTransformationCovar12(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
88// Bool_t GetTransformationCovar9(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
89// Bool_t GetTransformationCovar6(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
ae0ac7be 90 void Add(AliTPCcalibAlign * align);
3326b323 91 const Int_t *GetPoints() const {return fPoints;}
92 void Process(AliESDtrack *const track, Int_t runNo=-1){AliTPCcalibBase::Process(track,runNo);};
6f387311 93 TLinearFitter* GetOrMakeFitter12(Int_t s1,Int_t s2);
94 TLinearFitter* GetOrMakeFitter9(Int_t s1,Int_t s2);
95 TLinearFitter* GetOrMakeFitter6(Int_t s1,Int_t s2);
972cf6f2 96 void Process12(const Double_t *t1, const Double_t *t2,
3326b323 97 TLinearFitter *fitter) const;
98 void Process9(const Double_t *const t1, const Double_t *const t2, TLinearFitter *fitter) const;
99 void Process6(const Double_t *const t1, const Double_t *const t2, TLinearFitter *fitter) const;
1d82fc56 100 void ProcessTree(TTree * tree, AliExternalComparison *comp=0);
101 void GlobalAlign6(Int_t minPoints, Float_t sysError, Int_t niter);
102 //
103 // Cluster comparison Part
104 //
6f387311 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();
3326b323 111 void SetInstance(AliTPCcalibAlign* const param){fgInstance = param;}
1d82fc56 112 static void Constrain1Pt(AliExternalTrackParam &t1, const AliExternalTrackParam &t2, Bool_t noField);
113 void SetNoField(Bool_t noField){ fNoField=noField;}
774a5ee9 114
115 //
116 // Kalman fileter for sectors
117 //
118 void MakeSectorKalman();
3326b323 119 void UpdateSectorKalman(Int_t sector, Int_t quadrant0, Int_t quadrant1, TMatrixD *const p0, TMatrixD *const c0, TMatrixD *const p1, TMatrixD *const c1);
774a5ee9 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);
b842d904 133 //
134 //
135 void MakeResidualHistos();
60721370 136 void MakeResidualHistosTracklet();
4486a91f 137 THnSparse * GetClusterDelta(Int_t index) const { return fClusterDelta[index];}
60721370 138 THnSparse * GetTrackletDelta(Int_t index) const { return fTrackletDelta[index];}
774a5ee9 139public:
6f387311 140
774a5ee9 141 void FillHisto(const Double_t *t1,
142 const Double_t *t2,
6f387311 143 Int_t s1,Int_t s2);
5b7417d2 144 void FillHisto(AliExternalTrackParam *tp1,
145 AliExternalTrackParam *tp2,
60721370 146 Int_t s1,Int_t s2);
6f387311 147
3326b323 148protected:
5b7417d2 149 THnSparse *fClusterDelta[2]; //clusters residuals
60721370 150 THnSparse *fTrackletDelta[4]; //track residuals
b842d904 151
bb6bc8f6 152 TObjArray fDphiHistArray; // array of residual histograms phi -kPhi
153 TObjArray fDthetaHistArray; // array of residual histograms theta -kTheta
154 TObjArray fDyHistArray; // array of residual histograms y -kY
155 TObjArray fDzHistArray; // array of residual histograms z -kZ
156 //
157 TObjArray fDyPhiHistArray; // array of residual histograms y -kYPhi
158 TObjArray fDzThetaHistArray; // array of residual histograms z-z -kZTheta
159 //
160 TObjArray fDphiZHistArray; // array of residual histograms phi -kPhiz
161 TObjArray fDthetaZHistArray; // array of residual histograms theta -kThetaz
162 TObjArray fDyZHistArray; // array of residual histograms y -kYz
163 TObjArray fDzZHistArray; // array of residual histograms z -kZz
164 //
165 //
972cf6f2 166 TObjArray fFitterArray12; // array of fitters
167 TObjArray fFitterArray9; // array of fitters
168 TObjArray fFitterArray6; // array of fitters
6f387311 169 //
170 TObjArray fMatrixArray12; // array of transnformtation matrix
171 TObjArray fMatrixArray9; // array of transnformtation matrix
1d82fc56 172 TObjArray fMatrixArray6; // array of transnformtation matrix
173 //
174 //
b842d904 175 //
176 //
1d82fc56 177 TObjArray fCombinedMatrixArray6; // array combeined transformation matrix
178 //
6f387311 179 //
180 Int_t fPoints[72*72]; // number of points in the fitter
774a5ee9 181 Bool_t fNoField; // flag - no field data
182 // refernce x
183 Double_t fXIO; // OROC-IROC boundary
184 Double_t fXmiddle; // center of the TPC sector local X
185 Double_t fXquadrant; // x quadrant
186 //
187 // Kalman filter for sector internal alignemnt
188 //
189 TObjArray fArraySectorIntParam; // array of sector alignment parameters
190 TObjArray fArraySectorIntCovar; // array of sector alignment covariances
191 //
192 // Kalman filter for global alignment
193 //
194 TMatrixD *fSectorParamA; // Kalman parameter for A side
195 TMatrixD *fSectorCovarA; // Kalman covariance for A side
196 TMatrixD *fSectorParamC; // Kalman parameter for A side
197 TMatrixD *fSectorCovarC; // Kalman covariance for A side
4de48bc7 198 //
199 //
200 //
201 Bool_t fUseInnerOuter; // flag- use Inner Outer sector for left righ alignment
202
6f387311 203 static AliTPCcalibAlign* fgInstance; //! Instance of this class (singleton implementation)
774a5ee9 204private:
205 AliTPCcalibAlign& operator=(const AliTPCcalibAlign&);// not implemented
206
5b7417d2 207 ClassDef(AliTPCcalibAlign,6)
9318a5b4 208};
209
972cf6f2 210
211TLinearFitter* AliTPCcalibAlign::GetFitter12(Int_t s1,Int_t s2) {
212 return static_cast<TLinearFitter*>(fFitterArray12[GetIndex(s1,s2)]);
213}
214TLinearFitter* AliTPCcalibAlign::GetFitter9(Int_t s1,Int_t s2) {
215 return static_cast<TLinearFitter*>(fFitterArray9[GetIndex(s1,s2)]);
216}
217TLinearFitter* AliTPCcalibAlign::GetFitter6(Int_t s1,Int_t s2) {
218 return static_cast<TLinearFitter*>(fFitterArray6[GetIndex(s1,s2)]);
219}
220
6f387311 221const TMatrixD * AliTPCcalibAlign::GetTransformation(Int_t s1,Int_t s2, Int_t fitType){
222 if (fitType==0) return static_cast<TMatrixD*>(fMatrixArray6[GetIndex(s1,s2)]);
223 if (fitType==1) return static_cast<TMatrixD*>(fMatrixArray9[GetIndex(s1,s2)]);
224 if (fitType==2) return static_cast<TMatrixD*>(fMatrixArray12[GetIndex(s1,s2)]);
1d82fc56 225 return 0;
6f387311 226}
972cf6f2 227
228
229
9318a5b4 230#endif