1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 Origin: Marian Ivanov Marian.Ivanov@cern.ch
18 Not final version yet - fitting using histograms to be implemented
19 Expected to be more robust.
23 TPC Kalman filter implementation for TPC dEdx alignment:
24 The dEdx equalization for 3 types of the pad:
25 Short (0.75 cm) Medium (1 cm) and Long(1.5 cm)
27 Model of correction ci:
28 corrected raw correction
29 dEdxti = dEdxri*ci = dEdxri*p01*(1+p1i*kY+p2i*kZ+p3i*dR+p4i/sqrt(1+kY^2+kZ^2)
31 Matching - update using 2 tracklets ::UpdatedEdxPair
32 dEdxti-dEdxtj=0 = dEdxri*ci-dEdxrj*cj
34 Matching - normalization of the signal ::UpdatedEdx
35 possible only for identified particles
36 dEdxti = dN/dx * sqrt(1+kY^2+kZ^2)
40 #include "TTreeStream.h"
42 #include "TGraphErrors.h"
44 #include "AliTPCROC.h"
45 #include "AliTPCkalmandEdx.h"
48 AliTPCkalmandEdx::AliTPCkalmandEdx():
53 fNpad(3), // number of pad types
54 fNpar(5), // number of parameters
55 fNelem(3*5), // number of elements
60 // Default constructor
64 AliTPCkalmandEdx::AliTPCkalmandEdx(const char* name, const char* title, Int_t sampleSize):
69 fNpad(3), // number of pad types
70 fNpar(5), // number of parameters
71 fNelem(3*5), // number of elements
72 fSampleSize(sampleSize),
76 // Default constructor
81 AliTPCkalmandEdx::AliTPCkalmandEdx(const AliTPCkalmandEdx & kalman):
86 fNpad(kalman.fNpad), // number of pad types
87 fNpar(kalman.fNpar), // number of parameters
88 fNelem(kalman.fNelem), // number of elements
89 fSampleSize(kalman.fSampleSize),
95 fState = new TMatrixD(*(kalman.fState));
96 fCovariance = new TMatrixD(*(kalman.fCovariance));
97 fMat1 = new TMatrixD(*(kalman.fMat1));
100 void AliTPCkalmandEdx::Init(){
102 // Default parameters setting
104 fState = new TMatrixD(fNelem,1);
105 fCovariance = new TMatrixD(fNelem,fNelem);
106 fMat1 = new TMatrixD(fNelem,fNelem);
109 for (Int_t i=0;i<3; i++) {
110 fSample[i].ResizeTo(fSampleSize);
111 fSampleStat[i].ResizeTo(2);
115 TMatrixD &vecXk=*fState;
116 TMatrixD &covXk=*fCovariance;
117 TMatrixD &mat1=*fMat1;
120 for (Int_t i=0;i<fNelem;i++)
121 for(Int_t j=0;j<fNelem;j++) {covXk(i,j)=0; mat1(i,j)=0;}
123 for (Int_t i=0;i<fNelem;i++) {covXk(i,i)=1.; mat1(i,i)=1; vecXk(i,0)=0;}
124 for (Int_t ipad=0;ipad<3;ipad++){
125 vecXk(ipad*fNpar,0)=1;
128 // // set reference ipad=0
129 // vecXk(1*fNpar+0,0)=1;
130 // vecXk(1*fNpar+1,0)=0;
131 // vecXk(1*fNpar+2,0)=0;
132 // vecXk(1*fNpar+3,0)=0;
133 // vecXk(1*fNpar+4,0)=0;
138 void AliTPCkalmandEdx::UpdatedEdxPair(Int_t ip0, Int_t ip1,
139 Double_t dedx0, Double_t dedx1,
140 Double_t s0, Double_t s1,
141 Double_t kY0, Double_t kY1,
142 Double_t kZ0, Double_t kZ1,
143 Double_t dR0, Double_t dR1,
144 TTreeSRedirector *debug){
146 // update relative measurement
147 // 0 = dEdxti-dEdxtj = dEdxri*ci-dEdxrj*cj
149 // Model of correction ci:
150 // dEdxti = dEdxri*ci = dEdxri*p01*(1+p1i*kY+p2i*kZ+p3i*dR+p4i/sqrt(1+kY^2+kZ^2)
151 if (fInit<3) return; // not initialized parameters
152 const Double_t kchi2Cut = 3.*3.;
155 TMatrixD vecXk=*fState; // X vector
156 TMatrixD covXk=*fCovariance; // X covariance
157 TMatrixD &mat1=*fMat1; // update covariance matrix
159 Double_t length0 = TMath::Sqrt(1+kY0*kY0+kZ0*kZ0);
160 Double_t length1 = TMath::Sqrt(1+kY1*kY1+kZ1*kZ1);
162 Double_t corr0 = vecXk(ip0*fNpar,0)*
163 (1+vecXk(ip0*fNpar+1,0)*kY0+
164 vecXk(ip0*fNpar+2,0)*kZ0+vecXk(ip0*fNpar+3,0)*dR0+vecXk(ip0*fNpar+4,0)/length0);
165 Double_t corr1 = vecXk(ip1*fNpar,0)*
166 (1+vecXk(ip1*fNpar+1,0)*kY1+
167 vecXk(ip1*fNpar+2,0)*kZ1+vecXk(ip1*fNpar+3,0)*dR1+vecXk(ip1*fNpar+4,0)/length1);
169 TMatrixD vecZk(nmeas,nmeas);
170 TMatrixD measR(nmeas,nmeas);
171 TMatrixD matHk(nmeas,fNelem); // vector to mesurement
172 TMatrixD vecYk(nmeas,nmeas); // Innovation or measurement residual
173 TMatrixD matHkT(fNelem,nmeas); // helper matrix Hk transpose
174 TMatrixD matSk(nmeas,nmeas); // Innovation (or residual) covariance
175 TMatrixD matKk(fNelem,nmeas); // Optimal Kalman gain
176 TMatrixD covXk2(fNelem,fNelem); // helper matrix
177 TMatrixD covXk3(fNelem,fNelem); // helper matrix
180 vecZk(0,0) =dedx1/dedx0; // dedx ratio
181 measR(0,0) =(s0*s0+s1*s1);
184 for (Int_t iel=0;iel<fNelem;iel++)
185 for (Int_t ip=0;ip<nmeas;ip++) matHk(ip,iel)=0;
188 matHk(0, ip0*fNpar+0) = corr0/(corr1*vecXk(ip0*fNpar+0,0));
189 matHk(0, ip0*fNpar+1) = (vecXk(ip0*fNpar+0,0)*kY0)/corr1;
190 matHk(0, ip0*fNpar+2) = (vecXk(ip0*fNpar+0,0)*kZ0)/corr1;
191 matHk(0, ip0*fNpar+3) = (vecXk(ip0*fNpar+0,0)*dR0)/corr1;
192 matHk(0, ip0*fNpar+4) = (vecXk(ip0*fNpar+0,0)/length0)/corr1;
194 // matHk(0, ip1*fNpar+0) = ;
195 //matHk(0, ip1*fNpar+1) = ;
196 //matHk(0, ip1*fNpar+2) = ;
197 //matHk(0, ip1*fNpar+3) = ;
198 //matHk(0, ip1*fNpar+4) = ;
201 vecYk(0,0) = vecZk(0,0)- corr0/corr1; // Innovation or measurement residual
202 matHkT=matHk.T(); matHk.T();
203 matSk = (matHk*(covXk*matHkT))+measR; // Innovation (or residual) covariance
205 matKk = (covXk*matHkT)*matSk; // Optimal Kalman gain
206 vecXk += matKk*vecYk; // updated vector
207 covXk2= (mat1-(matKk*matHk));
208 covXk3 = covXk2*covXk;
210 Double_t chi2 = vecYk(0,0)* vecYk(0,0)*matSk(0,0);
214 if (debug){ // dump debug info
216 sprintf(chname,"updatePair_%s",GetName());
234 "length0="<<length0<<
235 "length1="<<length1<<
240 "matHkT.="<<&matHkT<<
243 "covXk2.="<<&covXk2<<
245 "cov.="<<fCovariance<<
251 // (*fCovariance)=covXk;
255 printf("chi2=%f\n",chi2);
259 void AliTPCkalmandEdx::UpdatedEdx(Int_t ip0,
266 TTreeSRedirector *debug){
268 // update relative measurement
269 // dEdx = dEdxti = dEdxri*ci
271 // Model of correction ci:
272 // dEdxti = dEdxri*ci = dEdxri*p0i*(1+p1i*kY+p2i*kZ+p3i*dR+p4i/sqrt(1+kY^2+kZ^2)
273 const Double_t kchi2Cut = 3.*3.;
274 // removing of "big outliers
275 if (fInit<3) return AdddEdx(ip0,dedx0,dedxRef);
276 if (TMath::Abs(dedxRef/dedx0-fSampleStat[ip0][0])>4*fSampleStat[ip0][1]) return;
280 TMatrixD vecXk=*fState; // X vector
281 TMatrixD covXk=*fCovariance; // X covariance
282 TMatrixD &mat1=*fMat1; // update covariance matrix
284 Double_t length0 = TMath::Sqrt(1+kY0*kY0+kZ0*kZ0);
286 Double_t corr0 = vecXk(ip0*fNpar,0)*
287 (1+vecXk(ip0*fNpar+1,0)*kY0+
288 vecXk(ip0*fNpar+2,0)*kZ0+vecXk(ip0*fNpar+3,0)*dR0+vecXk(ip0*fNpar+4,0)/length0);
292 TMatrixD vecZk(nmeas,nmeas);
293 TMatrixD measR(nmeas,nmeas);
294 TMatrixD matHk(nmeas,fNelem); // vector to mesurement
295 TMatrixD vecYk(nmeas,nmeas); // Innovation or measurement residual
296 TMatrixD matHkT(fNelem,nmeas); // helper matrix Hk transpose
297 TMatrixD matSk(nmeas,nmeas); // Innovation (or residual) covariance
298 TMatrixD matKk(fNelem,nmeas); // Optimal Kalman gain
299 TMatrixD covXk2(fNelem,fNelem); // helper matrix
300 TMatrixD covXk3(fNelem,fNelem); // helper matrix
302 vecZk(0,0) =dedxRef/dedx0;
303 measR(0,0) =s0*s0*dedxRef*dedxRef/(dedx0*dedx0);
306 for (Int_t iel=0;iel<fNelem;iel++)
307 for (Int_t ip=0;ip<nmeas;ip++) matHk(ip,iel)=0;
311 matHk(0, ip0*fNpar+0) = corr0/vecXk(ip0*fNpar,0);
312 matHk(0, ip0*fNpar+1) = kY0*vecXk(ip0*fNpar,0);
313 matHk(0, ip0*fNpar+2) = kZ0*vecXk(ip0*fNpar,0);
314 matHk(0, ip0*fNpar+3) = dR0*vecXk(ip0*fNpar,0);
315 matHk(0, ip0*fNpar+4) = vecXk(ip0*fNpar,0)/length0;
318 vecYk(0,0) = vecZk(0,0)-corr0; // Innovation or measurement residual
319 matHkT=matHk.T(); matHk.T();
320 matSk = (matHk*(covXk*matHkT))+measR; // Innovation (or residual) covariance
322 matKk = (covXk*matHkT)*matSk; // Optimal Kalman gain
323 vecXk += matKk*vecYk; // updated vector
324 covXk2= (mat1-(matKk*matHk));
325 covXk3 = covXk2*covXk;
327 Double_t chi2 = vecYk(0,0)*vecYk(0,0)*matSk(0,0);
331 if (debug){ // dump debug info
333 sprintf(chname,"update_%s",GetName());
338 "dedxRef="<<dedxRef<<
346 "length0="<<length0<<
351 "matHkT.="<<&matHkT<<
354 "covXk2.="<<&covXk2<<
356 "cov.="<<fCovariance<<
362 (*fCovariance)=covXk;
365 printf("chi2=%f\n",chi2);
369 void AliTPCkalmandEdx::AdddEdx(Int_t ip0,Double_t dedx0, Double_t dedxRef){
373 if (fCounter[ip0]>=fSampleSize) return;
374 fSample[ip0][fCounter[ip0]]=dedxRef/dedx0;
376 if (fCounter[ip0]==fSampleSize){
377 fSampleStat[ip0].ResizeTo(2);
378 fSampleStat[ip0][0] = TMath::Median(fSampleSize,fSample[ip0].GetMatrixArray());
379 fSampleStat[ip0][1] = TMath::RMS(fSampleSize,fSample[ip0].GetMatrixArray());
381 (*fState)(ip0*fNpar,0) = fSampleStat[ip0][0];
382 (*fCovariance)(ip0*fNpar,ip0*fNpar) = fSampleStat[ip0][1]*fSampleStat[ip0][1]/fSampleSize;
383 Double_t med2 = fSampleStat[ip0][0]*fSampleStat[ip0][0];
386 (*fCovariance)(ip0*fNpar+1,ip0*fNpar+1)=0.01*med2;
387 (*fCovariance)(ip0*fNpar+2,ip0*fNpar+2)=0.01*med2;
388 (*fCovariance)(ip0*fNpar+3,ip0*fNpar+3)=0.01*med2;
389 (*fCovariance)(ip0*fNpar+4,ip0*fNpar+4)=0.01*med2;