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