AliPhysics  d0bc297 (d0bc297)
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  // - TRD refit
436  // - at least 4 TRD tracklets
437  if(!((track->GetStatus() & AliVTrack::kTRDrefit) && (ntracklets >= 4))) 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 
511  EDataType_t dataType = kUnknownDataType;
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  AliInfoClassStream() << "Allocating task." << std::endl;
529  qaTask->SetVzRange(-10,10);
530  AliInfoClassStream() << "Task allocated, setting containers." << std::endl;
531  qaTask->AddParticleContainer(track_name.Data(), "detector");
532  if (isMC) qaTask->AddParticleContainer("mcparticles", "generator");
533 
534  AliInfoClassStream() << "Containers ok, adding task to the analysis manager." << std::endl;
535  // Final settings, pass to manager and set the containers
536  mgr->AddTask(qaTask);
537 
538  AliInfoClassStream() << "Task added, setting input/output." << std::endl;
539  // Create containers for input/output
540  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ;
541 
542  TString contName(name);
543  contName += "_histos";
544  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(contName.Data(),
545  TList::Class(),AliAnalysisManager::kOutputContainer,
546  Form("%s", AliAnalysisManager::GetCommonFileName()));
547  mgr->ConnectInput (qaTask, 0, cinput1 );
548  mgr->ConnectOutput (qaTask, 1, coutput1 );
549 
550 
551  AliInfoClassStream() << "Task configuration done." << std::endl;
552  return qaTask;
553 }
554 
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