AliPhysics  3abf71f (3abf71f)
AliEmcalTrackingQATask.cxx
Go to the documentation of this file.
1 #include <cstring>
2 #include <iostream>
3 
4 #include <THnSparse.h>
5 #include <TMath.h>
6 #include <TString.h>
7 
8 #include <AliESDtrack.h>
9 #include <AliAODTrack.h>
10 #include <AliAODMCParticle.h>
11 #include <AliLog.h>
12 #include <AliAnalysisManager.h>
13 #include <AliVEventHandler.h>
14 
15 #include "AliMCParticleContainer.h"
16 
17 #include "AliEmcalTrackingQATask.h"
18 
19 ClassImp(AliEmcalTrackingQATask)
20 
21 
25  AliAnalysisTaskEmcalLight("AliEmcalTrackingQA", kTRUE),
26  fDoSigma1OverPt(kFALSE),
27  fDoSigmaPtOverPtGen(kFALSE),
28  fDoSeparateTRDrefit(kFALSE),
29  fIsEsd(kFALSE),
30  fGeneratorLevel(nullptr),
31  fDetectorLevel(nullptr),
32  fPtHistBins(),
33  fEtaHistBins(),
34  fPhiHistBins(),
35  fCentHistBins(),
36  fPtRelDiffHistBins(),
37  fPtResHistBins(),
38  f1OverPtResHistBins(),
39  fIntegerHistBins(),
40  fTracks(nullptr),
41  fParticlesPhysPrim(nullptr),
42  fParticlesMatched(nullptr)
43 {
44  SetMakeGeneralHistograms(kTRUE);
45 
46  GenerateHistoBins();
47 }
48 
53  AliAnalysisTaskEmcalLight("AliEmcalTrackingQA", kTRUE),
54  fDoSigma1OverPt(kFALSE),
55  fDoSigmaPtOverPtGen(kFALSE),
56  fDoSeparateTRDrefit(kFALSE),
57  fIsEsd(kFALSE),
58  fGeneratorLevel(nullptr),
59  fDetectorLevel(nullptr),
60  fPtHistBins(),
61  fEtaHistBins(),
62  fPhiHistBins(),
63  fCentHistBins(),
64  fPtRelDiffHistBins(),
65  fPtResHistBins(),
66  f1OverPtResHistBins(),
67  fIntegerHistBins(),
68  fTracks(nullptr),
69  fParticlesPhysPrim(nullptr),
70  fParticlesMatched(nullptr)
71 {
73 
75 }
76 
81 {
82 }
83 
88 {
89  GenerateFixedBinArray(6, 0.0, 0.3, fPtHistBins, false);
90  GenerateFixedBinArray(7, 0.3, 1.0, fPtHistBins, false);
91  GenerateFixedBinArray(10, 1.0, 3.0, fPtHistBins, false);
92  GenerateFixedBinArray(14, 3.0, 10.0, fPtHistBins, false);
93  GenerateFixedBinArray(10, 10.0, 20.0, fPtHistBins, false);
94  GenerateFixedBinArray(15, 20.0, 50.0, fPtHistBins, false);
95  GenerateFixedBinArray(20, 50.0, 150.0, fPtHistBins);
96 
97  GenerateFixedBinArray(100, -1.0, 1.0, fEtaHistBins);
98 
99  GenerateFixedBinArray(100, 0.0, TMath::TwoPi(), fPhiHistBins);
100 
101  fCentHistBins.push_back(0);
102  fCentHistBins.push_back(10);
103  fCentHistBins.push_back(30);
104  fCentHistBins.push_back(50);
105  fCentHistBins.push_back(90);
106 
107  GenerateFixedBinArray(50, 0.00, 0.05, fPtResHistBins, false);
108  GenerateFixedBinArray(25, 0.05, 0.10, fPtResHistBins, false);
109  GenerateFixedBinArray(25, 0.10, 0.20, fPtResHistBins, false);
110  GenerateFixedBinArray(30, 0.20, 0.50, fPtResHistBins, false);
111  GenerateFixedBinArray(25, 0.50, 1.00, fPtResHistBins, false);
112  GenerateFixedBinArray(20, 1.00, 2.00, fPtResHistBins);
113 
114  GenerateFixedBinArray(200, -2.0, 2.0, fPtRelDiffHistBins);
115 
116  GenerateFixedBinArray(100, 0.00, 0.02, f1OverPtResHistBins, false);
117  GenerateFixedBinArray( 60, 0.02, 0.05, f1OverPtResHistBins, false);
118  GenerateFixedBinArray( 50, 0.05, 0.10, f1OverPtResHistBins, false);
119  GenerateFixedBinArray( 50, 0.10, 0.20, f1OverPtResHistBins, false);
120  GenerateFixedBinArray( 75, 0.20, 0.50, f1OverPtResHistBins, false);
121  GenerateFixedBinArray( 80, 0.50, 1.50, f1OverPtResHistBins);
122 
123  GenerateFixedBinArray(10, -0.5, 9.5, fIntegerHistBins);
124 }
125 
130 {
132 
133  if (fParticleCollArray.empty()) {
134  AliErrorStream() << "This task needs at least one particle container! The task won't run." << std::endl;
135  fInhibit = kTRUE;
136  return;
137  }
138 
139  AliDebugStream(3) << "Loading the detector track container" << std::endl;
140  if (!fDetectorLevel) {
141  auto iter = fParticleCollArray.find("detector");
142  if (iter == fParticleCollArray.end()) {
143  AliErrorStream() << "This task needs at least one particle container named 'detector'! The task won't run." << std::endl;
144  fInhibit = kTRUE;
145  return;
146  }
147  else {
148  fDetectorLevel = static_cast<AliTrackContainer*>(iter->second);
149  }
150  }
151 
152  AliDebugStream(3) << "Loading the generator particle container" << std::endl;
153  if (!fGeneratorLevel) {
154  auto iter = fParticleCollArray.find("generator");
155  if (iter == fParticleCollArray.end()) {
156  AliInfoStream() << "No particle container named 'generator' was found. Assuming this is not a MC production." << std::endl;
157  }
158  else {
159  fGeneratorLevel = static_cast<AliMCParticleContainer*>(iter->second);
160  }
161  }
162 
163  AliDebugStream(3) << "Allocating histograms" << std::endl;
165 
166  if (fGeneratorLevel) {
169  }
170 }
171 
173 {
175  if (!fDetectorLevel->GetArray()) {
176  AliErrorStream() << "Could not load track array! The task won't run." << std::endl;
177  fInhibit = kTRUE;
178  return;
179  }
180  if (fDetectorLevel->GetArray()->GetClass()->InheritsFrom("AliESDtrack")) fIsEsd = kTRUE;
181 }
182 
189 THnSparse* AliEmcalTrackingQATask::GenerateTHnSparse(const char* name, const std::vector<std::tuple<std::string, std::vector<Double_t>::iterator, std::vector<Double_t>::iterator>>& axis)
190 {
191  std::vector<int> nbins;
192  for (auto a : axis) nbins.push_back(int(std::get<2>(a) - std::get<1>(a) - 1));
193 
194  THnSparse* h = new THnSparseF(name, name, nbins.size(), &nbins[0]);
195  Int_t i = 0;
196  for (auto a : axis) {
197  h->GetAxis(i)->SetTitle(std::get<0>(a).c_str());
198  h->SetBinEdges(i, &(*(std::get<1>(a))));
199  i++;
200  }
201 
202  return h;
203 }
204 
209 {
210  typedef std::vector<Double_t>::iterator my_iterator;
211 
212  std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
213 
215  axis.push_back(std::make_tuple("Centrality %", fCentHistBins.begin(), fCentHistBins.end()));
216  }
217 
218  axis.push_back(std::make_tuple("#it{p}_{T} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
219  axis.push_back(std::make_tuple("#eta", fEtaHistBins.begin(), fEtaHistBins.end()));
220  axis.push_back(std::make_tuple("#phi", fPhiHistBins.begin(), fPhiHistBins.end()));
221  axis.push_back(std::make_tuple("MC Generator", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 3));
222  axis.push_back(std::make_tuple("track type", fIntegerHistBins.begin(), fIntegerHistBins.begin() + (fDoSeparateTRDrefit ? 9 : 5)));
223 
224  if (fDoSigma1OverPt) {
225  axis.push_back(std::make_tuple("#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}", f1OverPtResHistBins.begin(), f1OverPtResHistBins.end()));
226  }
227  else {
228  axis.push_back(std::make_tuple("#sigma(#it{p}_{T}) / #it{p}_{T}", fPtResHistBins.begin(), fPtResHistBins.end()));
229  }
230 
231  fTracks = GenerateTHnSparse("fTracks", axis);
232 
233  fOutput->Add(fTracks);
234 }
235 
240 {
241  typedef std::vector<Double_t>::iterator my_iterator;
242 
243  std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
244 
246  axis.push_back(std::make_tuple("Centrality %", fCentHistBins.begin(), fCentHistBins.end()));
247  }
248 
249  axis.push_back(std::make_tuple("#it{p}_{T} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
250  axis.push_back(std::make_tuple("#eta", fEtaHistBins.begin(), fEtaHistBins.end()));
251  axis.push_back(std::make_tuple("#phi", fPhiHistBins.begin(), fPhiHistBins.end()));
252  axis.push_back(std::make_tuple("MC Generator", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 3));
253  axis.push_back(std::make_tuple("Findable", fIntegerHistBins.begin(), fIntegerHistBins.begin() + 3));
254 
255  fParticlesPhysPrim = GenerateTHnSparse("fParticlesPhysPrim", axis);
256 
258 }
259 
264 {
265  typedef std::vector<Double_t>::iterator my_iterator;
266 
267  std::vector<std::tuple<std::string, my_iterator, my_iterator>> axis;
268 
270  axis.push_back(std::make_tuple("Centrality %", fCentHistBins.begin(), fCentHistBins.end()));
271  }
272 
273  axis.push_back(std::make_tuple("#it{p}_{T}^{gen} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
274  axis.push_back(std::make_tuple("#eta^{gen}", fEtaHistBins.begin(), fEtaHistBins.end()));
275  axis.push_back(std::make_tuple("#phi^{gen}", fPhiHistBins.begin(), fPhiHistBins.end()));
276  axis.push_back(std::make_tuple("#it{p}_{T}^{det} (GeV/#it{c})", fPtHistBins.begin(), fPtHistBins.end()));
277  axis.push_back(std::make_tuple("#eta^{det}", fEtaHistBins.begin(), fEtaHistBins.end()));
278  axis.push_back(std::make_tuple("#phi^{det}", fPhiHistBins.begin(), fPhiHistBins.end()));
279  axis.push_back(std::make_tuple("track type", fIntegerHistBins.begin(), fIntegerHistBins.begin() + (fDoSeparateTRDrefit ? 9 : 5)));
280 
281  if (fDoSigma1OverPt) {
282  axis.push_back(std::make_tuple("(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}", fPtRelDiffHistBins.begin(), fPtRelDiffHistBins.end()));
283  }
284  else {
285  axis.push_back(std::make_tuple("(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}", fPtRelDiffHistBins.begin(), fPtRelDiffHistBins.end()));
286  }
287 
288  fParticlesMatched = GenerateTHnSparse("fParticlesMatched", axis);
289 
291 }
292 
297  Double_t sigma1OverPt, Int_t mcGen, Byte_t trackType)
298 {
299  AliDebugStream(10) << "Filling detector level THnSparse" << std::endl;
300  std::vector<Double_t> contents(fTracks->GetNdimensions());
301 
302  for (Int_t i = 0; i < fTracks->GetNdimensions(); i++) {
303  TString title(fTracks->GetAxis(i)->GetTitle());
304  if (title=="Centrality %")
305  contents[i] = cent;
306  else if (title=="#it{p}_{T} (GeV/#it{c})")
307  contents[i] = trackPt;
308  else if (title=="#eta")
309  contents[i] = trackEta;
310  else if (title=="#phi")
311  contents[i] = trackPhi;
312  else if (title=="#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}")
313  contents[i] = sigma1OverPt;
314  else if (title=="#sigma(#it{p}_{T}) / #it{p}_{T}")
315  contents[i] = sigma1OverPt*trackPt;
316  else if (title=="MC Generator")
317  contents[i] = mcGen;
318  else if (title=="track type")
319  contents[i] = trackType;
320  else
321  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fTracks->GetName()));
322  }
323 
324  fTracks->Fill(&contents[0]);
325 }
326 
330 void AliEmcalTrackingQATask::FillGeneratorLevelTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Int_t mcGen, Byte_t findable)
331 {
332  std::vector<Double_t> contents(fParticlesPhysPrim->GetNdimensions());
333 
334  for (Int_t i = 0; i < fParticlesPhysPrim->GetNdimensions(); i++) {
335  TString title(fParticlesPhysPrim->GetAxis(i)->GetTitle());
336  if (title=="Centrality %")
337  contents[i] = cent;
338  else if (title=="#it{p}_{T} (GeV/#it{c})")
339  contents[i] = partPt;
340  else if (title=="#eta")
341  contents[i] = partEta;
342  else if (title=="#phi")
343  contents[i] = partPhi;
344  else if (title=="MC Generator")
345  contents[i] = mcGen;
346  else if (title=="Findable")
347  contents[i] = findable;
348  else
349  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesPhysPrim->GetName()));
350  }
351 
352  fParticlesPhysPrim->Fill(&contents[0]);
353 }
354 
359  Double_t trackEta, Double_t trackPhi, Double_t trackPt, Byte_t trackType)
360 {
361  std::vector<Double_t> contents(fParticlesMatched->GetNdimensions());
362 
363  for (Int_t i = 0; i < fParticlesMatched->GetNdimensions(); i++) {
364  TString title(fParticlesMatched->GetAxis(i)->GetTitle());
365  if (title=="Centrality %")
366  contents[i] = cent;
367  else if (title=="#it{p}_{T}^{gen} (GeV/#it{c})")
368  contents[i] = partPt;
369  else if (title=="#eta^{gen}")
370  contents[i] = partEta;
371  else if (title=="#phi^{gen}")
372  contents[i] = partPhi;
373  else if (title=="#it{p}_{T}^{det} (GeV/#it{c})")
374  contents[i] = trackPt;
375  else if (title=="#eta^{det}")
376  contents[i] = trackEta;
377  else if (title=="#phi^{det}")
378  contents[i] = trackPhi;
379  else if (title=="(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}")
380  contents[i] = (partPt - trackPt) / partPt;
381  else if (title=="(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}")
382  contents[i] = (partPt - trackPt) / trackPt;
383  else if (title=="track type")
384  contents[i] = (Double_t)trackType;
385  else
386  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesMatched->GetName()));
387  }
388 
389  fParticlesMatched->Fill(&contents[0]);
390 }
391 
396 {
397  AliDebugStream(1) << "Called: Tracks [" << fDetectorLevel->GetNTracks() << "], Accepted [" << fDetectorLevel->GetNAcceptedTracks() << "]\n";
398  auto iterable = fDetectorLevel->accepted_momentum();
399  for (auto trackIterator = iterable.begin(); trackIterator != iterable.end(); trackIterator++) {
400  auto track = trackIterator->second;
401  Byte_t type = fDetectorLevel->GetTrackType(track);
402  AliDebugStream(2) << "Next track of type " << static_cast<Int_t>(type) << std::endl;
403  Byte_t ntracklets = 0;
404  if (type <= 3) {
405  Double_t sigma = 0;
406 
407  if (fIsEsd) {
408  AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
409  if (esdTrack){
410  sigma = TMath::Sqrt(esdTrack->GetSigma1Pt2());
411  ntracklets = esdTrack->GetTRDntracklets();
412  }
413  }
414  else { // AOD
415  AliAODTrack *aodtrack = dynamic_cast<AliAODTrack*>(track);
416  if(!aodtrack) AliFatal("Not a standard AOD");
417 
418  AliExternalTrackParam exParam;
419 
420  //get covariance matrix
421  Double_t cov[21] = {0,};
422  aodtrack->GetCovMatrix(cov);
423  Double_t pxpypz[3] = {0,};
424  aodtrack->PxPyPz(pxpypz);
425  Double_t xyz[3] = {0,};
426  aodtrack->GetXYZ(xyz);
427  Short_t sign = aodtrack->Charge();
428  exParam.Set(xyz,pxpypz,cov,sign);
429 
430  sigma = TMath::Sqrt(exParam.GetSigma1Pt2());
431  ntracklets = track->GetTRDntrackletsPID();
432  }
433 
434  if(fDoSeparateTRDrefit) {
435  // Gold condition:
436  // - at least 3 TRD tracklets (with this cut track without TRD in global track fit is at % level)
437  if(ntracklets < 3) type += 4; // failed TRD gold condition
438  }
439 
440  Int_t label = TMath::Abs(track->GetLabel());
441  AliDebugStream(10) << "Track " << trackIterator.current_index() << " with type " << int(type) << " and label " << label <<
442  ", pt = " << track->Pt() << std::endl;
443  Int_t mcGen = 1;
444  // reject particles generated from other generators in the cocktail but keep fake tracks (label == 0)
445  if (label == 0 || track->GetGeneratorIndex() <= 0) mcGen = 0;
446 
447  FillDetectorLevelTHnSparse(fCent, track->Eta(), track->Phi(), track->Pt(), sigma, mcGen, type);
448 
449  if (fGeneratorLevel && label > 0) {
450  AliAODMCParticle *part = fGeneratorLevel->GetAcceptMCParticleWithLabel(label);
451  if (part) {
452  if (part->GetGeneratorIndex() <= 0) {
453  Int_t pdg = TMath::Abs(part->PdgCode());
454  // select charged pions, protons, kaons , electrons, muons
455  if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
456  FillMatchedParticlesTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt(), track->Eta(), track->Phi(), track->Pt(), type);
457  }
458  }
459  }
460  }
461  }
462  else {
463  AliErrorStream() << "Track " << trackIterator.current_index() << " has type " << type << " not recognized!" << std::endl;
464  }
465  }
466 
467  if (fGeneratorLevel) {
468  auto iterable = fGeneratorLevel->accepted_momentum();
469  for (auto partIterator = iterable.begin(); partIterator != iterable.end(); partIterator++) {
470  auto part = partIterator->second;
471 
472  Int_t mcGen = 1;
473  Byte_t findable = 0;
474 
475  if (part->GetGeneratorIndex() <= 0) mcGen = 0;
476 
477  Int_t pdg = TMath::Abs(part->PdgCode());
478  // select charged pions, protons, kaons , electrons, muons
479  if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) findable = 1;
480 
481  FillGeneratorLevelTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt(), mcGen, findable);
482  }
483  }
484 
485  return kTRUE;
486 }
487 
494 {
495  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
496  if (!mgr) {
497  AliErrorClassStream() << "No analysis manager to connect to." << std::endl;
498  return nullptr;
499  }
500 
501  // Check the analysis type using the event handlers connected to the analysis manager
502  AliVEventHandler* handler = mgr->GetInputEventHandler();
503  if (!handler) {
504  AliErrorClassStream() << "This task requires an input event handler" << std::endl;
505  return nullptr;
506  }
507  else {
508  AliInfoClassStream() << "Event handler ok!" << std::endl;
509  }
510 
512 
513  if (handler->InheritsFrom("AliESDInputHandler")) {
514  dataType = kESD;
515  AliInfoClassStream() << "Data type is ESD." << std::endl;
516  }
517  else if (handler->InheritsFrom("AliAODInputHandler")) {
518  dataType = kAOD;
519  AliInfoClassStream() << "Data type is AOD." << std::endl;
520  }
521 
522  TString track_name("tracks");
523  if (dataType == kESD) track_name = "Tracks";
524 
525  // Init the task and do settings
526  TString name("AliEmcalTrackingQATask");
527  if(strlen(suffix)) name += TString::Format("_%s", suffix);
528  AliInfoClassStream() << "Allocating task." << std::endl;
530  qaTask->SetVzRange(-10,10);
531  AliInfoClassStream() << "Task allocated, setting containers." << std::endl;
532  qaTask->AddParticleContainer(track_name.Data(), "detector");
533  if (isMC) qaTask->AddParticleContainer("mcparticles", "generator");
534 
535  AliInfoClassStream() << "Containers ok, adding task to the analysis manager." << std::endl;
536  // Final settings, pass to manager and set the containers
537  mgr->AddTask(qaTask);
538 
539  AliInfoClassStream() << "Task added, setting input/output." << std::endl;
540  // Create containers for input/output
541  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ;
542 
543  TString contName(name);
544  contName += "_histos";
545  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(contName.Data(),
546  TList::Class(),AliAnalysisManager::kOutputContainer,
547  Form("%s", AliAnalysisManager::GetCommonFileName()));
548  mgr->ConnectInput (qaTask, 0, cinput1 );
549  mgr->ConnectOutput (qaTask, 1, coutput1 );
550 
551 
552  AliInfoClassStream() << "Task configuration done." << std::endl;
553  return qaTask;
554 }
555 
Int_t pdg
Bool_t fInhibit
!inhibit execution of the task
std::vector< Double_t > fEtaHistBins
! eta bins
double Double_t
Definition: External.C:58
EDataType_t
Switch for the data type.
static AliEmcalTrackingQATask * AddTaskTrackingQA(Bool_t isMC, const char *suffix="")
AliTrackContainer * fDetectorLevel
! detector level container
Int_t GetNTracks() const
const char * title
Definition: MakeQAPdf.C:27
std::vector< Double_t > fIntegerHistBins
! integer bins
const AliMCParticleIterableMomentumContainer accepted_momentum() const
std::vector< Double_t > f1OverPtResHistBins
! 1/pt res bins
Container with name, TClonesArray and cuts for particles.
static std::vector< double > GenerateFixedBinArray(int n, double min, double max, bool last=true)
THnSparse * GenerateTHnSparse(const char *name, const std::vector< std::tuple< std::string, std::vector< Double_t >::iterator, std::vector< Double_t >::iterator >> &axis)
std::vector< Double_t > fPtHistBins
! pt bins
Double_t * sigma
EBeamType_t fForceBeamType
forced beam type
void FillMatchedParticlesTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Double_t trackEta, Double_t trackPhi, Double_t trackPt, Byte_t trackType)
void FillDetectorLevelTHnSparse(Double_t cent, Double_t trackEta, Double_t trackPhi, Double_t trackPt, Double_t sigma1OverPt, Int_t mcGen, Byte_t trackType)
Bool_t fIsEsd
! whether it is ESD data
std::vector< Double_t > fPtResHistBins
! pt res bins
int Int_t
Definition: External.C:63
Base task in the EMCAL framework (lighter version of AliAnalysisTaskEmcal)
virtual AliAODMCParticle * GetAcceptMCParticleWithLabel(Int_t lab)
std::vector< Double_t > fCentHistBins
! cent bins
std::vector< Double_t > fPtRelDiffHistBins
! pt relative difference bins
short Short_t
Definition: External.C:23
Bool_t isMC
void FillGeneratorLevelTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Int_t mcGen, Byte_t findable)
AliParticleContainer * AddParticleContainer(std::string branchName, std::string contName="")
AliMCParticleContainer * fGeneratorLevel
! generator level container
Char_t GetTrackType(const AliVTrack *track) const
std::map< std::string, AliParticleContainer * > fParticleCollArray
particle/track collection array
void SetVzRange(Double_t min, Double_t max)
const AliTrackIterableMomentumContainer accepted_momentum() const
Bool_t fDoSigma1OverPt
add sigma(1/pt), if false add sigma(pt)/pt instead
std::vector< Double_t > fPhiHistBins
! phi bins
const Int_t nbins
bool Bool_t
Definition: External.C:53
THnSparse * fParticlesPhysPrim
all tracks
Bool_t fDoSeparateTRDrefit
Separate tracks into tracks with TRD refit and 4 tracklets (gold) or not (sub-gold) ...
Container for MC-true particles within the EMCAL framework.
Double_t fCent
!event centrality
THnSparse * fParticlesMatched
all physical primary particles