]>
Commit | Line | Data |
---|---|---|
8296a418 | 1 | |
2 | /* | |
3 | This test macro to test AliTracker functionality. | |
4 | Additional focus on the tracking of cosmic tracks . | |
5 | ||
6 | Test: | |
7 | 1. Simulate random tracks - AliTracker used to propagate track | |
8 | 2. Missalign and smear space points | |
9 | 3. Fit the tracks | |
10 | ||
11 | 4. Visualize results/residual/pulls using tree draw | |
12 | ||
13 | The input MC paramters are stored together with reconstructed output in the tree. | |
14 | ||
15 | ||
16 | Usage: | |
17 | .L AliTrackerTest.C+g | |
18 | AliTrackerTest(10000) | |
19 | TFile f("fit.root"); | |
20 | ||
21 | Make a simple plots: | |
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)","") | |
26 | // | |
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)","") | |
31 | ||
32 | // | |
33 | // | |
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"); | |
36 | //"standart track | |
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"); | |
40 | hisSPt->FitSlicesY(); | |
41 | his0Pt->FitSlicesY(); | |
42 | his2Pt->FitSlicesY(); | |
43 | ||
44 | */ | |
45 | ||
46 | //ROOT includes | |
47 | #include <iostream> | |
48 | #include "TRandom.h" | |
49 | #include "TRandom3.h" | |
50 | #include "TNtuple.h" | |
51 | #include "TStopwatch.h" | |
52 | #include "TDatabasePDG.h" | |
53 | #include "TMath.h" | |
54 | #include "TGeoManager.h" | |
55 | #include "TClonesArray.h" | |
56 | #include "TTree.h" | |
57 | #include "TFile.h" | |
58 | //AliRoot includes | |
59 | #include "AliGeomManager.h" | |
60 | #include "AliMagF.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" | |
67 | ||
68 | // | |
69 | // | |
70 | #include "refitTrack.C" | |
71 | ||
72 | void TestRotateMI(AliExternalTrackParam *paramIn, TTreeSRedirector *pcstream); | |
73 | ||
74 | ||
75 | Int_t simulateCosmicTrack(AliExternalTrackParam ¶mU, AliExternalTrackParam ¶mD, | |
76 | AliTrackPointArray &pointsU, AliTrackPointArray &pointsD, | |
77 | AliTrackPointArray &pointsF){ | |
78 | // | |
79 | // Toy - Simulate cosmic muon track | |
80 | // space points genearted with the step 1 cm - at given radius | |
81 | // | |
82 | // Return value - number of points | |
83 | // paramU - parameters at the beginning of track | |
84 | // paramD - parameters at the end of track | |
85 | // pointsU - points in upper half of | |
86 | // pointsD - points in lower part | |
87 | // pointsF - all points along trajectory | |
88 | // | |
89 | Double_t rTPC1=250; | |
90 | Double_t rTPC0=80; | |
91 | Double_t kMuon = TDatabasePDG::Instance()->GetParticle("mu+")->Mass(); | |
92 | Double_t kMaxSnp = 0.85; | |
93 | Double_t xyz[3]={0,0,0}; | |
94 | Double_t xyzdw[3]={0,0,0}; | |
95 | Double_t pxyzup[3]={0,0,0}; | |
96 | Double_t pxyzdw[3]={0,0,0}; | |
97 | Double_t pxyz[3]={0,0,0}; | |
98 | Double_t cv[21]; | |
99 | for (Int_t i=0; i<21; i++) cv[i]=0; | |
100 | Float_t covPoint[6]={0,0,0,0,0,0}; | |
101 | UShort_t volid=0; | |
102 | // | |
103 | static TClonesArray arrup("AliTrackPoint",500); | |
104 | static TClonesArray arrdw("AliTrackPoint",500); | |
105 | static TClonesArray arr("AliTrackPoint",500); | |
106 | if (arrup[0]==0){ | |
107 | // init point arrays | |
108 | for (Int_t i=0;i<500;i++){ | |
109 | new (arrup[i]) AliTrackPoint; | |
110 | new (arrdw[i]) AliTrackPoint; | |
111 | new (arr[i]) AliTrackPoint; | |
112 | } | |
113 | } | |
114 | ||
115 | // | |
116 | xyz[0]=(gRandom->Rndm()-0.5)*250; | |
117 | xyz[1]=250; | |
118 | xyz[2]=(gRandom->Rndm()-0.5)*100; | |
119 | // | |
120 | Double_t pt = gRandom->Exp(8.); | |
121 | if (gRandom->Rndm()>0.3) pt= gRandom->Exp(50.); | |
122 | if (gRandom->Rndm()>0.6) pt= gRandom->Rndm()*400; | |
123 | // Double_t pt = gRandom->Exp(60.); | |
124 | Double_t pz = gRandom->Gaus(0,0.3)*pt; | |
125 | Double_t phi = gRandom->Gaus(0,0.3); | |
126 | pxyz[0] = pt*TMath::Sin(phi); | |
127 | pxyz[1] = pt*TMath::Cos(phi); | |
128 | pxyz[2] = pz; | |
129 | Short_t sign= (gRandom->Rndm()>0.5)? -1:1; | |
130 | // | |
131 | pxyzup[0]=pxyz[0]; | |
132 | pxyzup[1]=pxyz[1]; | |
133 | pxyzup[2]=pxyz[2]; | |
134 | // | |
135 | AliExternalTrackParam lparamU(xyz, pxyzup,cv,sign); | |
136 | Double_t alpha = TMath::ATan2(xyz[1],xyz[0]); | |
137 | lparamU.Rotate(alpha); | |
138 | paramU=lparamU; | |
139 | // | |
140 | // | |
141 | // | |
142 | Double_t txyzup[3]={0,0,0}; | |
143 | Double_t txyzdw[3]={0,0,0}; | |
144 | // | |
145 | Int_t npointsUp=0; | |
146 | AliTrackerBase::PropagateTrackTo(&lparamU,rTPC1,kMuon,3,kTRUE,kMaxSnp); | |
147 | paramU=lparamU; | |
148 | for (Double_t r=rTPC1; r>0; r-=1){ | |
149 | Bool_t status = AliTrackerBase::PropagateTrackTo(&lparamU,r,kMuon,3,kTRUE,kMaxSnp); | |
150 | if (!status) break; | |
151 | if (TMath::Abs(lparamU.GetSnp())>kMaxSnp) break; | |
152 | if (r<rTPC0) continue; | |
153 | lparamU.GetXYZ(txyzup); | |
154 | new (arrup[npointsUp]) AliTrackPoint(txyzup[0],txyzup[1],txyzup[2],covPoint,volid,0.,0.,0.,0); | |
155 | npointsUp++; | |
156 | } | |
157 | // | |
158 | lparamU.GetXYZ(txyzup); | |
159 | Double_t bz=AliTrackerBase::GetBz(txyzup); | |
160 | Double_t maxd=100000; | |
161 | Double_t pvtx[3]={0,0,0}; | |
162 | Double_t sigmavtx[3]={0.01,0.01,3000}; | |
163 | AliESDVertex *vtx= new AliESDVertex(pvtx,sigmavtx,"vertex"); | |
164 | Double_t dz[2]={0,0}; | |
165 | Double_t cvtx[3]={0.0,0.0,0}; | |
166 | lparamU.PropagateToDCA(vtx,bz,maxd,dz,cvtx); | |
167 | // | |
168 | // make step to other side | |
169 | lparamU.PropagateTo(-30,bz); | |
170 | lparamU.GetXYZ(xyzdw); | |
171 | lparamU.GetPxPyPz(pxyzdw); | |
172 | // invert the sign of the momentum | |
173 | pxyzdw[0]=-pxyzdw[0]; | |
174 | pxyzdw[1]=-pxyzdw[1]; | |
175 | pxyzdw[2]=-pxyzdw[2]; | |
176 | Short_t sign2=-sign; | |
177 | AliExternalTrackParam lparamD(xyzdw,pxyzdw,cv,sign2); | |
178 | lparamU.GetXYZ(xyzdw); | |
179 | lparamU.GetPxPyPz(pxyzdw); | |
180 | Double_t alphadw = TMath::ATan2(xyzdw[1],xyzdw[0]); | |
181 | lparamD.Rotate(alphadw);//I have to rotate gobal to local coordenate externalparam | |
182 | Double_t radius0=TMath::Sqrt(xyzdw[1]*xyzdw[1]+xyzdw[0]*xyzdw[0]); | |
183 | Int_t npointsDown=0; | |
184 | for (Double_t r=radius0; r<rTPC1; r+=1){ | |
185 | Bool_t status = AliTrackerBase::PropagateTrackTo(&lparamD,r,kMuon,3,kTRUE,0.99); | |
186 | if (!status) continue; | |
187 | if (TMath::Abs(lparamD.GetSnp())>kMaxSnp) continue; | |
188 | if(r>rTPC0){ | |
189 | lparamD.GetXYZ(txyzdw); | |
190 | new (arrdw[npointsDown]) AliTrackPoint(txyzdw[0],txyzdw[1],txyzdw[2],covPoint,volid,0.,0.,0.,0); | |
191 | npointsDown++; | |
192 | } | |
193 | } | |
194 | // | |
195 | // Fill MC point arrays | |
196 | // | |
197 | Int_t npoints=npointsUp+npointsDown; | |
198 | AliTrackPointArray lpointsF(npoints); | |
199 | AliTrackPointArray lpointsU(npointsUp); | |
200 | AliTrackPointArray lpointsD(npointsDown); | |
201 | for (Int_t i=0; i<npointsUp;i++){ | |
202 | AliTrackPoint *point = (AliTrackPoint*)arrup[i]; | |
203 | lpointsF.AddPoint(i,point); | |
204 | lpointsU.AddPoint(i,point); | |
205 | } | |
206 | // | |
207 | for (Int_t i=0; i<npointsDown;i++){ | |
208 | AliTrackPoint *point = (AliTrackPoint*)arrdw[i]; | |
209 | lpointsF.AddPoint(i+npointsUp,point); | |
210 | lpointsD.AddPoint(i,point); | |
211 | } | |
212 | // export points | |
213 | AliTrackerBase::PropagateTrackTo(&lparamD,rTPC1,kMuon,3,kTRUE,kMaxSnp); | |
214 | paramD=lparamD; | |
215 | // | |
216 | pointsU=lpointsU; | |
217 | pointsD=lpointsD; | |
218 | pointsF=lpointsF; | |
219 | return npoints; | |
220 | } | |
221 | ||
222 | ||
223 | AliTrackPointArray * SmearPoints(AliTrackPointArray &pointArray, Double_t sigmaY, Double_t sigmaZ, Double_t shiftY,Double_t shiftZ){ | |
224 | // | |
225 | // Smear ideal points form the simulation | |
226 | // 1. Smear the input points (in the "local frame") | |
227 | // 2. Assing corresponding covariance matrix | |
228 | // 3. Add systematic shift - shift y and shift z | |
229 | ||
230 | Int_t npoints=pointArray.GetNPoints(); | |
231 | AliTrackPointArray *outputArray = new AliTrackPointArray(npoints); | |
232 | Double_t xyz[3]={0,0,0}; | |
233 | Float_t covPoint[6]={0,0,0, sigmaY*sigmaY,0,sigmaZ*sigmaZ}; //covaraince at the local frame | |
234 | // | |
235 | // | |
236 | for (Int_t ipoint=0; ipoint<npoints; ipoint++){ | |
237 | AliTrackPoint pointIn; | |
238 | pointArray.GetPoint(pointIn,ipoint); | |
239 | Double_t alpha = TMath::ATan2(pointIn.GetY(),pointIn.GetX()); | |
240 | AliTrackPoint pr = pointIn.Rotate(alpha); | |
241 | xyz[0]=pr.GetX(); //local x | |
242 | xyz[1]=pr.GetY()+gRandom->Gaus(0,sigmaY); //local y | |
243 | xyz[2]=pr.GetZ()+gRandom->Gaus(0,sigmaZ); //local z | |
244 | if (pointIn.GetY()>0) xyz[1]+=shiftY; | |
245 | if (pointIn.GetY()>0) xyz[2]+=shiftZ; | |
246 | // | |
247 | pr.SetXYZ(xyz[0],xyz[1],xyz[2],covPoint); // set covariance matrix | |
248 | AliTrackPoint pg= pr.Rotate(-alpha); | |
249 | AliTrackPoint prCheck= pg.Rotate(alpha); | |
250 | outputArray->AddPoint(ipoint,&pg); | |
251 | } | |
252 | return outputArray; | |
253 | } | |
254 | ||
255 | ||
256 | ||
257 | AliExternalTrackParam * MakeSeed(AliTrackPointArray &pointArray, Int_t seedDelta){ | |
258 | // | |
259 | // Example: creation of seed | |
260 | // Make seed for array of track points | |
261 | // seedDelta - gap between seeding points | |
262 | // | |
263 | Int_t npoints=pointArray.GetNPoints(); | |
264 | if(npoints<=3) return 0; //not enough points to make a trac | |
265 | if (npoints-2*seedDelta-1<0) return 0; | |
266 | AliTrackPoint point1; | |
267 | AliTrackPoint point2; | |
268 | AliTrackPoint point3; | |
269 | pointArray.GetPoint(point1,npoints-1); | |
270 | pointArray.GetPoint(point2,npoints-seedDelta-1); | |
271 | pointArray.GetPoint(point3,npoints-2*seedDelta-1); | |
272 | // | |
273 | AliExternalTrackParam * trackParam = AliTrackerBase::MakeSeed(point1, point2, point3); | |
274 | return trackParam; | |
275 | } | |
276 | ||
277 | ||
278 | void AliTrackerTest(Int_t ntracks) { | |
279 | // | |
280 | // | |
281 | // | |
282 | TGeoManager::Import("./geometry.root"); | |
283 | AliGeomManager::LoadGeometry("./geometry.root"); | |
284 | AliMagF::BMap_t smag = AliMagF::k5kG; | |
285 | Double_t kMuon = TDatabasePDG::Instance()->GetParticle("mu+")->Mass(); | |
286 | TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., smag)); | |
287 | // | |
288 | ||
289 | TTreeSRedirector *pcstream = new TTreeSRedirector("fit.root"); | |
290 | AliExternalTrackParam paramU; | |
291 | AliExternalTrackParam paramD; | |
292 | AliTrackPointArray pointsU; | |
293 | AliTrackPointArray pointsD; | |
294 | AliTrackPointArray pointsF; | |
295 | ||
296 | for (Int_t i=0;i<ntracks;i++) { | |
297 | if (i%10==0) printf("Track\t%d\n",i); | |
298 | Int_t npoints = simulateCosmicTrack(paramU, paramD, pointsU, pointsD, pointsF); | |
299 | if (npoints<10) continue; | |
300 | // | |
301 | // point for test of seeding - with scaled errors | |
302 | AliTrackPointArray* pointsFS=SmearPoints(pointsF, 0.01,0.01,0,0); | |
303 | AliTrackPointArray* pointsDS=SmearPoints(pointsD, 0.01,0.01,0,0); | |
304 | AliTrackPointArray* pointsUS=SmearPoints(pointsU, 0.01,0.01,0,0); | |
305 | //test of seeding routines | |
306 | AliExternalTrackParam *seedF0 = MakeSeed(*pointsFS,50); | |
307 | AliExternalTrackParam *seedD0 = MakeSeed(*pointsDS,50); | |
308 | AliExternalTrackParam *seedU0 = MakeSeed(*pointsUS,50); | |
309 | // points smeeared according TPC resolution | |
310 | AliTrackPointArray* pointsF0=SmearPoints(pointsF, 0.1,0.1,0,0); | |
311 | AliTrackPointArray* pointsD0=SmearPoints(pointsD, 0.1,0.1,0,0); | |
312 | AliTrackPointArray* pointsU0=SmearPoints(pointsU, 0.1,0.1,0,0); | |
313 | // points smeared according TPCresolution - + systematic shift | |
314 | AliTrackPointArray* pointsF02=SmearPoints(pointsF, 0.1,0.1,0.2,0.2); | |
315 | AliTrackPointArray* pointsD02=SmearPoints(pointsD, 0.1,0.1,0.2,0.2); | |
316 | AliTrackPointArray* pointsU02=SmearPoints(pointsU, 0.1,0.1,0.2,0.2); | |
317 | //test of tracking | |
318 | AliExternalTrackParam *trackF0 = MakeSeed(*pointsF0,10); | |
319 | AliExternalTrackParam *trackD0 = MakeSeed(*pointsD0,10); | |
320 | AliExternalTrackParam *trackU0 = MakeSeed(*pointsU0,10); | |
321 | AliExternalTrackParam *trackF02 = MakeSeed(*pointsF02,10); | |
322 | AliExternalTrackParam *trackD02 = MakeSeed(*pointsD02,10); | |
323 | AliExternalTrackParam *trackU02 = MakeSeed(*pointsU02,10); | |
324 | // | |
325 | // | |
326 | if (!trackF0) continue; | |
327 | if (!trackD0) continue; | |
328 | if (!trackU0) continue; | |
329 | if (!seedF0) continue; | |
330 | if (!seedD0) continue; | |
331 | if (!seedU0) continue; | |
332 | AliTrackerBase::FitTrack(trackF0, pointsF0,kMuon,3); | |
333 | AliTrackerBase::FitTrack(trackU0, pointsU0,kMuon,3); | |
334 | AliTrackerBase::FitTrack(trackD0, pointsD0,kMuon,3); | |
335 | AliTrackerBase::FitTrack(trackF02, pointsF02,kMuon,3); | |
336 | AliTrackerBase::FitTrack(trackD02, pointsD02,kMuon,3); | |
337 | AliTrackerBase::FitTrack(trackU02, pointsU02,kMuon,3); | |
338 | // | |
339 | TestRotateMI(trackF0, pcstream); | |
340 | if (trackF0&&trackD0&&trackU0){ | |
341 | (*pcstream)<<"fit"<< | |
342 | "pointsD.="<<&pointsD<< | |
343 | "pointsD0.="<<pointsD0<< | |
344 | "pointsD02.="<<pointsD02<< | |
345 | // | |
346 | "pointsU.="<<&pointsU<< | |
347 | "pointsU0.="<<pointsU0<< | |
348 | "pointsU02.="<<pointsU02<< | |
349 | // | |
350 | "pointsF.="<<&pointsF<< | |
351 | "pointsF0.="<<pointsF0<< | |
352 | "pointsF02.="<<pointsF02<< | |
353 | // | |
354 | "mcU.="<<¶mU<< //MC track down | |
355 | "mcD.="<<¶mD<< //MC track top | |
356 | // track fit - 0 misalignemnt | |
357 | "seedF0.="<<seedF0<< //full track | |
358 | "seedD0.="<<seedD0<< //down track | |
359 | "seedU0.="<<seedU0<< //up track | |
360 | // | |
361 | "trackF0.="<<trackF0<< //full track | |
362 | "trackD0.="<<trackD0<< //down track | |
363 | "trackU0.="<<trackU0<< //up track | |
364 | // track fit - 0.2 cm misalignemnt | |
365 | "trackF02.="<<trackF02<< //full track | |
366 | "trackD02.="<<trackD02<< //down track | |
367 | "trackU02.="<<trackU02<< //up track | |
368 | "\n"; | |
369 | } | |
370 | } | |
371 | delete pcstream; | |
372 | ||
373 | } | |
374 | ||
375 | void TestRotateMI(AliExternalTrackParam *paramIn, TTreeSRedirector *pcstream){ | |
376 | // | |
377 | // test of rotation function | |
378 | // rotate by 360 degrees | |
379 | // dump the state vector to the tree after each rotation | |
380 | AliExternalTrackParam param(*paramIn); | |
381 | AliExternalTrackParam paramMI(*paramIn); | |
382 | for (Int_t idiv=0; idiv<=18; idiv++){ | |
383 | Double_t alphaRot = paramIn->GetAlpha()+2*TMath::Pi()*idiv/18.; | |
384 | param.Rotate(alphaRot); | |
385 | paramMI.RotateMI(alphaRot); | |
386 | (*pcstream)<<"rotateTest"<< | |
387 | "pIn.="<<paramIn<< | |
388 | "pRot.="<<¶m<< | |
389 | "pRotMI.="<<¶mMI<< | |
390 | "idiv="<<idiv<< | |
391 | "\n"; | |
392 | } | |
393 | /* | |
394 | to check: | |
395 | ||
396 | */ | |
397 | } |