7 #include "TProfile2D.h"
9 #include "TGraphErrors.h"
11 #include <TClonesArray.h>
12 #include <TObjArray.h>
15 // #include "AliPID.h"
16 #include "AliESDEvent.h"
17 #include "AliESDInputHandler.h"
18 #include "AliTrackReference.h"
20 #include "AliAnalysisTask.h"
21 // #include "AliAnalysisManager.h"
23 #include "AliTRDtrackerV1.h"
24 #include "AliTRDtrackV1.h"
25 #include "AliTRDcluster.h"
26 #include "AliTRDReconstructor.h"
27 #include "AliCDBManager.h"
28 // #include "../Cal/AliTRDCalPID.h"
29 #include "AliTRDpidUtil.h"
32 #include "AliTRDpidChecker.h"
33 #include "AliTRDtrackInfo/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(AliTRDpidChecker)
40 //________________________________________________________________________
41 AliTRDpidChecker::AliTRDpidChecker()
42 :AliTRDrecoTask("PID", "PID Checker")
46 // Default constructor
49 fReconstructor = new AliTRDReconstructor();
50 fReconstructor->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
54 //________________________________________________________________________
55 AliTRDpidChecker::~AliTRDpidChecker()
57 if(fReconstructor) delete fReconstructor;
61 //________________________________________________________________________
62 void AliTRDpidChecker::CreateOutputObjects()
67 OpenFile(0, "RECREATE");
68 Int_t xBins = AliPID::kSPECIES*AliTRDCalPID::kNMom;
69 fContainer = new TObjArray();
70 fContainer -> Expand(kGraphNN + 1);
72 const Float_t epsilon = 1./(2*(AliTRDpidUtil::kBins-1)); // get nice histos with bin center at 0 and 1
74 // histos of the electron probability of all 5 particle species and 11 momenta for the 2-dim LQ method
76 new TH2F("PID_LQ", "",
77 xBins, -0.5, xBins - 0.5,
78 AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon)
82 // histos of the electron probability of all 5 particle species and 11 momenta for the neural network method
84 new TH2F("PID_NN", "",
85 xBins, -0.5, xBins - 0.5,
86 AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon)
89 // histos of the dE/dx distribution for all 5 particle species and 11 momenta
92 xBins, -0.5, xBins - 0.5,
96 // histos of the pulse height distribution for all 5 particle species and 11 momenta
98 new TProfile2D("PH", "",
99 xBins, -0.5, xBins - 0.5,
100 AliTRDtrackerV1::GetNTimeBins(), -0.5, AliTRDtrackerV1::GetNTimeBins() - 0.5)
104 // momentum distributions - absolute and in momentum bins
105 fContainer->AddAt(new TH1F("hMom", "momentum distribution", 100, 0., 12.),kMomentum);
106 fContainer->AddAt(new TH1F("hMomBin", "momentum distribution in momentum bins", AliTRDCalPID::kNMom, 0.5, 11.5),kMomentumBin);
109 // TGraph of the pion efficiencies
111 TGraphErrors *gEffisLQ = 0x0;
112 TGraphErrors *gEffisNN = 0x0;
114 fContainer->AddAt(gEffisLQ = new TGraphErrors(), kGraphLQ);
115 gEffisLQ->SetLineColor(kBlue);
116 gEffisLQ->SetMarkerColor(kBlue);
117 gEffisLQ->SetMarkerStyle(29);
119 fContainer -> AddAt(gEffisNN = new TGraphErrors(),kGraphNN);
120 gEffisNN->SetLineColor(kRed);
121 gEffisNN->SetMarkerColor(kRed);
122 gEffisNN->SetMarkerStyle(29);
124 gEffisLQ -> SetNameTitle("gEffisLQErr", "Efficiencies and Errors of the 2-dim LQ method");
125 gEffisNN -> SetNameTitle("gEffisNNErr", "Efficiencies and Errors of the NN method");
129 //________________________________________________________________________
130 void AliTRDpidChecker::Exec(Option_t *)
133 // Called for each event
136 // if(!AliTracker::GetFieldMap()){
137 // AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 2, 1., 10., AliMagFMaps::k5kG);
138 // AliTracker::SetFieldMap(field, kTRUE);
146 hPIDLQ = (TH2F*)fContainer->At(kLQlikelihood);
147 hPIDNN = (TH2F*)fContainer->At(kNNlikelihood);
148 hdEdx = (TH2F*)fContainer->At(kdEdx);
149 hPH = (TProfile2D*)fContainer->At(kPH);
151 TH1F *hMom = (TH1F*)fContainer->At(kMomentum);
152 TH1F *hMomBin = (TH1F*)fContainer->At(kMomentumBin);
154 Int_t labelsacc[10000];
155 memset(labelsacc, 0, sizeof(Int_t) * 10000);
162 AliTRDtrackInfo *track = 0x0;
163 AliTRDtrackV1 *TRDtrack = 0x0;
164 AliTrackReference *ref = 0x0;
165 AliExternalTrackParam *esd = 0x0;
167 AliTRDseedV1 *TRDtracklet[AliTRDgeometry::kNlayer];
168 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++)
169 TRDtracklet[iChamb] = 0x0;
171 AliTRDcluster *TRDcluster = 0x0;
173 AliTRDpidUtil *util = new AliTRDpidUtil();
174 for(Int_t itrk=0; itrk<fTracks->GetEntriesFast(); itrk++){
175 track = (AliTRDtrackInfo*)fTracks->UncheckedAt(itrk);
176 if(!track->HasESDtrack()) continue;
177 status = track->GetStatus();
178 if(!(status&AliESDtrack::kTPCout)) continue;
180 if(!(TRDtrack = track->GetTRDtrack())) continue;
181 //&&(track->GetNumberOfClustersRefit()
183 // use only tracks that hit 6 chambers
184 if(!(TRDtrack->GetNumberOfTracklets() == AliTRDgeometry::kNlayer)) continue;
186 ref = track->GetTrackRef(0);
187 esd = track->GetOuterParam();
188 mom = ref ? ref->P(): esd->P();
190 labelsacc[nTRD] = track->GetLabel();
194 // set the 11 momentum bins
196 iMomBin = util -> GetMomentumBin(mom);
197 if(fDebugLevel>=4) Printf("MomBin[%d] MomTot[%f]", iMomBin, mom);
200 // fill momentum histo to have the momentum distribution
202 hMomBin -> Fill(iMomBin);
205 // set the reconstructor
206 TRDtrack -> SetReconstructor(fReconstructor);
209 // if no monte carlo data available -> use TRDpid
211 fReconstructor -> SetOption("nn");
212 TRDtrack -> CookPID();
213 if(TRDtrack -> GetPID(0) > TRDtrack -> GetPID(1) + TRDtrack -> GetPID(2) + TRDtrack -> GetPID(3) + TRDtrack -> GetPID(4)){
214 track -> SetPDG(kElectron);
216 else if(TRDtrack -> GetPID(4) > TRDtrack -> GetPID(2) && TRDtrack -> GetPID(4) > TRDtrack -> GetPID(3) && TRDtrack -> GetPID(4) > TRDtrack -> GetPID(1)){
217 track -> SetPDG(kProton);
219 else if(TRDtrack -> GetPID(3) > TRDtrack -> GetPID(1) && TRDtrack -> GetPID(3) > TRDtrack -> GetPID(2)){
220 track -> SetPDG(kKPlus);
222 else if(TRDtrack -> GetPID(1) > TRDtrack -> GetPID(2)){
223 track -> SetPDG(kMuonPlus);
226 track -> SetPDG(kPiPlus);
231 // calculate the probabilities for electron probability using 2-dim LQ, the deposited charge per chamber and the pulse height spectra and fill histograms
232 fReconstructor -> SetOption("!nn");
233 TRDtrack -> CookPID();
235 if(fDebugLevel>=4) Printf("PIDmethod[%d] Slices[%d] PDG[%d] LQLike[%f]", fReconstructor->GetPIDMethod(), fReconstructor->GetNdEdxSlices(), track->GetPDG(), TRDtrack -> GetPID(0));
238 Float_t SumdEdx[AliTRDgeometry::kNlayer];
239 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
240 TRDtracklet[iChamb] = TRDtrack -> GetTracklet(iChamb);
241 SumdEdx[iChamb] = 0.;
242 fdEdx = TRDtracklet[iChamb] -> GetdEdx();
243 SumdEdx[iChamb] += fdEdx[0] + fdEdx[1] + fdEdx[2];
246 switch(track->GetPDG()){
249 hPIDLQ -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
250 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
251 hdEdx -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
252 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
253 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
255 hPH -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
261 hPIDLQ -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
262 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
263 hdEdx -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
264 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
265 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
267 hPH -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
273 hPIDLQ -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
274 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
275 hdEdx -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
276 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
277 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
279 hPH -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
285 hPIDLQ -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
286 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
287 hdEdx -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
288 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
289 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
291 hPH -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
297 hPIDLQ -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
298 for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
299 hdEdx -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, SumdEdx[iChamb]);
300 for(Int_t iClus = 0; iClus < AliTRDtrackerV1::GetNTimeBins(); iClus++){
301 if(!(TRDcluster = (AliTRDcluster*)TRDtracklet[iChamb] -> GetClusters(iClus)))
303 hPH -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, TRDcluster -> GetLocalTimeBin(), TRDtracklet[iChamb] -> GetdQdl(iClus));
310 // calculate the probabilities and fill histograms for electrons using NN
311 fReconstructor -> SetOption("nn");
315 if(fDebugLevel>=4) Printf("PIDmethod[%d] Slices[%d] PDG[%d] NNLike[%f]", fReconstructor->GetPIDMethod(), fReconstructor->GetNdEdxSlices(), track->GetPDG(), TRDtrack -> GetPID(0));
318 switch(track->GetPDG()){
321 hPIDNN -> Fill(AliPID::kElectron * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
325 hPIDNN -> Fill(AliPID::kMuon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
329 hPIDNN -> Fill(AliPID::kPion * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
333 hPIDNN -> Fill(AliPID::kKaon * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
337 hPIDNN -> Fill(AliPID::kProton * AliTRDCalPID::kNMom + iMomBin, TRDtrack -> GetPID(0));
344 PostData(0, fContainer);
347 //________________________________________________________
348 void AliTRDpidChecker::GetRefFigure(Int_t ifig, Int_t &first, Int_t &last, Option_t *opt)
353 first = (Int_t)kGraphStart; last = first+2;
356 first = (Int_t)kGraphStart; last = first+2;
362 //________________________________________________________________________
363 Bool_t AliTRDpidChecker::PostProcess()
365 // Draw result to the screen
366 // Called once at the end of the query
369 Printf("ERROR: list not available");
372 // return kTRUE; // testing protection
375 // container for the pion efficiencies and the errors
376 Double_t PionEffiLQ[AliTRDCalPID::kNMom],
377 PionEffiErrorLQ[AliTRDCalPID::kNMom],
378 EleEffiLQ[AliTRDCalPID::kNMom],
379 ThresholdLQ[AliTRDCalPID::kNMom];
381 Double_t PionEffiNN[AliTRDCalPID::kNMom],
382 PionEffiErrorNN[AliTRDCalPID::kNMom],
383 EleEffiNN[AliTRDCalPID::kNMom],
384 ThresholdNN[AliTRDCalPID::kNMom];
388 TH1D *Histo1=0x0, *Histo2=0x0;
390 TH2F *hPIDLQ=0x0, *hPIDNN=0x0;
391 hPIDLQ = (TH2F*)fContainer->At(kLQlikelihood);
392 hPIDNN = (TH2F*)fContainer->At(kNNlikelihood);
394 // calculate the pion efficiencies and the errors for 90% electron efficiency (2-dim LQ)
395 for(Int_t iMom = 0; iMom < AliTRDCalPID::kNMom; iMom++){
397 AliTRDpidUtil *util = new AliTRDpidUtil();
398 mom = AliTRDCalPID::GetMomentum(iMom);
400 Histo1 = hPIDLQ -> ProjectionY("LQ_ele",AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1,AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1);
401 Histo2 = hPIDLQ -> ProjectionY("LQ_pio",AliTRDCalPID::kNMom*AliPID::kPion+iMom+1,AliTRDCalPID::kNMom*AliPID::kPion+iMom+1);
403 util -> CalculatePionEffi(Histo1, Histo2);
405 PionEffiLQ[iMom] = util -> GetPionEfficiency();
406 PionEffiErrorLQ[iMom] = util -> GetError();
407 EleEffiLQ[iMom] = util -> GetCalcElectronEfficiency();
408 ThresholdLQ[iMom] = util -> GetThreshold();
410 if(fDebugLevel>=1) Printf("Pion Efficiency for 2-dim LQ is : %f +/- %f\n\n", PionEffiLQ[iMom], PionEffiErrorLQ[iMom]);
416 // calculate the pion efficiencies and the errors for 90% electron efficiency (NN)
417 for(Int_t iMom = 0; iMom < AliTRDCalPID::kNMom; iMom++){
419 AliTRDpidUtil *util = new AliTRDpidUtil();
420 mom = AliTRDCalPID::GetMomentum(iMom);
422 Histo1 = hPIDNN -> ProjectionY("NN_ele",AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1,AliTRDCalPID::kNMom*AliPID::kElectron+iMom+1);
423 Histo2 = hPIDNN -> ProjectionY("NN_pio",AliTRDCalPID::kNMom*AliPID::kPion+iMom+1,AliTRDCalPID::kNMom*AliPID::kPion+iMom+1);
425 util -> CalculatePionEffi(Histo1, Histo2);
427 PionEffiNN[iMom] = util -> GetPionEfficiency();
428 PionEffiErrorNN[iMom] = util -> GetError();
429 EleEffiNN[iMom] = util -> GetCalcElectronEfficiency();
430 ThresholdNN[iMom] = util -> GetThreshold();
432 if(fDebugLevel>=1) Printf("Pion Efficiency for NN is : %f +/- %f\n\n", PionEffiNN[iMom], PionEffiErrorNN[iMom]);
438 // create TGraph to plot the pion efficiencies
439 TGraphErrors *gEffisLQ=0x0, *gEffisNN=0x0;
440 gEffisLQ = (TGraphErrors*)fContainer->At(kGraphLQ);
441 gEffisNN = (TGraphErrors*)fContainer->At(kGraphNN);
444 for(Int_t iBin = 0; iBin < AliTRDCalPID::kNMom; iBin++){
446 Float_t momentum = AliTRDCalPID::GetMomentum(iBin);
447 gEffisLQ->SetPoint(iBin, momentum, PionEffiLQ[iBin]);
448 gEffisLQ->SetPointError(iBin, 0., PionEffiErrorLQ[iBin]);
450 gEffisNN->SetPoint(iBin, momentum, PionEffiNN[iBin]);
451 gEffisNN->SetPointError(iBin, 0., PionEffiErrorNN[iBin]);
456 return kTRUE; // testing protection
460 //________________________________________________________________________
461 void AliTRDpidChecker::Terminate(Option_t *)
463 // Draw result to the screen
464 // Called once at the end of the query
466 fContainer = dynamic_cast<TObjArray*>(GetOutputData(0));
468 Printf("ERROR: list not available");