10 #include "AliMCEvent.h"
11 #include "AliMCParticle.h"
12 #include "AliESDtrackCuts.h"
13 #include "AliESDInputHandler.h"
14 #include "AliESDpid.h"
15 #include "AliCentrality.h"
16 #include "AliTracker.h"
18 #include "AliAnalysisNetParticleHelper.h"
22 // Task for NetParticle checks
23 // Author: Jochen Thaeder <jochen@thaeder.de>
25 ClassImp(AliAnalysisNetParticleHelper)
28 * ---------------------------------------------------------------------------------
29 * Constructor / Destructor
30 * ---------------------------------------------------------------------------------
33 //________________________________________________________________________
34 AliAnalysisNetParticleHelper::AliAnalysisNetParticleHelper() :
42 fCentralityPercentile(-1.),
47 fMinTrackLengthMC(70.),
51 fParticleSpecies(AliPID::kProton),
52 fControlParticleCode(3122),
53 fControlParticleIsNeutral(kTRUE),
54 fControlParticleName("Lambda"),
58 fMinPtForTOFRequired(0.8),
67 fHCentralityStat(NULL),
75 AliLog::SetClassDebugLevel("AliAnalysisNetParticleHelper",10);
78 //________________________________________________________________________
79 AliAnalysisNetParticleHelper::~AliAnalysisNetParticleHelper() {
82 for (Int_t jj = 0; jj < 2; ++jj) {
83 if (fCorr0[jj]) delete[] fCorr0[jj];
84 if (fCorr1[jj]) delete[] fCorr1[jj];
86 if (fCorr0) delete[] fCorr0;
87 if (fCorr1) delete[] fCorr1;
93 * ---------------------------------------------------------------------------------
95 * ---------------------------------------------------------------------------------
98 //________________________________________________________________________
99 Int_t AliAnalysisNetParticleHelper::Initialize(Bool_t isMC) {
100 // -- Initialize helper
104 // -- Setup event cut statistics
105 InitializeEventStats();
107 // -- Setup trigger statistics
108 InitializeTriggerStats();
110 // -- Setup centrality statistics
111 InitializeCentralityStats();
113 // -- Load Eta correction function
114 iResult = InitializeEtaCorrection(isMC);
116 // -- Load Eta correction function
117 iResult = InitializeTrackbyTrackCorrection();
122 //________________________________________________________________________
123 Int_t AliAnalysisNetParticleHelper::SetupEvent(AliESDInputHandler *esdHandler, AliMCEvent *mcEvent) {
126 // -- Get ESD objects
127 fESDHandler = esdHandler;
128 fPIDResponse = esdHandler->GetPIDResponse();
129 fESD = fESDHandler->GetEvent();
134 fStack = fMCEvent->Stack();
136 // -- Get event centrality
137 // > 0-5|5-10|10-20|20-30|30-40|40-50|50-60|60-70|70-80|80-90 --> 10 bins
138 // > 0 1 2 3 4 5 6 7 8 9
140 AliCentrality *centrality = fESD->GetCentrality();
142 Int_t centBin = centrality->GetCentralityClass10("V0M");
144 fCentralityBin = centrality->GetCentralityClass5("V0M");
145 else if (centBin == 10 || centBin == -1.)
147 else if (centBin > 0 && centBin < fNCentralityBins)
148 fCentralityBin = centBin + 1;
152 // -- Stay within the max centrality bin
153 if (fCentralityBin >= fCentralityBinMax)
156 fCentralityPercentile = centrality->GetCentralityPercentile("V0M");
158 // -- Update TPC pid with eta correction
159 UpdateEtaCorrectedTPCPid();
165 * ---------------------------------------------------------------------------------
166 * Event / Trigger Statistics
167 * ---------------------------------------------------------------------------------
170 //________________________________________________________________________
171 Bool_t AliAnalysisNetParticleHelper::IsEventTriggered() {
172 // -- Check if Event is triggered and fill Trigger Histogram
174 Bool_t *aTriggerFired = new Bool_t[fNTriggers];
175 for (Int_t ii = 0; ii < fNTriggers; ++ii)
176 aTriggerFired[ii] = kFALSE;
178 if ((fESDHandler->IsEventSelected() & AliVEvent::kMB)) aTriggerFired[0] = kTRUE;
179 if ((fESDHandler->IsEventSelected() & AliVEvent::kCentral)) aTriggerFired[1] = kTRUE;
180 if ((fESDHandler->IsEventSelected() & AliVEvent::kSemiCentral)) aTriggerFired[2] = kTRUE;
181 if ((fESDHandler->IsEventSelected() & AliVEvent::kEMCEJE)) aTriggerFired[3] = kTRUE;
182 if ((fESDHandler->IsEventSelected() & AliVEvent::kEMCEGA)) aTriggerFired[4] = kTRUE;
184 Bool_t isTriggered = kFALSE;
186 for (Int_t ii=0; ii<fNTriggers; ++ii) {
187 if(aTriggerFired[ii]) {
189 fHTriggerStat->Fill(ii);
193 delete[] aTriggerFired;
198 //________________________________________________________________________
199 Bool_t AliAnalysisNetParticleHelper::IsEventRejected() {
200 // -- Evaluate event statistics histograms
202 Int_t *aEventCuts = new Int_t[fHEventStatMax];
203 // set aEventCuts[ii] to 1 in case of reject
205 for (Int_t ii=0;ii<fHEventStatMax; ++ii)
210 // -- 0 - Before Physics Selection
211 aEventCuts[iCut] = 0;
213 // -- 1 - No Trigger fired
215 if (!IsEventTriggered())
216 aEventCuts[iCut] = 1;
220 const AliESDVertex* vtxESD = fESD->GetPrimaryVertexTracks();
222 aEventCuts[iCut] = 1;
224 // -- 3 - Vertex z outside cut window
227 if(TMath::Abs(vtxESD->GetZv()) > fVertexZMax)
228 aEventCuts[iCut] = 1;
231 aEventCuts[iCut] = 1;
233 // -- 4 - Centrality = -1 (no centrality or not hadronic)
235 if(fCentralityBin == -1.)
236 aEventCuts[iCut] = 1;
238 // -- 5 - Centrality < fCentralityMax
240 if(fCentralityBin == -2.)
241 aEventCuts[iCut] = 1;
243 // -- Fill statistics / reject event
244 Bool_t isRejected = FillEventStats(aEventCuts);
253 * ---------------------------------------------------------------------------------
254 * Accept Particle Methods - private
255 * ---------------------------------------------------------------------------------
258 //________________________________________________________________________
259 Bool_t AliAnalysisNetParticleHelper::IsParticleAcceptedBasicCharged(TParticle *particle, Int_t idxMC) {
260 // -- Check if MC particle is accepted for basic parameters
265 // -- check if PDF code exists
266 if (!particle->GetPDG())
269 // -- check if charged
270 if (particle->GetPDG()->Charge() == 0.0)
273 // -- check if physical primary
274 if(!fStack->IsPhysicalPrimary(idxMC))
279 //________________________________________________________________________
280 Bool_t AliAnalysisNetParticleHelper::IsParticleAcceptedBasicNeutral(TParticle *particle, Int_t idxMC) {
281 // -- Check if MC particle is accepted for basic parameters
286 // -- check if PDF code exists
287 if (!particle->GetPDG())
290 // -- check if neutral
291 if (particle->GetPDG()->Charge() != 0.0)
294 // -- check if physical primary
295 if(!fStack->IsPhysicalPrimary(idxMC))
301 //________________________________________________________________________
302 Bool_t AliAnalysisNetParticleHelper::IsParticleAcceptedRapidity(TParticle *particle, Double_t &yP) {
303 // -- Check if particle is accepted
305 // > return 0 if not accepted
307 Double_t mP = AliPID::ParticleMass(fParticleSpecies);
309 // -- Calculate rapidities and kinematics
310 Double_t p = particle->P();
311 Double_t pz = particle->Pz();
313 Double_t eP = TMath::Sqrt(p*p + mP*mP);
314 yP = 0.5 * TMath::Log((eP + pz) / (eP - pz));
316 // -- Check Rapidity window
317 if (TMath::Abs(yP) > fRapidityMax)
323 //_____________________________________________________________________________
324 Bool_t AliAnalysisNetParticleHelper::IsParticleFindable(Int_t label) {
325 // -- Check if MC particle is findable tracks
327 AliMCParticle *mcParticle = static_cast<AliMCParticle*>(fMCEvent->GetTrack(label));
332 Float_t tpcTrackLength = mcParticle->GetTPCTrackLength(AliTracker::GetBz(), 0.05, counter, 3.0);
334 return (tpcTrackLength > fMinTrackLengthMC);
338 * ---------------------------------------------------------------------------------
339 * Accept Track Methods - public
340 * ---------------------------------------------------------------------------------
343 //________________________________________________________________________
344 Bool_t AliAnalysisNetParticleHelper::IsTrackAcceptedBasicCharged(AliESDtrack *track) {
345 // -- Check if track is accepted
346 // > for basic parameters
351 if (track->Charge() == 0)
354 // -- Get momentum for dEdx
355 if (!track->GetInnerParam())
361 //________________________________________________________________________
362 Bool_t AliAnalysisNetParticleHelper::IsTrackAcceptedRapidity(AliESDtrack *track, Double_t &yP) {
363 // -- Check if track is accepted
365 // > return 0 if not accepted
367 Double_t mP = AliPID::ParticleMass(fParticleSpecies);
369 // -- Calculate rapidities and kinematics
371 track->GetPxPyPz(pvec);
373 Double_t p = track->GetP();
374 Double_t eP = TMath::Sqrt(p*p + mP*mP);
375 yP = 0.5 * TMath::Log((eP + pvec[2]) / (eP - pvec[2]));
377 // -- Check Rapidity window
378 if (TMath::Abs(yP) > fRapidityMax)
384 //________________________________________________________________________
385 Bool_t AliAnalysisNetParticleHelper::IsTrackAcceptedDCA(AliESDtrack *track) {
386 // -- Check if track is accepted
387 // > for DCA, if both SPD layers have hits
389 Bool_t isAccepted = kTRUE;
392 if (track->HasPointOnITSLayer(0) && track->HasPointOnITSLayer(1)) {
394 // -- Get DCA nSigmas
395 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
396 track->GetImpactParameters(dca,cov);
398 Float_t nSigmaCdd = (cov[0] != 0.) ? dca[0]/TMath::Sqrt(cov[0]) : -9.99;
399 Float_t nSigmaCzz = (cov[2] != 0.) ? dca[1]/TMath::Sqrt(cov[2]) : -9.99;
401 if (fNSigmaMaxCdd != 0.) {
402 if (TMath::Abs(nSigmaCdd) > fNSigmaMaxCdd)
406 if (fNSigmaMaxCzz != 0.) {
407 if (TMath::Abs(nSigmaCzz) > fNSigmaMaxCzz)
415 //________________________________________________________________________
416 Bool_t AliAnalysisNetParticleHelper::IsTrackAcceptedPID(AliESDtrack *track, Double_t* pid) {
417 // -- Check if track is accepted
418 // > provides TPC and TOF nSigmas to the argument
420 Bool_t isAcceptedTPC = kFALSE;
421 Bool_t isAcceptedTOF = kTRUE;
424 pid[0] = fPIDResponse->NumberOfSigmasTPC(track, fParticleSpecies);
425 pid[1] = fPIDResponse->NumberOfSigmasTOF(track, fParticleSpecies);
427 // -- Check PID with TPC
428 if (TMath::Abs(pid[0]) < fNSigmaMaxTPC)
429 isAcceptedTPC = kTRUE;
431 // -- Check PID with TOF
434 // Has TOF PID availible
435 if (track->GetStatus() & AliVTrack::kTOFpid) {
436 if (TMath::Abs(pid[1]) < fNSigmaMaxTOF)
437 isAcceptedTOF = kTRUE;
439 isAcceptedTOF = kFALSE;
442 // Has no TOF PID availible
444 if (track->Pt() > fMinPtForTOFRequired)
445 isAcceptedTOF = kFALSE;
447 isAcceptedTOF = kTRUE;
449 } // if (isAcceptedTPC) {
451 return (isAcceptedTPC && isAcceptedTOF);
455 * ---------------------------------------------------------------------------------
457 * ---------------------------------------------------------------------------------
460 //________________________________________________________________________
461 void AliAnalysisNetParticleHelper::UpdateEtaCorrectedTPCPid() {
462 // -- Update eta corrected TPC pid
467 for (Int_t idxTrack = 0; idxTrack < fESD->GetNumberOfTracks(); ++idxTrack) {
468 AliESDtrack *track = fESD->GetTrack(idxTrack);
470 // -- Check if charged track is accepted for basic parameters
471 if (!IsTrackAcceptedBasicCharged(track))
474 Double_t newTPCSignal = track->GetTPCsignal() / fEtaCorrFunc->Eval(track->Eta());
475 track->SetTPCsignal(newTPCSignal, track->GetTPCsignalSigma(), track->GetTPCsignalN());
479 //________________________________________________________________________
480 Double_t AliAnalysisNetParticleHelper::GetTrackbyTrackCorrectionFactor(Double_t *aTrack, Int_t flag) {
481 // -- Get efficiency correctionf of particle dependent on (eta, phi, pt, centrality)
483 Int_t idxPart = (aTrack[2] < 0) ? 0 : 1;
484 THnSparseF* corrMatrix = (flag == 0) ? fCorr0[idxPart][fCentralityBin] : fCorr1[idxPart][fCentralityBin];
486 Double_t dimBin[3] = {aTrack[3], aTrack[4], aTrack[1]}; // eta, phi, pt
488 Double_t corr = corrMatrix->GetBinContent(corrMatrix->GetBin(dimBin));
490 AliError(Form("Should not happen : bin content = 0. >> eta: %.2f | phi : %.2f | pt : %.2f | cent %d",
491 aTrack[3], aTrack[4], aTrack[1], fCentralityBin));
498 //________________________________________________________________________
499 void AliAnalysisNetParticleHelper::BinLogAxis(const THnSparseF *h, Int_t axisNumber) {
500 // -- Method for the correct logarithmic binning of histograms
502 TAxis *axis = h->GetAxis(axisNumber);
503 Int_t bins = axis->GetNbins();
505 Double_t from = axis->GetXmin();
506 Double_t to = axis->GetXmax();
507 Double_t *newBins = new Double_t[bins + 1];
510 Double_t factor = pow(to/from, 1./bins);
512 for (int i = 1; i <= bins; i++) {
513 newBins[i] = factor * newBins[i-1];
515 axis->Set(bins, newBins);
519 ///////////////////////////////////////////////////////////////////////////////////
522 * ---------------------------------------------------------------------------------
523 * Initialize - Private
524 * ---------------------------------------------------------------------------------
527 //________________________________________________________________________
528 void AliAnalysisNetParticleHelper::InitializeEventStats() {
529 // -- Initialize event statistics histograms
531 const Char_t* aEventNames[] = {"All", "IsTriggered", "HasVertex", "Vz<Vz_{Max}", "Centrality [0,90]%"};
532 const Char_t* aCentralityMaxNames[] = {"5", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100"};
534 fHEventStat0 = new TH1F("fHEventStat0","Event cut statistics 0;Event Cuts;Events", fHEventStatMax,-0.5,fHEventStatMax-0.5);
535 fHEventStat1 = new TH1F("fHEventStat1","Event cut statistics 1;Event Cuts;Events", fHEventStatMax,-0.5,fHEventStatMax-0.5);
537 for ( Int_t ii=0; ii < fHEventStatMax-1; ii++ ) {
538 fHEventStat0->GetXaxis()->SetBinLabel(ii+1, aEventNames[ii]);
539 fHEventStat1->GetXaxis()->SetBinLabel(ii+1, aEventNames[ii]);
541 fHEventStat0->GetXaxis()->SetBinLabel(fHEventStatMax, Form("Centrality [0-%s]%%", aCentralityMaxNames[fCentralityBinMax-1]));
542 fHEventStat1->GetXaxis()->SetBinLabel(fHEventStatMax, Form("Centrality [0-%s]%%", aCentralityMaxNames[fCentralityBinMax-1]));
545 //________________________________________________________________________
546 void AliAnalysisNetParticleHelper::InitializeTriggerStats() {
547 // -- Initialize trigger statistics histograms
549 const Char_t* aTriggerNames[] = { "kMB", "kCentral", "kSemiCentral", "kEMCEJE", "kEMCEGA" };
551 fHTriggerStat = new TH1F("fHTriggerStat","Trigger statistics;Trigger;Events", fNTriggers,-0.5,fNTriggers-0.5);
553 for ( Int_t ii=0; ii < fNTriggers; ii++ )
554 fHTriggerStat->GetXaxis()->SetBinLabel(ii+1, aTriggerNames[ii]);
557 //________________________________________________________________________
558 void AliAnalysisNetParticleHelper::InitializeCentralityStats() {
559 // -- Initialize trigger statistics histograms
561 const Char_t* aCentralityNames[] = {"0-5%", "5-10%", "10-20%", "20-30%", "30-40%", "40-50%",
562 "50-60%", "60-70%", "70-80%", "80-90%", "90-100%"};
564 fHCentralityStat = new TH1F("fHCentralityStat","Centrality statistics;Centrality Bins;Events",
565 fNCentralityBins,-0.5,fNCentralityBins-0.5);
567 for ( Int_t ii=0; ii < fNCentralityBins; ii++ )
568 fHCentralityStat->GetXaxis()->SetBinLabel(ii+1, aCentralityNames[ii]);
571 //________________________________________________________________________
572 Int_t AliAnalysisNetParticleHelper::InitializeEtaCorrection(Bool_t isMC) {
573 // -- Initialize eta correction maps for TPC pid
575 TFile fileEtaCorrMaps("${ALICE_ROOT}/PWGDQ/dielectron/files/EtaCorrMaps.root");
576 if (!fileEtaCorrMaps.IsOpen())
579 TList *keyList = fileEtaCorrMaps.GetListOfKeys();
582 sList = (isMC) ? "LHC11a10" : "LHC10h.pass2";
584 for (Int_t idx = 0; idx < keyList->GetEntries(); ++idx) {
585 TString keyName = keyList->At(idx)->GetName();
586 TPRegexp reg(keyName);
587 if (reg.MatchB(sList)){
588 AliInfo(Form("Using Eta Correction Function: %s",keyName.Data()));
589 fEtaCorrFunc = static_cast<TF1*>(fileEtaCorrMaps.Get(keyName.Data()));
597 //________________________________________________________________________
598 Int_t AliAnalysisNetParticleHelper::InitializeTrackbyTrackCorrection() {
599 // -- Initialize track by track correction matrices
601 AliInfo("TODO ... get the correct name from particle"); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
603 TFile* corrFile = TFile::Open("${ALICE_ROOT}/PWGCF/EBYE/NetParticle/eff/effectiveCorrectionProton.root");
605 AliError("Track-by-track correction file can not be opened!");
609 // -- correction - not cross section corrected
610 fCorr0 = new THnSparseF**[2];
611 fCorr0[0] = new THnSparseF*[fCentralityBinMax];
612 fCorr0[1] = new THnSparseF*[fCentralityBinMax];
614 for (Int_t idxCent = 0; idxCent < fCentralityBinMax; ++idxCent) {
615 THnSparseF *sp0 = static_cast<THnSparseF*>(corrFile->Get(Form("pbar_Corr0_Cent_%d", idxCent)));
616 THnSparseF *sp1 = static_cast<THnSparseF*>(corrFile->Get(Form("p_Corr0_Cent_%d", idxCent)));
619 AliError(Form("Effective correction objects 0 - idxCent %d can not be retrieved!",idxCent));
623 fCorr0[0][idxCent] = static_cast<THnSparseF*>(sp0->Clone());
624 fCorr0[1][idxCent] = static_cast<THnSparseF*>(sp1->Clone());
627 // -- correction - ross section corrected
628 fCorr1 = new THnSparseF**[2];
629 fCorr1[0] = new THnSparseF*[fCentralityBinMax];
630 fCorr1[1] = new THnSparseF*[fCentralityBinMax];
632 for (Int_t idxCent = 0; idxCent < fCentralityBinMax; ++idxCent) {
633 THnSparseF *sp0 = static_cast<THnSparseF*>(corrFile->Get(Form("pbar_Corr1_Cent_%d", idxCent)));
634 THnSparseF *sp1 = static_cast<THnSparseF*>(corrFile->Get(Form("p_Corr1_Cent_%d", idxCent)));
637 AliError(Form("Effective correction objects 1 - idxCent %d can not be retrieved!",idxCent));
641 fCorr1[0][idxCent] = static_cast<THnSparseF*>(sp0->Clone());
642 fCorr1[1][idxCent] = static_cast<THnSparseF*>(sp1->Clone());
649 * ---------------------------------------------------------------------------------
650 * Event / Trigger Statistics - private
651 * ---------------------------------------------------------------------------------
654 //________________________________________________________________________
655 Bool_t AliAnalysisNetParticleHelper::FillEventStats(Int_t *aEventCuts) {
656 // -- Fill event / centrality statistics
658 Bool_t isRejected = kFALSE;
660 // -- Fill event statistics
661 for (Int_t idx = 0; idx < fHEventStatMax ; ++idx) {
665 fHEventStat0->Fill(idx);
668 for (Int_t idx = 0; idx < fHEventStatMax; ++idx) {
671 fHEventStat1->Fill(idx);
674 // -- Fill centrality statistics of accepted events
676 fHCentralityStat->Fill(fCentralityBin);