1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: ALICE Offline. *
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 //=========================================================================//
17 // AliEbyE Analysis for Particle Ratio Fluctuation //
18 // Deepika Rathee | Satyajit Jena //
19 // drathee@cern.ch | sjena@cern.ch //
20 // Date: Wed Jul 9 18:38:30 CEST 2014 //
21 // New approch to find particle ratio to reduce memory //
23 //=========================================================================//
32 #include "AliMCEvent.h"
33 #include "AliMCParticle.h"
34 #include "AliESDtrackCuts.h"
35 #include "AliESDInputHandler.h"
36 #include "AliESDpid.h"
37 #include "AliAODInputHandler.h"
38 #include "AliAODEvent.h"
39 #include "AliAODMCParticle.h"
40 #include "AliCentrality.h"
41 #include "AliTracker.h"
43 #include "AliEbyEPidRatioHelper.h"
48 ClassImp(AliEbyEPidRatioHelper)
49 //________________________________________________________________________
50 AliEbyEPidRatioHelper::AliEbyEPidRatioHelper() :
53 fInputEventHandler(NULL),
58 fAODtrackCutBit(1024),
64 fCentralityPercentile(-1.),
66 fCentralityBinMax(11),
70 fPhiMax(TMath::TwoPi()),
71 fMinTrackLengthMC(70.),
80 fMinPtForTOFRequired(0.69),
81 fMaxPtForTPClow(0.69),
90 fHCentralityStat(NULL),
91 fHCentralityPer(NULL),
92 fHCentralityPerAll(NULL),
97 fIsPtBin(kFALSE), fIsDetectorWise(kFALSE) {
100 AliLog::SetClassDebugLevel("AliEbyEPidRatioHelper",10);
103 const Float_t AliEbyEPidRatioHelper::fgkfHistBinWitdthRap = 0.1;
104 const Float_t AliEbyEPidRatioHelper::fgkfHistBinWitdthPt = 0.3; // 0.08 // 300 MeV // was 80 MeV
106 const Float_t AliEbyEPidRatioHelper::fgkfHistRangeCent[] = {-0.5, 10.5};
107 const Int_t AliEbyEPidRatioHelper::fgkfHistNBinsCent = 11 ;
109 const Float_t AliEbyEPidRatioHelper::fgkfHistRangeEta[] = {-0.9, 0.9};
110 const Int_t AliEbyEPidRatioHelper::fgkfHistNBinsEta = Int_t((AliEbyEPidRatioHelper::fgkfHistRangeEta[1] -
111 AliEbyEPidRatioHelper::fgkfHistRangeEta[0]) /
112 AliEbyEPidRatioHelper::fgkfHistBinWitdthRap) +1;
114 const Float_t AliEbyEPidRatioHelper::fgkfHistRangeRap[] = {-0.8, 0.8};
115 const Int_t AliEbyEPidRatioHelper::fgkfHistNBinsRap = Int_t((AliEbyEPidRatioHelper::fgkfHistRangeRap[1] - AliEbyEPidRatioHelper::fgkfHistRangeRap[0]) / AliEbyEPidRatioHelper::fgkfHistBinWitdthRap) +1;
117 const Float_t AliEbyEPidRatioHelper::fgkfHistRangePhi[] = {0.0, TMath::TwoPi()};
118 const Int_t AliEbyEPidRatioHelper::fgkfHistNBinsPhi = 21 ;
120 const Float_t AliEbyEPidRatioHelper::fgkfHistRangePt[] = {0.2, 2.9}; // {0.2, 5.}; // was {0.3, 2.22}
121 const Int_t AliEbyEPidRatioHelper::fgkfHistNBinsPt = Int_t((AliEbyEPidRatioHelper::fgkfHistRangePt[1] - AliEbyEPidRatioHelper::fgkfHistRangePt[0]) / AliEbyEPidRatioHelper::fgkfHistBinWitdthPt);
123 const Float_t AliEbyEPidRatioHelper::fgkfHistRangeSign[] = {-1.5, 1.5};
124 const Int_t AliEbyEPidRatioHelper::fgkfHistNBinsSign = 3;
126 const Char_t* AliEbyEPidRatioHelper::fgkEventNames[] = {"All", "IsTriggered", "HasVertex", "Vz<Vz_{Max}", "Centrality [0,100]%"};
127 const Char_t* AliEbyEPidRatioHelper::fgkCentralityMaxNames[] = {"5", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100"};
128 const Char_t* AliEbyEPidRatioHelper::fgkTriggerNames[] = {"kMB", "kCentral", "kSemiCentral", "kEMCEJE", "kEMCEGA" };
129 const Char_t* AliEbyEPidRatioHelper::fgkCentralityNames[] = {"0-5%", "5-10%", "10-20%", "20-30%", "30-40%", "40-50%","50-60%", "60-70%", "70-80%", "80-90%", "90-100%"};
131 const Char_t* AliEbyEPidRatioHelper::fgkPidName[4] = {"Nch","Npi","Nka","Npr"};
132 const Char_t* AliEbyEPidRatioHelper::fgkPidLatex[4][2] = {{"N_{-}","N_{+}"}, {"N_{#pi^{-}}","N_{#pi^{+}}"},{"N_{K^{-}}","N_{K^{+}}"}, {"N_{#bar{p}}","N_{p}"}};
133 const Char_t* AliEbyEPidRatioHelper::fgkPidTitles[4][2] = {{"Negative","Positive"},{"Anti-Pions","Pions"},{"Anti-Kaons","Kaons"}, {"Anti-Protons","Protons"}};
137 //________________________________________________________________________
138 AliEbyEPidRatioHelper::~AliEbyEPidRatioHelper() {
147 //________________________________________________________________________
148 void AliEbyEPidRatioHelper::SetPhiRange(Float_t f1, Float_t f2) {
149 // -- Set phi range and adopt to phi-histogram
152 fPhiMax = (f1 < f2) ? f2 : f2+TMath::TwoPi();
154 Float_t phiMin = fPhiMin;
155 Float_t phiMax = fPhiMax;
158 Float_t binWidth = (AliEbyEPidRatioHelper::fgkfHistRangePhi[1] - AliEbyEPidRatioHelper::fgkfHistRangePhi[0]) /
159 Float_t(AliEbyEPidRatioHelper::fgkfHistNBinsPhi);
161 Float_t lowEdge = AliEbyEPidRatioHelper::fgkfHistRangePhi[0] - binWidth;
162 Float_t highEdge = AliEbyEPidRatioHelper::fgkfHistRangePhi[0];
164 for (Int_t ii = 1; ii <= AliEbyEPidRatioHelper::fgkfHistNBinsPhi; ++ii) {
166 highEdge += binWidth;
168 if (phiMin >= lowEdge && phiMin < highEdge )
170 if (phiMax > lowEdge && phiMax <= highEdge )
174 printf(">>>> Update Phi Range : [%f,%f] -> [%f,%f]\n", fPhiMin, fPhiMax, phiMin, phiMax);
181 //________________________________________________________________________
182 Int_t AliEbyEPidRatioHelper::Initialize(AliESDtrackCuts *cuts, Bool_t isMC, Bool_t isRatio, Bool_t isPtBin, Bool_t isDetWise, Int_t trackCutBit, Int_t modeDistCreation) {
183 // -- Initialize helper
188 fESDTrackCuts = cuts;
195 fIsDetectorWise = isDetWise;
199 // -- AOD track filter bit
200 fAODtrackCutBit = trackCutBit;
202 // -- mode Distribution creation
203 fModeDistCreation = modeDistCreation;
205 // -- Setup event cut statistics
206 InitializeEventStats();
208 // -- Setup trigger statistics
209 InitializeTriggerStats();
211 // -- Setup centrality statistics
212 InitializeCentralityStats();
214 // -- PRINT PID Strategy
215 // 0 : TPC(TPClow+TPCHigh)
218 // 3 : ITS+TPC(TPClow+TPCHigh)
219 // 4 : TPC(TPClow+TPCHigh)+TOF
220 // 5 : TPC(TPClow+TPCHigh)+TOF for pT >= fMinPtForTOFRequired TOF is required, below, only used if there
221 // 6 : TPC(TPClow+TPCHigh)+ITS+TOF with TOF only for those tracks which have TOF information
222 // 7 : TPC(TPClow+TPCHigh)+ITS+TOF for pT >= fMinPtForTOFRequired TOF is required, below, only used if there
223 // 8 : TPC(TPClow+TPCHigh)+ITS+TOF
224 printf(">>>> PID STRATEGY: %d || sigmaMax: ITS %.2f TPC %.2f TOF %.2f \n", fPIDStrategy, fNSigmaMaxITS, fNSigmaMaxTPC, fNSigmaMaxTOF);
226 // -- Initialize random number generator
227 fRandom = new TRandom3();
233 //________________________________________________________________________
234 Int_t AliEbyEPidRatioHelper::SetupEvent(AliESDInputHandler *esdHandler, AliAODInputHandler *aodHandler, AliMCEvent *mcEvent) {
237 // -- Get ESD objects
239 fInputEventHandler = static_cast<AliInputEventHandler*>(esdHandler);
240 fESD = dynamic_cast<AliESDEvent*>(fInputEventHandler->GetEvent());
242 AliError("ESD event handler not available");
247 // -- Get AOD objects
249 fInputEventHandler = static_cast<AliInputEventHandler*>(aodHandler);
250 fAOD = dynamic_cast<AliAODEvent*>(fInputEventHandler->GetEvent());
252 AliError("AOD event handler not available");
257 // -- Get Common objects
258 fPIDResponse = fInputEventHandler->GetPIDResponse();
263 fStack = fMCEvent->Stack();
265 // -- Get event centrality
266 // > 0-5|5-10|10-20|20-30|30-40|40-50|50-60|60-70|70-80|80-90|90-100 --> 11 bins
267 // > 0 1 2 3 4 5 6 7 8 9 10
269 AliCentrality *centrality = NULL;
272 centrality = fESD->GetCentrality();
274 centrality = fAOD->GetHeader()->GetCentralityP();
277 AliError("Centrality not available");
282 // Int_t a = centrality->GetCentralityClass5("V0M");
283 // if (a < 0 || a >= 20 ) fCentralityBin = -2;
284 // else if (a <= 1) fCentralityBin = a;
285 // else fCentralityBin = 1 + centrality->GetCentralityClass10("V0M");
289 Int_t centBin = centrality->GetCentralityClass10("V0M");
290 if (centBin == 0) { fCentralityBin = centrality->GetCentralityClass5("V0M"); }
291 else if (centBin == 11 || centBin == -1.) { fCentralityBin = -1; }
292 else if (centBin > 0 && centBin < fNCentralityBins) { fCentralityBin = centBin + 1; }
293 else { fCentralityBin = -2; }
296 if (fCentralityBin >= fCentralityBinMax)
301 fCentralityPercentile = centrality->GetCentralityPercentile("V0M");
306 //________________________________________________________________________
307 Bool_t AliEbyEPidRatioHelper::IsEventTriggered() {
308 // -- Check if Event is triggered and fill Trigger Histogram
310 Bool_t *aTriggerFired = new Bool_t[fNTriggers];
311 for (Int_t ii = 0; ii < fNTriggers; ++ii)
312 aTriggerFired[ii] = kFALSE;
314 if ((fInputEventHandler->IsEventSelected() & AliVEvent::kMB)) aTriggerFired[0] = kTRUE;
315 if ((fInputEventHandler->IsEventSelected() & AliVEvent::kCentral)) aTriggerFired[1] = kTRUE;
316 if ((fInputEventHandler->IsEventSelected() & AliVEvent::kSemiCentral)) aTriggerFired[2] = kTRUE;
317 if ((fInputEventHandler->IsEventSelected() & AliVEvent::kEMCEJE)) aTriggerFired[3] = kTRUE;
318 if ((fInputEventHandler->IsEventSelected() & AliVEvent::kEMCEGA)) aTriggerFired[4] = kTRUE;
320 Bool_t isTriggered = kFALSE;
322 for (Int_t ii=0; ii<fNTriggers; ++ii) {
323 if(aTriggerFired[ii]) {
325 fHTriggerStat->Fill(ii);
329 delete[] aTriggerFired;
334 //________________________________________________________________________
335 Bool_t AliEbyEPidRatioHelper::IsEventRejected() {
336 // -- Evaluate event statistics histograms
338 Int_t *aEventCuts = new Int_t[fHEventStatMax];
339 // set aEventCuts[ii] to 1 in case of reject
341 for (Int_t ii=0;ii<fHEventStatMax; ++ii)
346 // -- 0 - Before Physics Selection
347 aEventCuts[iCut] = 0;
349 // -- 1 - No Trigger fired
351 if (!IsEventTriggered())
352 aEventCuts[iCut] = 1;
356 const AliESDVertex* vtxESD = NULL;
357 const AliAODVertex* vtxAOD = NULL;
359 vtxESD = fESD->GetPrimaryVertexTracks();
361 aEventCuts[iCut] = 1;
364 vtxAOD = fAOD->GetPrimaryVertex();
366 aEventCuts[iCut] = 1;
369 // -- 3 - Vertex z outside cut window
372 if(TMath::Abs(vtxESD->GetZv()) > fVertexZMax)
373 aEventCuts[iCut] = 1;
376 if(TMath::Abs(vtxAOD->GetZ()) > fVertexZMax)
377 aEventCuts[iCut] = 1;
380 aEventCuts[iCut] = 1;
382 // -- 4 - Centrality = -1 (no centrality or not hadronic)
384 if(fCentralityBin == -1.)
385 aEventCuts[iCut] = 1;
387 // -- 5 - Centrality < fCentralityMax
389 if(fCentralityBin == -2.)
390 aEventCuts[iCut] = 1;
392 // -- Fill statistics / reject event
393 Bool_t isRejected = FillEventStats(aEventCuts);
398 //cout << isRejected << endl;
403 //________________________________________________________________________
404 Bool_t AliEbyEPidRatioHelper::IsParticleAcceptedBasicCharged(AliVParticle *particle, Int_t idxMC) {
405 // -- Check if MC particle is accepted for basic parameters
410 // -- check if charged
411 if (particle->Charge() == 0.0)
414 // -- check if physical primary - ESD
416 if(!fStack->IsPhysicalPrimary(idxMC))
419 // -- check if physical primary - AOD
421 if(!(static_cast<AliAODMCParticle*>(particle))->IsPhysicalPrimary())
428 //________________________________________________________________________
429 Bool_t AliEbyEPidRatioHelper::IsParticleAcceptedBasicNeutral(AliVParticle *particle, Int_t idxMC) {
430 // -- Check if MC particle is accepted for basic parameters
435 // -- check if charged
436 if (particle->Charge() != 0.0)
439 // -- check if physical primary - ESD
441 if(!fStack->IsPhysicalPrimary(idxMC))
444 // -- check if physical primary - AOD
446 if(!(static_cast<AliAODMCParticle*>(particle))->IsPhysicalPrimary())
453 //________________________________________________________________________
454 Bool_t AliEbyEPidRatioHelper::IsParticleAcceptedRapidity(AliVParticle *particle, Double_t &yP, Int_t gCurPid) {
457 yP = particle->Eta();
461 Double_t mP = AliPID::ParticleMass(AliPID::kPion);
462 if(gCurPid == 1) mP = AliPID::ParticleMass(AliPID::kPion);
463 else if(gCurPid == 2) mP = AliPID::ParticleMass(AliPID::kKaon);
464 else if(gCurPid == 3) mP = AliPID::ParticleMass(AliPID::kProton);
466 // -- Calculate rapidities and kinematics
467 Double_t p = particle->P();
468 Double_t pz = particle->Pz();
470 Double_t eP = TMath::Sqrt(p*p + mP*mP);
471 yP = 0.5 * TMath::Log((eP + pz) / (eP - pz));
473 // -- Check Rapidity window
474 if (TMath::Abs(yP) > fRapidityMax)
480 //________________________________________________________________________
481 Bool_t AliEbyEPidRatioHelper::IsParticleAcceptedPhi(AliVParticle *particle) {
482 // -- Check if particle is accepted
484 // > return 0 if not accepted
486 if (particle->Phi() > fPhiMin && particle->Phi() <= fPhiMax)
488 else if (particle->Phi() < fPhiMin && (particle->Phi() + TMath::TwoPi()) <= fPhiMax)
494 //_____________________________________________________________________________
495 Bool_t AliEbyEPidRatioHelper::IsParticleFindable(Int_t label) {
496 // -- Check if MC particle is findable tracks
498 AliMCParticle *mcParticle = static_cast<AliMCParticle*>(fMCEvent->GetTrack(label));
503 Float_t tpcTrackLength = mcParticle->GetTPCTrackLength(AliTracker::GetBz(), 0.05, counter, 3.0);
505 return (tpcTrackLength > fMinTrackLengthMC);
507 //________________________________________________________________________
508 Bool_t AliEbyEPidRatioHelper::IsTrackAcceptedBasicCharged(AliVTrack* track) {
509 // -- Check if track is accepted
510 // > for basic parameters
515 if (track->Charge() == 0)
521 //________________________________________________________________________
522 Bool_t AliEbyEPidRatioHelper::IsTrackAcceptedRapidity(AliVTrack *track, Double_t &yP, Int_t gCurPid) {
528 Double_t mP = AliPID::ParticleMass(AliPID::kPion);
529 if(gCurPid == 1) mP = AliPID::ParticleMass(AliPID::kPion);
530 else if(gCurPid == 2) mP = AliPID::ParticleMass(AliPID::kKaon);
531 else if(gCurPid == 3) mP = AliPID::ParticleMass(AliPID::kProton);
533 // -- Calculate rapidities and kinematics
535 track->GetPxPyPz(pvec);
537 Double_t p = track->P();
538 Double_t eP = TMath::Sqrt(p*p + mP*mP);
539 yP = 0.5 * TMath::Log((eP + pvec[2]) / (eP - pvec[2]));
541 // -- Check Rapidity window
542 if (TMath::Abs(yP) > fRapidityMax)
548 //________________________________________________________________________
549 Bool_t AliEbyEPidRatioHelper::IsTrackAcceptedDCA(AliVTrack *vTrack) {
550 Bool_t isAccepted = kTRUE;
555 AliESDtrack* track = dynamic_cast<AliESDtrack*>(vTrack);
560 if (track->HasPointOnITSLayer(0) && track->HasPointOnITSLayer(1)) {
562 // -- Get DCA nSigmas
563 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
564 track->GetImpactParameters(dca,cov);
566 Float_t nSigmaCdd = (cov[0] != 0.) ? dca[0]/TMath::Sqrt(cov[0]) : -9.99;
567 Float_t nSigmaCzz = (cov[2] != 0.) ? dca[1]/TMath::Sqrt(cov[2]) : -9.99;
569 if (fNSigmaMaxCdd != 0.) {
570 if (TMath::Abs(nSigmaCdd) > fNSigmaMaxCdd)
574 if (fNSigmaMaxCzz != 0.) {
575 if (TMath::Abs(nSigmaCzz) > fNSigmaMaxCzz)
583 //________________________________________________________________________
584 Bool_t AliEbyEPidRatioHelper::IsTrackAcceptedPID(AliVTrack *track, Double_t* pid, AliPID::EParticleType gCurPid) {
586 Bool_t isAcceptedITS = kFALSE;
587 Bool_t isAcceptedTPC = kFALSE;
588 Bool_t isAcceptedTPClow = kFALSE;
589 Bool_t isAcceptedTOF = kFALSE;
590 Bool_t isAccepted = kFALSE;
592 // -- In case not PID is used
600 if (fPIDResponse->NumberOfSigmas(AliPIDResponse::kITS, track, gCurPid, pid[0]) == AliPIDResponse::kDetPidOk) {
601 if (TMath::Abs(pid[0]) < fNSigmaMaxITS)
602 isAcceptedITS = kTRUE;
605 if (fPIDResponse->NumberOfSigmas(AliPIDResponse::kTPC, track, gCurPid, pid[1]) == AliPIDResponse::kDetPidOk) {
606 if (TMath::Abs(pid[1]) < fNSigmaMaxTPC)
607 isAcceptedTPC = kTRUE;
608 if (TMath::Abs(pid[1]) < fNSigmaMaxTPClow)
609 isAcceptedTPClow = kTRUE;
610 if (track->Pt() < fMaxPtForTPClow)
611 isAcceptedTPC = isAcceptedTPClow;
614 Bool_t hasPIDTOF = kFALSE;
615 if (fPIDResponse->NumberOfSigmas(AliPIDResponse::kTOF, track, gCurPid, pid[2]) == AliPIDResponse::kDetPidOk) {
617 if (TMath::Abs(pid[2]) < fNSigmaMaxTOF)
618 isAcceptedTOF = kTRUE;
620 // -- Check TOF missmatch for MC
623 if (fIsMC && isAcceptedTOF) {
625 // AliESDtrack* track = dynamic_cast<AliESDtrack*>(vTrack);
626 // TODO add code for AOD
628 (dynamic_cast<AliESDtrack*>(track))->GetTOFLabel(tofLabel);
630 Bool_t hasMatchTOF = kTRUE;
631 if (TMath::Abs(track->GetLabel()) != TMath::Abs(tofLabel[0]) || tofLabel[1] > 0)
632 hasMatchTOF = kFALSE;
634 TParticle *matchedTrack = fStack->Particle(TMath::Abs(tofLabel[0]));
635 if (TMath::Abs(matchedTrack->GetFirstMother()) == TMath::Abs(track->GetLabel()))
638 isAcceptedTOF = hasMatchTOF;
641 // 0 : TPC(TPClow+TPCHigh)
644 // 3 : ITS+TPC(TPClow+TPCHigh)
645 // 4 : TPC(TPClow+TPCHigh)+TOF
646 // 5 : TPC(TPClow+TPCHigh)+TOF for pT >= fMinPtForTOFRequired TOF is required, below, only used if there
647 // 6 : TPC(TPClow+TPCHigh)+ITS+TOF with TOF only for those tracks which have TOF information
648 // 7 : TPC(TPClow+TPCHigh)+ITS+TOF for pT >= fMinPtForTOFRequired TOF is required, below, only used if there
649 // 8 : TPC(TPClow+TPCHigh)+ITS+TOF
650 if (fPIDStrategy == 0) { // TPC PID
651 isAccepted = isAcceptedTPC;
653 else if (fPIDStrategy == 1) { // ITS PID
654 isAccepted = isAcceptedITS;
656 else if (fPIDStrategy == 2) { // TOF PID
657 isAccepted = isAcceptedTOF;
659 else if (fPIDStrategy == 3) { // TPC+ITS PID
660 isAccepted = isAcceptedTPC && isAcceptedITS;
662 else if (fPIDStrategy == 4) { // TPC+TOF PID
663 isAccepted = isAcceptedTPC && isAcceptedTOF;
665 else if (fPIDStrategy == 5) { // TPC+TOF PID -- for pT >= fMinPtForTOFRequired TOF is required
666 if (!hasPIDTOF && track->Pt() < fMinPtForTOFRequired)
667 isAcceptedTOF = kTRUE;
668 isAccepted = isAcceptedTPC && isAcceptedTOF;
670 else if (fPIDStrategy == 6) { // ITS+TPC+TOF PID -- TOF only for those tracks which have TOF information
671 isAccepted = isAcceptedTPC && isAcceptedITS;
673 isAccepted = isAccepted && isAcceptedTOF;
675 else if (fPIDStrategy == 7) { // ITS+TPC+TOF PID -- for pT >= fMinPtForTOFRequired TOF is required
676 if (!hasPIDTOF && track->Pt() < fMinPtForTOFRequired)
677 isAcceptedTOF = kTRUE;
678 isAccepted = isAcceptedITS && isAcceptedTPC && isAcceptedTOF;
680 else if (fPIDStrategy == 8) { // ITS+TPC+TOF PID
681 isAccepted = isAcceptedITS && isAcceptedTPC && isAcceptedTOF;
687 //________________________________________________________________________
688 Bool_t AliEbyEPidRatioHelper::IsTrackAcceptedPhi(AliVTrack *track) {
689 // -- Check if track is accepted
691 // > return 0 if not accepted
693 if (track->Phi() > fPhiMin && track->Phi() <= fPhiMax)
695 else if (track->Phi() < fPhiMin && (track->Phi() + TMath::TwoPi()) <= fPhiMax)
701 //________________________________________________________________________
702 void AliEbyEPidRatioHelper::BinLogAxis(const THnBase *hn, Int_t axisNumber, AliESDtrackCuts* cuts) {
703 AliESDtrackCuts* esdTrackCuts = (cuts) ? cuts : fESDTrackCuts;
705 // -- Make logarithmic binning
706 TAxis *axis = hn->GetAxis(axisNumber);
707 Int_t nBins = axis->GetNbins();
709 Double_t from = axis->GetXmin();
710 Double_t to = axis->GetXmax();
711 Double_t *newBins = new Double_t[nBins + 1];
714 Double_t factor = TMath::Power(to/from, 1./nBins);
716 for (int ii = 1; ii <= nBins; ii++)
717 newBins[ii] = factor * newBins[ii-1];
719 axis->Set(nBins, newBins);
724 // ------------------
726 Float_t oldPtRange[2];
727 esdTrackCuts->GetPtRange(ptRange[0],ptRange[1]);
728 esdTrackCuts->GetPtRange(oldPtRange[0],oldPtRange[1]);
730 Float_t minPtForTOFRequired = fMinPtForTOFRequired;
731 Float_t maxPtForTPClow = fMaxPtForTPClow;
733 // -- Update minPt Cut
734 Int_t bin = axis->FindBin(ptRange[0]+10e-7);
735 ptRange[0] = axis->GetBinLowEdge(bin);
737 // -- Update maxPt Cut
738 bin = axis->FindBin(ptRange[1]-10e-7);
739 ptRange[1] = axis->GetBinUpEdge(bin);
741 if (ptRange[0] != oldPtRange[0] || ptRange[1] != oldPtRange[1]) {
742 printf(">>>> Update Pt Range : [%f,%f] -> [%f,%f]\n", oldPtRange[0], oldPtRange[1], ptRange[0], ptRange[1]);
743 esdTrackCuts->SetPtRange(ptRange[0],ptRange[1]);
746 // -- Update MinPtForTOFRequired
747 bin = axis->FindBin(minPtForTOFRequired-10e-7);
748 minPtForTOFRequired = axis->GetBinUpEdge(bin);
750 if (minPtForTOFRequired != fMinPtForTOFRequired) {
751 printf(">>>> Update Min Pt for TOF : %f -> %f\n", fMinPtForTOFRequired, minPtForTOFRequired);
752 fMinPtForTOFRequired = minPtForTOFRequired;
755 // -- Update MaxPtForTPClow
756 bin = axis->FindBin(maxPtForTPClow-10e-7);
757 maxPtForTPClow = axis->GetBinUpEdge(bin);
759 if (maxPtForTPClow != fMaxPtForTPClow) {
760 printf(">>>> Update Max Pt for TPC Low : %f -> %f\n", fMaxPtForTPClow, maxPtForTPClow);
761 fMaxPtForTPClow = maxPtForTPClow;
765 //________________________________________________________________________
766 void AliEbyEPidRatioHelper::InitializeEventStats() {
767 // -- Initialize event statistics histograms
769 fHEventStat0 = new TH1F("hEventStat0","Event cut statistics 0;Event Cuts;Events", fHEventStatMax,-0.5,fHEventStatMax-0.5);
770 fHEventStat1 = new TH1F("hEventStat1","Event cut statistics 1;Event Cuts;Events", fHEventStatMax,-0.5,fHEventStatMax-0.5);
772 for ( Int_t ii=0; ii < fHEventStatMax-1; ii++ ) {
773 fHEventStat0->GetXaxis()->SetBinLabel(ii+1, AliEbyEPidRatioHelper::fgkEventNames[ii]);
774 fHEventStat1->GetXaxis()->SetBinLabel(ii+1, AliEbyEPidRatioHelper::fgkEventNames[ii]);
777 fHEventStat0->GetXaxis()->SetBinLabel(fHEventStatMax, Form("Centrality [0-%s]%%", AliEbyEPidRatioHelper::fgkCentralityMaxNames[fCentralityBinMax-1]));
778 fHEventStat1->GetXaxis()->SetBinLabel(fHEventStatMax, Form("Centrality [0-%s]%%", AliEbyEPidRatioHelper::fgkCentralityMaxNames[fCentralityBinMax-1]));
781 //________________________________________________________________________
782 void AliEbyEPidRatioHelper::InitializeTriggerStats() {
783 // -- Initialize trigger statistics histograms
785 fHTriggerStat = new TH1F("hTriggerStat","Trigger statistics;Trigger;Events", fNTriggers,-0.5,fNTriggers-0.5);
787 for ( Int_t ii=0; ii < fNTriggers; ii++ )
788 fHTriggerStat->GetXaxis()->SetBinLabel(ii+1, AliEbyEPidRatioHelper::fgkTriggerNames[ii]);
791 //________________________________________________________________________
792 void AliEbyEPidRatioHelper::InitializeCentralityStats() {
793 // -- Initialize trigger statistics histograms
795 fHCentralityStat = new TH1F("hCentralityStat","Centrality statistics;Centrality Bins;Events",
796 fNCentralityBins,-0.5,fNCentralityBins-0.5);
798 for ( Int_t ii=0; ii < fNCentralityBins; ii++ )
799 fHCentralityStat->GetXaxis()->SetBinLabel(ii+1, AliEbyEPidRatioHelper::fgkCentralityNames[ii]);
801 fHCentralityPer = new TH1F("hCentralityPercentileAccepted","Centrality Percentile statistics;Centrality Bins;Events",
804 fHCentralityPerAll = new TH1F("hCentralityPercentileAll","Centrality Percentile statistics;Centrality Bins;Events",
809 //________________________________________________________________________
810 Bool_t AliEbyEPidRatioHelper::FillEventStats(Int_t *aEventCuts) {
811 // -- Fill event / centrality statistics
813 Bool_t isRejected = kFALSE;
816 // -- Fill event statistics
817 for (Int_t idx = 0; idx < fHEventStatMax ; ++idx) {
822 fHEventStat0->Fill(idx);
825 for (Int_t idx = 0; idx < fHEventStatMax; ++idx) {
828 fHEventStat1->Fill(idx);
831 // -- Fill centrality statistics of accepted events
833 fHCentralityStat->Fill(fCentralityBin);
834 fHCentralityPer->Fill(fCentralityPercentile);
837 fHCentralityPerAll->Fill(fCentralityPercentile);