AliPhysics  dde76db (dde76db)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliAnalysisTaskChargedParticlesMCTriggerMimic.cxx
Go to the documentation of this file.
1 /**************************************************************************
2  * Copyright(c) 1998-2015, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Author: The ALICE Off-line Project. *
5  * Contributors are mentioned in the code where appropriate. *
6  * *
7  * Permission to use, copy, modify and distribute this software and its *
8  * documentation strictly for non-commercial purposes is hereby granted *
9  * without fee, provided that the above copyright notice appears in all *
10  * copies and that both the copyright notice and this permission notice *
11  * appear in the supporting documentation. The authors make no claims *
12  * about the suitability of this software for any purpose. It is *
13  * provided "as is" without express or implied warranty. *
14  **************************************************************************/
15 #include <array>
16 #include <bitset>
17 #include <iomanip>
18 #include <iostream>
19 #include <memory>
20 #include <string>
21 
22 #include <TClonesArray.h>
23 #include <TFile.h>
24 #include <THistManager.h>
25 #include <TMath.h>
26 #include <TPDGCode.h>
27 #include <TTree.h>
28 
29 #include "AliAnalysisUtils.h"
30 #include "AliAODInputHandler.h"
31 #include "AliAODMCHeader.h"
32 #include "AliAODMCParticle.h"
33 #include "AliAODTrack.h"
35 #include "AliEMCALGeometry.h"
36 #include "AliEMCALRecoUtils.h"
37 #include "AliEMCALTriggerPatchInfo.h"
39 #include "AliESDtrack.h"
40 #include "AliGenPythiaEventHeader.h"
41 #include "AliInputEventHandler.h"
42 #include "AliLog.h"
43 #include "AliVEvent.h"
44 #include "AliVParticle.h"
45 
47 
51 
52 namespace EMCalTriggerPtAnalysis {
53 
57 AliAnalysisTaskChargedParticlesMCTriggerMimic::AliAnalysisTaskChargedParticlesMCTriggerMimic():
59  fTrackCuts(NULL),
60  fHistos(NULL),
61  fWeightHandler(NULL),
62  fYshift(0.465),
63  fEtaSign(1),
64  fEtaLabCut(-0.6, 0.6),
65  fEtaCmsCut(-0.13, 0.13),
66  fPatchType(kUndef),
67  fEnergyThreshold(0.)
68 {
69  SetCaloTriggerPatchInfoName("EmcalTriggers");
70  SetNeedEmcalGeom(true);
71 }
72 
78  AliAnalysisTaskEmcal(name, true),
79  fTrackCuts(nullptr),
80  fHistos(nullptr),
81  fWeightHandler(nullptr),
82  fYshift(0.465),
83  fEtaSign(1),
84  fEtaLabCut(-0.6, 0.6),
85  fEtaCmsCut(-0.13, 0.13),
86  fPatchType(kUndef),
87  fEnergyThreshold(0.)
88 {
89  SetCaloTriggerPatchInfoName("EmcalTriggers");
90  SetNeedEmcalGeom(true);
92 }
93 
98  //if(fTrackCuts) delete fTrackCuts;
99  if(fHistos) delete fHistos;
100 }
101 
104 
105  if(fIsPythia){
106  AliDebugStream(1) << GetName() << ": Running on PYTHIA Hard production" << std::endl;
107  } else {
108  AliDebugStream(1) << GetName() << ": Not running on PYTHIA Hard production" << std::endl;
109  }
110 
111  if(!fAliAnalysisUtils) fAliAnalysisUtils = new AliAnalysisUtils;
112  if(!fTrackCuts) InitializeTrackCuts("standard",fInputHandler->IsA() == AliAODInputHandler::Class());
113 
114  PtBinning newbinning;
115  fHistos = new THistManager("Ref");
116 
117  // The first two histograms should lead to a re-implementation inside AliAnalysisTaskEMCAL:
118  // Users should be able to set event weights.
119  fHistos->CreateTH1("hUserEventCount", "User event counter", 1, 0.5, 1.5);
120  fHistos->CreateTH1("hUserVertexZ", "User vertex distribution after z-cut", 100, -10, 10);
121  fHistos->CreateTH1("hUserPtHard", "User pt-hard distribution", 1000, 0., 300.);
122  const std::array<std::string, 2> kInputs = {"True", "Accept"};
123  const std::array<std::string, 6> kSpecies = {"El", "Mu", "Pi", "Ka", "Pr", "Ot"};
124  const std::array<double, 5> kPtCuts = {1., 2., 5., 10., 20.};
125  for(const auto &input : kInputs){
126  AliDebugStream(1) << GetName() << ": Creating histograms for case " << input << std::endl;
127  fHistos->CreateTH1(Form("hPtEtaAll%s", input.c_str()), Form("Charged particle p_{t} distribution all #eta %s", input.c_str()), newbinning, "s");
128  fHistos->CreateTH1(Form("hPtEtaCent%s", input.c_str()), Form("Charged particle p_{t} distribution central #eta %s", input.c_str()), newbinning, "s");
129  fHistos->CreateTH1(Form("hPtEMCALEtaAll%s", input.c_str()), Form("Charged particle in EMCAL p_{t} distribution all #eta trigger %s", input.c_str()), newbinning);
130  fHistos->CreateTH1(Form("hPtEMCALEtaCent%s", input.c_str()), Form("Charged particle in EMCAL p_{t} distribution central eta trigger %s", input.c_str()), newbinning);
131  for(const auto &piditer : kSpecies){
132  fHistos->CreateTH1(Form("hPtEtaAll%s%s", piditer.c_str(), input.c_str()), Form("Charged %s p_{t} distribution all #eta %s", piditer.c_str(), input.c_str()), newbinning);
133  fHistos->CreateTH1(Form("hPtEtaCent%s%s", piditer.c_str(), input.c_str()), Form("Charged %s p_{t} distribution central #eta %s", piditer.c_str(), input.c_str()), newbinning);
134  fHistos->CreateTH1(Form("hPtEMCALEtaAll%s%s", piditer.c_str(), input.c_str()), Form("Charged %s in EMCAL p_{t} distribution all #eta %s", piditer.c_str(), input.c_str()), newbinning);
135  fHistos->CreateTH1(Form("hPtEMCALEtaCent%s%s", piditer.c_str(), input.c_str()), Form("Charged %s in EMCAL p_{t} distribution central #eta %s", piditer.c_str(), input.c_str()), newbinning);
136  }
137  for(const auto &ptcut : kPtCuts){
139  Form("hEtaLabDistAllPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
140  Form("#eta_{lab} distribution without #eta-cut for tracks with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
141  100,
142  -1.,
143  1.
144  );
146  Form("hEtaLabDistCutPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
147  Form("#eta_{lab} distribution with #eta-cut for tracks with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
148  100,
149  -1.,
150  1.
151  );
153  Form("hEtaCentDistAllPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
154  Form("#eta_{cent} distribution without #eta-cut for tracks with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
155  160,
156  -1.3,
157  1.3
158  );
160  Form("hEtaCentDistCutPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
161  Form("#eta_{cent} distribution with #eta-cut for tracks with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
162  160,
163  -1.3,
164  1.3
165  );
167  Form("hEtaLabDistAllEMCALPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
168  Form("#eta_{lab} distribution without #eta-cut for tracks in EMCAL with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
169  100,
170  -1.,
171  1.
172  );
174  Form("hEtaLabDistCutEMCALPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
175  Form("#eta_{lab} distribution with #eta-cut for tracks in EMCAL with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
176  100,
177  -1.,
178  1.
179  );
181  Form("hEtaCentDistAllEMCALPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
182  Form("#eta_{cent} distribution without #eta-cut for tracks in EMCAL with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
183  160,
184  -1.3,
185  1.3
186  );
188  Form("hEtaCentDistCutEMCALPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
189  Form("Eta (cent) distribution with #eta-cut for tracks in EMCAL with p_{t} above %.1f GeV/c %s", ptcut, input.c_str()),
190  160,
191  -1.3,
192  1.3
193  );
195  Form("hPhiDistAllPt%d%s", static_cast<Int_t>(ptcut), input.c_str()),
196  Form("#phi distribution of particles with p_{t} above %.1f GeV/c trigger %s", ptcut, input.c_str()),
197  300,
198  0.,
199  2*TMath::Pi()
200  );
201  }
202  }
203 
204 
205  for(auto hist : *(fHistos->GetListOfHistograms())) fOutput->Add(hist);
206  PostData(1, fOutput);
207 
208  AliDebugStream(1) << GetName() << ": Output objects initialized" << std::endl;
209 }
210 
217  AliDebugStream(2) << GetName() << ": Using custom event selection method" << std::endl;
218  if(!fTriggerPatchInfo){
219  AliErrorStream() << GetName() << ": Trigger patch container not found but required" << std::endl;
220  return false;
221  }
222  if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7)) return false;
223  AliDebugStream(3) << GetName() << "Event is an INT7 event" << std::endl;
224 
225  // MC outlier cut
226  if(fIsPythia){
227  if(!CheckMCOutliers()){
228  AliDebugStream(3) << GetName() << ": Event identified as outlier" << std::endl;
229  return false;
230  } else {
231  AliDebugStream(3) << GetName() << ": Not an outlier event" << std::endl;
232  }
233  }
234 
235  // Generall event quality cuts
236  // The vertex cut also contains cuts on the number
237  // of contributors and the position in z
238  AliDebugStream(3) << GetName() << ": Applying vertex selection" << std::endl;
239  if(fAliAnalysisUtils){
240  if(!fAliAnalysisUtils->IsVertexSelected2013pA(InputEvent())) return false;
241  if(fAliAnalysisUtils->IsPileUpEvent(InputEvent())) return false;
242  AliDebugStream(3) << GetName() << ": Vertex selection passed" << std::endl;
243  }
244 
245  AliDebugStream(3) << GetName() << ": Applying EMCAL trigger selection" << std::endl;
246  if(fPatchType != kUndef){
248  AliDebugStream(3) << GetName() << ": Failed trigger selection" << std::endl;
249  return false;
250  }
251  }
252 
253  AliDebugStream(2) << GetName() << "Event selected" << std::endl;
254  return true;
255 }
256 
262  AliDebugStream(1) << GetName() << ": Inspecting event" << std::endl;
263  Double_t weight = 1.;
264  if(fIsPythia){
265  if(!fPythiaHeader){
266  AliErrorStream() << GetName() << ": PYTHIA event header not found" << std::endl;
267  } else {
269  }
270  }
271 
272  fHistos->FillTH1("hUserEventCount", 1, weight);
273  const AliVVertex *vtx = InputEvent()->GetPrimaryVertex();
274  fHistos->FillTH1("hUserVertexZ", vtx->GetZ(), weight);
275  fHistos->FillTH1("hUserPtHard", fPtHard);
276 
277  AliDebugStream(3) << GetName() << ": eta-lab cut: " << fEtaLabCut << ", eta-cms cut: " << fEtaCmsCut << std::endl;
278 
279  AliVParticle *truepart(nullptr);
280  Bool_t isEMCAL(kFALSE);
281  if(MCEvent()){
282  for(int ipart = 0; ipart < fMCEvent->GetNumberOfTracks(); ipart++){
283  truepart = MCEvent()->GetTrack(ipart);
284 
285  // Select only particles within ALICE acceptance
286  if(!fEtaLabCut.IsInRange(truepart->Eta())) continue;
287  if(TMath::Abs(truepart->Pt()) < 0.1) continue;
288  if(!truepart->Charge()) continue;
289 
290  if(!IsPhysicalPrimary(truepart, fMCEvent)) continue;
291  AliAODMCParticle *aodmc = static_cast<AliAODMCParticle *>(truepart);
292  isEMCAL = (truepart->Phi() > 1.5 && truepart->Phi() < 3.1) ? kTRUE : kFALSE;
293 
294  // Calculate eta in cms frame according
295  // EPJC74 (2014) 3054:
296  // eta_cms = - eta_lab - |yshift|
297  Double_t etacent = -1. * truepart->Eta() - TMath::Abs(fYshift);
298  etacent *= fEtaSign;
299 
300  Bool_t etacentcut = fEtaCmsCut.IsInRange(etacent);
301 
302  // Get PID
303  TString pid = "";
304  switch(TMath::Abs(truepart->PdgCode())){
305  case kPiPlus: pid = "Pi"; break;
306  case kMuonMinus: pid = "Mu"; break;
307  case kElectron: pid = "El"; break;
308  case kKPlus: pid = "Ka"; break;
309  case kProton: pid = "Pr"; break;
310  default: pid = "Ot"; break;
311  };
312 
313  // Particle selected (do not filter TRD sectors for MC truth)
314  FillTrackHistos("True", weight, TMath::Abs(truepart->Pt()), truepart->Eta() * fEtaSign, etacent, truepart->Phi(), etacentcut, isEMCAL, pid);
315  }
316  }
317 
318  // Loop over tracks, fill select particles
319  // Histograms
320  // - Full eta (-0.8, 0.8), new binning
321  // - Eta distribution for tracks above 1, 2, 5, 10 GeV/c without eta cut
322  // - Central eta (-0.8, -0.2), new binning,
323  // - Eta distribution for tracks above 1, 2, 5, 10 GeV/c
324  // - Eta distribution for tracks above 1, 2, 5, 10 GeV/c with eta cut
325  AliVTrack *checktrack(NULL);
326  AliVParticle *assocMC(NULL);
327  double ptparticle(-1.), etaparticle(-100.), etaEMCAL(0.), phiEMCAL(0.);
328  for(int itrk = 0; itrk < fInputEvent->GetNumberOfTracks(); ++itrk){
329  checktrack = dynamic_cast<AliVTrack *>(fInputEvent->GetTrack(itrk));
330  if(!checktrack) continue;
331  // Find associated particle
332  assocMC = MCEvent()->GetTrack(TMath::Abs(checktrack->GetLabel()));
333  if(!assocMC) continue; // Fake track
334  if(!IsPhysicalPrimary(assocMC, fMCEvent)) continue;
335 
336  // Select only particles within ALICE acceptance
337  if(!fEtaLabCut.IsInRange(checktrack->Eta())) continue;
338  if(TMath::Abs(checktrack->Pt()) < 0.1) continue;
339  if(checktrack->IsA() == AliESDtrack::Class()){
340  AliESDtrack copytrack(*(static_cast<AliESDtrack *>(checktrack)));
341  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(&copytrack);
342  etaEMCAL = copytrack.GetTrackEtaOnEMCal();
343  phiEMCAL = copytrack.GetTrackPhiOnEMCal();
344  } else {
345  AliAODTrack copytrack(*(static_cast<AliAODTrack *>(checktrack)));
346  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(&copytrack);
347  etaEMCAL = copytrack.GetTrackEtaOnEMCal();
348  phiEMCAL = copytrack.GetTrackPhiOnEMCal();
349  }
350  Int_t supermoduleID = -1;
351  isEMCAL = fGeom->SuperModuleNumberFromEtaPhi(etaEMCAL, phiEMCAL, supermoduleID);
352  // Exclude supermodules 10 and 11 as they did not participate in the trigger
353  isEMCAL = isEMCAL && supermoduleID < 10;
354 
355  if(!fTrackCuts->IsTrackAccepted(checktrack)) continue;
356 
357  ptparticle = TMath::Abs(assocMC->Pt());
358  etaparticle = assocMC->Eta();
359 
360  // Calculate eta in cms frame according
361  // EPJC74 (2014) 3054:
362  // eta_cms = - eta_lab - |yshift|
363  Double_t etacent = -1. * checktrack->Eta() - TMath::Abs(fYshift);
364  etacent *= fEtaSign;
365 
366  Bool_t etacentcut = fEtaCmsCut.IsInRange(etacent);
367 
368  // Get PID
369  TString assocpid = "";
370  switch(TMath::Abs(assocMC->PdgCode())){
371  case kPiPlus: assocpid = "Pi"; break;
372  case kMuonMinus: assocpid = "Mu"; break;
373  case kElectron: assocpid = "El"; break;
374  case kKPlus: assocpid = "Ka"; break;
375  case kProton: assocpid = "Pr"; break;
376  default: assocpid = "Ot"; break;
377  };
378 
379  FillTrackHistos("Accept", weight, ptparticle, checktrack->Eta() * fEtaSign, etacent, checktrack->Phi(), etacentcut, isEMCAL, assocpid);
380  }
381 
382  return true;
383 }
384 
397  const char *eventclass,
398  Double_t weight,
399  Double_t pt,
400  Double_t etalab,
401  Double_t etacent,
402  Double_t phi,
403  Bool_t etacut,
404  Bool_t inEmcal,
405  const char *pid
406  )
407 {
408  fHistos->FillTH1(Form("hPtEtaAll%s", eventclass), TMath::Abs(pt), weight);
409  fHistos->FillTH1(Form("hPtEtaAll%s%s", pid, eventclass), TMath::Abs(pt), weight);
410  if(inEmcal){
411  fHistos->FillTH1(Form("hPtEMCALEtaAll%s", eventclass), TMath::Abs(pt), weight);
412  fHistos->FillTH1(Form("hPtEMCALEtaAll%s%s", pid, eventclass), TMath::Abs(pt), weight);
413  }
414 
415  const std::array<int, 5> kPtMin = {1,2,5,10,20}; // for eta distributions
416  for(const auto &ptmin : kPtMin){
417  if(TMath::Abs(pt) > static_cast<double>(ptmin)){
418  fHistos->FillTH1(Form("hPhiDistAllPt%d%s", ptmin, eventclass), phi, weight);
419  fHistos->FillTH1(Form("hEtaLabDistAllPt%d%s", ptmin, eventclass), etalab, weight);
420  fHistos->FillTH1(Form("hEtaCentDistAllPt%d%s", ptmin, eventclass), etacent, weight);
421  if(inEmcal){
422  fHistos->FillTH1(Form("hEtaLabDistAllEMCALPt%d%s", ptmin, eventclass), etalab, weight);
423  fHistos->FillTH1(Form("hEtaCentDistAllEMCALPt%d%s", ptmin, eventclass), etacent, weight);
424  }
425  }
426  }
427 
428  if(etacut){
429  fHistos->FillTH1(Form("hPtEtaCent%s", eventclass), TMath::Abs(pt), weight);
430  fHistos->FillTH1(Form("hPtEtaCent%s%s", pid, eventclass), TMath::Abs(pt), weight);
431  if(inEmcal){
432  fHistos->FillTH1(Form("hPtEMCALEtaCent%s", eventclass), TMath::Abs(pt), weight);
433  fHistos->FillTH1(Form("hPtEMCALEtaCent%s%s", pid, eventclass), TMath::Abs(pt), weight);
434  }
435  for(const auto &ptmin : kPtMin){
436  if(TMath::Abs(pt) > static_cast<double>(ptmin)){
437  fHistos->FillTH1(Form("hEtaLabDistCutPt%d%s", ptmin, eventclass), etalab, weight);
438  fHistos->FillTH1(Form("hEtaCentDistCutPt%d%s", ptmin, eventclass), etacent, weight);
439  if(inEmcal){
440  fHistos->FillTH1(Form("hEtaLabDistCutEMCALPt%d%s", ptmin, eventclass), etalab, weight);
441  fHistos->FillTH1(Form("hEtaCentDistCutEMCALPt%d%s", ptmin, eventclass), etacent, weight);
442  }
443  }
444  }
445  }
446 }
447 
448 
457 Bool_t AliAnalysisTaskChargedParticlesMCTriggerMimic::IsPhysicalPrimary(const AliVParticle* const part, AliMCEvent* const mcevent) {
458  Bool_t physprim = false;
459  const AliAODMCParticle *aodmc = dynamic_cast<const AliAODMCParticle *>(part);
460  if(aodmc){
461  physprim = aodmc->IsPhysicalPrimary();
462  } else {
463  physprim = mcevent->IsPhysicalPrimary(part->GetLabel());
464  }
465  return physprim;
466 }
467 
475 }
476 
485  bool selected = false;
486  AliEMCALTriggerPatchInfo *patch(nullptr);
487  AliDebugStream(2) << GetName() << ": Selecting EMCAL triggered event type (" << (fPatchType == kEMCEGA ? "EGA" : "EJE") << ") using patch energy above threshold" << std::endl;
488  AliDebugStream(2) << GetName() << ": Energy threshold " << fEnergyThreshold << " GeV" << std::endl;
489  AliDebugStream(2) << GetName() << ": Number of reconstructed patches " << triggerpatches->GetEntries() << std::endl;
490  for(TIter patchiter = TIter(triggerpatches).Begin(); patchiter != TIter::End(); ++patchiter){
491  patch = static_cast<AliEMCALTriggerPatchInfo *>(*patchiter);
492  AliDebugStream(4) << GetName() << ": Next patch" << std::endl;
493  if(!patch->IsOfflineSimple()) continue;
494  AliDebugStream(4) << GetName() << "Patch is an offline simple patch" << std::endl;
495  AliDebugStream(4) << GetName() << ": Trigger bits: " << std::bitset<32>(patch->GetTriggerBits()) << std::endl;
496  AliDebugStream(4) << GetName() << ": J1(" << patch->IsJetHighSimple() << "), J2(" << patch->IsJetLowSimple()
497  << "), G1(" << patch->IsGammaHighSimple() << ") G2(" << patch->IsGammaLowSimple() << ")" << std::endl;
498  if(fPatchType == kEMCEJE){
499  if(!patch->IsJetHighSimple()) continue;
500  AliDebugStream(3) << GetName() << ": Patch is jet high simple" << std::endl;
501  } else if(fPatchType == kEMCEGA){
502  if(!patch->IsGammaHighSimple()) continue;
503  AliDebugStream(4) << GetName() << ": Patch is gamma high simple" << std::endl;
504  }
505  AliDebugStream(3) << GetName() << ": Found trigger patch of matching type, now cutting on energy ...." << std::endl;
506  if(patch->GetPatchE() > fEnergyThreshold){
507  // firing trigger patch found
508  AliDebugStream(2) << GetName() << ": Firing trigger patch found at energy " << std::setprecision(1) << patch->GetPatchE() << std::endl;
509  selected = true;
510  break;
511  }
512  }
513  return selected;
514 }
515 
521 {
522  this->SetMinimum(0.);
523  this->AddStep(1, 0.05);
524  this->AddStep(2, 0.1);
525  this->AddStep(4, 0.2);
526  this->AddStep(7, 0.5);
527  this->AddStep(16, 1);
528  this->AddStep(36, 2);
529  this->AddStep(40, 4);
530  this->AddStep(50, 5);
531  this->AddStep(100, 10);
532  this->AddStep(200, 20);
533 }
534 
535 
536 } /* namespace EMCalTriggerPtAnalysis */
Bool_t fIsPythia
trigger, if it is a PYTHIA production
static AliEmcalTrackSelection * TrackCutsFactory(TString name, Bool_t isAOD)
void FillTrackHistos(const char *eventclass, Double_t weight, Double_t pt, Double_t eta, Double_t etacent, Double_t phi, Bool_t etacut, Bool_t inEmcal, const char *pid)
Base task in the EMCAL framework.
AliCutValueRange< double > fEtaCmsCut
Cut applied in Eta centre-of-mass frame.
Double_t fPtHard
!event pt hard
void AddStep(Double_t max, Double_t binwidth)
void SetCaloTriggerPatchInfoName(const char *n)
THashList * GetListOfHistograms() const
Definition: THistManager.h:504
AliEMCALGeometry * fGeom
!emcal geometry
AliGenPythiaEventHeader * fPythiaHeader
!event Pythia header
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
AliAnalysisUtils * fAliAnalysisUtils
!vertex selection (optional)
Helper class creating user defined custom binning.
const Double_t ptmin
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
double GetEventWeight(const AliMCEvent *const event) const
AliEmcalList * fOutput
!output list
Bool_t IsPhysicalPrimary(const AliVParticle *const part, AliMCEvent *const mcevent)
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
void SetMakeGeneralHistograms(Bool_t g)
TClonesArray * fTriggerPatchInfo
!trigger patch info array
void SetNeedEmcalGeom(Bool_t n)
Container class for histograms for the high- charged particle analysis.
Definition: THistManager.h:43
Double_t fEtaSign
Sign of the eta distribution (swaps when beam directions swap): p-Pb: +1, Pb-p: -1.
virtual bool IsTrackAccepted(AliVTrack *const trk)=0
void SetMinimum(Double_t min)