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.
15 #include "Math/Factory.h"
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"
25 #include "AliESDTrdTrack.h"
26 #include "AliESDTrdTracklet.h"
27 #include "AliTRDtrackletMCM.h"
28 #include "AliTRDtrackletWord.h"
29 #include "AliTRDtrapConfig.h"
30 #include "AliTRDmcmSim.h"
31 #include "AliTRDcalibDB.h"
33 #include "AliVParticle.h"
34 #include "AliMCParticle.h"
35 #include "AliTrackReference.h"
37 #include "TGeoGlobalMagField.h"
39 #include "AliTRDonlineTrackletQA.h"
41 ClassImp(AliTRDonlineTrackletQA)
43 AliTRDonlineTrackletQA::AliTRDonlineTrackletQA(const char *name) :
44 AliAnalysisTask(name, ""),
77 fHistFitDyresEven(0x0),
78 fHistFitDyresOdd(0x0),
92 fGeo(new AliTRDgeometry),
98 DefineInput(0, TChain::Class());
99 DefineInput(1, TTree::Class());
101 DefineOutput(0, TTree::Class());
102 DefineOutput(1, TList::Class());
105 AliTRDonlineTrackletQA::~AliTRDonlineTrackletQA()
112 void AliTRDonlineTrackletQA::ConnectInputData(const Option_t * /* option */)
114 // connect input data
116 fInputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
118 fInputEvent = fInputHandler->GetEvent();
120 AliMCEventHandler *mcH = (AliMCEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler();
122 fMCEvent = mcH->MCEvent();
125 void AliTRDonlineTrackletQA::CreateOutputObjects()
127 // create output objects
131 fOutputList = new TList();
132 fOutputList->SetOwner(kTRUE);
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",
139 8192/32, -4096*160e-4, 4095*160e-4);
140 fHistYres = new TH1F("yres",
141 "Tracklet (sim) #Deltay;y_{tracklet}-y_{MC} (cm);count",
142 8192/32, -4096/32*160e-4, 4095/32*160e-4);
143 fHistYresDy = new TH2F("yresdy",
144 "Tracklet (sim) #Deltay;y_{tracklet}-y_{MC} (cm);deflection (bin)",
145 8192/32, -4096/32*160e-4, 4095/32*160e-4,
147 fHistYresESD = new TH1F("yresesd",
148 "Tracklet #Deltay;y (cm);count",
150 fHistYdiff = new TH1F("ydiff",
151 "Tracklet #Deltay (sim - raw);y_{sim}-y_{raw} (160 #mum);count",
153 for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
154 fHistYlocal[iLayer] = new TH2F(Form("ylocal_%i", iLayer),
155 Form("Tracklet local y, layer %i;y_{MC} (pad width);y_{trkl} (pad width)", iLayer),
156 100, -1, 1, 100, -1, 1);
159 fHistdY = new TH1F("dy",
160 "deflection (sim);dy (140 #mum)",
162 fHistdYRaw = new TH1F("dy_raw",
163 "deflection (raw);dy (140 #mum)",
165 fHistAlphaRaw = new TH1F("fHistAlphaRaw",
166 "angle w.r.t. to straight line",
168 fHistdYres = new TH1F("dyres",
169 "deflection residual;dy (cm)",
171 fHistdYresESD = new TH1F("dyresesd",
172 "deflection residual;dy (cm)",
174 fHistCanddY = new TH1F("dycand",
175 "deflection;dy (140 #mum)",
177 fHistFounddY = new TH1F("dyfound",
178 "deflection;dy (140 #mum)",
180 fHistdYdiff = new TH1F("dydiff",
181 "deflection #Deltady;dy_{sim}-dy_{raw} (140 #mum)",
183 fHistdYdYraw = new TH2F("dydyraw",
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);
187 fHistTrklPerRef = new TH1F("trklperref",
188 "No. of tracklets per track reference;no. of tracklets",
191 fHistdYdYref = new TH2F("dydyref",
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);
195 fHistZrow = new TH1F("zrow",
196 "z-position;pad row",
198 fHistZrowRaw = new TH1F("zrow-raw",
199 "z-position;pad row",
202 fHistPid = new TH1F("pid",
205 fHistPidRaw = new TH1F("pid-raw",
208 fHistPidDiff = new TH1F("piddiff",
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,
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);
221 fHistFitDyresEven= new TH1F("fitdyreseven",
222 "Tracklet #Deltady;dy_{tracklet}-dy_{track} (cm);count",
224 fHistFitDyresOdd = new TH1F("fitdyresodd",
225 "Tracklet #Deltady;dy_{tracklet}-dy_{track} (cm);count",
228 fHistNoMatchSim = new TH2F("nomatchsim",
229 "Unmatched tracklets from Simulation",
230 8192/32, -4096*160e-4, 4095*160e-4,
232 fHistNoMatchRaw = new TH2F("nomatchraw",
233 "Unmatched tracklets from raw data",
234 8192/32, -4096*160e-4, 4095*160e-4,
237 fHistResY = new TH1F("resy",
238 "Residuals to GTU track",
240 fHistResZ = new TH1F("resz",
241 "Residuals to GTU track",
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);
253 fOutputList->Add(fHistYpos);
254 fOutputList->Add(fHistdY);
255 fOutputList->Add(fHistZrow);
256 fOutputList->Add(fHistPid);
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);
268 for (Int_t iLayer = 0; iLayer < 6; iLayer++)
269 fOutputList->Add(fHistYlocal[iLayer]);
271 fOutputList->Add(fHistYposRaw);
272 fOutputList->Add(fHistdYRaw);
273 fOutputList->Add(fHistAlphaRaw);
274 fOutputList->Add(fHistZrowRaw);
275 fOutputList->Add(fHistPidRaw);
276 fOutputList->Add(fHistYdYRaw);
278 fOutputList->Add(fHistYdiff);
279 fOutputList->Add(fHistdYdiff);
280 fOutputList->Add(fHistPidDiff);
281 fOutputList->Add(fHistdYdYraw);
283 fOutputList->Add(fHistFitYres);
284 fOutputList->Add(fHistFitDyresEven);
285 fOutputList->Add(fHistFitDyresOdd);
287 fOutputList->Add(fHistNoMatchSim);
288 fOutputList->Add(fHistNoMatchRaw);
290 fOutputList->Add(fHistResY);
291 fOutputList->Add(fHistResZ);
293 fOutputList->Add(fTreeTracklets);
295 PostData(1, fOutputList);
298 void AliTRDonlineTrackletQA::Exec(const Option_t * /* option */)
300 // execute this for each event
302 // connect input data
303 fTrackletTree = (TTree*) GetInputData(1);
305 fTrackletTree->SetBranchAddress("tracklets_sim", &fTrackletsSim);
306 fTrackletTree->SetBranchAddress("tracklets_raw", &fTrackletsRaw);
307 fTrackletTree->GetEntry(fTrackletTree->GetEntriesFast()-1);
310 fESD = dynamic_cast<AliESDEvent*> (fInputEvent);
312 TList trackletsSim[540];
313 TList trackletsRaw[540];
315 // prepare raw tracklets for comparison
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
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);
342 // ----- read ESD tracklets -----
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);
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());
357 detSim = tracklet->GetDetector();
358 robSim = tracklet->GetROB();
359 mcmSim = tracklet->GetMCM();
360 ySim = tracklet->GetBinY();
361 dySim = tracklet->GetBinDy();
364 AliDebug(1, Form("trkl sim 0x%08x in %4i (ESD)", tracklet->GetTrackletWord(), tracklet->GetHCId()));
367 if (tracklet->GetDetector() > -1) {
368 trackletsSim[tracklet->GetDetector()].Add(tracklet);
374 // otherwise raw tracklet
376 if (tracklet->GetDetector() > -1)
377 trackletsRaw[tracklet->GetDetector()].Add(tracklet);
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());
387 detRaw = tracklet->GetDetector();
388 robRaw = tracklet->GetROB();
389 mcmRaw = tracklet->GetMCM();
390 yRaw = tracklet->GetBinY();
391 dyRaw = tracklet->GetBinDy();
396 AliDebug(1, Form("no. of simulated tracklets in ESDs: %i", nTrackletsSim));
399 // ----- simulated tracklet from TRD.Tracklets.root -----
401 AliDebug(1, Form("no. of simulated tracklets in TRD.Tracklets.root: %i", fTrackletsSim->GetEntries()));
402 for (Int_t iTracklet = 0; iTracklet < fTrackletsSim->GetEntries(); iTracklet++) {
403 AliTRDtrackletMCM *trkl = (AliTRDtrackletMCM*) (*fTrackletsSim)[iTracklet];
404 AliDebug(1, Form("trkl sim 0x%08x in %4i (TRD)", trkl->GetTrackletWord(), trkl->GetHCId()));
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);
413 // search for the best match
414 AliESDTrdTracklet *trackletMatch = 0x0;
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() ));
423 if (trackletRaw->GetBinZ() != trackletSim->GetBinZ())
426 if (TMath::Abs(trackletRaw->GetBinY() - trackletSim->GetBinY()) > yMax)
429 trackletMatch = trackletSim;
430 yMax = TMath::Abs(trackletRaw->GetBinY() - trackletSim->GetBinY());
431 dyMax = TMath::Abs(trackletRaw->GetBinDy() - trackletSim->GetBinDy());
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);
441 // store unmatched raw tracklets
442 fHistNoMatchRaw->Fill(trackletRaw->GetLocalY(), trackletRaw->GetDetector());
443 // AliInfo(Form("unmatched raw tracklet: 0x%08x", trackletRaw->GetTrackletWord()));
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()));
454 // ----- MC tracks and track references -----
455 // determine tracklet efficiency
457 Int_t nTracksMC = fMCEvent->GetNumberOfTracks();
458 // AliInfo(Form("no. of MC tracks: %i", nTracksMC));
459 for (Int_t iTrack = 0; iTrack < nTracksMC; iTrack++) {
461 if (!fMCEvent->IsPhysicalPrimary(iTrack))
464 AliMCParticle *mcpart = (AliMCParticle*) fMCEvent->GetTrack(iTrack);
466 // don't look at tracks with too low pt
467 if (TMath::Abs(mcpart->Pt()) < fMinPt)
470 // look for two track references in a chamber
471 Int_t nTrackRefs = mcpart->GetNumberOfTrackReferences();
472 AliTrackReference *tr[2] = { 0x0 };
475 for (Int_t iTrackRef = 0; iTrackRef < nTrackRefs; iTrackRef++) {
476 AliTrackReference *trackRef = mcpart->GetTrackReference(iTrackRef);
477 if (trackRef->DetectorId() != AliTrackReference::kTRD)
479 if (trackRef->Pt() < fMinPt)
481 Int_t label = trackRef->Label();
485 // first track reference, remember it
492 // next one is too far away, remember it but forget the previous one
493 if (TMath::Abs(trackRef->LocalX() - tr[0]->LocalX()) > 5.) {
498 // too close to previous track reference
500 else if (TMath::Abs(trackRef->LocalX() - tr[0]->LocalX()) < .5) {
503 // then it must be ok, so we take it
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);
521 // now search for tracklets belonging to this track reference
522 Int_t nTrackletsPerRef(0);
524 TIter nextTracklet(trackletsSim);
525 while (AliESDTrdTracklet *trkl = (AliESDTrdTracklet*) nextTracklet()) {
526 // they must have the same label
527 if (trkl->GetLabel() != label)
530 // and be close enough in radial position
531 if (TMath::Abs(trackRef->LocalX() - GetX(trkl)) > 5.)
534 // if they are close in position we accept it
535 if ((TMath::Abs(trackRef->LocalY() - trkl->GetLocalY()) < 5.) &&
536 (TMath::Abs(trackRef->Z() - GetZ(trkl)) < 5.)) {
537 defl = trkl->GetDyDx();
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()));
546 if (nTrackletsPerRef == 1) {
547 fHistdYdYref->Fill(deflLength/140.e-4, defl);
548 fHistFounddY->Fill(deflLength/140.e-4);
555 // ----- ESD tracks -----
557 for (Int_t iTrack = 0; iTrack < fESD->GetNumberOfTracks(); iTrack++) {
558 AliESDtrack *esdTrack = fESD->GetTrack(iTrack);
559 AliDebug(1, Form("ESD track pt: %7.2f", esdTrack->Pt()));
563 // ----- ESD TRD tracks -----
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);
575 tracklets[iLayer].SetTrackletWord(trkl->GetTrackletWord());
576 tracklets[iLayer].SetHCId(trkl->GetHCId());
577 // track.AddTracklet(&(tracklets[iLayer])); //???
580 // track.AddParametrization(new AliTRDtrackParametrizationCurved());
581 // ROOT::Math::Minimizer *minim = ROOT::Math::Factory::CreateMinimizer("Minuit");
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);
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);
605 // fHistFitDyresEven->Fill(pos.GetdY() - defl);
614 PostData(1, fOutputList);
617 void AliTRDonlineTrackletQA::LocalInit()
622 void AliTRDonlineTrackletQA::Terminate(const Option_t * /* option */)
626 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
629 AliError("No output objects found!");
633 // fHistYpos = dynamic_cast<TH1F*> (fOutputList->FindObject("ypos"));
635 // TCanvas *c = new TCanvas;
639 // fHistYpos->DrawCopy();
643 void AliTRDonlineTrackletQA::PlotMC(AliESDTrdTracklet *trkl)
645 // compare the given tracklet to the MC information,
646 // i.e. track references
648 Int_t label = trkl->GetLabel();
650 // check for valid label
652 AliDebug(1, "MC tracklet has no label");
655 if (label >= fMCEvent->GetNumberOfTracks()) {
656 AliError("MC tracklet has invalid label");
660 // some cuts on the tracklet
661 // if (!fMCEvent->IsPhysicalPrimary(label))
663 // if (TMath::Abs(trkl->GetdYdX()) > 0.05)
665 // if (trkl->GetDetector() % 6 != 5)
668 // get MC particle for this tracklet
669 AliMCParticle *track = (AliMCParticle*) fMCEvent->GetTrack(label);
671 // don't look at tracks with too low pt
672 if (TMath::Abs(track->Pt() < fMinPt))
675 // serach track references corresponding to the current tracklet
676 AliTrackReference *tr[2] = { 0x0 };
677 Int_t nTrackRefs = 0;
679 for (Int_t iTrackRef = 0; iTrackRef < track->GetNumberOfTrackReferences(); iTrackRef++) {
680 AliTrackReference *trackRef = track->GetTrackReference(iTrackRef);
681 if (trackRef->DetectorId() != AliTrackReference::kTRD)
683 if (trackRef->Pt() < fMinPt)
686 if (TMath::Abs(GetX(trkl) - trackRef->LocalX()) > 5.)
689 tr[nTrackRefs++] = trackRef;
695 // if there were exactly 2 track references
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");
703 // require minimal distance in X and maximum deflection in Y
704 // for the track references
705 else if ((tr[1]->LocalX() - tr[0]->LocalX()) > 0.1 && TMath::Abs(tr[1]->LocalY() - tr[0]->LocalY()) < 1.) {
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) {
710 AliDebug(1,Form("x1: %f, x0: %f, y1: %f, y0:%f",
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
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()));
721 fHistYres->Fill(trkl->GetLocalY() - yMCtilt);
722 fHistYresDy->Fill(trkl->GetLocalY() - yMCtilt, trkl->GetDyDx());
723 // what about tilt correction here ???
724 fHistdYres->Fill(3. * trkl->GetDyDx() -
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();
729 Float_t yMClocal = yMCtilt/padWidth - floor(yMCtilt/padWidth) - padWidth/2.;
730 Int_t layer = trkl->GetDetector() % 6;
731 fHistYlocal[layer]->Fill(yMClocal,
732 trkl->GetLocalY()/padWidth - floor(trkl->GetLocalY()/padWidth) - padWidth/2. - yMClocal);
733 // and fill everything to the tree
734 fYdiff = trkl->GetLocalY() - yMCtilt;
735 fDYdiff = 3. * trkl->GetDyDx() -
736 3. * (tr[1]->LocalY() - tr[0]->LocalY()) / (tr[1]->LocalX() - tr[0]->LocalX());
737 fY = trkl->GetLocalY();
738 fDY = trkl->GetDyDx();
739 fTreeTracklets->Fill();
740 // output tracklets with large deviation
741 if (TMath::Abs(fYdiff) > 0.5) {
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));
751 void AliTRDonlineTrackletQA::PlotESD(AliESDTrdTracklet *trkl)
753 // plot comparison to ESD
755 Float_t xTrkl = GetX(trkl);
756 Float_t yTrkl = trkl->GetLocalY();
757 Float_t zTrkl = GetZ(trkl);
759 Float_t alpha = (trkl->GetDetector() / 30) * 20. + 10.;
760 alpha *= TMath::Pi() / 180.;
762 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*> (fInputEvent);
766 Float_t mag = 0.5; //((AliMagF*) TGeoGlobalMagField::Instance()->GetField())->SolenoidField();
768 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++) {
769 AliESDtrack *track = esdEvent->GetTrack(iTrack);
771 if (!track->GetOuterParam())
774 AliExternalTrackParam *param = new AliExternalTrackParam(*(track->GetOuterParam()));
776 AliDebug(10, Form("track %i at x = %f, y = %f",
777 iTrack, param->GetX(), param->GetY()));
778 param->Propagate(alpha, xTrkl, mag);
779 AliDebug(10, Form("after propagating track %i at x = %f, y = %f",
780 iTrack, param->GetX(), param->GetY()));
782 if ((TMath::Abs(xTrkl - param->GetX()) < 10.) &&
783 (TMath::Abs(yTrkl - param->GetY()) < 5.) &&
784 (TMath::Abs(zTrkl - param->GetZ()) < 10.)) {
785 AliDebug(2, Form("match of tracklet-track: %i <-> %i",
786 trkl->GetLabel(), track->GetLabel()));
787 AliDebug(5, Form("tracklet position: det: %3i x = %f, y = %f, z = %f, alpha = %f",
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",
790 iTrack, param->GetX(), param->GetY(), param->GetZ()));
792 fHistYresESD->Fill(yTrkl - param->GetY());
800 Int_t AliTRDonlineTrackletQA::GetTrackletsForMC(Int_t /* label */, Int_t /*idx*/ []) const
802 // get tracklets for MC label