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