3 This test macro to test AliTracker functionality.
4 Additional focus on the tracking of cosmic tracks .
7 1. Simulate random tracks - AliTracker used to propagate track
8 2. Missalign and smear space points
11 4. Visualize results/residual/pulls using tree draw
13 The input MC paramters are stored together with reconstructed output in the tree.
22 //Pulls in P3 parameter - tangent lambda
23 fit->Draw("(seedF0.fP[3]-mcU.fP[3])/sqrt(seedF0.fC[9])>>hisSP3(100,-5,5)","")
24 //Pulls of seeding for seed
25 fit->Draw("(seedF0.fP[4]-mcU.fP[4])/sqrt(seedF0.fC[14])>>hisSP4(100,-5,5)","")
27 //Pulls in P3 parameter - tangent lambda
28 fit->Draw("(trackF0.fP[3]-mcU.fP[3])/sqrt(trackF02.fC[9])>>hisP3(100,-5,5)","")
29 //Pulls in P4 parameter
30 fit->Draw("(trackF0.fP[4]-mcU.fP[4])/sqrt(trackF02.fC[14])>>hisP4(100,-5,5)","")
34 // seeding procedure test (errors scaled 0.01 cm)
35 fit->Draw("(seedF0.Pt()-mcD.Pt())/mcD.Pt()^2:mcD.Pt()>>hisSPt(10,0,400,100,-0.005,0.005)","abs(seedF0.fP[4])<3&&abs(pointsU.fNPoints+pointsD.fNPoints)>300","colz");
37 fit->Draw("(trackF0.Pt()-mcU.Pt())/mcU.Pt()^2:mcU.Pt()>>his0Pt(10,0,400,100,-0.005,0.005)","abs(trackF0.fP[4])<3&&abs(pointsU.fNPoints+pointsD.fNPoints)>300","colz");
38 // misaligned track - up down
39 fit->Draw("(trackF02.Pt()-mcU.Pt())/mcU.Pt()^2:mcU.Pt()>>his2Pt(10,0,400,100,-0.005,0.005)","abs(trackF02.fP[4])<3&&abs(pointsU.fNPoints+pointsD.fNPoints)>300","colz");
51 #include "TStopwatch.h"
52 #include "TDatabasePDG.h"
54 #include "TGeoManager.h"
55 #include "TClonesArray.h"
59 #include "AliGeomManager.h"
61 #include "AliESDVertex.h"
62 #include "AliExternalTrackParam.h"
63 #include "TTreeStream.h"
64 #include "AliTrackPointArray.h"
65 #include "AliTrackerBase.h"
66 #include "AliTracker.h"
71 //#include "refitTrack.C"
73 void TestRotateMI(AliExternalTrackParam *paramIn, TTreeSRedirector *pcstream);
74 void AliTrackerBaseUpdateTrack(AliExternalTrackParam &track1, const AliExternalTrackParam &track2);
75 void TestUpdate(AliExternalTrackParam ¶m0, const AliExternalTrackParam ¶m1);
78 Int_t simulateCosmicTrack(AliExternalTrackParam ¶mU, AliExternalTrackParam ¶mD,
79 AliTrackPointArray &pointsU, AliTrackPointArray &pointsD,
80 AliTrackPointArray &pointsF){
82 // Toy - Simulate cosmic muon track
83 // space points genearted with the step 1 cm - at given radius
85 // Return value - number of points
86 // paramU - parameters at the beginning of track
87 // paramD - parameters at the end of track
88 // pointsU - points in upper half of
89 // pointsD - points in lower part
90 // pointsF - all points along trajectory
94 Double_t kMuon = TDatabasePDG::Instance()->GetParticle("mu+")->Mass();
95 Double_t kMaxSnp = 0.85;
96 Double_t xyz[3]={0,0,0};
97 Double_t xyzdw[3]={0,0,0};
98 Double_t pxyzup[3]={0,0,0};
99 Double_t pxyzdw[3]={0,0,0};
100 Double_t pxyz[3]={0,0,0};
102 for (Int_t i=0; i<21; i++) cv[i]=0;
103 Float_t covPoint[6]={0,0,0,0,0,0};
106 static TClonesArray arrup("AliTrackPoint",500);
107 static TClonesArray arrdw("AliTrackPoint",500);
108 static TClonesArray arr("AliTrackPoint",500);
111 for (Int_t i=0;i<500;i++){
112 new (arrup[i]) AliTrackPoint;
113 new (arrdw[i]) AliTrackPoint;
114 new (arr[i]) AliTrackPoint;
119 xyz[0]=(gRandom->Rndm()-0.5)*250;
121 xyz[2]=(gRandom->Rndm()-0.5)*100;
123 Double_t pt = gRandom->Exp(8.);
124 if (gRandom->Rndm()>0.3) pt= gRandom->Exp(50.);
125 if (gRandom->Rndm()>0.6) pt= gRandom->Rndm()*400;
126 // Double_t pt = gRandom->Exp(60.);
127 Double_t pz = gRandom->Gaus(0,0.3)*pt;
128 Double_t phi = gRandom->Gaus(0,0.3);
129 pxyz[0] = pt*TMath::Sin(phi);
130 pxyz[1] = pt*TMath::Cos(phi);
132 Short_t sign= (gRandom->Rndm()>0.5)? -1:1;
138 AliExternalTrackParam lparamU(xyz, pxyzup,cv,sign);
139 Double_t alpha = TMath::ATan2(xyz[1],xyz[0]);
140 lparamU.Rotate(alpha);
145 Double_t txyzup[3]={0,0,0};
146 Double_t txyzdw[3]={0,0,0};
149 AliTrackerBase::PropagateTrackTo(&lparamU,rTPC1,kMuon,3,kTRUE,kMaxSnp);
151 for (Double_t r=rTPC1; r>0; r-=1){
152 Bool_t status = AliTrackerBase::PropagateTrackToBxByBz(&lparamU,r,kMuon,3,kTRUE,kMaxSnp);
154 if (TMath::Abs(lparamU.GetSnp())>kMaxSnp) break;
155 if (r<rTPC0) continue;
156 lparamU.GetXYZ(txyzup);
157 new (arrup[npointsUp]) AliTrackPoint(txyzup[0],txyzup[1],txyzup[2],covPoint,volid,0.,0.,0.,0);
161 lparamU.GetXYZ(txyzup);
162 Double_t bz=AliTrackerBase::GetBz(txyzup);
163 Double_t maxd=100000;
164 Double_t pvtx[3]={0,0,0};
165 Double_t sigmavtx[3]={0.01,0.01,3000};
166 AliESDVertex *vtx= new AliESDVertex(pvtx,sigmavtx,"vertex");
167 Double_t dz[2]={0,0};
168 Double_t cvtx[3]={0.0,0.0,0};
169 lparamU.PropagateToDCA(vtx,bz,maxd,dz,cvtx);
171 // make step to other side
172 lparamU.PropagateTo(-30,bz);
173 lparamU.GetXYZ(xyzdw);
174 lparamU.GetPxPyPz(pxyzdw);
175 // invert the sign of the momentum
176 pxyzdw[0]=-pxyzdw[0];
177 pxyzdw[1]=-pxyzdw[1];
178 pxyzdw[2]=-pxyzdw[2];
180 AliExternalTrackParam lparamD(xyzdw,pxyzdw,cv,sign2);
181 lparamU.GetXYZ(xyzdw);
182 lparamU.GetPxPyPz(pxyzdw);
183 Double_t alphadw = TMath::ATan2(xyzdw[1],xyzdw[0]);
184 lparamD.Rotate(alphadw);//I have to rotate gobal to local coordenate externalparam
185 Double_t radius0=TMath::Sqrt(xyzdw[1]*xyzdw[1]+xyzdw[0]*xyzdw[0]);
187 for (Double_t r=radius0; r<rTPC1; r+=1){
188 Bool_t status = AliTrackerBase::PropagateTrackToBxByBz(&lparamD,r,kMuon,3,kTRUE,0.99);
189 if (!status) continue;
190 if (TMath::Abs(lparamD.GetSnp())>kMaxSnp) continue;
192 lparamD.GetXYZ(txyzdw);
193 new (arrdw[npointsDown]) AliTrackPoint(txyzdw[0],txyzdw[1],txyzdw[2],covPoint,volid,0.,0.,0.,0);
198 // Fill MC point arrays
200 Int_t npoints=npointsUp+npointsDown;
201 AliTrackPointArray lpointsF(npoints);
202 AliTrackPointArray lpointsU(npointsUp);
203 AliTrackPointArray lpointsD(npointsDown);
204 for (Int_t i=0; i<npointsUp;i++){
205 AliTrackPoint *point = (AliTrackPoint*)arrup[i];
206 lpointsF.AddPoint(i,point);
207 lpointsU.AddPoint(i,point);
210 for (Int_t i=0; i<npointsDown;i++){
211 AliTrackPoint *point = (AliTrackPoint*)arrdw[i];
212 lpointsF.AddPoint(i+npointsUp,point);
213 lpointsD.AddPoint(i,point);
216 AliTrackerBase::PropagateTrackToBxByBz(&lparamD,rTPC1,kMuon,3,kTRUE,kMaxSnp);
226 AliTrackPointArray * SmearPoints(AliTrackPointArray &pointArray, Double_t sigmaY, Double_t sigmaZ, Double_t shiftY,Double_t shiftZ){
228 // Smear ideal points form the simulation
229 // 1. Smear the input points (in the "local frame")
230 // 2. Assing corresponding covariance matrix
231 // 3. Add systematic shift - shift y and shift z
233 Int_t npoints=pointArray.GetNPoints();
234 AliTrackPointArray *outputArray = new AliTrackPointArray(npoints);
235 Double_t xyz[3]={0,0,0};
236 Float_t covPoint[6]={0,0,0, sigmaY*sigmaY,0,sigmaZ*sigmaZ}; //covaraince at the local frame
239 for (Int_t ipoint=0; ipoint<npoints; ipoint++){
240 AliTrackPoint pointIn;
241 pointArray.GetPoint(pointIn,ipoint);
242 Double_t alpha = TMath::ATan2(pointIn.GetY(),pointIn.GetX());
243 AliTrackPoint pr = pointIn.Rotate(alpha);
244 xyz[0]=pr.GetX(); //local x
245 xyz[1]=pr.GetY()+gRandom->Gaus(0,sigmaY); //local y
246 xyz[2]=pr.GetZ()+gRandom->Gaus(0,sigmaZ); //local z
247 if (pointIn.GetY()>0) xyz[1]+=shiftY;
248 if (pointIn.GetY()>0) xyz[2]+=shiftZ;
250 pr.SetXYZ(xyz[0],xyz[1],xyz[2],covPoint); // set covariance matrix
251 AliTrackPoint pg= pr.Rotate(-alpha);
252 AliTrackPoint prCheck= pg.Rotate(alpha);
253 outputArray->AddPoint(ipoint,&pg);
260 AliExternalTrackParam * MakeSeed(AliTrackPointArray &pointArray, Int_t seedDelta){
262 // Example: creation of seed
263 // Make seed for array of track points
264 // seedDelta - gap between seeding points
266 Int_t npoints=pointArray.GetNPoints();
267 if(npoints<=3) return 0; //not enough points to make a trac
268 if (npoints-2*seedDelta-1<0) return 0;
269 AliTrackPoint point1;
270 AliTrackPoint point2;
271 AliTrackPoint point3;
272 pointArray.GetPoint(point1,npoints-1);
273 pointArray.GetPoint(point2,npoints-seedDelta-1);
274 pointArray.GetPoint(point3,npoints-2*seedDelta-1);
276 AliExternalTrackParam * trackParam = AliTrackerBase::MakeSeed(point1, point2, point3);
281 void AliTrackerTest(Int_t ntracks) {
285 TGeoManager::Import("./geometry.root");
286 AliGeomManager::LoadGeometry("./geometry.root");
287 AliMagF::BMap_t smag = AliMagF::k5kG;
288 Double_t kMuon = TDatabasePDG::Instance()->GetParticle("mu+")->Mass();
289 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., smag));
292 TTreeSRedirector *pcstream = new TTreeSRedirector("fit.root");
293 AliExternalTrackParam paramU;
294 AliExternalTrackParam paramD;
295 AliTrackPointArray pointsU;
296 AliTrackPointArray pointsD;
297 AliTrackPointArray pointsF;
299 for (Int_t i=0;i<ntracks;i++) {
300 if (i%10==0) printf("Track\t%d\n",i);
301 Int_t npoints = simulateCosmicTrack(paramU, paramD, pointsU, pointsD, pointsF);
302 if (npoints<10) continue;
304 // point for test of seeding - with scaled errors
305 AliTrackPointArray* pointsFS=SmearPoints(pointsF, 0.01,0.01,0,0);
306 AliTrackPointArray* pointsDS=SmearPoints(pointsD, 0.01,0.01,0,0);
307 AliTrackPointArray* pointsUS=SmearPoints(pointsU, 0.01,0.01,0,0);
308 //test of seeding routines
309 AliExternalTrackParam *seedF0 = MakeSeed(*pointsFS,50);
310 AliExternalTrackParam *seedD0 = MakeSeed(*pointsDS,50);
311 AliExternalTrackParam *seedU0 = MakeSeed(*pointsUS,50);
312 // points smeeared according TPC resolution
313 AliTrackPointArray* pointsF0=SmearPoints(pointsF, 0.1,0.1,0,0);
314 AliTrackPointArray* pointsD0=SmearPoints(pointsD, 0.1,0.1,0,0);
315 AliTrackPointArray* pointsU0=SmearPoints(pointsU, 0.1,0.1,0,0);
316 // points smeared according TPCresolution - + systematic shift
317 AliTrackPointArray* pointsF02=SmearPoints(pointsF, 0.1,0.1,0.2,0.2);
318 AliTrackPointArray* pointsD02=SmearPoints(pointsD, 0.1,0.1,0.2,0.2);
319 AliTrackPointArray* pointsU02=SmearPoints(pointsU, 0.1,0.1,0.2,0.2);
321 AliExternalTrackParam *trackF0 = MakeSeed(*pointsF0,10);
322 AliExternalTrackParam *trackD0 = MakeSeed(*pointsD0,10);
323 AliExternalTrackParam *trackU0 = MakeSeed(*pointsU0,10);
324 AliExternalTrackParam *trackF02 = MakeSeed(*pointsF02,10);
325 AliExternalTrackParam *trackD02 = MakeSeed(*pointsD02,10);
326 AliExternalTrackParam *trackU02 = MakeSeed(*pointsU02,10);
329 if (!trackF0) continue;
330 if (!trackD0) continue;
331 if (!trackU0) continue;
332 if (!seedF0) continue;
333 if (!seedD0) continue;
334 if (!seedU0) continue;
335 AliTrackerBase::FitTrack(trackF0, pointsF0,kMuon,3);
336 AliTrackerBase::FitTrack(trackU0, pointsU0,kMuon,3);
337 AliTrackerBase::FitTrack(trackD0, pointsD0,kMuon,3);
338 AliTrackerBase::FitTrack(trackF02, pointsF02,kMuon,3);
339 AliTrackerBase::FitTrack(trackD02, pointsD02,kMuon,3);
340 AliTrackerBase::FitTrack(trackU02, pointsU02,kMuon,3);
342 // test update of 2 track params
343 AliExternalTrackParam utrackU0(*trackU0);
344 TestUpdate(utrackU0,*trackD0);
348 TestRotateMI(trackF0, pcstream);
349 if (trackF0&&trackD0&&trackU0){
351 "pointsD.="<<&pointsD<<
352 "pointsD0.="<<pointsD0<<
353 "pointsD02.="<<pointsD02<<
355 "pointsU.="<<&pointsU<<
356 "pointsU0.="<<pointsU0<<
357 "pointsU02.="<<pointsU02<<
359 "pointsF.="<<&pointsF<<
360 "pointsF0.="<<pointsF0<<
361 "pointsF02.="<<pointsF02<<
363 "mcU.="<<¶mU<< //MC track down
364 "mcD.="<<¶mD<< //MC track top
365 // track fit - 0 misalignemnt
366 "seedF0.="<<seedF0<< //full track
367 "seedD0.="<<seedD0<< //down track
368 "seedU0.="<<seedU0<< //up track
370 "trackF0.="<<trackF0<< //full track
371 "trackD0.="<<trackD0<< //down track
372 "trackU0.="<<trackU0<< //up track
373 "utrackU0.="<<&utrackU0<< //up track - updated
374 // track fit - 0.2 cm misalignemnt
375 "trackF02.="<<trackF02<< //full track
376 "trackD02.="<<trackD02<< //down track
377 "trackU02.="<<trackU02<< //up track
385 void TestRotateMI(AliExternalTrackParam *paramIn, TTreeSRedirector *pcstream){
387 // test of rotation function
388 // rotate by 360 degrees
389 // dump the state vector to the tree after each rotation
390 AliExternalTrackParam param(*paramIn);
391 AliExternalTrackParam paramMI(*paramIn);
392 for (Int_t idiv=0; idiv<=18; idiv++){
393 Double_t alphaRot = paramIn->GetAlpha()+2*TMath::Pi()*idiv/18.;
394 param.Rotate(alphaRot);
395 paramMI.RotateMI(alphaRot);
396 (*pcstream)<<"rotateTest"<<
399 "pRotMI.="<<¶mMI<<
410 void TestUpdate(AliExternalTrackParam ¶m0, const AliExternalTrackParam ¶m1){
412 // Test function of update
414 // fit->Draw("(utrackU0.fP[4]-mcU.fP[4])/sqrt(utrackU0.fC[14])","abs(utrackU0.fP[0]-trackU0.fP[0])<1")
415 // fit->Draw("(trackU0.fP[4]-mcU.fP[4])/sqrt(utrackU0.fC[14])","abs(utrackU0.fP[0]-trackU0.fP[0])<1")
419 Double_t kMuon = TDatabasePDG::Instance()->GetParticle("mu+")->Mass();
420 Double_t kMaxSnp = 0.85;
422 AliExternalTrackParam track1(param1); // make a local copy of param1
423 track1.Rotate(param0.GetAlpha());
424 AliTrackerBase::PropagateTrackToBxByBz(&track1,param0.GetX(),kMuon,3,kFALSE,kMaxSnp);
425 AliTrackerBaseUpdateTrack(param0,track1);
431 void AliTrackerBaseUpdateTrack(AliExternalTrackParam &track1, const AliExternalTrackParam &track2){
433 // Update track 1 with track 2
437 TMatrixD vecXk(5,1); // X vector
438 TMatrixD covXk(5,5); // X covariance
439 TMatrixD matHk(5,5); // vector to mesurement
440 TMatrixD measR(5,5); // measurement error
441 TMatrixD vecZk(5,1); // measurement
443 TMatrixD vecYk(5,1); // Innovation or measurement residual
444 TMatrixD matHkT(5,5);
445 TMatrixD matSk(5,5); // Innovation (or residual) covariance
446 TMatrixD matKk(5,5); // Optimal Kalman gain
447 TMatrixD mat1(5,5); // update covariance matrix
448 TMatrixD covXk2(5,5); //
449 TMatrixD covOut(5,5);
451 Double_t *param1=(Double_t*) track1.GetParameter();
452 Double_t *covar1=(Double_t*) track1.GetCovariance();
453 Double_t *param2=(Double_t*) track2.GetParameter();
454 Double_t *covar2=(Double_t*) track2.GetCovariance();
456 // copy data to the matrix
457 for (Int_t ipar=0; ipar<5; ipar++){
458 for (Int_t jpar=0; jpar<5; jpar++){
459 covXk(ipar,jpar) = covar1[track1.GetIndex(ipar, jpar)];
460 measR(ipar,jpar) = covar2[track2.GetIndex(ipar, jpar)];
464 vecXk(ipar,0) = param1[ipar];
465 vecZk(ipar,0) = param2[ipar];
474 vecYk = vecZk-matHk*vecXk; // Innovation or measurement residual
475 matHkT=matHk.T(); matHk.T();
476 matSk = (matHk*(covXk*matHkT))+measR; // Innovation (or residual) covariance
478 matKk = (covXk*matHkT)*matSk; // Optimal Kalman gain
479 vecXk += matKk*vecYk; // updated vector
480 covXk2 = (mat1-(matKk*matHk));
481 covOut = covXk2*covXk;
485 // copy from matrix to parameters
498 for (Int_t ipar=0; ipar<5; ipar++){
499 param1[ipar]= vecXk(ipar,0) ;
500 for (Int_t jpar=0; jpar<5; jpar++){
501 covar1[track1.GetIndex(ipar, jpar)]=covOut(ipar,jpar);