1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // QA class for TRD PID
17 // Plot Pion Efficiency at x electron efficiency
18 // Calculate the threshold parametrisation and save
19 // them in a root file
22 // Markus Fasel <M.Fasel@gsi.de>
30 #include <TGraphErrors.h>
31 #include <THnSparse.h>
34 #include <TIterator.h>
38 #include <TObjArray.h>
41 #include "AliAODTrack.h"
42 #include "AliAODPid.h"
43 #include "AliESDtrack.h"
44 #include "AliHFEtrdPIDqa.h"
45 #include "AliHFEtools.h"
46 #include "AliHFEpidTRD.h"
49 ClassImp(AliHFEtrdPIDqa)
51 const Double_t AliHFEtrdPIDqa::fgkElectronEff[kNElectronEffs] = {0.7,0.75, 0.8, 0.85, 0.9, 0.95};
52 //_______________________________________________________________
53 // Definition of the common binning
54 const Int_t AliHFEtrdPIDqa::fgkNBinsCommon[kQuantitiesCommon] = {
55 AliPID::kSPECIES + 1, // species
57 AliESDtrack::kTRDnPlanes + 1 // tracklets including 0
59 const Double_t AliHFEtrdPIDqa::fgkMinBinCommon[kQuantitiesCommon] = {
62 0 // tracklets including 0
65 const Double_t AliHFEtrdPIDqa::fgkMaxBinCommon[kQuantitiesCommon] = {
66 AliPID::kSPECIES, // species
68 AliESDtrack::kTRDnPlanes + 1 // tracklets including 0
70 //_______________________________________________________________
72 //__________________________________________________________________
73 AliHFEtrdPIDqa::AliHFEtrdPIDqa():
74 TNamed("trdPIDqa", ""),
80 fPionEfficiencies(NULL),
81 fProtonEfficiencies(NULL),
82 fKaonEfficiencies(NULL),
86 // Default Constructor
90 //__________________________________________________________________
91 AliHFEtrdPIDqa::AliHFEtrdPIDqa(const Char_t *name):
98 fPionEfficiencies(NULL),
99 fProtonEfficiencies(NULL),
100 fKaonEfficiencies(NULL),
108 //__________________________________________________________________
109 AliHFEtrdPIDqa::AliHFEtrdPIDqa(const AliHFEtrdPIDqa &ref):
116 fPionEfficiencies(NULL),
117 fProtonEfficiencies(NULL),
118 fKaonEfficiencies(NULL),
127 //__________________________________________________________________
128 AliHFEtrdPIDqa &AliHFEtrdPIDqa::operator=(const AliHFEtrdPIDqa &ref){
130 // Assignment operator
137 //__________________________________________________________________
138 AliHFEtrdPIDqa::~AliHFEtrdPIDqa(){
142 if(fTRDpid) delete fTRDpid;
143 if(fLikeTRD) delete fLikeTRD;
144 if(fQAtrack) delete fQAtrack;
145 if(fQAdEdx) delete fQAdEdx;
146 if(fTRDtruncMean) delete fTRDtruncMean;
148 if(fPionEfficiencies) delete fPionEfficiencies;
149 if(fProtonEfficiencies) delete fProtonEfficiencies;
150 if(fKaonEfficiencies) delete fKaonEfficiencies;
153 //__________________________________________________________________
154 void AliHFEtrdPIDqa::Copy(TObject &ref) const{
156 // Copies content of this object into object ref
160 AliHFEtrdPIDqa &target = dynamic_cast<AliHFEtrdPIDqa &>(ref);
161 target.fTRDpid = fTRDpid;
162 target.fLikeTRD = dynamic_cast<THnSparseF *>(fLikeTRD->Clone());
163 target.fQAtrack = dynamic_cast<THnSparseF *>(fQAtrack->Clone());
164 target.fQAdEdx = dynamic_cast<THnSparseF *>(fQAdEdx->Clone());
165 target.fTRDtruncMean = dynamic_cast<THnSparseF *>(fTRDtruncMean->Clone());
168 //__________________________________________________________________
169 Long64_t AliHFEtrdPIDqa::Merge(TCollection *coll){
174 if(coll->IsEmpty()) return 1;
176 TIterator *it = coll->MakeIterator();
179 while((o = it->Next())){
180 AliHFEtrdPIDqa *refQA = dynamic_cast<AliHFEtrdPIDqa *>(o);
183 if(fLikeTRD) fLikeTRD->Add(refQA->fLikeTRD);
184 if(fQAtrack) fQAtrack->Add(refQA->fQAtrack);
185 if(fQAdEdx) fQAdEdx->Add(refQA->fQAdEdx);
186 if(fTRDtruncMean) fTRDtruncMean->Add(refQA->fTRDtruncMean);
193 //__________________________________________________________________
194 void AliHFEtrdPIDqa::Init(){
199 CreateLikelihoodHistogram();
201 CreatedEdxHistogram();
202 CreateHistoTruncatedMean();
204 fTRDpid = new AliHFEpidTRD("QAtrdPID");
207 //__________________________________________________________________
208 void AliHFEtrdPIDqa::CreateLikelihoodHistogram(){
210 // Create Histogram for TRD Likelihood Studies
212 Int_t nbins[kQuantitiesLike]; memcpy(nbins, fgkNBinsCommon, sizeof(Int_t) * kQuantitiesCommon);
213 nbins[kElectronLike] = 100;
214 Double_t binMin[kQuantitiesLike]; memcpy(binMin, fgkMinBinCommon, sizeof(Double_t) * kQuantitiesCommon);
215 Double_t binMax[kQuantitiesLike]; memcpy(binMax, fgkMaxBinCommon, sizeof(Double_t) * kQuantitiesCommon);
216 binMin[kElectronLike] = 0.;
217 binMax[kElectronLike] = 1.;
219 fLikeTRD = new THnSparseF("fLikeTRD","TRD Likelihood Studies", kQuantitiesLike, nbins, binMin, binMax);
220 Double_t *binLog = AliHFEtools::MakeLogarithmicBinning(nbins[kP], binMin[kP], binMax[kP]);
221 fLikeTRD->GetAxis(kP)->Set(nbins[kP], binLog);
225 //__________________________________________________________________
226 void AliHFEtrdPIDqa::CreateQAHistogram(){
228 // Create Histogram for Basic TRD PID QA
230 AliDebug(1, "Called");
231 Int_t nbins[kQuantitiesQA]; memcpy(nbins, fgkNBinsCommon, sizeof(Int_t) * kQuantitiesCommon);
232 nbins[kNonZeroTrackletCharge] = AliESDtrack::kTRDnPlanes + 1;
233 nbins[kNClusters] = 200;
234 Double_t binMin[kQuantitiesQA]; memcpy(binMin, fgkMinBinCommon, sizeof(Double_t) * kQuantitiesCommon);
235 binMin[kNonZeroTrackletCharge] = 0.;
236 binMin[kNClusters] = 0.;
237 Double_t binMax[kQuantitiesQA]; memcpy(binMax, fgkMaxBinCommon, sizeof(Double_t) * kQuantitiesCommon);
238 binMax[kNonZeroTrackletCharge] = AliESDtrack::kTRDnPlanes + 1.;
239 binMax[kNClusters] = 200.;
241 fQAtrack = new THnSparseF("fQAtrack","TRD QA Histogram", kQuantitiesQA, nbins, binMin, binMax);
242 Double_t *binLog = AliHFEtools::MakeLogarithmicBinning(nbins[kP], binMin[kP], binMax[kP]);
243 fQAtrack->GetAxis(kP)->Set(nbins[kP], binLog);
247 //__________________________________________________________________
248 void AliHFEtrdPIDqa::CreatedEdxHistogram(){
250 // Create QA histogram for dEdx investigations
252 AliDebug(1, "Called");
253 Int_t nbins[kQuantitiesdEdx]; memcpy(nbins, fgkNBinsCommon, sizeof(Int_t) * kQuantitiesCommon);
255 nbins[kNclusters] = 261;
256 nbins[kNonZeroSlices] = 9;
257 Double_t binMin[kQuantitiesdEdx]; memcpy(binMin, fgkMinBinCommon, sizeof(Double_t) * kQuantitiesCommon);
259 binMin[kNclusters] = 0;
260 Double_t binMax[kQuantitiesdEdx]; memcpy(binMax, fgkMaxBinCommon, sizeof(Double_t) * kQuantitiesCommon);
261 binMax[kdEdx] = 100000.;
262 binMax[kNclusters] = 260.;
263 binMax[kNonZeroSlices] = 8.;
265 fQAdEdx = new THnSparseF("fQAdEdx","TRD summed dEdx", kQuantitiesdEdx, nbins, binMin, binMax);
266 Double_t *binLog = AliHFEtools::MakeLogarithmicBinning(nbins[kP], binMin[kP], binMax[kP]);
267 fQAdEdx->GetAxis(kP)->Set(nbins[kP], binLog);
271 //__________________________________________________________________
272 void AliHFEtrdPIDqa::CreateHistoTruncatedMean(){
274 // Create Histogram for Basic TRD PID QA
276 AliDebug(1, "Called");
277 Int_t nbins[kQuantitiesTruncMean]; memcpy(nbins, fgkNBinsCommon, sizeof(Int_t) * kQuantitiesCommon);
278 nbins[kTPCdEdx] = 600;
279 nbins[kTRDdEdxMethod1] = 1000;
280 nbins[kTRDdEdxMethod2] = 1000;
281 Double_t binMin[kQuantitiesTruncMean]; memcpy(binMin, fgkMinBinCommon, sizeof(Double_t) * kQuantitiesCommon);
282 binMin[kTPCdEdx] = 0.;
283 binMin[kTRDdEdxMethod1] = 0.;
284 binMin[kTRDdEdxMethod2] = 0.;
285 Double_t binMax[kQuantitiesTruncMean]; memcpy(binMax, fgkMaxBinCommon, sizeof(Double_t) * kQuantitiesCommon);
286 binMax[kTPCdEdx] = 600;
287 binMax[kTRDdEdxMethod1] = 20000.;
288 binMax[kTRDdEdxMethod2] = 20000.;
290 fTRDtruncMean = new THnSparseF("fTRDtruncMean","TRD TruncatedMean studies", kQuantitiesTruncMean, nbins, binMin, binMax);
291 Double_t *binLog = AliHFEtools::MakeLogarithmicBinning(nbins[kP], binMin[kP], binMax[kP]);
292 fTRDtruncMean->GetAxis(kP)->Set(nbins[kP], binLog);
297 //__________________________________________________________________
298 void AliHFEtrdPIDqa::ProcessTracks(TObjArray * const tracks, Int_t species){
300 // Process Electron Tracks
302 if(species < -1 || species >= AliPID::kSPECIES) return;
303 TIterator *it = tracks->MakeIterator();
304 AliVTrack *track = NULL;
305 while((track = dynamic_cast<AliVTrack *>(it->Next()))){
306 if(track) ProcessTrack(track, species);
311 //__________________________________________________________________
312 void AliHFEtrdPIDqa::ProcessTrack(AliVTrack *track, Int_t species){
314 // Process Single Track
316 if(TString(track->IsA()->GetName()).CompareTo("AliESDtrack") == 0)
317 ProcessTrackESD(dynamic_cast<AliESDtrack *>(track), species);
318 else if(TString(track->IsA()->GetName()).CompareTo("AliAODTrack") == 0)
319 ProcessTrackAOD(dynamic_cast<AliAODTrack *>(track), species);
323 //__________________________________________________________________
324 void AliHFEtrdPIDqa::ProcessTrackESD(AliESDtrack *track, Int_t species){
326 // Process single ESD track
328 if((track->GetStatus() & AliESDtrack::kTRDout) == 0) return; // require TRD track
329 FillTRDLikelihoods(track, species);
330 FillTRDQAplots(track, species);
333 //__________________________________________________________________
334 void AliHFEtrdPIDqa::ProcessTrackAOD(AliAODTrack * const track, Int_t /*species*/){
336 // Process single AOD track
337 // AOD PID object required
339 AliAODPid *trackPID = track->GetDetPid();
340 if(!trackPID) return;
344 //__________________________________________________________________
345 void AliHFEtrdPIDqa::FillTRDLikelihoods(AliESDtrack *track, Int_t species){
347 // Fill TRD Likelihood Histogram
349 Double_t trdLike[AliPID::kSPECIES];
350 track->GetTRDpid(trdLike);
351 const AliExternalTrackParam *outerPars = track->GetOuterParam();
353 Double_t quantities[kQuantitiesLike]; memset(quantities, 0, sizeof(Double_t) * kQuantitiesLike);
358 // Electron Likelihood
359 quantities[kSpecies] = species;
360 quantities[kP] = outerPars ? outerPars->P() : track->P();
361 quantities[kNTracklets] = track->GetTRDntrackletsPID();
362 quantities[kElectronLike] = trdLike[AliPID::kElectron];
364 fLikeTRD->Fill(quantities);
367 //__________________________________________________________________
368 void AliHFEtrdPIDqa::FillTRDQAplots(AliESDtrack *track, Int_t species){
370 // Fill QA Plots containing further information
372 const AliExternalTrackParam *outerPars = track->GetOuterParam();
374 Double_t quantitiesQA[kQuantitiesQA], quantitiesdEdx[kQuantitiesdEdx], quantitiesTruncMean[kQuantitiesTruncMean];
380 // Non-zero tracklet charges
381 // Number of clusters / full track
392 quantitiesQA[kSpecies] = quantitiesdEdx[kSpecies]
393 = quantitiesTruncMean[kSpecies]
395 quantitiesQA[kP] = quantitiesdEdx[kP]
396 = quantitiesTruncMean[kP]
397 = outerPars ? outerPars->P() : track->P();
398 quantitiesQA[kNTracklets] = quantitiesdEdx[kNTracklets]
399 = quantitiesTruncMean[kNTracklets]
400 = track->GetTRDntrackletsPID();
401 quantitiesQA[kNClusters] = quantitiesdEdx[kNclusters] = track->GetTRDncls();
404 Double_t dEdxSum = 0., qSlice = 0.;
405 // remove the last slice from the histogram
406 Int_t ntrackletsNonZero = 0, nSlices = track->GetNumberOfTRDslices() - 1, nSlicesNonZero = 0;
407 for(Int_t iplane = 0; iplane < AliESDtrack::kTRDnPlanes; iplane++){
409 for(Int_t islice = 0; islice < nSlices; islice++){
410 qSlice = track->GetTRDslice(iplane, islice);
417 quantitiesdEdx[kNonZeroSlices] = nSlicesNonZero;
418 quantitiesdEdx[kdEdx] = dEdxSum;
419 if(dEdxSum) ntrackletsNonZero++;
420 // Fill dEdx histogram
421 if(dEdxSum > 1e-1) fQAdEdx->Fill(quantitiesdEdx); // Cut out 0 entries
423 quantitiesQA[kNonZeroTrackletCharge] = ntrackletsNonZero;
424 fQAtrack->Fill(quantitiesQA);
426 quantitiesTruncMean[kTPCdEdx] = track->GetTPCsignal();
427 quantitiesTruncMean[kTRDdEdxMethod1] = fTRDpid->GetTRDSignalV1(track);
428 quantitiesTruncMean[kTRDdEdxMethod2] = fTRDpid->GetTRDSignalV2(track);
429 fTRDtruncMean->Fill(quantitiesTruncMean);
432 /////////////////////////////////////////////////////////
434 // Code for Post Processing
436 // //////////////////////////////////////////////////////
438 //__________________________________________________________________
439 void AliHFEtrdPIDqa::FinishAnalysis(){
442 // Calculate Electron Efficiency for ntracklets = 4...6
443 // Calculate thresholds for ntracklets = 4...6
446 if(!fPionEfficiencies){
447 fPionEfficiencies = new TList;
448 fPionEfficiencies->SetName("pionEfficiencies");
450 if(!fProtonEfficiencies){
451 fProtonEfficiencies = new TList;
452 fProtonEfficiencies->SetName("protonEfficiencies");
455 fThresholds = new TList;
456 fThresholds->SetName("thresholds");
459 for(Int_t itr = 4; itr <= 6; itr++){
460 printf("========================================\n");
461 printf("Analysing %d trackltes\n", itr);
462 printf("========================================\n");
463 AnalyseNTracklets(itr);
467 //__________________________________________________________________
468 void AliHFEtrdPIDqa::StoreResults(const Char_t *filename){
470 // Store histos into a root file
472 TFile *outfile = new TFile(filename, "RECREATE");
474 fPionEfficiencies->Clone()->Write(fPionEfficiencies->GetName(), kSingleKey);
475 fProtonEfficiencies->Clone()->Write(fProtonEfficiencies->GetName(), kSingleKey);
476 fThresholds->Clone()->Write(fThresholds->GetName(), kSingleKey);
481 //__________________________________________________________________
482 void AliHFEtrdPIDqa::SaveThresholdParameters(const Char_t *name){
484 // Fit the threshold histograms with the given parametrisation
485 // and store the TF1 in the file
489 AliError("Threshold histograms have to be created first");
493 printf("========================================\n");
494 printf("Calculating threshold parameters\n");
495 printf("========================================\n");
497 TList *outlist = new TList;
498 outlist->SetName("thresholdTRD");
500 TGraph *threshhist = NULL;
501 TF1 *threshparam = NULL;
502 TList *lHistos = NULL, *lFormulas = NULL;
503 for(Int_t itracklet = 4; itracklet <= 6; itracklet++){
505 printf("-------------------------------\n");
506 printf("Processing %d tracklets\n", itracklet);
507 printf("-------------------------------\n");
509 lHistos = dynamic_cast<TList *>(fThresholds->FindObject(Form("%dTracklets", itracklet)));
511 AliError(Form("Threshold histograms for the case %d tracklets not found", itracklet));
514 lFormulas = new TList;
515 lFormulas->SetName(Form("%dTracklets", itracklet));
516 outlist->Add(lFormulas);
518 for(Int_t ieff = 0; ieff < kNElectronEffs; ieff++){
520 printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
521 printf("Processing Electron Efficiency %f\n", fgkElectronEff[ieff]);
522 printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
524 threshhist = dynamic_cast<TGraph *>(lHistos->FindObject(Form("eff%d", static_cast<Int_t>(fgkElectronEff[ieff] * 100))));
525 threshparam = MakeThresholds(threshhist);
526 threshparam->SetName(Form("thresh_%d_%d", itracklet, static_cast<Int_t>(fgkElectronEff[ieff] * 100)));
531 TFile *outfile = new TFile(name, "RECREATE");
533 outlist->Write(outlist->GetName(), kSingleKey);
538 //__________________________________________________________________
539 void AliHFEtrdPIDqa::AnalyseNTracklets(Int_t nTracklets){
541 // Calculate Pion Efficiency, Proton Efficiency and Kaon Efficiency at discrete
542 // elPion Efficiency, Proton Efficiency and Kaon Efficiency at discrete
543 // electron efficiencies
545 Int_t binTracklets = fLikeTRD->GetAxis(kNTracklets)->FindBin(nTracklets);
546 fLikeTRD->GetAxis(kNTracklets)->SetRange(binTracklets, binTracklets);
548 Int_t binElectrons = fLikeTRD->GetAxis(kSpecies)->FindBin(AliPID::kElectron);
549 AliDebug(1, Form("BinElectrons %d", binElectrons));
550 Int_t binPions = fLikeTRD->GetAxis(kSpecies)->FindBin(AliPID::kPion);
551 AliDebug(1, Form("BinPions %d", binPions));
552 Int_t binProtons = fLikeTRD->GetAxis(kSpecies)->FindBin(AliPID::kProton);
553 AliDebug(1, Form("BinProtons %d", binProtons));
554 fLikeTRD->GetAxis(kSpecies)->SetRange(binElectrons, binElectrons);
555 TH2 *likeElectron = fLikeTRD->Projection(kElectronLike, kP);
556 likeElectron->SetName("likeElectron");
557 fLikeTRD->GetAxis(kSpecies)->SetRange(binPions, binPions);
558 TH2 *likePion = fLikeTRD->Projection(kElectronLike, kP);
559 likePion->SetName("likePion");
560 fLikeTRD->GetAxis(kSpecies)->SetRange(binProtons, binProtons);
561 TH2 *likeProton = fLikeTRD->Projection(kElectronLike, kP);
562 likeProton->SetName("likeProton");
565 fLikeTRD->GetAxis(kSpecies)->SetRange(0, fLikeTRD->GetAxis(kSpecies)->GetNbins());
566 fLikeTRD->GetAxis(kNTracklets)->SetRange(0, fLikeTRD->GetAxis(kNTracklets)->GetNbins());
568 // Prepare List for output
569 TList *listPions = new TList; listPions->SetName(Form("%dTracklets", nTracklets));
570 TList *listProtons = new TList; listProtons->SetName(Form("%dTracklets", nTracklets));
571 TList *listThresholds = new TList; listThresholds->SetName(Form("%dTracklets", nTracklets));
572 fPionEfficiencies->Add(listPions);
573 fProtonEfficiencies->Add(listProtons);
574 fThresholds->Add(listThresholds);
576 TH1 *probsEl = NULL, *probsPi = NULL, *probsPr = NULL;
577 TGraphErrors *effPi = NULL, *effPr = NULL; TGraph *thresholds = NULL;
578 Double_t p = 0, dp = 0;
580 Double_t noElEff[2]; // value and error
581 for(Int_t ieff = 0; ieff < kNElectronEffs; ieff++){
582 printf("-----------------------------------------\n");
583 printf("Doing Electron Efficiency %f\n", fgkElectronEff[ieff]);
584 printf("-----------------------------------------\n");
585 effPi = new TGraphErrors(likeElectron->GetXaxis()->GetNbins());
586 effPi->SetName(Form("eff%d", static_cast<Int_t >(fgkElectronEff[ieff] * 100)));
587 effPr = new TGraphErrors(likeElectron->GetXaxis()->GetNbins());
588 effPr->SetName(Form("eff%d", static_cast<Int_t >(fgkElectronEff[ieff] * 100)));
589 thresholds = new TGraph(likeElectron->GetXaxis()->GetNbins());
590 thresholds->SetName(Form("eff%d", static_cast<Int_t >(fgkElectronEff[ieff] * 100)));
593 listPions->Add(effPi);
594 listProtons->Add(effPr);
595 listThresholds->Add(thresholds);
597 for(Int_t imom = 1; imom <= likeElectron->GetXaxis()->GetLast(); imom++){
598 p = likeElectron->GetXaxis()->GetBinCenter(imom);
599 dp = likeElectron->GetXaxis()->GetBinWidth(imom)/2;
601 probsEl = likeElectron->ProjectionY("el", imom);
602 if(!probsEl->GetEntries()) continue;
603 probsEl->Scale(1./probsEl->Integral());
604 probsPi = likePion->ProjectionY("pi", imom);
605 if(!probsPi->GetEntries()) continue;
606 probsPi->Scale(1./probsPi->Integral());
607 probsPr = likeProton->ProjectionY("pr", imom);
608 if(!probsPr->GetEntries()) continue;
609 probsPr->Scale(1./probsPr->Integral());
610 AliDebug(1, Form("Calculating Values for p = %f", p));
612 // Calculare threshold we need to achive the x% electron Efficiency
613 threshbin = GetThresholdBin(probsEl, fgkElectronEff[ieff]);
614 thresholds->SetPoint(imom - 1, p, probsEl->GetXaxis()->GetBinCenter(threshbin));
615 AliDebug(1, Form("threshold %d|%f", threshbin, probsEl->GetXaxis()->GetBinCenter(threshbin)));
617 // Calculate non-electronEfficiency and error
618 CalculateEfficiency(probsPi, threshbin, noElEff);
619 AliDebug(1, Form("Pion Efficiency %f", noElEff[0]));
620 effPi->SetPoint(imom - 1, p, noElEff[0]);
621 effPi->SetPointError(imom - 1, dp, noElEff[1]);
622 CalculateEfficiency(probsPr, threshbin, noElEff);
623 effPr->SetPoint(imom - 1, p, noElEff[0]);
624 effPr->SetPointError(imom - 1, dp, noElEff[1]);
625 AliDebug(1, Form("Proton Efficiency %f", noElEff[0]));
634 // remove temporary histograms
640 //__________________________________________________________________
641 Int_t AliHFEtrdPIDqa::GetThresholdBin(TH1 * const input, Double_t eff){
643 // Calculate the threshold bin
645 Double_t integralEff = 0.;
646 Int_t currentBin = 0;
647 for(Int_t ibin = input->GetXaxis()->GetLast(); ibin >= input->GetXaxis()->GetFirst(); ibin--){
649 integralEff += input->GetBinContent(ibin);
650 if(integralEff >= eff){
651 // we found the matching bin, break the loop
658 //__________________________________________________________________
659 Bool_t AliHFEtrdPIDqa::CalculateEfficiency(TH1 * const input, Int_t threshbin, Double_t *par){
661 // Calculate non-electron efficiency
663 Double_t integralEff = 0;
664 for(Int_t ibin = threshbin; ibin <= input->GetXaxis()->GetLast(); ibin++)
665 integralEff += input->GetBinContent(ibin);
666 par[0] = integralEff;
668 // @TODO: Error calculation
674 //__________________________________________________________________
675 void AliHFEtrdPIDqa::DrawTracklet(Int_t itracklet){
677 // Draw efficiencies and threshold as function of p
679 if(!(fPionEfficiencies && fProtonEfficiencies && fThresholds)){
680 AliError("No graphs to draw available");
684 TList *lpions = dynamic_cast<TList *>(fPionEfficiencies->FindObject(Form("%dTracklets", itracklet)));
685 TList *lprotons = dynamic_cast<TList *>(fProtonEfficiencies->FindObject(Form("%dTracklets", itracklet)));
687 TList *lthresholds = dynamic_cast<TList *>(fThresholds->FindObject(Form("%dTracklets", itracklet)));
689 TGraphErrors *pi, *pr;
692 TCanvas *c1 = new TCanvas(Form("tracklet%d", itracklet), Form("Tracklet %d", itracklet), 1024, 768);
694 for(Int_t ieff = 0; ieff < kNElectronEffs; ieff++){
696 leg = new TLegend(0.6, 0.7, 0.89, 0.89);
697 leg->SetBorderSize(0);
698 leg->SetFillStyle(0);
699 pi = dynamic_cast<TGraphErrors *>(lpions->FindObject(Form("eff%d", static_cast<Int_t>(fgkElectronEff[ieff] * 100))));
700 pr = dynamic_cast<TGraphErrors *>(lprotons->FindObject(Form("eff%d", static_cast<Int_t>(fgkElectronEff[ieff] * 100))));
701 tr = dynamic_cast<TGraph *>(lthresholds->FindObject(Form("eff%d", static_cast<Int_t>(fgkElectronEff[ieff] * 100))));
703 // Define nice plot, draw
705 pi->GetXaxis()->SetTitle("p / GeV/c");
706 pi->GetYaxis()->SetTitle("Efficiency");
707 pr->GetXaxis()->SetTitle("p / GeV/c");
708 pr->GetYaxis()->SetTitle("Efficiency");
709 tr->GetXaxis()->SetTitle("p / GeV/c");
710 tr->GetYaxis()->SetTitle("Efficiency");
712 pi->GetYaxis()->SetRangeUser(0., 1.);
713 pr->GetYaxis()->SetRangeUser(0., 1.);
714 tr->GetYaxis()->SetRangeUser(0., 1.);
716 pi->SetMarkerColor(kRed);
717 pi->SetMarkerStyle(20);
718 pr->SetMarkerColor(kBlue);
719 pr->SetMarkerStyle(21);
720 tr->SetMarkerColor(kBlack);
721 tr->SetMarkerStyle(22);
723 pi->SetTitle(Form ("%.2f Electron Efficiency", fgkElectronEff[ieff]));
724 pr->SetTitle(Form ("%.2f Electron Efficiency", fgkElectronEff[ieff]));
725 tr->SetTitle(Form ("%.2f Electron Efficiency", fgkElectronEff[ieff]));
727 pi->Draw("ape"); pr->Draw("pesame"); tr->Draw("psame");
729 // Add entries to legend
730 leg->AddEntry(pi, "Pion Efficiency", "lp");
731 leg->AddEntry(pr, "Proton Efficiency", "lp");
732 leg->AddEntry(tr, "Thresholds", "lp");
738 //__________________________________________________________________
739 TF1 *AliHFEtrdPIDqa::MakeThresholds(TGraph *threshist){
741 // Create TF1 containing the threshold parametrisation
744 TF1 *threshparam = new TF1("thresh", "1-[0]-[1]*x-[2]*TMath::Exp(-[3]*x)", 0.1, 10);
745 threshist->Fit(threshparam, "NE", "", 0, 10);
749 //__________________________________________________________________
750 void AliHFEtrdPIDqa::ClearLists(){
752 // Clear lists for particle efficiencies and thresholds
754 if(fPionEfficiencies){
755 fPionEfficiencies->Delete();
756 delete fPionEfficiencies;
757 fPionEfficiencies = NULL;
759 if(fProtonEfficiencies){
760 fProtonEfficiencies->Delete();
761 delete fProtonEfficiencies;
762 fProtonEfficiencies = NULL;
765 fThresholds->Delete();