2 // See http://en.wikipedia.org/wiki/Kalman_filter
6 gSystem->AddIncludePath("-I$ALICE_ROOT/STAT");
7 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
8 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC");
9 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+")
10 gSystem->Load("libSTAT.so");
12 .L $ALICE_ROOT/TPC/CalibMacros/DriftKalman.C++
16 TFile fgoofie("goofieTree.root");
17 TTree *chainTime = (TTree*)fgoofie.Get("drift");
18 chainTime->SetAlias("mcut","abs(areaF/areaN-1.117)<0.1");
19 chainTime->SetAlias("atpcor","(1000*press/(3.329*(tempF)))-1");
20 chainTime->SetAlias("dvdrift","(((vdrift/2.636)-1))");
21 chainTime->SetAlias("trCorr","0");
23 Int_t npoints= chainTime->Draw("time:(dvdrift)-trCorr:(atpcor)","mcut");
24 Double_t *timeV = new Double_t[npoints];
25 Double_t *vdriftV = new Double_t[npoints];
26 Double_t *cPTV = new Double_t[npoints];
27 memcpy(timeV,chainTime->GetV1(),npoints*sizeof(Double_t));
28 memcpy(vdriftV,chainTime->GetV2(),npoints*sizeof(Double_t));
29 memcpy(cPTV,chainTime->GetV3(),npoints*sizeof(Double_t));
31 Double_t rms=0.006, corr;
32 covXk(0,0)=0.01; covXk(1,1)=0.1; covXk(2,2)=0.1; covXk(1,0)=0; covXk(0,1)=0;
33 vecXk(0,0)=0; vecXk(1,0)=1; vecXk(2,0)=0; //initial stat
35 recVDriftSort(npoints,timeV,vdriftV,cPTV,rms,10/(250*24*60*60.),kFALSE);
36 recVDriftSort(npoints,timeV,vdriftV,cPTV,rms,10/(250*24*60*60.),kTRUE);
37 TFile f("realvdrift.root");
38 drift->Draw("vecXk.fElements[1]:time","isOK","")
42 // Real data test usage
45 AliXRDPROOFtoolkit tool;
46 TChain * chainTime = tool.MakeChain("time.txt","timeInfo",0,10200);
51 chainTime->SetAlias("atpcorP","press0/(3.329*(temp0+273.15))-1");
52 chainTime->SetAlias("mcutP","press0>0");
53 chainTime->SetAlias("ncutP","press0<1");
54 chainTime->SetAlias("atpcorG","temp1.fElements[14]/(0.003378*(temp0+273.15))-1");
55 chainTime->SetAlias("mcutG","temp1.fElements[14]>0");
57 chainTime->SetAlias("atpcor","(mcutP*atpcorP+(ncutP)*atpcorG)");
58 chainTime->SetAlias("mcut","temp1.fElements[14]>0");
59 chainTime->SetAlias("dvdrift","(fDz/500)");
61 fitLinear(chainTime, rms,corr);
64 Int_t npoints= chainTime->Draw("time:(dvdrift)-trCorr:(atpcor)","mcut&&abs(fDz-500*driftG)<1");
65 Double_t *timeV = new Double_t[npoints];
66 Double_t *vdriftV = new Double_t[npoints];
67 Double_t *cPTV = new Double_t[npoints];
68 memcpy(timeV,chainTime->GetV1(),npoints*sizeof(Double_t));
69 memcpy(vdriftV,chainTime->GetV2(),npoints*sizeof(Double_t));
70 memcpy(cPTV,chainTime->GetV3(),npoints*sizeof(Double_t));
73 kalmanTime.Init(0,0,-1,0.01,0.01);
75 recVDriftSort(npoints,timeV,vdriftV,cPTV,rms,1/(250*24*60*60.),kFALSE);
76 recVDriftSort(npoints,timeV,vdriftV,cPTV,rms,1/(250*24*60*60.),kTRUE);
78 TFile f("realvdrift.root");
79 drift->Draw("k.fState.fElements[0]:time","isOK","");
84 #include "TTreeStream.h"
88 #include "TStatToolkit.h"
89 #include "AliTPCkalmanTime.h"
94 Double_t floatS = 0.00005; //
95 Double_t floatTP = 0.0005; //
96 Double_t noiseV = 0.3/250.; // cosmic drift precission
99 AliTPCkalmanTime kalmanTime;
102 void recVDrift(Int_t npoints, Double_t *timeV, Double_t *vdriftV, Double_t * cPTV, Double_t noise, Double_t sshift){
104 // chainTime->Draw("time:(dvdrift):(atpcor)","mcut&&abs(((dvdrift))-(atpcor))<0.004");
106 TTreeSRedirector *pcstream = new TTreeSRedirector("realvdrift.root");
109 for (Int_t ipoint=0; ipoint<npoints;ipoint++){
111 if (ipoint==0) kalmanTime.fTime=timeV[ipoint];
112 TMatrixD &vecXk = *(kalmanTime.fState);
113 TMatrixD &covXk = *(kalmanTime.fCovariance);
114 Double_t fdrift = vecXk(0,0)+ cPTV[ipoint]*vecXk(1,0);
115 Double_t ddrift = fdrift-vdriftV[ipoint];
116 Double_t sdrift = TMath::Sqrt(covXk(0,0)+noise*noise);
117 Bool_t isOK = nused<10||TMath::Abs(ddrift)<5*sdrift;
118 kalmanTime.Propagate(timeV[ipoint],sshift);
119 kalmanTime.Update(vdriftV[ipoint],noise,cPTV[ipoint],pcstream);
121 (*pcstream)<<"drift"<<
123 "time="<<timeV[ipoint]<<
126 "cPT="<<cPTV[ipoint]<<
127 "vdrift="<<vdriftV[ipoint]<<
136 void recVDriftSort(Int_t npoints, Double_t *timeV, Double_t *vdriftV, Double_t * cPTV, Double_t noise, Double_t sshift, Bool_t sort){
138 // sort entries before fit
140 Int_t *index = new Int_t[npoints];
141 Double_t *tmpsort = new Double_t[npoints];
142 TMath::Sort(npoints, timeV, index,sort);
144 for (Int_t i=0; i<npoints;i++){
145 tmpsort[i]= timeV[index[i]];
147 for (Int_t i=0; i<npoints;i++){
148 timeV[i] =tmpsort[i];
151 for (Int_t i=0; i<npoints;i++){
152 tmpsort[i]= vdriftV[index[i]];
154 for (Int_t i=0; i<npoints;i++){
155 vdriftV[i] =tmpsort[i];
158 for (Int_t i=0; i<npoints;i++){
159 tmpsort[i]= cPTV[index[i]];
161 for (Int_t i=0; i<npoints;i++){
166 recVDrift(npoints,timeV,vdriftV,cPTV,noise,sshift);
170 void fitLinear(TChain * chainTime, Double_t& rms, Double_t & corr){
172 // Fit globaly - make aliases;
174 TStatToolkit toolkit;
180 fitStr+="(atpcor)++";
181 fitStr+="(trigger==1)++";
182 fitStr+="(trigger==2)++";
183 fitStr+="(trigger==4)++";
184 fitStr+="(trigger==8)++";
186 TString *strvdpt1 = 0;
187 strvdpt1 = toolkit.FitPlane(chainTime,"(dvdrift)",fitStr.Data(),"mcut" , chi2,npoints,fitParam,covMatrix);
188 chainTime->SetAlias("driftG",strvdpt1->Data());
190 strvdpt1 =toolkit.FitPlane(chainTime,"(dvdrift)",fitStr.Data(),"mcut&&abs(fDz-500*driftG)<2" , chi2,npoints,fitParam,covMatrix);
191 chainTime->SetAlias("driftG",strvdpt1->Data());
194 rms = TMath::Sqrt(chi2/npoints);
195 corr = fitParam[1]; // cPT parameter
199 fitStr+="(trigger==1)++";
200 fitStr+="(trigger==2)++";
201 fitStr+="(trigger==4)++";
202 fitStr+="(trigger==8)++";
203 TString fitExpr = "(dvdrift)-";
204 fitExpr+=fitParam[1];
205 fitExpr+="* (atpcor)";
206 TString *strCorr = toolkit.FitPlane(chainTime,fitExpr.Data(),fitStr.Data(),"abs(fDz-500*driftG)<1" , chi2,npoints,fitParam,covMatrix);
207 chainTime->SetAlias("trCorr",strCorr->Data());
211 fitStr+="(atpcor)++";
212 fitStr+="(atpcor)^2++";
213 fitStr+="(trigger==1)++";
214 fitStr+="(trigger==2)++";
215 fitStr+="(trigger==4)++";
216 fitStr+="(trigger==8)++";
217 TString *strvdpt2 = 0;
218 strvdpt2 =toolkit.FitPlane(chainTime,"(dvdrift)",fitStr.Data(),"mcut&&abs(fDz-500*driftG)<2" , chi2,npoints,fitParam,covMatrix);
219 chainTime->SetAlias("driftG2",strvdpt2->Data());