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 **************************************************************************/
17 //=========================================================================//
18 // AliEbyE Analysis for Particle Ratio Fluctuation //
19 // Deepika Rathee | Satyajit Jena //
20 // drathee@cern.ch | sjena@cern.ch //
21 // Date: Wed Jul 9 18:38:30 CEST 2014 //
22 // New approch to find particle ratio to reduce memory //
24 // Copied from NetParticle Classes
25 // Origin: Jochen Thaeder <jochen@thaeder.de>
26 // Michael Weber <m.weber@cern.ch>
27 //=========================================================================//
32 #include "AliESDEvent.h"
34 #include "AliMCEvent.h"
35 #include "AliESDtrackCuts.h"
36 #include "AliAODEvent.h"
37 #include "AliAODMCParticle.h"
39 #include "AliEbyEPidRatioEffContExtra.h"
43 ClassImp(AliEbyEPidRatioEffContExtra)
45 //________________________________________________________________________
46 AliEbyEPidRatioEffContExtra::AliEbyEPidRatioEffContExtra() :
47 AliEbyEPidRatioBase("EffCont", "EffCont"),
67 AliLog::SetClassDebugLevel("AliEbyEPidRatioEffContExtra",10);
70 //________________________________________________________________________
71 AliEbyEPidRatioEffContExtra::~AliEbyEPidRatioEffContExtra() {
75 for (Int_t ii = 0; ii < 2; ++ii) {
76 for (Int_t kk = 0; kk < 4; ++kk)
77 if (fLabelsRec[ii][kk]) delete[] fLabelsRec[ii][kk];
78 if (fLabelsRec[ii]) delete[] fLabelsRec[ii];
80 if (fLabelsRec) delete[] fLabelsRec;
85 //________________________________________________________________________
86 void AliEbyEPidRatioEffContExtra::Process() {
87 for(Int_t i = 0; i < 4; i++) {
94 //________________________________________________________________________
95 void AliEbyEPidRatioEffContExtra::Init() {
96 fLabelsRec = new Int_t**[2];
97 for (Int_t ii = 0 ; ii < 2; ++ii) {
98 fLabelsRec[ii] = new Int_t*[4];
99 for (Int_t kk = 0 ; kk < 4; ++kk)
100 fLabelsRec[ii][kk] = NULL;
102 Printf(" >>>> AliEbyEPidRatioEffContExtra - inside");
105 //________________________________________________________________________
106 void AliEbyEPidRatioEffContExtra::CreateHistograms() {
107 Int_t binHnEffPIDMC[8] = {AliEbyEPidRatioHelper::fgkfHistNBinsCent,
108 AliEbyEPidRatioHelper::fgkfHistNBinsSign,
110 AliEbyEPidRatioHelper::fgkfHistNBinsRap,
111 AliEbyEPidRatioHelper::fgkfHistNBinsPhi,
114 Double_t minHnEffPIDMC[8] = {AliEbyEPidRatioHelper::fgkfHistRangeCent[0],
115 AliEbyEPidRatioHelper::fgkfHistRangeSign[0],
117 AliEbyEPidRatioHelper::fgkfHistRangeRap[0],
118 AliEbyEPidRatioHelper::fgkfHistRangePhi[0],
121 Double_t maxHnEffPIDMC[8] = {AliEbyEPidRatioHelper::fgkfHistRangeCent[1],
122 AliEbyEPidRatioHelper::fgkfHistRangeSign[1],
124 AliEbyEPidRatioHelper::fgkfHistRangeRap[1],
125 AliEbyEPidRatioHelper::fgkfHistRangePhi[1],
130 TString titilemc = "cent:signMC:findable:recStatus:pidStatus:yMC:phiMC:ptMC";
132 TString tiltlelaxmc[8] = {"Centrality",
138 "#varphi_{MC} (rad)",
139 "#it{p}_{T,MC} (GeV/#it{c})"
144 fHnNpiEMc = new THnSparseF("hmNpiEffMc",titilemc.Data(),8,binHnEffPIDMC,minHnEffPIDMC, maxHnEffPIDMC);
145 fHnNkaEMc = new THnSparseF("hmNkaEffMc",titilemc.Data(),8,binHnEffPIDMC,minHnEffPIDMC, maxHnEffPIDMC);
146 fHnNprEMc = new THnSparseF("hmNprEffMc",titilemc.Data(),8,binHnEffPIDMC,minHnEffPIDMC, maxHnEffPIDMC);
147 fHnNchEMc = new THnSparseF("hmNchEffMc",titilemc.Data(),8,binHnEffPIDMC,minHnEffPIDMC, maxHnEffPIDMC);
149 for (Int_t i = 0; i < 8; i++) {
150 fHnNchEMc->GetAxis(i)->SetTitle(tiltlelaxmc[i].Data());
151 fHnNpiEMc->GetAxis(i)->SetTitle(tiltlelaxmc[i].Data());
152 fHnNkaEMc->GetAxis(i)->SetTitle(tiltlelaxmc[i].Data());
153 fHnNprEMc->GetAxis(i)->SetTitle(tiltlelaxmc[i].Data());
159 Int_t binHnEffPID[5] = {AliEbyEPidRatioHelper::fgkfHistNBinsCent,
160 AliEbyEPidRatioHelper::fgkfHistNBinsSign,
161 AliEbyEPidRatioHelper::fgkfHistNBinsRap,
162 AliEbyEPidRatioHelper::fgkfHistNBinsPhi,
165 Double_t minHnEffPID[5] = {AliEbyEPidRatioHelper::fgkfHistRangeCent[0],
166 AliEbyEPidRatioHelper::fgkfHistRangeSign[0],
167 AliEbyEPidRatioHelper::fgkfHistRangeRap[0],
168 AliEbyEPidRatioHelper::fgkfHistRangePhi[0],
172 Double_t maxHnEffPID[5] = {AliEbyEPidRatioHelper::fgkfHistRangeCent[1],
173 AliEbyEPidRatioHelper::fgkfHistRangeSign[1],
174 AliEbyEPidRatioHelper::fgkfHistRangeRap[1],
175 AliEbyEPidRatioHelper::fgkfHistRangePhi[1],
179 TString titilerec = "cent:signRec:yRec:phiRec:ptRec";
180 TString tiltlelaxrec[5] = {"Centrality",
183 "#varphi_{Rec} (rad)",
184 "#it{p}_{T,Rec} (GeV/#it{c})"};
187 fHnNpiERec = new THnSparseF("hmNpiEffRec",titilerec.Data(),5,binHnEffPID, minHnEffPID, maxHnEffPID);
188 fHnNkaERec = new THnSparseF("hmNkaEffRec",titilerec.Data(),5,binHnEffPID, minHnEffPID, maxHnEffPID);
189 fHnNprERec = new THnSparseF("hmNprEffRec",titilerec.Data(),5,binHnEffPID, minHnEffPID, maxHnEffPID);
190 fHnNchERec = new THnSparseF("hmNchEffRec",titilerec.Data(),5,binHnEffPID,minHnEffPID, maxHnEffPID);
194 for (Int_t i = 0; i < 5; i++) {
195 fHnNchERec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
196 fHnNpiERec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
197 fHnNkaERec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
198 fHnNprERec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
204 Int_t binHnCont[6] = {AliEbyEPidRatioHelper::fgkfHistNBinsCent,
205 AliEbyEPidRatioHelper::fgkfHistNBinsSign,
207 AliEbyEPidRatioHelper::fgkfHistNBinsRap,
208 AliEbyEPidRatioHelper::fgkfHistNBinsPhi,
211 Double_t minHnCont[6] = {AliEbyEPidRatioHelper::fgkfHistRangeCent[0],
212 AliEbyEPidRatioHelper::fgkfHistRangeSign[0],
214 AliEbyEPidRatioHelper::fgkfHistRangeRap[0],
215 AliEbyEPidRatioHelper::fgkfHistRangePhi[0],
220 Double_t maxHnCont[6] = {AliEbyEPidRatioHelper::fgkfHistRangeCent[1],
221 AliEbyEPidRatioHelper::fgkfHistRangeSign[1],
223 AliEbyEPidRatioHelper::fgkfHistRangeRap[1],
224 AliEbyEPidRatioHelper::fgkfHistRangePhi[1],
230 TString titilecont = "cent:signMC:contStatus:yMC:phiMC:ptMC";
231 TString tiltlelaxcont[6]
232 = {"Centrality","sign","contPart","#it{y}_{MC}","#varphi_{MC} (rad)","#it{p}_{T,MC} (GeV/#it{c})"};
234 fHnNpiCMc = new THnSparseF("hmNpiContMc",titilecont.Data(),6,binHnCont,minHnCont, maxHnCont);
235 fHnNkaCMc = new THnSparseF("hmNkaContMc",titilecont.Data(),6,binHnCont,minHnCont, maxHnCont);
236 fHnNprCMc = new THnSparseF("hmNprContMc",titilecont.Data(),6,binHnCont,minHnCont, maxHnCont);
237 fHnNchCMc = new THnSparseF("hmNchContMc",titilecont.Data(),6,binHnCont,minHnCont, maxHnCont);
239 for (Int_t i = 0; i < 6; i++) {
240 fHnNchCMc->GetAxis(i)->SetTitle(tiltlelaxcont[i].Data());
241 fHnNpiCMc->GetAxis(i)->SetTitle(tiltlelaxcont[i].Data());
242 fHnNkaCMc->GetAxis(i)->SetTitle(tiltlelaxcont[i].Data());
243 fHnNprCMc->GetAxis(i)->SetTitle(tiltlelaxcont[i].Data());
248 fHnNpiCRec = new THnSparseF("hmNpiContRec",titilerec.Data(),5,binHnEffPID,minHnEffPID, maxHnEffPID);
249 fHnNkaCRec = new THnSparseF("hmNkaContRec",titilerec.Data(),5,binHnEffPID,minHnEffPID, maxHnEffPID);
250 fHnNprCRec = new THnSparseF("hmNprContRec",titilerec.Data(),5,binHnEffPID,minHnEffPID, maxHnEffPID);
251 fHnNchCRec = new THnSparseF("hmNchContRec",titilerec.Data(),5,binHnEffPID,minHnEffPID, maxHnEffPID);
253 for (Int_t i = 0; i < 5; i++) {
254 fHnNchCRec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
255 fHnNpiCRec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
256 fHnNkaCRec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
257 fHnNprCRec->GetAxis(i)->SetTitle(tiltlelaxrec[i].Data());
261 fHelper->BinLogAxis(fHnNchERec,4);
262 fHelper->BinLogAxis(fHnNpiERec,4);
263 fHelper->BinLogAxis(fHnNkaERec,4);
264 fHelper->BinLogAxis(fHnNprERec,4);
266 fHelper->BinLogAxis(fHnNchEMc,7);
267 fHelper->BinLogAxis(fHnNpiEMc,7);
268 fHelper->BinLogAxis(fHnNkaEMc,7);
269 fHelper->BinLogAxis(fHnNprEMc,7);
271 fHelper->BinLogAxis(fHnNchCMc,5);
272 fHelper->BinLogAxis(fHnNpiCMc,5);
273 fHelper->BinLogAxis(fHnNkaCMc,5);
274 fHelper->BinLogAxis(fHnNprCMc,5);
276 fHelper->BinLogAxis(fHnNchCRec,4);
277 fHelper->BinLogAxis(fHnNpiCRec,4);
278 fHelper->BinLogAxis(fHnNkaCRec,4);
279 fHelper->BinLogAxis(fHnNprCRec,4);
285 //________________________________________________________________________
286 Int_t AliEbyEPidRatioEffContExtra::Setup() {
287 for(Int_t i = 0; i < 4; i++) {
288 fLabelsRec[0][i] = new Int_t[fNTracks];
289 if(!fLabelsRec[0][i]) {
290 AliError("Cannot create fLabelsRec[0]");
294 fLabelsRec[1][i] = new Int_t[fNTracks];
295 if(!fLabelsRec[1][i]) {
296 AliError("Cannot create fLabelsRec[1] for PID");
300 for(Int_t ii = 0; ii < fNTracks; ++ii) {
301 fLabelsRec[0][i][ii] = 0;
302 fLabelsRec[1][i][ii] = 0;
309 //________________________________________________________________________
310 void AliEbyEPidRatioEffContExtra::Reset() {
311 // -- Reset eventwise
313 for(Int_t i = 0; i < 4; i++) {
314 for (Int_t ii = 0; ii < 2 ; ++ii) {
315 if (fLabelsRec[ii][i])
316 delete[] fLabelsRec[ii][i];
317 fLabelsRec[ii][i] = NULL;
322 //________________________________________________________________________
323 void AliEbyEPidRatioEffContExtra::FillMCLabels(Int_t ipid) {
325 // Loop over ESD tracks and fill arrays with MC lables
326 // fLabelsRec[0] : all Tracks
327 // fLabelsRec[1] : all Tracks accepted by PID of TPC
328 // Check every accepted track if correctly identified
329 // otherwise check for contamination
331 // -- Get ranges for AOD particles
333 fESDTrackCuts->GetEtaRange(etaRange[0],etaRange[1]);
336 fESDTrackCuts->GetPtRange(ptRange[0],ptRange[1]);
339 for (Int_t idxTrack = 0; idxTrack < fNTracks; ++idxTrack) {
340 AliVTrack *track = (fESD) ? static_cast<AliVTrack*>(fESD->GetTrack(idxTrack)) : static_cast<AliVTrack*>(fAOD->GetTrack(idxTrack));
342 // -- Check if track is accepted for basic parameters
343 if (!fHelper->IsTrackAcceptedBasicCharged(track))
346 // -- Check if accepted - ESD
347 if (fESD && !fESDTrackCuts->AcceptTrack(dynamic_cast<AliESDtrack*>(track)))
350 // -- Check if accepted - AOD
352 AliAODTrack * trackAOD = dynamic_cast<AliAODTrack*>(track);
355 AliError("Pointer to dynamic_cast<AliAODTrack*>(track) = ZERO");
358 if (!trackAOD->TestFilterBit(fAODtrackCutBit))
361 // -- Check if in pT and eta range (is done in ESDTrackCuts for ESDs)
362 if(!(track->Pt() > ptRange[0] && track->Pt() <= ptRange[1] && TMath::Abs(track->Eta()) <= etaRange[1]))
366 // -- Check if accepted in rapidity window -- for identified particles
367 // for charged particles -- eta check is done in the trackcuts
369 if (fHelper->GetUsePID(ipid) && !fHelper->IsTrackAcceptedRapidity(track, yP, ipid))
373 if (!fHelper->IsTrackAcceptedDCA(track))
376 Int_t label = TMath::Abs(track->GetLabel());
379 // -- Fill Label of all reconstructed
380 fLabelsRec[0][ipid][idxTrack] = label;
382 // -- Check if accepted by PID from TPC or TPC+TOF
384 if (!fHelper->IsTrackAcceptedPID(track, pid, fHelper->GetParticleSpecies(ipid))) // check it
389 // -- Fill Label of all reconstructed && recPid_TPC+TOF
390 fLabelsRec[1][ipid][idxTrack] = label;
392 // -- Check for contamination and fill contamination THnSparse
393 CheckContTrack(track, ipid);
395 } // for (Int_t idxTrack = 0; idxTrack < fNTracks; ++idxTrack) {
400 //________________________________________________________________________
401 void AliEbyEPidRatioEffContExtra::CheckContTrack(AliVTrack *track, Int_t ipid) {
402 // Check if particle is contamination or correctly identified for ESDs and AODs
403 // Check for missidentified primaries and secondaries
404 // Fill contamination THnSparse
406 Int_t label = TMath::Abs(track->GetLabel());
407 Float_t signRec = track->Charge();
410 AliVParticle* particle = (fESD) ? fMCEvent->GetTrack(label) : static_cast<AliVParticle*>(fArrayMC->At(label));
414 Bool_t isPhysicalPrimary = (fESD) ? fStack->IsPhysicalPrimary(label): (static_cast<AliAODMCParticle*>(particle))->IsPhysicalPrimary();
416 // -- Check if correctly identified
417 // > return if correctly identified -> all ok, no action neededin this method
418 // > if PID required check -> for the correct (signed pdgcode) particle
419 // > no PID just check for primary
420 if (fHelper->GetUsePID(ipid)) {
421 if (particle->PdgCode() == (signRec*fHelper->GetPdg(ipid)))
422 if (isPhysicalPrimary)
426 if (isPhysicalPrimary)
430 // -- Check if secondaries from material or weak decay
431 Bool_t isSecondaryFromWeakDecay = (fESD) ? fStack->IsSecondaryFromWeakDecay(label) : (static_cast<AliAODMCParticle*>(particle))->IsSecondaryFromWeakDecay();
432 Bool_t isSecondaryFromMaterial = (fESD) ? fStack->IsSecondaryFromMaterial(label) : (static_cast<AliAODMCParticle*>(particle))->IsSecondaryFromMaterial();
434 // -- Get PDG Charge of contaminating particle
436 if (particle->Charge() == 0.) signMC = 0.;
437 else if (particle->Charge() < 0.) signMC = -1.;
438 else if (particle->Charge() > 0.) signMC = 1.;
440 // -- Get contaminating particle
441 Double_t contPart = 0;
442 if (isSecondaryFromWeakDecay) contPart = 7; // probeParticle from WeakDecay
443 else if (isSecondaryFromMaterial) contPart = 8; // probeParticle from Material
445 if (TMath::Abs(particle->PdgCode()) == 211) contPart = 1; // pion
446 else if (TMath::Abs(particle->PdgCode()) == 321) contPart = 2; // kaon
447 else if (TMath::Abs(particle->PdgCode()) == 2212) contPart = 3; // proton
448 else if (TMath::Abs(particle->PdgCode()) == 11) contPart = 4; // electron
449 else if (TMath::Abs(particle->PdgCode()) == 13) contPart = 5; // muon
450 else contPart = 6; // other
453 // -- Get Reconstructed y
454 // yRec = y for identified particles | yRec = eta for charged particles
456 fHelper->IsTrackAcceptedRapidity(track, yRec, ipid);
459 Double_t yetapid = (ipid == 0 ) ? particle->Eta() : particle->Y();
460 Double_t yeta = (ipid == 0 ) ? track->Eta() : yRec;
462 Double_t hnContMc[6] = {fCentralityBin,signMC,contPart,yetapid,particle->Phi(),particle->Pt()};
463 Double_t hnContRec[5] = {fCentralityBin,signRec, yeta,track->Phi(),track->Pt()};
465 if (ipid == 0) { fHnNchCRec->Fill(hnContRec); fHnNchCMc->Fill(hnContMc); }
466 else if (ipid == 1) { fHnNpiCRec->Fill(hnContRec); fHnNpiCMc->Fill(hnContMc); }
467 else if (ipid == 2) { fHnNkaCRec->Fill(hnContRec); fHnNkaCMc->Fill(hnContMc); }
468 else if (ipid == 3) { fHnNprCRec->Fill(hnContRec); fHnNprCMc->Fill(hnContMc); }
473 //________________________________________________________________________
474 void AliEbyEPidRatioEffContExtra::FillMCEffHist(Int_t ipid) {
475 // Fill efficiency THnSparse for ESDs
478 fESDTrackCuts->GetEtaRange(etaRange[0],etaRange[1]);
480 Int_t nPart = (fESD) ? fStack->GetNprimary() : fArrayMC->GetEntriesFast();
482 for (Int_t idxMC = 0; idxMC < nPart; ++idxMC) {
483 AliVParticle* particle = (fESD) ? fMCEvent->GetTrack(idxMC) : static_cast<AliVParticle*>(fArrayMC->At(idxMC));
485 // -- Check basic MC properties -> charged physical primary
486 if (!fHelper->IsParticleAcceptedBasicCharged(particle, idxMC))
489 // -- Check if accepted in rapidity window -- for identified particles
491 if (fHelper->GetUsePID(ipid) && !fHelper->IsParticleAcceptedRapidity(particle, yMC, ipid))
494 // -- Check if accepted in eta window -- for charged particles
495 if (!fHelper->GetUsePID(ipid) && TMath::Abs(particle->Eta()) > etaRange[1])
498 // -- Check if probeParticle / anti-probeParticle
499 // > skip check if PID is not required
500 if (fHelper->GetUsePID(ipid) && TMath::Abs(particle->PdgCode()) != fHelper->GetPdg(ipid))
503 // -- Get sign of particle
504 Float_t signMC = (particle->PdgCode() < 0) ? -1. : 1.;
506 // -- Get if particle is findable --- not availible for AODs yet
507 Float_t findable = (fESD) ? Float_t(fHelper->IsParticleFindable(idxMC)) : 1.;
509 // -- Get recStatus and pidStatus
510 Float_t recStatus = 0.;
513 // -- Get Reconstructed values
518 Float_t signRec = 0.;
520 // -- Loop over all labels
521 for (Int_t idxRec=0; idxRec < fNTracks; ++idxRec) {
522 if (idxMC == fLabelsRec[0][ipid][idxRec]) {
525 if (idxMC == fLabelsRec[1][ipid][idxRec]) recPid = 1.;
527 AliVTrack *track = NULL;
529 track = fESD->GetTrack(idxRec);
531 track = fAOD->GetTrack(idxRec);
534 etaRec = track->Eta();
535 phiRec = track->Phi();
537 signRec = track->Charge();
538 fHelper->IsTrackAcceptedRapidity(track, yRec, ipid);
539 Double_t yeta = (ipid == 0 ) ? etaRec : yRec;
540 Double_t hneffRec[5] = {fCentralityBin,signRec, yeta,phiRec,ptRec};
541 if (ipid == 0) { fHnNchERec->Fill(hneffRec); }
542 else if (ipid == 1) { fHnNpiERec->Fill(hneffRec); }
543 else if (ipid == 2) { fHnNkaERec->Fill(hneffRec); }
544 else if (ipid == 3) { fHnNprERec->Fill(hneffRec); }
549 } // for (Int_t idxRec=0; idxRec < fNTracks; ++idxRec) {
551 Double_t deltaPhi = particle->Phi()-phiRec;
552 if (TMath::Abs(deltaPhi) > TMath::TwoPi()) {
554 deltaPhi += TMath::TwoPi();
556 deltaPhi -= TMath::TwoPi();
560 Double_t yetapid = (ipid == 0 ) ? particle->Eta() : particle->Y();
563 // Printf("%2d %10.5f %10.5f %10.5f %10.5f %10.5f %10.5f", ipid, yetapid, yeta, particle->Eta(), particle->Y(), etaRec, yRec);
565 Double_t hneffMc[8] = {fCentralityBin,signMC,findable, recStatus, recPid,yetapid,particle->Phi(),particle->Pt()};
568 if (ipid == 0) { fHnNchEMc->Fill(hneffMc); }
569 else if (ipid == 1) { fHnNpiEMc->Fill(hneffMc); }
570 else if (ipid == 2) { fHnNkaEMc->Fill(hneffMc); }
571 else if (ipid == 3) { fHnNprEMc->Fill(hneffMc); }
574 } // for (Int_t idxMC = 0; idxMC < nPart; ++idxMC) {