AliPhysics  0fdb362 (0fdb362)
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  fInhibit(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  fInhibit(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() + 4));
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() + 4));
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  std::vector<Double_t> contents(fTracks->GetNdimensions());
299 
300  for (Int_t i = 0; i < fTracks->GetNdimensions(); i++) {
301  TString title(fTracks->GetAxis(i)->GetTitle());
302  if (title=="Centrality %")
303  contents[i] = cent;
304  else if (title=="#it{p}_{T} (GeV/#it{c})")
305  contents[i] = trackPt;
306  else if (title=="#eta")
307  contents[i] = trackEta;
308  else if (title=="#phi")
309  contents[i] = trackPhi;
310  else if (title=="#sigma(1/#it{p}_{T}) (GeV/#it{c})^{-1}")
311  contents[i] = sigma1OverPt;
312  else if (title=="#sigma(#it{p}_{T}) / #it{p}_{T}")
313  contents[i] = sigma1OverPt*trackPt;
314  else if (title=="MC Generator")
315  contents[i] = mcGen;
316  else if (title=="track type")
317  contents[i] = trackType;
318  else
319  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fTracks->GetName()));
320  }
321 
322  fTracks->Fill(&contents[0]);
323 }
324 
328 void AliEmcalTrackingQATask::FillGeneratorLevelTHnSparse(Double_t cent, Double_t partEta, Double_t partPhi, Double_t partPt, Int_t mcGen, Byte_t findable)
329 {
330  std::vector<Double_t> contents(fParticlesPhysPrim->GetNdimensions());
331 
332  for (Int_t i = 0; i < fParticlesPhysPrim->GetNdimensions(); i++) {
333  TString title(fParticlesPhysPrim->GetAxis(i)->GetTitle());
334  if (title=="Centrality %")
335  contents[i] = cent;
336  else if (title=="#it{p}_{T} (GeV/#it{c})")
337  contents[i] = partPt;
338  else if (title=="#eta")
339  contents[i] = partEta;
340  else if (title=="#phi")
341  contents[i] = partPhi;
342  else if (title=="MC Generator")
343  contents[i] = mcGen;
344  else if (title=="Findable")
345  contents[i] = findable;
346  else
347  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesPhysPrim->GetName()));
348  }
349 
350  fParticlesPhysPrim->Fill(&contents[0]);
351 }
352 
357  Double_t trackEta, Double_t trackPhi, Double_t trackPt, Byte_t trackType)
358 {
359  std::vector<Double_t> contents(fParticlesMatched->GetNdimensions());
360 
361  for (Int_t i = 0; i < fParticlesMatched->GetNdimensions(); i++) {
362  TString title(fParticlesMatched->GetAxis(i)->GetTitle());
363  if (title=="Centrality %")
364  contents[i] = cent;
365  else if (title=="#it{p}_{T}^{gen} (GeV/#it{c})")
366  contents[i] = partPt;
367  else if (title=="#eta^{gen}")
368  contents[i] = partEta;
369  else if (title=="#phi^{gen}")
370  contents[i] = partPhi;
371  else if (title=="#it{p}_{T}^{det} (GeV/#it{c})")
372  contents[i] = trackPt;
373  else if (title=="#eta^{det}")
374  contents[i] = trackEta;
375  else if (title=="#phi^{det}")
376  contents[i] = trackPhi;
377  else if (title=="(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{gen}")
378  contents[i] = (partPt - trackPt) / partPt;
379  else if (title=="(#it{p}_{T}^{gen} - #it{p}_{T}^{det}) / #it{p}_{T}^{det}")
380  contents[i] = (partPt - trackPt) / trackPt;
381  else if (title=="track type")
382  contents[i] = (Double_t)trackType;
383  else
384  AliWarning(Form("Unable to fill dimension %s of histogram %s!", title.Data(), fParticlesMatched->GetName()));
385  }
386 
387  fParticlesMatched->Fill(&contents[0]);
388 }
389 
394 {
395  if (fInhibit) return kFALSE;
396 
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  if (type <= 2) {
402  Double_t sigma = 0;
403 
404  if (fIsEsd) {
405  AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
406  if (esdTrack) sigma = TMath::Sqrt(esdTrack->GetSigma1Pt2());
407  }
408  else { // AOD
409  AliAODTrack *aodtrack = dynamic_cast<AliAODTrack*>(track);
410  if(!aodtrack) AliFatal("Not a standard AOD");
411 
412  AliExternalTrackParam exParam;
413 
414  //get covariance matrix
415  Double_t cov[21] = {0,};
416  aodtrack->GetCovMatrix(cov);
417  Double_t pxpypz[3] = {0,};
418  aodtrack->PxPyPz(pxpypz);
419  Double_t xyz[3] = {0,};
420  aodtrack->GetXYZ(xyz);
421  Short_t sign = aodtrack->Charge();
422  exParam.Set(xyz,pxpypz,cov,sign);
423 
424  sigma = TMath::Sqrt(exParam.GetSigma1Pt2());
425  }
426 
427  Int_t label = TMath::Abs(track->GetLabel());
428  AliDebugStream(10) << "Track " << trackIterator.current_index() << " with type " << int(type) << " and label " << label <<
429  ", pt = " << track->Pt() << std::endl;
430  Int_t mcGen = 1;
431  // reject particles generated from other generators in the cocktail but keep fake tracks (label == 0)
432  if (label == 0 || track->GetGeneratorIndex() <= 0) mcGen = 0;
433 
434  FillDetectorLevelTHnSparse(fCent, track->Eta(), track->Phi(), track->Pt(), sigma, mcGen, type);
435 
436  if (fGeneratorLevel && label > 0) {
437  AliAODMCParticle *part = fGeneratorLevel->GetAcceptMCParticleWithLabel(label);
438  if (part) {
439  if (part->GetGeneratorIndex() <= 0) {
440  Int_t pdg = TMath::Abs(part->PdgCode());
441  // select charged pions, protons, kaons , electrons, muons
442  if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) {
443  FillMatchedParticlesTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt(), track->Eta(), track->Phi(), track->Pt(), type);
444  }
445  }
446  }
447  }
448  }
449  else {
450  AliErrorStream() << "Track " << trackIterator.current_index() << " has type " << type << " not recognized!" << std::endl;
451  }
452  }
453 
454  if (fGeneratorLevel) {
455  auto iterable = fGeneratorLevel->accepted_momentum();
456  for (auto partIterator = iterable.begin(); partIterator != iterable.end(); partIterator++) {
457  auto part = partIterator->second;
458 
459  Int_t mcGen = 1;
460  Byte_t findable = 0;
461 
462  if (part->GetGeneratorIndex() <= 0) mcGen = 0;
463 
464  Int_t pdg = TMath::Abs(part->PdgCode());
465  // select charged pions, protons, kaons , electrons, muons
466  if (pdg == 211 || pdg == 2212 || pdg == 321 || pdg == 11 || pdg == 13) findable = 1;
467 
468  FillGeneratorLevelTHnSparse(fCent, part->Eta(), part->Phi(), part->Pt(), mcGen, findable);
469  }
470  }
471 
472  return kTRUE;
473 }
474 
481 {
482  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
483  if (!mgr) {
484  AliErrorClassStream() << "No analysis manager to connect to." << std::endl;
485  return nullptr;
486  }
487 
488  // Check the analysis type using the event handlers connected to the analysis manager
489  AliVEventHandler* handler = mgr->GetInputEventHandler();
490  if (!handler) {
491  AliErrorClassStream() << "This task requires an input event handler" << std::endl;
492  return nullptr;
493  }
494  else {
495  AliInfoClassStream() << "Event handler ok!" << std::endl;
496  }
497 
498  EDataType_t dataType = kUnknownDataType;
499 
500  if (handler->InheritsFrom("AliESDInputHandler")) {
501  dataType = kESD;
502  AliInfoClassStream() << "Data type is ESD." << std::endl;
503  }
504  else if (handler->InheritsFrom("AliAODInputHandler")) {
505  dataType = kAOD;
506  AliInfoClassStream() << "Data type is AOD." << std::endl;
507  }
508 
509  TString track_name("tracks");
510  if (dataType == kESD) track_name = "Tracks";
511 
512  // Init the task and do settings
513  TString name("AliEmcalTrackingQATask");
514  AliInfoClassStream() << "Allocating task." << std::endl;
516  qaTask->SetVzRange(-10,10);
517  AliInfoClassStream() << "Task allocated, setting containers." << std::endl;
518  qaTask->AddParticleContainer(track_name.Data(), "detector");
519  if (isMC) qaTask->AddParticleContainer("mcparticles", "generator");
520 
521  AliInfoClassStream() << "Containers ok, adding task to the analysis manager." << std::endl;
522  // Final settings, pass to manager and set the containers
523  mgr->AddTask(qaTask);
524 
525  AliInfoClassStream() << "Task added, setting input/output." << std::endl;
526  // Create containers for input/output
527  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ;
528 
529  TString contName(name);
530  contName += "_histos";
531  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(contName.Data(),
532  TList::Class(),AliAnalysisManager::kOutputContainer,
533  Form("%s", AliAnalysisManager::GetCommonFileName()));
534  mgr->ConnectInput (qaTask, 0, cinput1 );
535  mgr->ConnectOutput (qaTask, 1, coutput1 );
536 
537 
538  AliInfoClassStream() << "Task configuration done." << std::endl;
539  return qaTask;
540 }
541 
Int_t pdg
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
const char * title
Definition: MakeQAPdf.C:27
std::vector< Double_t > fIntegerHistBins
! integer bins
Bool_t fInhibit
! Inhibit execution of task
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
TString part
use mixed event to constrain combinatorial background
Definition: InvMassFit.C:52
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
Container for MC-true particles within the EMCAL framework.
Double_t fCent
!event centrality
THnSparse * fParticlesMatched
all physical primary particles