]>
Commit | Line | Data |
---|---|---|
6419bebb | 1 | // AliTRDonlineTrackletQA implements the standard QA for the TRD |
2 | // on-line tracklets. It reads the tracklets provided by | |
3 | // AliTRDonlineTrackletFilter and analyses them. The QA can be run | |
4 | // on tracklets from simulation or from real data. In addition it is | |
5 | // possible to compare the tracklets from real data to re-simulation | |
6 | // based on the ADC data. | |
7 | ||
b220e595 | 8 | #include "TFile.h" |
9 | #include "TTree.h" | |
10 | #include "TChain.h" | |
11 | #include "TH1F.h" | |
12 | #include "TH2F.h" | |
13 | #include "TProfile.h" | |
14 | #include "TCanvas.h" | |
6911c7f9 | 15 | #include "Math/Factory.h" |
b220e595 | 16 | |
17 | #include "AliAnalysisManager.h" | |
18 | #include "AliESDEvent.h" | |
19 | #include "AliAODEvent.h" | |
20 | #include "AliMCEvent.h" | |
21 | #include "AliESDInputHandler.h" | |
22 | #include "AliAODHandler.h" | |
23 | #include "AliMCEventHandler.h" | |
24 | #include "AliLog.h" | |
25 | #include "AliESDTrdTrack.h" | |
6911c7f9 | 26 | #include "AliESDTrdTracklet.h" |
b220e595 | 27 | #include "AliTRDtrackletMCM.h" |
6911c7f9 | 28 | #include "AliTRDtrackletWord.h" |
29 | #include "AliTRDtrapConfig.h" | |
30 | #include "AliTRDmcmSim.h" | |
31 | #include "AliTRDcalibDB.h" | |
32 | ||
b220e595 | 33 | #include "AliVParticle.h" |
6911c7f9 | 34 | #include "AliMCParticle.h" |
b220e595 | 35 | #include "AliTrackReference.h" |
36 | #include "AliMagF.h" | |
37 | #include "TGeoGlobalMagField.h" | |
b220e595 | 38 | |
39 | #include "AliTRDonlineTrackletQA.h" | |
40 | ||
41 | ClassImp(AliTRDonlineTrackletQA) | |
42 | ||
43 | AliTRDonlineTrackletQA::AliTRDonlineTrackletQA(const char *name) : | |
44 | AliAnalysisTask(name, ""), | |
45 | fESD(0x0), | |
46 | fInputHandler(0x0), | |
47 | fInputEvent(0x0), | |
48 | fOutputAOD(0x0), | |
49 | fMCEvent(0x0), | |
50 | fTrackletsRaw(0x0), | |
6911c7f9 | 51 | fTrackletsSim(0x0), |
b220e595 | 52 | fOutputList(0x0), |
53 | fHistYpos(0x0), | |
54 | fHistYres(0x0), | |
55 | fHistYresDy(0x0), | |
56 | fHistdY(0x0), | |
57 | fHistdYres(0x0), | |
58 | fHistYresESD(0x0), | |
59 | fHistdYresESD(0x0), | |
60 | fHistCanddY(0x0), | |
61 | fHistFounddY(0x0), | |
62 | fHistTrklPerRef(0x0), | |
63 | fHistdYdYref(0x0), | |
64 | fHistYposRaw(0x0), | |
65 | fHistdYRaw(0x0), | |
6911c7f9 | 66 | fHistAlphaRaw(0x0), |
67 | fHistYdYRaw(0x0), | |
b220e595 | 68 | fHistZrow(0x0), |
69 | fHistZrowRaw(0x0), | |
70 | fHistPid(0x0), | |
71 | fHistPidRaw(0x0), | |
6911c7f9 | 72 | fHistPidDiff(0x0), |
b220e595 | 73 | fHistYdiff(0x0), |
74 | fHistdYdiff(0x0), | |
75 | fHistdYdYraw(0x0), | |
6911c7f9 | 76 | fHistFitYres(0x0), |
77 | fHistFitDyresEven(0x0), | |
78 | fHistFitDyresOdd(0x0), | |
79 | fHistNoMatchSim(0x0), | |
80 | fHistNoMatchRaw(0x0), | |
81 | fHistResY(0x0), | |
82 | fHistResZ(0x0), | |
b220e595 | 83 | fTreeTracklets(0x0), |
54d34aac | 84 | fY(0.), |
85 | fDY(0.), | |
86 | fYdiff(0.), | |
87 | fDYdiff(0.), | |
88 | fQ0(0), | |
89 | fQ1(0), | |
90 | fNHits(0), | |
b220e595 | 91 | fMinPt(1.), |
92 | fGeo(new AliTRDgeometry), | |
93 | fNevent(0), | |
6911c7f9 | 94 | fTrackletTree(0x0) |
b220e595 | 95 | { |
96 | // ctor | |
97 | ||
98 | DefineInput(0, TChain::Class()); | |
99 | DefineInput(1, TTree::Class()); | |
100 | ||
6911c7f9 | 101 | DefineOutput(0, TTree::Class()); |
b220e595 | 102 | DefineOutput(1, TList::Class()); |
103 | } | |
104 | ||
105 | AliTRDonlineTrackletQA::~AliTRDonlineTrackletQA() | |
106 | { | |
107 | // dtor | |
108 | ||
109 | delete fGeo; | |
110 | } | |
111 | ||
54d34aac | 112 | void AliTRDonlineTrackletQA::ConnectInputData(const Option_t * /* option */) |
b220e595 | 113 | { |
54d34aac | 114 | // connect input data |
115 | ||
b220e595 | 116 | fInputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler(); |
117 | if (fInputHandler) | |
118 | fInputEvent = fInputHandler->GetEvent(); | |
119 | ||
120 | AliMCEventHandler *mcH = (AliMCEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler(); | |
121 | if (mcH) | |
122 | fMCEvent = mcH->MCEvent(); | |
123 | } | |
124 | ||
125 | void AliTRDonlineTrackletQA::CreateOutputObjects() | |
126 | { | |
54d34aac | 127 | // create output objects |
128 | ||
6911c7f9 | 129 | OpenFile(1); |
130 | ||
b220e595 | 131 | fOutputList = new TList(); |
6911c7f9 | 132 | fOutputList->SetOwner(kTRUE); |
b220e595 | 133 | |
6911c7f9 | 134 | fHistYpos = new TH1F("ypos", |
135 | "Tracklet (sim) y-position;y (cm);count", | |
136 | 8192/32, -4096*160e-4, 4095*160e-4); | |
137 | fHistYposRaw = new TH1F("ypos_raw", | |
138 | "Tracklet (raw) y-position;y (cm);count", | |
b220e595 | 139 | 8192/32, -4096*160e-4, 4095*160e-4); |
6911c7f9 | 140 | fHistYres = new TH1F("yres", |
141 | "Tracklet (sim) #Deltay;y_{tracklet}-y_{MC} (cm);count", | |
b220e595 | 142 | 8192/32, -4096/32*160e-4, 4095/32*160e-4); |
6911c7f9 | 143 | fHistYresDy = new TH2F("yresdy", |
144 | "Tracklet (sim) #Deltay;y_{tracklet}-y_{MC} (cm);deflection (bin)", | |
b220e595 | 145 | 8192/32, -4096/32*160e-4, 4095/32*160e-4, |
146 | 128, -64.5, 63.5); | |
6911c7f9 | 147 | fHistYresESD = new TH1F("yresesd", |
148 | "Tracklet #Deltay;y (cm);count", | |
b220e595 | 149 | 100, -10, 10); |
6911c7f9 | 150 | fHistYdiff = new TH1F("ydiff", |
151 | "Tracklet #Deltay (sim - raw);y_{sim}-y_{raw} (160 #mum);count", | |
152 | 200, -100, 100); | |
b220e595 | 153 | for (Int_t iLayer = 0; iLayer < 6; iLayer++) { |
6911c7f9 | 154 | fHistYlocal[iLayer] = new TH2F(Form("ylocal_%i", iLayer), |
b220e595 | 155 | Form("Tracklet local y, layer %i;y_{MC} (pad width);y_{trkl} (pad width)", iLayer), |
156 | 100, -1, 1, 100, -1, 1); | |
157 | } | |
158 | ||
6911c7f9 | 159 | fHistdY = new TH1F("dy", |
160 | "deflection (sim);dy (140 #mum)", | |
b220e595 | 161 | 128, -64.5, 63.5); |
6911c7f9 | 162 | fHistdYRaw = new TH1F("dy_raw", |
163 | "deflection (raw);dy (140 #mum)", | |
b220e595 | 164 | 128, -64.5, 63.5); |
6911c7f9 | 165 | fHistAlphaRaw = new TH1F("fHistAlphaRaw", |
166 | "angle w.r.t. to straight line", | |
167 | 256, -128.5, 127.5); | |
168 | fHistdYres = new TH1F("dyres", | |
169 | "deflection residual;dy (cm)", | |
b220e595 | 170 | 128, -1., 1.); |
6911c7f9 | 171 | fHistdYresESD = new TH1F("dyresesd", |
172 | "deflection residual;dy (cm)", | |
b220e595 | 173 | 128, -1., 1.); |
6911c7f9 | 174 | fHistCanddY = new TH1F("dycand", |
175 | "deflection;dy (140 #mum)", | |
b220e595 | 176 | 128, -64.5, 63.5); |
6911c7f9 | 177 | fHistFounddY = new TH1F("dyfound", |
178 | "deflection;dy (140 #mum)", | |
b220e595 | 179 | 128, -64.5, 63.5); |
6911c7f9 | 180 | fHistdYdiff = new TH1F("dydiff", |
181 | "deflection #Deltady;dy_{sim}-dy_{raw} (140 #mum)", | |
182 | 100, -2., 2.); | |
183 | fHistdYdYraw = new TH2F("dydyraw", | |
b220e595 | 184 | "deflection from sim. vs raw;dy_{sim} (140 #mum);dy_{raw} (140 #mum)", |
185 | 128, -64.5, 63.5, 128, -64.5, 63.5); | |
186 | ||
6911c7f9 | 187 | fHistTrklPerRef = new TH1F("trklperref", |
b220e595 | 188 | "No. of tracklets per track reference;no. of tracklets", |
189 | 10, -0.5, 9.5); | |
190 | ||
6911c7f9 | 191 | fHistdYdYref = new TH2F("dydyref", |
b220e595 | 192 | "deflection vs. deflection from track reference;dy_{ref} (140 #mum);dy (140 #mum)", |
193 | 128, -64.5, 63.5, 128, -64.5, 63.5); | |
194 | ||
6911c7f9 | 195 | fHistZrow = new TH1F("zrow", |
196 | "z-position;pad row", | |
b220e595 | 197 | 16, -0.5, 15.5); |
6911c7f9 | 198 | fHistZrowRaw = new TH1F("zrow-raw", |
199 | "z-position;pad row", | |
b220e595 | 200 | 16, -0.5, 15.5); |
201 | ||
6911c7f9 | 202 | fHistPid = new TH1F("pid", |
203 | "pid", | |
b220e595 | 204 | 256, -0.5, 255.5); |
6911c7f9 | 205 | fHistPidRaw = new TH1F("pid-raw", |
206 | "pid", | |
b220e595 | 207 | 256, -0.5, 255.5); |
6911c7f9 | 208 | fHistPidDiff = new TH1F("piddiff", |
209 | "piddiff", | |
210 | 256, -127.5, 128.5); | |
b220e595 | 211 | |
6911c7f9 | 212 | fHistYdYRaw = new TH2F("ydyraw", |
213 | "y vs dy (raw tracklets);y (cm);dy (140 #mum)", | |
214 | 8192/32, -4096*160e-4, 4095*160e-4, | |
b220e595 | 215 | 128, -64.5, 63.5); |
216 | ||
6911c7f9 | 217 | fHistFitYres = new TH1F("fityres", |
218 | "Tracklet #Deltay;y_{tracklet}-y_{track} (cm);count", | |
219 | 8192/32, -4096/32*160e-4, 4095/32*160e-4); | |
220 | ||
221 | fHistFitDyresEven= new TH1F("fitdyreseven", | |
222 | "Tracklet #Deltady;dy_{tracklet}-dy_{track} (cm);count", | |
223 | 100, -2., 2.); | |
224 | fHistFitDyresOdd = new TH1F("fitdyresodd", | |
225 | "Tracklet #Deltady;dy_{tracklet}-dy_{track} (cm);count", | |
226 | 100, -2., 2.); | |
227 | ||
228 | fHistNoMatchSim = new TH2F("nomatchsim", | |
229 | "Unmatched tracklets from Simulation", | |
230 | 8192/32, -4096*160e-4, 4095*160e-4, | |
231 | 540, -0.5, 539.5); | |
232 | fHistNoMatchRaw = new TH2F("nomatchraw", | |
233 | "Unmatched tracklets from raw data", | |
234 | 8192/32, -4096*160e-4, 4095*160e-4, | |
235 | 540, -0.5, 539.5); | |
236 | ||
237 | fHistResY = new TH1F("resy", | |
238 | "Residuals to GTU track", | |
239 | 100, -10., 10.); | |
240 | fHistResZ = new TH1F("resz", | |
241 | "Residuals to GTU track", | |
242 | 100, -20., 20.); | |
243 | ||
b220e595 | 244 | fTreeTracklets = new TTree("trkl", "trkl"); |
245 | fTreeTracklets->Branch("y", &fY); | |
246 | fTreeTracklets->Branch("dy", &fDY); | |
247 | fTreeTracklets->Branch("ydiff", &fYdiff); | |
248 | fTreeTracklets->Branch("dydiff", &fDYdiff); | |
249 | fTreeTracklets->Branch("q0", &fQ0); | |
250 | fTreeTracklets->Branch("q1", &fQ1); | |
251 | fTreeTracklets->Branch("nhits", &fNHits); | |
252 | ||
253 | fOutputList->Add(fHistYpos); | |
254 | fOutputList->Add(fHistdY); | |
255 | fOutputList->Add(fHistZrow); | |
256 | fOutputList->Add(fHistPid); | |
257 | ||
258 | fOutputList->Add(fHistYres); | |
259 | fOutputList->Add(fHistYresDy); | |
260 | fOutputList->Add(fHistCanddY); | |
261 | fOutputList->Add(fHistFounddY); | |
262 | fOutputList->Add(fHistTrklPerRef); | |
263 | fOutputList->Add(fHistdYres); | |
264 | fOutputList->Add(fHistYresESD); | |
265 | fOutputList->Add(fHistdYresESD); | |
266 | fOutputList->Add(fHistdYdYref); | |
267 | ||
6911c7f9 | 268 | for (Int_t iLayer = 0; iLayer < 6; iLayer++) |
b220e595 | 269 | fOutputList->Add(fHistYlocal[iLayer]); |
270 | ||
271 | fOutputList->Add(fHistYposRaw); | |
272 | fOutputList->Add(fHistdYRaw); | |
6911c7f9 | 273 | fOutputList->Add(fHistAlphaRaw); |
b220e595 | 274 | fOutputList->Add(fHistZrowRaw); |
275 | fOutputList->Add(fHistPidRaw); | |
276 | fOutputList->Add(fHistYdYRaw); | |
277 | ||
278 | fOutputList->Add(fHistYdiff); | |
279 | fOutputList->Add(fHistdYdiff); | |
6911c7f9 | 280 | fOutputList->Add(fHistPidDiff); |
b220e595 | 281 | fOutputList->Add(fHistdYdYraw); |
282 | ||
6911c7f9 | 283 | fOutputList->Add(fHistFitYres); |
284 | fOutputList->Add(fHistFitDyresEven); | |
285 | fOutputList->Add(fHistFitDyresOdd); | |
286 | ||
287 | fOutputList->Add(fHistNoMatchSim); | |
288 | fOutputList->Add(fHistNoMatchRaw); | |
289 | ||
290 | fOutputList->Add(fHistResY); | |
291 | fOutputList->Add(fHistResZ); | |
292 | ||
b220e595 | 293 | fOutputList->Add(fTreeTracklets); |
6911c7f9 | 294 | |
295 | PostData(1, fOutputList); | |
b220e595 | 296 | } |
297 | ||
54d34aac | 298 | void AliTRDonlineTrackletQA::Exec(const Option_t * /* option */) |
b220e595 | 299 | { |
300 | // execute this for each event | |
301 | ||
302 | // connect input data | |
303 | fTrackletTree = (TTree*) GetInputData(1); | |
6911c7f9 | 304 | if (fTrackletTree) { |
305 | fTrackletTree->SetBranchAddress("tracklets_sim", &fTrackletsSim); | |
306 | fTrackletTree->SetBranchAddress("tracklets_raw", &fTrackletsRaw); | |
307 | fTrackletTree->GetEntry(fTrackletTree->GetEntriesFast()-1); | |
308 | } | |
b220e595 | 309 | |
6911c7f9 | 310 | fESD = dynamic_cast<AliESDEvent*> (fInputEvent); |
311 | ||
312 | TList trackletsSim[540]; | |
313 | TList trackletsRaw[540]; | |
b220e595 | 314 | |
315 | // prepare raw tracklets for comparison | |
316 | Int_t detRaw; | |
6911c7f9 | 317 | Int_t robRaw; |
b220e595 | 318 | Int_t mcmRaw; |
6911c7f9 | 319 | Int_t yRaw; |
b220e595 | 320 | Int_t dyRaw; |
321 | TTree trklRaw("raw tracklets", "raw tracklets"); | |
322 | trklRaw.Branch("det", &detRaw); | |
323 | trklRaw.Branch("rob", &robRaw); | |
324 | trklRaw.Branch("mcm", &mcmRaw); | |
325 | trklRaw.Branch("y", &yRaw); | |
326 | trklRaw.Branch("dy", &dyRaw); | |
327 | trklRaw.SetDirectory(0x0); | |
328 | // prepare simulated tracklets for comparison | |
329 | Int_t detSim; | |
6911c7f9 | 330 | Int_t robSim; |
b220e595 | 331 | Int_t mcmSim; |
6911c7f9 | 332 | Int_t ySim; |
b220e595 | 333 | Int_t dySim; |
334 | TTree trklSim("sim tracklets", "sim tracklets"); | |
335 | trklSim.Branch("det", &detSim); | |
336 | trklSim.Branch("rob", &robSim); | |
337 | trklSim.Branch("mcm", &mcmSim); | |
338 | trklSim.Branch("y", &ySim); | |
339 | trklSim.Branch("dy", &dySim); | |
340 | trklSim.SetDirectory(0x0); | |
341 | ||
6911c7f9 | 342 | // ----- read ESD tracklets ----- |
343 | if (fESD) { | |
344 | Int_t nTracklets = fESD->GetNumberOfTrdTracklets(); | |
345 | Int_t nTrackletsSim = 0; | |
346 | for (Int_t iTracklet = 0; iTracklet < nTracklets; iTracklet++) { | |
347 | AliESDTrdTracklet *tracklet = fESD->GetTrdTracklet(iTracklet); | |
348 | ||
349 | if (tracklet) { | |
350 | // check for tracklet from simulation (label >= -1) | |
351 | if (tracklet->GetLabel() >= -1) { | |
352 | fHistYpos->Fill(tracklet->GetLocalY()); | |
353 | fHistdY->Fill(tracklet->GetBinDy()); | |
354 | fHistZrow->Fill(tracklet->GetBinZ()); | |
355 | fHistPid->Fill(tracklet->GetPID()); | |
356 | ||
357 | detSim = tracklet->GetDetector(); | |
358 | robSim = tracklet->GetROB(); | |
359 | mcmSim = tracklet->GetMCM(); | |
360 | ySim = tracklet->GetBinY(); | |
361 | dySim = tracklet->GetBinDy(); | |
362 | trklSim.Fill(); | |
363 | ||
364 | AliDebug(1, Form("trkl sim 0x%08x in %4i (ESD)", tracklet->GetTrackletWord(), tracklet->GetHCId())); | |
365 | ++nTrackletsSim; | |
366 | ||
367 | if (tracklet->GetDetector() > -1) { | |
368 | trackletsSim[tracklet->GetDetector()].Add(tracklet); | |
369 | } | |
370 | ||
371 | PlotMC(tracklet); | |
372 | PlotESD(tracklet); | |
373 | } | |
374 | // otherwise raw tracklet | |
375 | else { | |
376 | if (tracklet->GetDetector() > -1) | |
377 | trackletsRaw[tracklet->GetDetector()].Add(tracklet); | |
378 | ||
379 | fHistYposRaw->Fill(tracklet->GetLocalY()); | |
380 | fHistdYRaw->Fill(tracklet->GetBinDy()); | |
381 | Float_t alpha = tracklet->GetBinDy() - 3./140.e-4*tracklet->GetLocalY()/GetX(tracklet); | |
382 | fHistAlphaRaw->Fill(alpha); | |
383 | fHistZrowRaw->Fill(tracklet->GetBinZ()); | |
384 | fHistPidRaw->Fill(tracklet->GetPID()); | |
385 | fHistYdYRaw->Fill(tracklet->GetLocalY(), tracklet->GetBinDy()); | |
386 | ||
387 | detRaw = tracklet->GetDetector(); | |
388 | robRaw = tracklet->GetROB(); | |
389 | mcmRaw = tracklet->GetMCM(); | |
390 | yRaw = tracklet->GetBinY(); | |
391 | dyRaw = tracklet->GetBinDy(); | |
392 | trklRaw.Fill(); | |
393 | } | |
394 | } | |
395 | } | |
396 | AliDebug(1, Form("no. of simulated tracklets in ESDs: %i", nTrackletsSim)); | |
397 | } | |
398 | ||
399 | // ----- simulated tracklet from TRD.Tracklets.root ----- | |
b220e595 | 400 | if (fTrackletsSim) { |
6911c7f9 | 401 | AliDebug(1, Form("no. of simulated tracklets in TRD.Tracklets.root: %i", fTrackletsSim->GetEntries())); |
b220e595 | 402 | for (Int_t iTracklet = 0; iTracklet < fTrackletsSim->GetEntries(); iTracklet++) { |
6911c7f9 | 403 | AliTRDtrackletMCM *trkl = (AliTRDtrackletMCM*) (*fTrackletsSim)[iTracklet]; |
404 | AliDebug(1, Form("trkl sim 0x%08x in %4i (TRD)", trkl->GetTrackletWord(), trkl->GetHCId())); | |
b220e595 | 405 | } |
406 | } | |
407 | ||
6911c7f9 | 408 | // ----- match simulated and raw tracklets (detector-wise) ----- |
409 | for (Int_t iDetector = 0; iDetector < 540; iDetector++) { | |
410 | for (Int_t iTracklet = 0; iTracklet < trackletsRaw[iDetector].GetEntries(); iTracklet++) { | |
411 | AliESDTrdTracklet *trackletRaw = (AliESDTrdTracklet*) trackletsRaw[iDetector].At(iTracklet); | |
412 | ||
413 | // search for the best match | |
414 | AliESDTrdTracklet *trackletMatch = 0x0; | |
415 | Int_t dyMax = 20; | |
416 | Int_t yMax = 100; | |
417 | for (Int_t iTrackletSim = 0; iTrackletSim < trackletsSim[iDetector].GetEntries(); iTrackletSim++) { | |
418 | AliESDTrdTracklet *trackletSim = (AliESDTrdTracklet*) trackletsSim[iDetector].At(iTrackletSim); | |
419 | AliDebug(10, Form("comparing 0x%08x with 0x%08x, det: %i %i", | |
420 | trackletRaw->GetTrackletWord(), trackletSim->GetTrackletWord(), | |
421 | trackletRaw->GetDetector(), trackletSim->GetDetector() )); | |
422 | // require equal z | |
423 | if (trackletRaw->GetBinZ() != trackletSim->GetBinZ()) | |
424 | continue; | |
425 | // match on y | |
426 | if (TMath::Abs(trackletRaw->GetBinY() - trackletSim->GetBinY()) > yMax) | |
427 | continue; | |
b220e595 | 428 | |
6911c7f9 | 429 | trackletMatch = trackletSim; |
430 | yMax = TMath::Abs(trackletRaw->GetBinY() - trackletSim->GetBinY()); | |
431 | dyMax = TMath::Abs(trackletRaw->GetBinDy() - trackletSim->GetBinDy()); | |
432 | } | |
433 | if (trackletMatch) { | |
434 | fHistYdiff->Fill(trackletRaw->GetBinY() - trackletMatch->GetBinY()); | |
435 | fHistdYdiff->Fill(3.*trackletRaw->GetDyDx() - 3.*trackletMatch->GetDyDx()); | |
436 | fHistdYdYraw->Fill(trackletMatch->GetBinDy(), trackletRaw->GetBinDy()); | |
437 | fHistPidDiff->Fill(trackletRaw->GetPID() - trackletMatch->GetPID()); | |
438 | trackletsSim[iDetector].Remove(trackletMatch); | |
439 | } | |
440 | else { | |
441 | // store unmatched raw tracklets | |
442 | fHistNoMatchRaw->Fill(trackletRaw->GetLocalY(), trackletRaw->GetDetector()); | |
443 | // AliInfo(Form("unmatched raw tracklet: 0x%08x", trackletRaw->GetTrackletWord())); | |
444 | } | |
445 | } | |
446 | // store the unmatched sim tracklets | |
447 | for (Int_t iTracklet = 0; iTracklet < trackletsSim[iDetector].GetEntries(); iTracklet++) { | |
448 | AliESDTrdTracklet *tracklet = (AliESDTrdTracklet*) trackletsSim[iDetector].At(iTracklet); | |
449 | fHistNoMatchSim->Fill(tracklet->GetLocalY(), tracklet->GetDetector()); | |
450 | // AliInfo(Form("unmatched simulated tracklet: 0x%08x", tracklet->GetTrackletWord())); | |
b220e595 | 451 | } |
452 | } | |
453 | ||
b220e595 | 454 | // ----- MC tracks and track references ----- |
455 | // determine tracklet efficiency | |
456 | if (fMCEvent) { | |
457 | Int_t nTracksMC = fMCEvent->GetNumberOfTracks(); | |
6911c7f9 | 458 | // AliInfo(Form("no. of MC tracks: %i", nTracksMC)); |
b220e595 | 459 | for (Int_t iTrack = 0; iTrack < nTracksMC; iTrack++) { |
460 | // we want primaries | |
461 | if (!fMCEvent->IsPhysicalPrimary(iTrack)) | |
462 | continue; | |
463 | ||
464 | AliMCParticle *mcpart = (AliMCParticle*) fMCEvent->GetTrack(iTrack); | |
465 | ||
466 | // don't look at tracks with too low pt | |
467 | if (TMath::Abs(mcpart->Pt()) < fMinPt) | |
468 | continue; | |
469 | ||
470 | // look for two track references in a chamber | |
471 | Int_t nTrackRefs = mcpart->GetNumberOfTrackReferences(); | |
472 | AliTrackReference *tr[2] = { 0x0 }; | |
473 | Int_t nRef = 0; | |
474 | ||
475 | for (Int_t iTrackRef = 0; iTrackRef < nTrackRefs; iTrackRef++) { | |
476 | AliTrackReference *trackRef = mcpart->GetTrackReference(iTrackRef); | |
477 | if (trackRef->DetectorId() != AliTrackReference::kTRD) | |
478 | continue; | |
479 | if (trackRef->Pt() < fMinPt) | |
480 | continue; | |
481 | Int_t label = trackRef->Label(); | |
482 | if (label < 0) | |
483 | continue; | |
484 | ||
485 | // first track reference, remember it | |
486 | if (nRef == 0) { | |
487 | tr[nRef] = trackRef; | |
488 | nRef++; | |
489 | continue; | |
490 | } | |
491 | else { | |
492 | // next one is too far away, remember it but forget the previous one | |
493 | if (TMath::Abs(trackRef->LocalX() - tr[0]->LocalX()) > 5.) { | |
494 | tr[0] = trackRef; | |
495 | nRef = 1; | |
496 | continue; | |
497 | } | |
498 | // too close to previous track reference | |
499 | // we don't want it | |
500 | else if (TMath::Abs(trackRef->LocalX() - tr[0]->LocalX()) < .5) { | |
501 | continue; | |
502 | } | |
503 | // then it must be ok, so we take it | |
504 | else { | |
505 | tr[1] = trackRef; | |
506 | nRef++; | |
507 | } | |
508 | } | |
509 | ||
510 | // calculation deflection from track references | |
511 | Float_t deflLength = 3. * (tr[1]->LocalY() - tr[0]->LocalY()) / (tr[1]->LocalX() - tr[0]->LocalX()); | |
512 | // if it is too large we reject it | |
513 | if (deflLength < 1.) { | |
514 | fHistCanddY->Fill(deflLength/140e-4); | |
515 | } | |
516 | else { | |
517 | nRef = 0; | |
518 | continue; | |
519 | } | |
6911c7f9 | 520 | |
b220e595 | 521 | // now search for tracklets belonging to this track reference |
e068d4e7 | 522 | Int_t nTrackletsPerRef(0); |
523 | Int_t defl(0); | |
6911c7f9 | 524 | TIter nextTracklet(trackletsSim); |
525 | while (AliESDTrdTracklet *trkl = (AliESDTrdTracklet*) nextTracklet()) { | |
b220e595 | 526 | // they must have the same label |
6911c7f9 | 527 | if (trkl->GetLabel() != label) |
b220e595 | 528 | continue; |
6911c7f9 | 529 | |
b220e595 | 530 | // and be close enough in radial position |
6911c7f9 | 531 | if (TMath::Abs(trackRef->LocalX() - GetX(trkl)) > 5.) |
b220e595 | 532 | continue; |
6911c7f9 | 533 | |
b220e595 | 534 | // if they are close in position we accept it |
6911c7f9 | 535 | if ((TMath::Abs(trackRef->LocalY() - trkl->GetLocalY()) < 5.) && |
536 | (TMath::Abs(trackRef->Z() - GetZ(trkl)) < 5.)) { | |
537 | defl = trkl->GetDyDx(); | |
b220e595 | 538 | nTrackletsPerRef++; |
539 | } | |
540 | } | |
541 | fHistTrklPerRef->Fill(nTrackletsPerRef); | |
542 | if (nTrackletsPerRef == 0) { | |
543 | AliInfo(Form("Track ref without assigned tracklet: x=%4.2f, y=%4.2f, z=%4.2f, pt=%4.2f (%i)", | |
544 | trackRef->X(), trackRef->Y(), trackRef->Z(), trackRef->Pt(), trackRef->Label())); | |
545 | } | |
546 | if (nTrackletsPerRef == 1) { | |
547 | fHistdYdYref->Fill(deflLength/140.e-4, defl); | |
548 | fHistFounddY->Fill(deflLength/140.e-4); | |
549 | } | |
550 | nRef = 0; | |
551 | } | |
552 | } | |
553 | } | |
554 | ||
555 | // ----- ESD tracks ----- | |
556 | if (fESD) { | |
557 | for (Int_t iTrack = 0; iTrack < fESD->GetNumberOfTracks(); iTrack++) { | |
558 | AliESDtrack *esdTrack = fESD->GetTrack(iTrack); | |
54d34aac | 559 | AliDebug(1, Form("ESD track pt: %7.2f", esdTrack->Pt())); |
b220e595 | 560 | } |
561 | } | |
562 | ||
6911c7f9 | 563 | // ----- ESD TRD tracks ----- |
564 | if (fESD) { | |
565 | // AliTRDtrapConfig *trapcfg = AliTRDcalibDB::Instance()->GetTrapConfig(); | |
566 | AliDebug(1, Form("no. of TRD tracks: %i", fESD->GetNumberOfTrdTracks())); | |
567 | for (Int_t iTrack = 0; iTrack < fESD->GetNumberOfTrdTracks(); iTrack++) { | |
568 | AliESDTrdTrack *trdTrack = fESD->GetTrdTrack(iTrack); | |
569 | AliInfo(Form("TRD track pt: %7.2f", trdTrack->Pt())); | |
570 | // AliTRDtrackOnline track; | |
571 | AliESDTrdTracklet tracklets[6]; | |
572 | for (Int_t iLayer = 0; iLayer < 6; iLayer++) { | |
573 | AliESDTrdTracklet *trkl = trdTrack->GetTracklet(iLayer); | |
574 | if (trkl) { | |
575 | tracklets[iLayer].SetTrackletWord(trkl->GetTrackletWord()); | |
576 | tracklets[iLayer].SetHCId(trkl->GetHCId()); | |
577 | // track.AddTracklet(&(tracklets[iLayer])); //??? | |
578 | } | |
579 | } | |
580 | // track.AddParametrization(new AliTRDtrackParametrizationCurved()); | |
581 | // ROOT::Math::Minimizer *minim = ROOT::Math::Factory::CreateMinimizer("Minuit"); | |
582 | // track.Fit(minim); | |
583 | // const TList ¶mList = track.GetParametrizations(); | |
584 | // TIter param(¶mList, kFALSE); | |
585 | // while (AliTRDtrackParametrization *trackParam = (AliTRDtrackParametrization*) param()) { | |
586 | // trackParam->Print(); | |
587 | // AliTRDtrackParametrizationCurved *curvedParam = dynamic_cast<AliTRDtrackParametrizationCurved*> (trackParam); | |
588 | // if (curvedParam) { | |
589 | // // calculate residuals | |
590 | // for (Int_t iLayer = 0; iLayer < 6; iLayer++) { | |
591 | // AliESDTrdTracklet *trkl = trdTrack->GetTracklet(iLayer); | |
592 | // if (trkl) { | |
593 | // AliTRDtrackPosition pos = curvedParam->ExtrapolateToLayer(iLayer); | |
594 | // fHistFitYres->Fill(pos.GetY() - trkl->GetLocalY()); | |
595 | // Int_t rob = (trkl->GetBinZ()/4) + (trkl->GetHCId() % 0x1 ? 1 : 0); | |
596 | // Int_t mcm = trkl->GetBinZ() & 0x3; | |
597 | // Float_t deflcorr = ((Int_t) trapcfg->GetDmemUnsigned(AliTRDmcmSim::fgkDmemAddrDeflCorr, trkl->GetDetector(), rob, mcm)) | |
598 | // * (0.635 + 0.03 * iLayer)/(256.0) / 32.; | |
599 | // Float_t scale = 1.; | |
600 | // Float_t defl = (3.*trkl->GetDyDx() - deflcorr) * scale + deflcorr; | |
601 | // if (iLayer & 0x1) { | |
602 | // fHistFitDyresOdd->Fill(pos.GetdY() - defl); | |
603 | // } | |
604 | // else { | |
605 | // fHistFitDyresEven->Fill(pos.GetdY() - defl); | |
606 | // } | |
607 | // } | |
608 | // } | |
609 | // } | |
610 | // } | |
611 | } | |
612 | } | |
613 | ||
614 | PostData(1, fOutputList); | |
b220e595 | 615 | } |
616 | ||
617 | void AliTRDonlineTrackletQA::LocalInit() | |
618 | { | |
619 | ||
620 | } | |
621 | ||
54d34aac | 622 | void AliTRDonlineTrackletQA::Terminate(const Option_t * /* option */) |
b220e595 | 623 | { |
54d34aac | 624 | // upon terminate |
625 | ||
b220e595 | 626 | fOutputList = dynamic_cast<TList*> (GetOutputData(1)); |
627 | ||
628 | if (!fOutputList) { | |
629 | AliError("No output objects found!"); | |
630 | return; | |
631 | } | |
632 | ||
633 | // fHistYpos = dynamic_cast<TH1F*> (fOutputList->FindObject("ypos")); | |
634 | // if (fHistYpos) { | |
635 | // TCanvas *c = new TCanvas; | |
636 | // c->cd(); | |
637 | // gPad->SetGridx(); | |
638 | // gPad->SetGridy(); | |
639 | // fHistYpos->DrawCopy(); | |
640 | // } | |
641 | } | |
642 | ||
6911c7f9 | 643 | void AliTRDonlineTrackletQA::PlotMC(AliESDTrdTracklet *trkl) |
b220e595 | 644 | { |
645 | // compare the given tracklet to the MC information, | |
646 | // i.e. track references | |
6911c7f9 | 647 | |
b220e595 | 648 | Int_t label = trkl->GetLabel(); |
649 | ||
650 | // check for valid label | |
651 | if (label < 0 ) { | |
6911c7f9 | 652 | AliDebug(1, "MC tracklet has no label"); |
b220e595 | 653 | return; |
654 | } | |
655 | if (label >= fMCEvent->GetNumberOfTracks()) { | |
6911c7f9 | 656 | AliError("MC tracklet has invalid label"); |
b220e595 | 657 | return; |
658 | } | |
659 | ||
660 | // some cuts on the tracklet | |
661 | // if (!fMCEvent->IsPhysicalPrimary(label)) | |
662 | // return; | |
663 | // if (TMath::Abs(trkl->GetdYdX()) > 0.05) | |
664 | // return; | |
665 | // if (trkl->GetDetector() % 6 != 5) | |
666 | // return; | |
6911c7f9 | 667 | |
b220e595 | 668 | // get MC particle for this tracklet |
669 | AliMCParticle *track = (AliMCParticle*) fMCEvent->GetTrack(label); | |
670 | ||
671 | // don't look at tracks with too low pt | |
672 | if (TMath::Abs(track->Pt() < fMinPt)) | |
673 | return; | |
674 | ||
675 | // serach track references corresponding to the current tracklet | |
676 | AliTrackReference *tr[2] = { 0x0 }; | |
677 | Int_t nTrackRefs = 0; | |
678 | ||
679 | for (Int_t iTrackRef = 0; iTrackRef < track->GetNumberOfTrackReferences(); iTrackRef++) { | |
680 | AliTrackReference *trackRef = track->GetTrackReference(iTrackRef); | |
681 | if (trackRef->DetectorId() != AliTrackReference::kTRD) | |
682 | continue; | |
683 | if (trackRef->Pt() < fMinPt) | |
684 | continue; | |
6911c7f9 | 685 | |
686 | if (TMath::Abs(GetX(trkl) - trackRef->LocalX()) > 5.) | |
b220e595 | 687 | continue; |
688 | ||
6911c7f9 | 689 | tr[nTrackRefs++] = trackRef; |
b220e595 | 690 | |
691 | if (nTrackRefs == 2) | |
692 | break; | |
693 | } | |
694 | ||
6911c7f9 | 695 | // if there were exactly 2 track references |
b220e595 | 696 | // (otherwise something is strange and we want to look at clean cases) |
697 | // compare tracklet to them | |
698 | if (nTrackRefs == 2) { | |
699 | // sanity check to be in the same sector | |
700 | if ( TMath::Abs((tr[0]->Alpha()*180./TMath::Pi()-10.)/20. - (trkl->GetDetector()/30)) > .1) { | |
701 | AliError("Track reference in different sector"); | |
702 | } | |
703 | // require minimal distance in X and maximum deflection in Y | |
704 | // for the track references | |
6911c7f9 | 705 | else if ((tr[1]->LocalX() - tr[0]->LocalX()) > 0.1 && TMath::Abs(tr[1]->LocalY() - tr[0]->LocalY()) < 1.) { |
b220e595 | 706 | // calculate slope from track references |
707 | // and check whether it's in the allowed range | |
708 | Float_t slope = 3. * (tr[1]->LocalY() - tr[0]->LocalY()) / (tr[1]->LocalX() - tr[0]->LocalX()); | |
709 | if (TMath::Abs(slope) < 64*140e-4) { | |
6911c7f9 | 710 | AliDebug(1,Form("x1: %f, x0: %f, y1: %f, y0:%f", |
b220e595 | 711 | tr[1]->LocalX(), tr[0]->LocalX(), tr[1]->LocalY(), tr[0]->LocalY() )); |
712 | // calculate y-position scaled to radial position of the tracklet | |
713 | // and consider the tilting angle of the pads | |
714 | // since the tracklets are affected by it | |
6911c7f9 | 715 | Float_t yMC = (tr[1]->LocalY() + (-0.5+GetX(trkl) - tr[1]->LocalX()) * (tr[1]->LocalY() - tr[0]->LocalY()) / (tr[1]->LocalX() - tr[0]->LocalX())); |
716 | Float_t yMCtilt = yMC + (TMath::Tan(TMath::Power(-1, (trkl->GetDetector() % 6))*2.*TMath::Pi()/180.) * (tr[1]->Z() - GetZ(trkl))); | |
717 | if (TMath::Abs(trkl->GetLocalY() - yMCtilt) > 10.) { | |
718 | AliError(Form("Deviation too large for tracklet: 0x%08x in det. %i at x = %f, y = %f, z = %f, alpha = %f", | |
719 | trkl->GetTrackletWord(), trkl->GetDetector(), GetX(trkl), trkl->GetLocalY(), GetZ(trkl), tr[0]->Alpha())); | |
b220e595 | 720 | } |
6911c7f9 | 721 | fHistYres->Fill(trkl->GetLocalY() - yMCtilt); |
722 | fHistYresDy->Fill(trkl->GetLocalY() - yMCtilt, trkl->GetDyDx()); | |
b220e595 | 723 | // what about tilt correction here ??? |
6911c7f9 | 724 | fHistdYres->Fill(3. * trkl->GetDyDx() - |
b220e595 | 725 | 3. * (tr[1]->LocalY() - tr[0]->LocalY()) / (tr[1]->LocalX() - tr[0]->LocalX())); |
726 | // plot position deviation in pad-coordinates | |
727 | // to study the influence of the position LUT | |
728 | Float_t padWidth = fGeo->GetPadPlane(trkl->GetDetector())->GetWidthIPad(); | |
6911c7f9 | 729 | Float_t yMClocal = yMCtilt/padWidth - floor(yMCtilt/padWidth) - padWidth/2.; |
b220e595 | 730 | Int_t layer = trkl->GetDetector() % 6; |
6911c7f9 | 731 | fHistYlocal[layer]->Fill(yMClocal, |
732 | trkl->GetLocalY()/padWidth - floor(trkl->GetLocalY()/padWidth) - padWidth/2. - yMClocal); | |
b220e595 | 733 | // and fill everything to the tree |
6911c7f9 | 734 | fYdiff = trkl->GetLocalY() - yMCtilt; |
735 | fDYdiff = 3. * trkl->GetDyDx() - | |
b220e595 | 736 | 3. * (tr[1]->LocalY() - tr[0]->LocalY()) / (tr[1]->LocalX() - tr[0]->LocalX()); |
6911c7f9 | 737 | fY = trkl->GetLocalY(); |
738 | fDY = trkl->GetDyDx(); | |
b220e595 | 739 | fTreeTracklets->Fill(); |
740 | // output tracklets with large deviation | |
741 | if (TMath::Abs(fYdiff) > 0.5) { | |
6911c7f9 | 742 | AliWarning(Form("tracklet: y=%4.2f, dy=%4.2f, ydiff=%4.2f, dydiff=%4.2f, q0=%5d, q1=%5d, nhits=%2d, label=%i", |
743 | trkl->GetLocalY(), trkl->GetDyDx(), fYdiff, fDYdiff, fQ0, fQ1, fNHits, label)); | |
b220e595 | 744 | } |
745 | } | |
746 | } | |
747 | } | |
748 | } | |
749 | ||
750 | ||
6911c7f9 | 751 | void AliTRDonlineTrackletQA::PlotESD(AliESDTrdTracklet *trkl) |
b220e595 | 752 | { |
54d34aac | 753 | // plot comparison to ESD |
b220e595 | 754 | |
6911c7f9 | 755 | Float_t xTrkl = GetX(trkl); |
756 | Float_t yTrkl = trkl->GetLocalY(); | |
757 | Float_t zTrkl = GetZ(trkl); | |
b220e595 | 758 | |
759 | Float_t alpha = (trkl->GetDetector() / 30) * 20. + 10.; | |
760 | alpha *= TMath::Pi() / 180.; | |
761 | ||
762 | AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*> (fInputEvent); | |
763 | if (!esdEvent) | |
764 | return; | |
765 | ||
6911c7f9 | 766 | Float_t mag = 0.5; //((AliMagF*) TGeoGlobalMagField::Instance()->GetField())->SolenoidField(); |
b220e595 | 767 | |
768 | for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++) { | |
769 | AliESDtrack *track = esdEvent->GetTrack(iTrack); | |
770 | ||
771 | if (!track->GetOuterParam()) | |
772 | continue; | |
773 | ||
774 | AliExternalTrackParam *param = new AliExternalTrackParam(*(track->GetOuterParam())); | |
775 | ||
6911c7f9 | 776 | AliDebug(10, Form("track %i at x = %f, y = %f", |
b220e595 | 777 | iTrack, param->GetX(), param->GetY())); |
778 | param->Propagate(alpha, xTrkl, mag); | |
6911c7f9 | 779 | AliDebug(10, Form("after propagating track %i at x = %f, y = %f", |
b220e595 | 780 | iTrack, param->GetX(), param->GetY())); |
781 | ||
782 | if ((TMath::Abs(xTrkl - param->GetX()) < 10.) && | |
783 | (TMath::Abs(yTrkl - param->GetY()) < 5.) && | |
784 | (TMath::Abs(zTrkl - param->GetZ()) < 10.)) { | |
6911c7f9 | 785 | AliDebug(2, Form("match of tracklet-track: %i <-> %i", |
786 | trkl->GetLabel(), track->GetLabel())); | |
b220e595 | 787 | AliDebug(5, Form("tracklet position: det: %3i x = %f, y = %f, z = %f, alpha = %f", |
6911c7f9 | 788 | trkl->GetDetector(), GetX(trkl), trkl->GetLocalY(), GetZ(trkl), alpha)); |
789 | AliDebug(5, Form("after propagating track %i at x = %f, y = %f, z = %f", | |
b220e595 | 790 | iTrack, param->GetX(), param->GetY(), param->GetZ())); |
791 | ||
792 | fHistYresESD->Fill(yTrkl - param->GetY()); | |
793 | } | |
794 | ||
795 | delete param; | |
796 | } | |
797 | ||
798 | } | |
799 | ||
6419bebb | 800 | Int_t AliTRDonlineTrackletQA::GetTrackletsForMC(Int_t /* label */, Int_t /*idx*/ []) const |
b220e595 | 801 | { |
54d34aac | 802 | // get tracklets for MC label |
803 | // not implemented | |
804 | ||
b220e595 | 805 | return 0; |
806 | } |