10 #include "TProfile2D.h"
12 #include "TGraphErrors.h"
15 #include <TClonesArray.h>
16 #include <TObjArray.h>
19 #include "AliESDEvent.h"
20 #include "AliESDInputHandler.h"
21 #include "AliTrackReference.h"
23 #include "AliAnalysisTask.h"
25 #include "AliTRDtrackerV1.h"
26 #include "AliTRDtrackV1.h"
27 #include "AliTRDcluster.h"
28 #include "AliTRDReconstructor.h"
29 #include "AliCDBManager.h"
30 #include "AliTRDpidUtil.h"
32 #include "AliTRDcheckPID.h"
33 #include "info/AliTRDtrackInfo.h"
35 // calculate pion efficiency at 90% electron efficiency for 11 momentum bins
36 // this task should be used with simulated data only
38 ClassImp(AliTRDcheckPID)
40 //________________________________________________________________________
41 AliTRDcheckPID::AliTRDcheckPID()
42 :AliTRDrecoTask("checkPID", "TRD PID checker")
48 ,fMinNTracklets(AliTRDgeometry::kNlayer)
49 ,fMaxNTracklets(AliTRDgeometry::kNlayer)
52 // Default constructor
55 fReconstructor = new AliTRDReconstructor();
56 fReconstructor->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
58 // Initialize momentum axis with default values
59 Double_t defaultMomenta[AliTRDCalPID::kNMom+1];
60 for(Int_t imom = 0; imom < AliTRDCalPID::kNMom+1; imom++)
61 defaultMomenta[imom] = AliTRDCalPID::GetMomentumBinning(imom);
62 SetMomentumBinning(AliTRDCalPID::kNMom, defaultMomenta);
64 fUtil = new AliTRDpidUtil();
69 //________________________________________________________________________
70 AliTRDcheckPID::~AliTRDcheckPID()
72 if(fGraph){fGraph->Delete(); delete fGraph;}
73 if(fReconstructor) delete fReconstructor;
74 if(fUtil) delete fUtil;
78 //________________________________________________________________________
79 void AliTRDcheckPID::CreateOutputObjects()
84 OpenFile(0, "RECREATE");
85 fContainer = Histos();
89 //_______________________________________________________
90 TObjArray * AliTRDcheckPID::Histos(){
93 // Create QA histograms
95 if(fContainer) return fContainer;
97 Int_t xBins = AliPID::kSPECIES*fMomentumAxis->GetNbins();
98 fContainer = new TObjArray(); fContainer->Expand(kNPlots);
100 const Float_t epsilon = 1./(2*(AliTRDpidUtil::kBins-1)); // get nice histos with bin center at 0 and 1
102 // histos of the electron probability of all 5 particle species and 11 momenta for the 2-dim LQ method
103 fEfficiency = new TObjArray(3);
104 fEfficiency->SetOwner(); fEfficiency->SetName("Efficiency");
105 fContainer->AddAt(fEfficiency, kEfficiency);
108 if(!(h = (TH2F*)gROOT->FindObject("PID_LQ"))){
109 h = new TH2F("PID_LQ", "", xBins, -0.5, xBins - 0.5,
110 AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon);
112 fEfficiency->AddAt(h, AliTRDpidUtil::kLQ);
114 // histos of the electron probability of all 5 particle species and 11 momenta for the neural network method
115 if(!(h = (TH2F*)gROOT->FindObject("PID_NN"))){
116 h = new TH2F("PID_NN", "",
117 xBins, -0.5, xBins - 0.5,
118 AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon);
120 fEfficiency->AddAt(h, AliTRDpidUtil::kNN);
122 // histos of the electron probability of all 5 particle species and 11 momenta for the ESD output
123 if(!(h = (TH2F*)gROOT->FindObject("PID_ESD"))){
124 h = new TH2F("PID_ESD", "",
125 xBins, -0.5, xBins - 0.5,
126 AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon);
128 fEfficiency->AddAt(h, AliTRDpidUtil::kESD);
130 // histos of the dE/dx distribution for all 5 particle species and 11 momenta
131 if(!(h = (TH2F*)gROOT->FindObject("dEdx"))){
132 h = new TH2F("dEdx", "",
133 xBins, -0.5, xBins - 0.5,
136 fContainer->AddAt(h, kdEdx);
138 // histos of the dE/dx slices for all 5 particle species and 11 momenta
139 if(!(h = (TH2F*)gROOT->FindObject("dEdxSlice"))){
140 h = new TH2F("dEdxSlice", "",
141 xBins*AliTRDpidUtil::kLQslices, -0.5, xBins*AliTRDpidUtil::kLQslices - 0.5,
144 fContainer->AddAt(h, kdEdxSlice);
146 // histos of the pulse height distribution for all 5 particle species and 11 momenta
147 TObjArray *fPH = new TObjArray(2);
148 fPH->SetOwner(); fPH->SetName("PH");
149 fContainer->AddAt(fPH, kPH);
150 if(!(h = (TProfile2D*)gROOT->FindObject("PHT"))){
151 h = new TProfile2D("PHT", "",
152 xBins, -0.5, xBins - 0.5,
153 AliTRDtrackerV1::GetNTimeBins(), -0.5, AliTRDtrackerV1::GetNTimeBins() - 0.5);
156 if(!(h = (TProfile2D*)gROOT->FindObject("PHX"))){
157 h = new TProfile2D("PHX", "",
158 xBins, -0.5, xBins - 0.5,
159 AliTRDtrackerV1::GetNTimeBins(), 0., .5*AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght());
163 // histos of the number of clusters distribution for all 5 particle species and 11 momenta
164 if(!(h = (TH2F*)gROOT->FindObject("NClus"))){
165 h = new TH2F("NClus", "",
166 xBins, -0.5, xBins - 0.5,
167 AliTRDtrackerV1::GetNTimeBins(), -0.5, AliTRDtrackerV1::GetNTimeBins() - 0.5);
169 fContainer->AddAt(h, kNClus);
172 // momentum distributions - absolute and in momentum bins
173 if(!(h = (TH1F*)gROOT->FindObject("hMom"))){
174 h = new TH1F("hMom", "momentum distribution", fMomentumAxis->GetNbins(), fMomentumAxis->GetXmin(), fMomentumAxis->GetXmax());
176 fContainer->AddAt(h, kMomentum);
178 if(!(h = (TH1F*)gROOT->FindObject("hMomBin"))){
179 h = new TH1F("hMomBin", "momentum distribution in momentum bins", fMomentumAxis->GetNbins(), fMomentumAxis->GetXmin(), fMomentumAxis->GetXmax());
181 fContainer->AddAt(h, kMomentumBin);
183 // Number of tracklets per track
184 if(!(h = (TH2F*)gROOT->FindObject("nTracklets"))){
185 h = new TH2F("nTracklets", "",
186 xBins, -0.5, xBins - 0.5,
187 AliTRDgeometry::kNlayer, 0.5, AliTRDgeometry::kNlayer+.5);
189 fContainer->AddAt(h, kNTracklets);
195 //________________________________________________________________________
196 Bool_t AliTRDcheckPID::CheckTrackQuality(const AliTRDtrackV1* track)
199 // Check if the track is ok for PID
202 Int_t ntracklets = track->GetNumberOfTracklets();
203 if(ntracklets >= fMinNTracklets && ntracklets <= fMaxNTracklets) return 1;
210 //________________________________________________________________________
211 Int_t AliTRDcheckPID::CalcPDG(AliTRDtrackV1* track)
214 track -> SetReconstructor(fReconstructor);
216 fReconstructor -> SetOption("nn");
219 if(track -> GetPID(AliPID::kElectron) > track -> GetPID(AliPID::kMuon) + track -> GetPID(AliPID::kPion) + track -> GetPID(AliPID::kKaon) + track -> GetPID(AliPID::kProton)){
222 else if(track -> GetPID(kProton) > track -> GetPID(AliPID::kPion) && track -> GetPID(AliPID::kProton) > track -> GetPID(AliPID::kKaon) && track -> GetPID(AliPID::kProton) > track -> GetPID(AliPID::kMuon)){
225 else if(track -> GetPID(AliPID::kKaon) > track -> GetPID(AliPID::kMuon) && track -> GetPID(AliPID::kKaon) > track -> GetPID(AliPID::kPion)){
228 else if(track -> GetPID(AliPID::kMuon) > track -> GetPID(AliPID::kPion)){
237 //_______________________________________________________
238 TH1 *AliTRDcheckPID::PlotLQ(const AliTRDtrackV1 *track)
241 // Plot the probabilities for electrons using 2-dim LQ
245 AliWarning("No ESD info available.");
249 if(track) fTrack = track;
251 AliWarning("No Track defined.");
256 status = fESD -> GetStatus();
257 if(!(status&AliESDtrack::kTRDin)) return 0x0;
259 if(!CheckTrackQuality(fTrack)) return 0x0;
261 if(!(fEfficiency = dynamic_cast<TObjArray *>(fContainer->At(kEfficiency)))){
262 AliWarning("No Histogram defined.");
266 if(!(hPIDLQ = dynamic_cast<TH2F *>(fEfficiency->At(AliTRDpidUtil::kLQ)))){
267 AliWarning("No Histogram defined.");
271 AliTRDtrackV1 cTrack(*fTrack);
272 cTrack.SetReconstructor(fReconstructor);
275 Float_t momentum = 0.;
278 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
281 //AliWarning("No MC info available!");
282 momentum = cTrack.GetMomentum(0);
283 pdg = CalcPDG(&cTrack);
285 if(!IsInRange(momentum)) return 0x0;
287 fReconstructor -> SetOption("!nn");
289 if(cTrack.GetNumberOfTrackletsPID() < fMinNTracklets) return 0x0;
291 Int_t species = AliTRDpidUtil::Pdg2Pid(pdg);
292 hPIDLQ -> Fill(FindBin(species, momentum), cTrack.GetPID(AliPID::kElectron));
297 //_______________________________________________________
298 TH1 *AliTRDcheckPID::PlotNN(const AliTRDtrackV1 *track)
301 // Plot the probabilities for electrons using 2-dim LQ
305 AliWarning("No ESD info available.");
309 if(track) fTrack = track;
311 AliWarning("No Track defined.");
316 status = fESD -> GetStatus();
317 if(!(status&AliESDtrack::kTRDin)) return 0x0;
319 if(!CheckTrackQuality(fTrack)) return 0x0;
321 if(!(fEfficiency = dynamic_cast<TObjArray *>(fContainer->At(kEfficiency)))){
322 AliWarning("No Histogram defined.");
326 if(!(hPIDNN = dynamic_cast<TH2F *>(fEfficiency->At(AliTRDpidUtil::kNN)))){
327 AliWarning("No Histogram defined.");
331 AliTRDtrackV1 cTrack(*fTrack);
332 cTrack.SetReconstructor(fReconstructor);
335 Float_t momentum = 0.;
337 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
340 //AliWarning("No MC info available!");
341 momentum = cTrack.GetMomentum(0);
342 pdg = CalcPDG(&cTrack);
344 if(!IsInRange(momentum)) return 0x0;
346 fReconstructor -> SetOption("nn");
348 if(cTrack.GetNumberOfTrackletsPID() < fMinNTracklets) return 0x0;
350 Int_t species = AliTRDpidUtil::Pdg2Pid(pdg);
351 hPIDNN -> Fill(FindBin(species, momentum), cTrack.GetPID(AliPID::kElectron));
356 //_______________________________________________________
357 TH1 *AliTRDcheckPID::PlotESD(const AliTRDtrackV1 *track)
360 // Plot the probabilities for electrons using 2-dim LQ
364 AliWarning("No ESD info available.");
368 if(track) fTrack = track;
370 AliWarning("No Track defined.");
375 status = fESD -> GetStatus();
376 if(!(status&AliESDtrack::kTRDin)) return 0x0;
378 if(!CheckTrackQuality(fTrack)) return 0x0;
379 if(fTrack->GetNumberOfTrackletsPID() < fMinNTracklets) return 0x0;
381 if(!(fEfficiency = dynamic_cast<TObjArray *>(fContainer->At(kEfficiency)))){
382 AliWarning("No Histogram defined.");
386 if(!(hPIDESD = dynamic_cast<TH2F *>(fEfficiency->At(AliTRDpidUtil::kESD)))){
387 AliWarning("No Histogram defined.");
393 Float_t momentum = 0.;
395 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
398 //AliWarning("No MC info available!");
399 AliTRDtrackV1 cTrack(*fTrack);
400 cTrack.SetReconstructor(fReconstructor);
401 momentum = cTrack.GetMomentum(0);
402 pdg = CalcPDG(&cTrack);
404 if(!IsInRange(momentum)) return 0x0;
406 // Double32_t pidESD[AliPID::kSPECIES];
407 const Double32_t *pidESD = fESD->GetResponseIter();
408 Int_t species = AliTRDpidUtil::Pdg2Pid(pdg);
409 hPIDESD -> Fill(FindBin(species, momentum), pidESD[0]);
414 //_______________________________________________________
415 TH1 *AliTRDcheckPID::PlotdEdx(const AliTRDtrackV1 *track)
418 // Plot the probabilities for electrons using 2-dim LQ
421 if(track) fTrack = track;
423 AliWarning("No Track defined.");
427 if(!CheckTrackQuality(fTrack)) return 0x0;
430 if(!(hdEdx = dynamic_cast<TH2F *>(fContainer->At(kdEdx)))){
431 AliWarning("No Histogram defined.");
435 AliTRDtrackV1 cTrack(*fTrack);
436 cTrack.SetReconstructor(fReconstructor);
438 Float_t momentum = 0.;
440 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
443 //AliWarning("No MC info available!");
444 momentum = cTrack.GetMomentum(0);
445 pdg = CalcPDG(&cTrack);
447 Int_t species = AliTRDpidUtil::Pdg2Pid(pdg);
448 if(!IsInRange(momentum)) return 0x0;
450 fReconstructor -> SetOption("!nn");
452 Int_t iBin = FindBin(species, momentum);
453 AliTRDseedV1 *tracklet = 0x0;
454 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
456 tracklet = cTrack.GetTracklet(iChamb);
457 if(!tracklet) continue;
458 tracklet -> CookdEdx(AliTRDpidUtil::kLQslices);
459 for(Int_t i = 3; i--;) SumdEdx += tracklet->GetdEdx()[i];
460 hdEdx -> Fill(iBin, SumdEdx);
466 //_______________________________________________________
467 TH1 *AliTRDcheckPID::PlotdEdxSlice(const AliTRDtrackV1 *track)
470 // Plot the probabilities for electrons using 2-dim LQ
473 if(track) fTrack = track;
475 AliWarning("No Track defined.");
479 if(!CheckTrackQuality(fTrack)) return 0x0;
482 if(!(hdEdxSlice = dynamic_cast<TH2F *>(fContainer->At(kdEdxSlice)))){
483 AliWarning("No Histogram defined.");
487 AliTRDtrackV1 cTrack(*fTrack);
488 cTrack.SetReconstructor(fReconstructor);
490 Float_t momentum = 0.;
492 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
495 //AliWarning("No MC info available!");
496 momentum = cTrack.GetMomentum(0);
497 pdg = CalcPDG(&cTrack);
499 if(!IsInRange(momentum)) return 0x0;
501 fReconstructor -> SetOption("!nn");
502 Int_t iMomBin = fMomentumAxis->FindBin(momentum);
503 Int_t species = AliTRDpidUtil::Pdg2Pid(pdg);
505 AliTRDseedV1 *tracklet = 0x0;
506 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
507 tracklet = cTrack.GetTracklet(iChamb);
508 if(!tracklet) continue;
509 tracklet -> CookdEdx(AliTRDpidUtil::kLQslices);
510 fdEdx = const_cast<Float_t *>(tracklet->GetdEdx());
511 for(Int_t iSlice = 0; iSlice < AliTRDpidUtil::kLQslices; iSlice++){
512 hdEdxSlice -> Fill(species * fMomentumAxis->GetNbins() * AliTRDpidUtil::kLQslices + (iMomBin-1) * AliTRDpidUtil::kLQslices + iSlice, fdEdx[iSlice]);
520 //_______________________________________________________
521 TH1 *AliTRDcheckPID::PlotPH(const AliTRDtrackV1 *track)
524 // Plot the probabilities for electrons using 2-dim LQ
527 if(track) fTrack = track;
529 AliWarning("No Track defined.");
533 if(!CheckTrackQuality(fTrack)) return 0x0;
535 TObjArray *arr = 0x0;
536 TProfile2D *hPHX, *hPHT;
537 if(!(arr = dynamic_cast<TObjArray *>(fContainer->At(kPH)))){
538 AliWarning("No Histogram defined.");
541 hPHT = (TProfile2D*)arr->At(0);
542 hPHX = (TProfile2D*)arr->At(1);
545 Float_t momentum = 0.;
547 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
550 //AliWarning("No MC info available!");
551 AliTRDtrackV1 cTrack(*fTrack);
552 cTrack.SetReconstructor(fReconstructor);
553 momentum = cTrack.GetMomentum(0);
554 pdg = CalcPDG(&cTrack);
556 if(!IsInRange(momentum)) return 0x0;;
558 AliTRDseedV1 *tracklet = 0x0;
559 AliTRDcluster *cluster = 0x0;
560 Int_t species = AliTRDpidUtil::Pdg2Pid(pdg);
561 Int_t iBin = FindBin(species, momentum);
562 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
563 tracklet = fTrack->GetTracklet(iChamb);
564 if(!tracklet) continue;
565 Float_t x0 = tracklet->GetX0();
566 for(Int_t ic = 0; ic < AliTRDtrackerV1::GetNTimeBins(); ic++){
567 if(!(cluster = tracklet->GetClusters(ic))) continue;
568 hPHT -> Fill(iBin, cluster->GetLocalTimeBin(), TMath::Abs(cluster->GetQ()));
569 hPHX -> Fill(iBin, x0 - cluster->GetX(), tracklet->GetdQdl(ic));
576 //_______________________________________________________
577 TH1 *AliTRDcheckPID::PlotNClus(const AliTRDtrackV1 *track)
580 // Plot the probabilities for electrons using 2-dim LQ
583 if(track) fTrack = track;
585 AliWarning("No Track defined.");
589 if(!CheckTrackQuality(fTrack)) return 0x0;
592 if(!(hNClus = dynamic_cast<TH2F *>(fContainer->At(kNClus)))){
593 AliWarning("No Histogram defined.");
599 Float_t momentum = 0.;
601 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
604 //AliWarning("No MC info available!");
605 AliTRDtrackV1 cTrack(*fTrack);
606 cTrack.SetReconstructor(fReconstructor);
607 momentum = cTrack.GetMomentum(0);
608 pdg = CalcPDG(&cTrack);
610 if(!IsInRange(momentum)) return 0x0;
612 Int_t species = AliTRDpidUtil::AliTRDpidUtil::Pdg2Pid(pdg);
613 Int_t iBin = FindBin(species, momentum);
614 AliTRDseedV1 *tracklet = 0x0;
615 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
616 tracklet = fTrack->GetTracklet(iChamb);
617 if(!tracklet) continue;
618 hNClus -> Fill(iBin, tracklet->GetN());
624 //_______________________________________________________
625 TH1 *AliTRDcheckPID::PlotNTracklets(const AliTRDtrackV1 *track)
628 // Plot the probabilities for electrons using 2-dim LQ
631 if(track) fTrack = track;
633 AliWarning("No Track defined.");
638 if(!(hTracklets = dynamic_cast<TH2F *>(fContainer->At(kNTracklets)))){
639 AliWarning("No Histogram defined.");
643 AliTRDtrackV1 cTrack(*fTrack);
644 cTrack.SetReconstructor(fReconstructor);
646 Float_t momentum = 0.;
648 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
651 //AliWarning("No MC info available!");
652 momentum = cTrack.GetMomentum(0);
653 pdg = CalcPDG(&cTrack);
655 Int_t species = AliTRDpidUtil::Pdg2Pid(pdg);
656 if(!IsInRange(momentum)) return 0x0;
658 Int_t iBin = FindBin(species, momentum);
659 hTracklets -> Fill(iBin, cTrack.GetNumberOfTracklets());
663 //_______________________________________________________
664 TH1 *AliTRDcheckPID::PlotMom(const AliTRDtrackV1 *track)
667 // Plot the probabilities for electrons using 2-dim LQ
670 if(track) fTrack = track;
672 AliWarning("No Track defined.");
676 if(!CheckTrackQuality(fTrack)) return 0x0;
679 if(!(hMom = dynamic_cast<TH1F *>(fContainer->At(kMomentum)))){
680 AliWarning("No Histogram defined.");
686 Float_t momentum = 0.;
688 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
691 //AliWarning("No MC info available!");
692 AliTRDtrackV1 cTrack(*fTrack);
693 cTrack.SetReconstructor(fReconstructor);
694 momentum = cTrack.GetMomentum(0);
695 pdg = CalcPDG(&cTrack);
697 if(IsInRange(momentum)) hMom -> Fill(momentum);
702 //_______________________________________________________
703 TH1 *AliTRDcheckPID::PlotMomBin(const AliTRDtrackV1 *track)
706 // Plot the probabilities for electrons using 2-dim LQ
709 if(track) fTrack = track;
711 AliWarning("No Track defined.");
715 if(!CheckTrackQuality(fTrack)) return 0x0;
718 if(!(hMomBin = dynamic_cast<TH1F *>(fContainer->At(kMomentumBin)))){
719 AliWarning("No Histogram defined.");
725 Float_t momentum = 0.;
728 if(fMC->GetTrackRef()) momentum = fMC->GetTrackRef()->P();
731 //AliWarning("No MC info available!");
732 AliTRDtrackV1 cTrack(*fTrack);
733 cTrack.SetReconstructor(fReconstructor);
734 momentum = cTrack.GetMomentum(0);
736 if(IsInRange(momentum)) hMomBin -> Fill(fMomentumAxis->FindBin(momentum));
741 //________________________________________________________
742 Bool_t AliTRDcheckPID::GetRefFigure(Int_t ifig)
744 Bool_t FIRST = kTRUE;
745 TGraphErrors *g = 0x0;
747 TObjArray *arr = 0x0;
748 TH1 *h1 = 0x0, *h=0x0;
750 TList *content = 0x0;
753 gPad->Divide(2, 1, 1.e-5, 1.e-5);
754 TList *l=gPad->GetListOfPrimitives();
755 TVirtualPad *pad = ((TVirtualPad*)l->At(0));pad->cd();
756 pad->SetMargin(0.1, 0.01, 0.1, 0.01);
758 TLegend *legEff = new TLegend(.7, .7, .98, .98);
759 legEff->SetBorderSize(1);
760 content = (TList *)fGraph->FindObject("Efficiencies");
761 if(!(g = (TGraphErrors*)content->At(AliTRDpidUtil::kLQ))) break;
762 if(!g->GetN()) break;
763 legEff->SetHeader("PID Method");
765 ax = g->GetHistogram()->GetXaxis();
766 ax->SetTitle("p (GeV/c)");
767 ax->SetRangeUser(.5, 11.);
768 ax->SetMoreLogLabels();
769 ax = g->GetHistogram()->GetYaxis();
770 ax->SetTitle("#epsilon_{#pi}");
771 ax->SetRangeUser(1.e-3, 1.e-1);
772 legEff->AddEntry(g, "2D LQ", "pl");
773 if(! (g = (TGraphErrors*)content->At(AliTRDpidUtil::kNN))) break;
775 legEff->AddEntry(g, "NN", "pl");
776 if(! (g = (TGraphErrors*)content->At(AliTRDpidUtil::kESD))) break;
778 legEff->AddEntry(g, "ESD", "pl");
785 pad = ((TVirtualPad*)l->At(1));pad->cd();
786 pad->SetMargin(0.1, 0.01, 0.1, 0.01);
787 content = (TList *)fGraph->FindObject("Thresholds");
788 if(!(g = (TGraphErrors*)content->At(AliTRDpidUtil::kLQ))) break;
789 if(!g->GetN()) break;
791 ax = g->GetHistogram()->GetXaxis();
792 ax->SetTitle("p (GeV/c)");
793 ax->SetRangeUser(.5, 11.5);
794 ax->SetMoreLogLabels();
795 ax = g->GetHistogram()->GetYaxis();
796 ax->SetTitle("threshold (%)");
797 ax->SetRangeUser(5.e-2, 1.);
798 if(!(g = (TGraphErrors*)content->At(AliTRDpidUtil::kNN))) break;
800 if(!(g = (TGraphErrors*)content->At(AliTRDpidUtil::kESD))) break;
808 // save 2.0 GeV projection as reference
809 TLegend *legdEdx = new TLegend(.7, .7, .98, .98);
810 legdEdx->SetBorderSize(1);
812 if(!(h2 = (TH2F*)(fContainer->At(kdEdx)))) break;
813 legdEdx->SetHeader("Particle Species");
814 gPad->SetMargin(0.1, 0.01, 0.1, 0.01);
815 for(Int_t is = AliPID::kSPECIES-1; is>=0; is--){
816 Int_t bin = FindBin(is, 2.);
817 h1 = h2->ProjectionY("px", bin, bin);
818 if(!h1->GetEntries()) continue;
819 h1->Scale(1./h1->Integral());
820 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
822 h1->GetXaxis()->SetTitle("dE/dx (a.u.)");
823 h1->GetYaxis()->SetTitle("<Entries>");
825 h = (TH1F*)h1->DrawClone(FIRST ? "c" : "samec");
826 legdEdx->AddEntry(h, Form("%s", AliTRDCalPID::GetPartName(is)), "l");
840 gPad->Divide(2, 1, 1.e-5, 1.e-5);
841 TList *l=gPad->GetListOfPrimitives();
843 // save 2.0 GeV projection as reference
844 TLegend *legPH = new TLegend(.4, .7, .68, .98);
845 legPH->SetBorderSize(1);legPH->SetFillColor(0);
846 legPH->SetHeader("Particle Species");
847 if(!(arr = (TObjArray*)(fContainer->At(kPH)))) break;
848 if(!(h2 = (TProfile2D*)(arr->At(0)))) break;
850 TVirtualPad *pad = ((TVirtualPad*)l->At(0));pad->cd();
851 pad->SetMargin(0.1, 0.01, 0.1, 0.01);
853 for(Int_t is=0; is<AliPID::kSPECIES; is++){
854 Int_t bin = FindBin(is, 2.);
855 h1 = h2->ProjectionY("pyt", bin, bin);
856 if(!h1->GetEntries()) continue;
857 h1->SetMarkerStyle(24);
858 h1->SetMarkerColor(AliTRDCalPID::GetPartColor(is));
859 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
861 h1->GetXaxis()->SetTitle("t_{drift} [100*ns]");
862 h1->GetYaxis()->SetTitle("<dQ/dt> [a.u.]");
864 h = (TH1F*)h1->DrawClone(FIRST ? "c" : "samec");
865 legPH->AddEntry(h, Form("%s", AliTRDCalPID::GetPartName(is)), "pl");
869 pad = ((TVirtualPad*)l->At(1));pad->cd();
870 pad->SetMargin(0.1, 0.01, 0.1, 0.01);
871 if(!(h2 = (TProfile2D*)(arr->At(1)))) break;
873 for(Int_t is=0; is<AliPID::kSPECIES; is++){
874 Int_t bin = FindBin(is, 2.);
875 h1 = h2->ProjectionY("pyx", bin, bin);
876 if(!h1->GetEntries()) continue;
877 h1->SetMarkerStyle(24);
878 h1->SetMarkerColor(AliTRDCalPID::GetPartColor(is));
879 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
881 h1->GetXaxis()->SetTitle("x_{drift} [cm]");
882 h1->GetYaxis()->SetTitle("<dQ/dl> [a.u./cm]");
884 h = (TH1F*)h1->DrawClone(FIRST ? "c" : "samec");
897 // save 2.0 GeV projection as reference
898 TLegend *legNClus = new TLegend(.4, .7, .68, .98);
899 legNClus->SetBorderSize(1);
901 if(!(h2 = (TH2F*)(fContainer->At(kNClus)))) break;
902 legNClus->SetHeader("Particle Species");
903 for(Int_t is=0; is<AliPID::kSPECIES; is++){
904 Int_t bin = FindBin(is, 2.);
905 h1 = h2->ProjectionY("pyNClus", bin, bin);
906 if(!h1->GetEntries()) continue;
907 h1->Scale(100./h1->Integral());
908 //h1->SetMarkerStyle(24);
909 //h1->SetMarkerColor(AliTRDCalPID::GetPartColor(is));
910 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
911 if(FIRST) h1->GetXaxis()->SetTitle("N^{cl}/tracklet");
912 if(FIRST) h1->GetYaxis()->SetTitle("Prob. [%]");
913 h = (TH1F*)h1->DrawClone(FIRST ? "c" : "samec");
914 legNClus->AddEntry(h, Form("%s", AliTRDCalPID::GetPartName(is)), "l");
929 TLegend *legNClus = new TLegend(.4, .7, .68, .98);
930 legNClus->SetBorderSize(1);
932 if(!(h2 = (TH2F*)(fContainer->At(kNTracklets)))) break;
933 legNClus->SetHeader("Particle Species");
934 for(Int_t is=0; is<AliPID::kSPECIES; is++){
935 Int_t bin = FindBin(is, 2.);
936 h1 = h2->ProjectionY("pyNTracklets", bin, bin);
937 if(!h1->GetEntries()) continue;
938 h1->Scale(100./h1->Integral());
939 //h1->SetMarkerStyle(24);
940 //h1->SetMarkerColor(AliTRDCalPID::GetPartColor(is));
941 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
943 h1->GetXaxis()->SetTitle("N^{trklt}/track");
944 h1->GetXaxis()->SetRangeUser(1.,6.);
945 h1->GetYaxis()->SetTitle("Prob. [%]");
947 h = (TH1F*)h1->DrawClone(FIRST ? "c" : "samec");
948 legNClus->AddEntry(h, Form("%s", AliTRDCalPID::GetPartName(is)), "l");
960 AliInfo(Form("Reference plot [%d] missing result", ifig));
964 //________________________________________________________________________
965 Bool_t AliTRDcheckPID::PostProcess()
967 // Draw result to the screen
968 // Called once at the end of the query
971 Printf("ERROR: list not available");
974 if(!(fEfficiency = dynamic_cast<TObjArray *>(fContainer->At(kEfficiency)))){
975 AliError("Efficiency container missing.");
979 fGraph = new TObjArray(6);
981 EvaluatePionEfficiency(fEfficiency, fGraph, 0.9);
987 //________________________________________________________________________
988 void AliTRDcheckPID::EvaluatePionEfficiency(TObjArray *histoContainer, TObjArray *results, Float_t electron_efficiency){
989 fUtil->SetElectronEfficiency(electron_efficiency);
991 Color_t colors[3] = {kBlue, kGreen+2, kRed};
992 Int_t markerStyle[3] = {7, 7, 24};
993 TString MethodName[3] = {"LQ", "NN", "ESD"};
995 TGraphErrors *g, *gPtrEff[3], *gPtrThres[3];
996 TObjArray *eff = new TObjArray(3); eff->SetOwner(); eff->SetName("Efficiencies");
997 results->AddAt(eff, 0);
998 for(Int_t iMethod = 0; iMethod < 3; iMethod++){
999 eff->AddAt(g = gPtrEff[iMethod] = new TGraphErrors(), iMethod);
1000 g->SetName(Form("efficiency_%s", MethodName[iMethod].Data()));
1001 g->SetLineColor(colors[iMethod]);
1002 g->SetMarkerColor(colors[iMethod]);
1003 g->SetMarkerStyle(markerStyle[iMethod]);
1007 TObjArray *thres = new TObjArray(3); thres->SetOwner(); thres->SetName("Thresholds");
1008 results->AddAt(thres, 1);
1009 for(Int_t iMethod = 0; iMethod < 3; iMethod++){
1010 thres->AddAt(g = gPtrThres[iMethod] = new TGraphErrors(), iMethod);
1011 g->SetName(Form("threshold_%s", MethodName[iMethod].Data()));
1012 g->SetLineColor(colors[iMethod]);
1013 g->SetMarkerColor(colors[iMethod]);
1014 g->SetMarkerStyle(markerStyle[iMethod]);
1018 TH1D *Histo1=0x0, *Histo2=0x0;
1021 hPtr[0] = (TH2F*)histoContainer->At(AliTRDpidUtil::kLQ);
1022 hPtr[1] = (TH2F*)histoContainer->At(AliTRDpidUtil::kNN);
1023 hPtr[2] = (TH2F*)histoContainer->At(AliTRDpidUtil::kESD);
1025 for(Int_t iMom = 0; iMom < fMomentumAxis->GetNbins(); iMom++){
1026 mom = fMomentumAxis->GetBinCenter(iMom+1);
1028 Int_t binEl = fMomentumAxis->GetNbins() * AliPID::kElectron + iMom + 1,
1029 binPi = fMomentumAxis->GetNbins() * AliPID::kPion + iMom + 1;
1030 for(Int_t iMethod = 0; iMethod < 3; iMethod++){
1031 // Calculate the Pion Efficiency at 90% electron efficiency for each Method
1032 Histo1 = hPtr[iMethod] -> ProjectionY(Form("%s_ele", MethodName[iMethod].Data()), binEl, binEl);
1033 Histo2 = hPtr[iMethod] -> ProjectionY(Form("%s_pio", MethodName[iMethod].Data()), binPi, binPi);
1035 if(!fUtil->CalculatePionEffi(Histo1, Histo2)) continue;
1037 gPtrEff[iMethod]->SetPoint(iMom, mom, fUtil->GetPionEfficiency());
1038 gPtrEff[iMethod]->SetPointError(iMom, 0., fUtil->GetError());
1039 gPtrThres[iMethod]->SetPoint(iMom, mom, fUtil->GetThreshold());
1040 gPtrThres[iMethod]->SetPointError(iMom, 0., 0.);
1042 if(fDebugLevel>=2) Printf(Form("Pion Efficiency for 2-dim LQ is : %f +/- %f\n\n", MethodName[iMethod].Data()), fUtil->GetPionEfficiency(), fUtil->GetError());
1047 //________________________________________________________________________
1048 void AliTRDcheckPID::Terminate(Option_t *)
1050 // Draw result to the screen
1051 // Called once at the end of the query
1053 fContainer = dynamic_cast<TObjArray*>(GetOutputData(0));
1055 Printf("ERROR: list not available");