8 #include "TProfile2D.h"
10 #include "TGraphErrors.h"
12 #include <TClonesArray.h>
13 #include <TObjArray.h>
16 // #include "AliPID.h"
17 #include "AliESDEvent.h"
18 #include "AliESDInputHandler.h"
19 #include "AliTrackReference.h"
21 #include "AliAnalysisTask.h"
22 // #include "AliAnalysisManager.h"
24 #include "AliTRDtrackerV1.h"
25 #include "AliTRDtrackV1.h"
26 #include "AliTRDcluster.h"
27 #include "AliTRDReconstructor.h"
28 #include "AliCDBManager.h"
29 // #include "../Cal/AliTRDCalPID.h"
30 #include "AliTRDpidUtil.h"
33 #include "AliTRDpidChecker.h"
34 #include "AliTRDtrackInfo/AliTRDtrackInfo.h"
36 // calculate pion efficiency at 90% electron efficiency for 11 momentum bins
37 // this task should be used with simulated data only
39 ClassImp(AliTRDpidChecker)
41 //________________________________________________________________________
42 AliTRDpidChecker::AliTRDpidChecker()
43 :AliTRDrecoTask("PID", "PID Checker")
47 // Default constructor
50 fReconstructor = new AliTRDReconstructor();
51 fReconstructor->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
55 //________________________________________________________________________
56 AliTRDpidChecker::~AliTRDpidChecker()
58 if(fReconstructor) delete fReconstructor;
62 //________________________________________________________________________
63 void AliTRDpidChecker::CreateOutputObjects()
68 OpenFile(0, "RECREATE");
69 Int_t xBins = AliPID::kSPECIES*AliTRDCalPID::kNMom;
70 fContainer = new TObjArray();
71 fContainer -> Expand(kGraphNN + 1);
73 const Float_t epsilon = 1./(2*(AliTRDpidUtil::kBins-1)); // get nice histos with bin center at 0 and 1
75 // histos of the electron probability of all 5 particle species and 11 momenta for the 2-dim LQ method
77 new TH2F("PID_LQ", "",
78 xBins, -0.5, xBins - 0.5,
79 AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon)
83 // histos of the electron probability of all 5 particle species and 11 momenta for the neural network method
85 new TH2F("PID_NN", "",
86 xBins, -0.5, xBins - 0.5,
87 AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon)
90 // histos of the dE/dx distribution for all 5 particle species and 11 momenta
93 xBins, -0.5, xBins - 0.5,
97 // histos of the pulse height distribution for all 5 particle species and 11 momenta
99 new TProfile2D("PH", "",
100 xBins, -0.5, xBins - 0.5,
101 AliTRDtrackerV1::GetNTimeBins(), -0.5, AliTRDtrackerV1::GetNTimeBins() - 0.5)
104 // histos of the number of clusters distribution for all 5 particle species and 11 momenta
106 new TH2F("NClus", "",
107 xBins, -0.5, xBins - 0.5,
108 AliTRDtrackerV1::GetNTimeBins(), -0.5, AliTRDtrackerV1::GetNTimeBins() - 0.5)
112 // momentum distributions - absolute and in momentum bins
113 fContainer->AddAt(new TH1F("hMom", "momentum distribution", 100, 0., 12.),kMomentum);
114 fContainer->AddAt(new TH1F("hMomBin", "momentum distribution in momentum bins", AliTRDCalPID::kNMom, 0.5, 11.5),kMomentumBin);
117 // TGraph of the pion efficiencies
119 TGraphErrors *gEffisLQ = 0x0;
120 TGraphErrors *gEffisNN = 0x0;
122 fContainer->AddAt(gEffisLQ = new TGraphErrors(), kGraphLQ);
123 gEffisLQ->SetLineColor(kBlue);
124 gEffisLQ->SetMarkerColor(kBlue);
125 gEffisLQ->SetMarkerStyle(29);
127 fContainer -> AddAt(gEffisNN = new TGraphErrors(),kGraphNN);
128 gEffisNN->SetLineColor(kRed);
129 gEffisNN->SetMarkerColor(kRed);
130 gEffisNN->SetMarkerStyle(29);
132 gEffisLQ -> SetNameTitle("gEffisLQErr", "Efficiencies and Errors of the 2-dim LQ method");
133 gEffisNN -> SetNameTitle("gEffisNNErr", "Efficiencies and Errors of the NN method");
137 //________________________________________________________________________
138 void AliTRDpidChecker::Exec(Option_t *)
141 // Called for each event
144 // if(!AliTracker::GetFieldMap()){
145 // AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 2, 1., 10., AliMagFMaps::k5kG);
146 // AliTracker::SetFieldMap(field, kTRUE);
155 hPIDLQ = (TH2F*)fContainer->At(kLQlikelihood);
156 hPIDNN = (TH2F*)fContainer->At(kNNlikelihood);
157 hdEdx = (TH2F*)fContainer->At(kdEdx);
158 hPH = (TProfile2D*)fContainer->At(kPH);
159 hNClus = (TH2F*)fContainer->At(kNClus);
161 TH1F *hMom = (TH1F*)fContainer->At(kMomentum);
162 TH1F *hMomBin = (TH1F*)fContainer->At(kMomentumBin);
164 Int_t labelsacc[10000];
165 memset(labelsacc, 0, sizeof(Int_t) * 10000);
172 AliTRDtrackInfo *track = 0x0;
173 AliTRDtrackV1 *TRDtrack = 0x0;
174 AliTrackReference *ref = 0x0;
175 AliExternalTrackParam *esd = 0x0;
177 AliTRDseedV1 *TRDtracklet[AliTRDgeometry::kNlayer];
178 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++)
179 TRDtracklet[iChamb] = 0x0;
181 AliTRDcluster *TRDcluster = 0x0;
183 AliTRDpidUtil *util = new AliTRDpidUtil();
184 for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
185 track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
186 if(!track->HasESDtrack()) continue;
187 status = track->GetStatus();
188 if(!(status&AliESDtrack::kTPCout)) continue;
190 if(!(TRDtrack = track->GetTRDtrack())) continue;
191 //&&(track->GetNumberOfClustersRefit()
193 // use only tracks that hit 6 chambers
194 if(!(TRDtrack->GetNumberOfTracklets() == AliTRDgeometry::kNlayer)) continue;
196 ref = track->GetTrackRef(0);
197 esd = track->GetOuterParam();
198 mom = ref ? ref->P(): esd->P();
200 labelsacc[nTRD] = track->GetLabel();
204 // set the 11 momentum bins
206 iMomBin = util -> GetMomentumBin(mom);
207 if(fDebugLevel>=4) Printf("MomBin[%d] MomTot[%f]", iMomBin, mom);
210 // fill momentum histo to have the momentum distribution
212 hMomBin -> Fill(iMomBin);
215 // set the reconstructor
216 TRDtrack -> SetReconstructor(fReconstructor);
219 // if no monte carlo data available -> use TRDpid
221 fReconstructor -> SetOption("nn");
222 TRDtrack -> CookPID();
223 if(TRDtrack -> GetPID(0) > TRDtrack -> GetPID(1) + TRDtrack -> GetPID(2) + TRDtrack -> GetPID(3) + TRDtrack -> GetPID(4)){
224 track -> SetPDG(kElectron);
226 else if(TRDtrack -> GetPID(4) > TRDtrack -> GetPID(2) && TRDtrack -> GetPID(4) > TRDtrack -> GetPID(3) && TRDtrack -> GetPID(4) > TRDtrack -> GetPID(1)){
227 track -> SetPDG(kProton);
229 else if(TRDtrack -> GetPID(3) > TRDtrack -> GetPID(1) && TRDtrack -> GetPID(3) > TRDtrack -> GetPID(2)){
230 track -> SetPDG(kKPlus);
232 else if(TRDtrack -> GetPID(1) > TRDtrack -> GetPID(2)){
233 track -> SetPDG(kMuonPlus);
236 track -> SetPDG(kPiPlus);
241 // calculate the probabilities for electron probability using 2-dim LQ, the deposited charge per chamber and the pulse height spectra and fill histograms
242 fReconstructor -> SetOption("!nn");
243 TRDtrack -> CookPID();
245 if(fDebugLevel>=4) Printf("PIDmethod[%d] Slices[%d] PDG[%d] LQLike[%f]", fReconstructor->GetPIDMethod(), fReconstructor->GetNdEdxSlices(), track->GetPDG(), TRDtrack -> GetPID(0));
248 // Bool_t bChange = kFALSE;
250 Float_t SumdEdx[AliTRDgeometry::kNlayer];
251 Int_t iNClus[AliTRDgeometry::kNlayer];
253 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
254 TRDtracklet[iChamb] = TRDtrack -> GetTracklet(iChamb);
256 // if(!(TRDtracklet[iChamb] -> GetNChange() == 0))
259 SumdEdx[iChamb] = 0.;
261 iNClus[iChamb] = TRDtracklet[iChamb] -> GetN();
262 // Printf("NClus[%d]", iNClus[iChamb]);
263 fdEdx = TRDtracklet[iChamb] -> GetdEdx();
264 SumdEdx[iChamb] += fdEdx[0] + fdEdx[1] + fdEdx[2];
267 // if(bChange == kTRUE)
270 switch(track->GetPDG()){
273 hPIDLQ -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
274 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
275 hdEdx -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
276 hNClus -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, iNClus[iChamb]);
277 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
278 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
280 hPH -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
286 hPIDLQ -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
287 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
288 hdEdx -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
289 hNClus -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, iNClus[iChamb]);
290 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
291 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
293 hPH -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
299 hPIDLQ -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
300 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
301 hdEdx -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
302 hNClus -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, iNClus[iChamb]);
303 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
304 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
306 hPH -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
312 hPIDLQ -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
313 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
314 hdEdx -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
315 hNClus -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, iNClus[iChamb]);
316 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
317 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
319 hPH -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
325 hPIDLQ -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
326 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
327 hdEdx -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
328 hNClus -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, iNClus[iChamb]);
329 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
330 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
332 hPH -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
339 // calculate the probabilities and fill histograms for electrons using NN
340 fReconstructor -> SetOption("nn");
344 if(fDebugLevel>=4) Printf("PIDmethod[%d] Slices[%d] PDG[%d] NNLike[%f]", fReconstructor->GetPIDMethod(), fReconstructor->GetNdEdxSlices(), track->GetPDG(), TRDtrack -> GetPID(0));
347 switch(track->GetPDG()){
350 hPIDNN -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
354 hPIDNN -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
358 hPIDNN -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
362 hPIDNN -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
366 hPIDNN -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
373 PostData(0, fContainer);
377 //________________________________________________________
378 void AliTRDpidChecker::GetRefFigure(Int_t ifig)
380 Bool_t FIRST = kTRUE;
381 TGraphErrors *g = 0x0;
386 g = (TGraphErrors*)fContainer->At(kGraphStart);
388 g->GetHistogram()->GetXaxis()->SetTitle("p [GeV/c]");
389 g->GetHistogram()->GetXaxis()->SetRangeUser(.6, 10.5);
390 g->GetHistogram()->GetYaxis()->SetTitle("#epsilon_{#pi} [%]");
391 ((TGraphErrors*)fContainer->At(kGraphStart+1))->Draw("pl");
398 // save 2.0 GeV projection as reference
400 h2 = (TH2F*)(fContainer->At(kdEdx));
401 for(Int_t is = AliPID::kSPECIES-1; is>=0; is--){
402 Int_t bin = is*AliTRDCalPID::kNMom+4;
403 h1 = h2->ProjectionY("px", bin, bin);
404 if(!h1->GetEntries()) continue;
405 h1->Scale(1./h1->Integral());
406 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
407 h1->DrawClone(FIRST ? "c" : "samec");
416 // save 2.0 GeV projection as reference
418 h2 = (TH2F*)(fContainer->At(kPH));
419 for(Int_t is=0; is<AliPID::kSPECIES; is++){
420 Int_t bin = is*AliTRDCalPID::kNMom+4;
421 h1 = h2->ProjectionY("py", bin, bin);
422 if(!h1->GetEntries()) continue;
423 h1->SetMarkerStyle(24);
424 h1->SetMarkerColor(AliTRDCalPID::GetPartColor(is));
425 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
426 h1->DrawClone(FIRST ? "e2" : "same e2");
435 // save 2.0 GeV projection as reference
437 h2 = (TH2F*)(fContainer->At(kNClus));
438 for(Int_t is=0; is<AliPID::kSPECIES; is++){
439 Int_t bin = is*AliTRDCalPID::kNMom+4;
440 h1 = h2->ProjectionY("py", bin, bin);
441 if(!h1->GetEntries()) continue;
442 h1->SetMarkerStyle(24);
443 h1->SetMarkerColor(AliTRDCalPID::GetPartColor(is));
444 h1->SetLineColor(AliTRDCalPID::GetPartColor(is));
445 h1->DrawClone(FIRST ? "e2" : "same e2");
456 //________________________________________________________________________
457 Bool_t AliTRDpidChecker::PostProcess()
459 // Draw result to the screen
460 // Called once at the end of the query
463 Printf("ERROR: list not available");
466 // return kTRUE; // testing protection
469 // container for the pion efficiencies and the errors
470 Double_t PionEffiLQ[AliTRDCalPID::kNMom],
471 PionEffiErrorLQ[AliTRDCalPID::kNMom],
472 EleEffiLQ[AliTRDCalPID::kNMom],
473 ThresholdLQ[AliTRDCalPID::kNMom];
475 Double_t PionEffiNN[AliTRDCalPID::kNMom],
476 PionEffiErrorNN[AliTRDCalPID::kNMom],
477 EleEffiNN[AliTRDCalPID::kNMom],
478 ThresholdNN[AliTRDCalPID::kNMom];
482 TH1D *Histo1=0x0, *Histo2=0x0;
484 TH2F *hPIDLQ=0x0, *hPIDNN=0x0;
485 hPIDLQ = (TH2F*)fContainer->At(kLQlikelihood);
486 hPIDNN = (TH2F*)fContainer->At(kNNlikelihood);
488 // calculate the pion efficiencies and the errors for 90% electron efficiency (2-dim LQ)
489 for(Int_t iMom = 0; iMom < AliTRDCalPID::kNMom; iMom++){
491 AliTRDpidUtil *util = new AliTRDpidUtil();
492 mom = AliTRDCalPID::GetMomentum(iMom);
494 Histo1 = hPIDLQ -> ProjectionY("LQ_ele",AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1,AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1);
495 Histo2 = hPIDLQ -> ProjectionY("LQ_pio",AliTRDCalPID::kNMom*AliPID::kPion+iMom+1,AliTRDCalPID::kNMom*AliPID::kPion+iMom+1);
497 util -> CalculatePionEffi(Histo1, Histo2);
499 PionEffiLQ[iMom] = util -> GetPionEfficiency();
500 PionEffiErrorLQ[iMom] = util -> GetError();
501 EleEffiLQ[iMom] = util -> GetCalcElectronEfficiency();
502 ThresholdLQ[iMom] = util -> GetThreshold();
504 if(fDebugLevel>=1) Printf("Pion Efficiency for 2-dim LQ is : %f +/- %f\n\n", PionEffiLQ[iMom], PionEffiErrorLQ[iMom]);
510 // calculate the pion efficiencies and the errors for 90% electron efficiency (NN)
511 for(Int_t iMom = 0; iMom < AliTRDCalPID::kNMom; iMom++){
513 AliTRDpidUtil *util = new AliTRDpidUtil();
514 mom = AliTRDCalPID::GetMomentum(iMom);
516 Histo1 = hPIDNN -> ProjectionY("NN_ele",AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1,AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1);
517 Histo2 = hPIDNN -> ProjectionY("NN_pio",AliTRDCalPID::kNMom*AliPID::kPion+iMom+1,AliTRDCalPID::kNMom*AliPID::kPion+iMom+1);
519 util -> CalculatePionEffi(Histo1, Histo2);
521 PionEffiNN[iMom] = util -> GetPionEfficiency();
522 PionEffiErrorNN[iMom] = util -> GetError();
523 EleEffiNN[iMom] = util -> GetCalcElectronEfficiency();
524 ThresholdNN[iMom] = util -> GetThreshold();
526 if(fDebugLevel>=1) Printf("Pion Efficiency for NN is : %f +/- %f\n\n", PionEffiNN[iMom], PionEffiErrorNN[iMom]);
532 // create TGraph to plot the pion efficiencies
533 TGraphErrors *gEffisLQ=0x0, *gEffisNN=0x0;
534 gEffisLQ = (TGraphErrors*)fContainer->At(kGraphLQ);
535 gEffisNN = (TGraphErrors*)fContainer->At(kGraphNN);
538 for(Int_t iBin = 0; iBin < AliTRDCalPID::kNMom; iBin++){
540 Float_t momentum = AliTRDCalPID::GetMomentum(iBin);
541 gEffisLQ->SetPoint(iBin, momentum, PionEffiLQ[iBin]);
542 gEffisLQ->SetPointError(iBin, 0., PionEffiErrorLQ[iBin]);
544 gEffisNN->SetPoint(iBin, momentum, PionEffiNN[iBin]);
545 gEffisNN->SetPointError(iBin, 0., PionEffiErrorNN[iBin]);
549 fNRefFigures = 4/*1*/;
550 return kTRUE; // testing protection
554 //________________________________________________________________________
555 void AliTRDpidChecker::Terminate(Option_t *)
557 // Draw result to the screen
558 // Called once at the end of the query
560 fContainer = dynamic_cast<TObjArray*>(GetOutputData(0));
562 Printf("ERROR: list not available");