AliPhysics  master (3d17d9d)
AliAnalysisTaskEmcalSoftDropData.cxx
Go to the documentation of this file.
1 /************************************************************************************
2  * Copyright (C) 2019, Copyright Holders of the ALICE Collaboration *
3  * All rights reserved. *
4  * *
5  * Redistribution and use in source and binary forms, with or without *
6  * modification, are permitted provided that the following conditions are met: *
7  * * Redistributions of source code must retain the above copyright *
8  * notice, this list of conditions and the following disclaimer. *
9  * * Redistributions in binary form must reproduce the above copyright *
10  * notice, this list of conditions and the following disclaimer in the *
11  * documentation and/or other materials provided with the distribution. *
12  * * Neither the name of the <organization> nor the *
13  * names of its contributors may be used to endorse or promote products *
14  * derived from this software without specific prior written permission. *
15  * *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
19  * DISCLAIMED. IN NO EVENT SHALL ALICE COLLABORATION BE LIABLE FOR ANY *
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
26  ************************************************************************************/
27 #include <memory>
28 #include <sstream>
29 
30 #include <fastjet/ClusterSequence.hh>
31 #include <fastjet/JetDefinition.hh>
32 #include <fastjet/PseudoJet.hh>
33 #include <fastjet/contrib/SoftDrop.hh>
34 
35 #include <TArray.h>
36 #include <TCustomBinning.h>
37 #include <THistManager.h>
38 #include <TLinearBinning.h>
39 
41 #include "AliAnalysisManager.h"
42 #include "AliAODInputHandler.h"
43 #include "AliClusterContainer.h"
46 #include "AliEmcalJet.h"
47 #include "AliInputEventHandler.h"
48 #include "AliJetContainer.h"
49 #include "AliLog.h"
50 #include "AliTrackContainer.h"
51 #include "AliVCluster.h"
52 #include "AliVTrack.h"
53 
55 
56 using namespace PWGJE::EMCALJetTasks;
57 
60  fTriggerBits(AliVEvent::kAny),
61  fTriggerString(""),
62  fUseDownscaleWeight(false),
63  fBeta(0.),
64  fZcut(0.1),
65  fReclusterizer(kCAAlgo),
66  fUseChargedConstituents(kTRUE),
67  fUseNeutralConstituents(kTRUE),
68  fHistos(nullptr),
69  fPtBinning(nullptr)
70 {
71 
72 }
73 
74 AliAnalysisTaskEmcalSoftDropData::AliAnalysisTaskEmcalSoftDropData(EMCAL_STRINGVIEW name) :
75  AliAnalysisTaskEmcalJet(name.data(), kTRUE),
76  fTriggerBits(AliVEvent::kAny),
77  fTriggerString(""),
78  fUseDownscaleWeight(false),
79  fBeta(0.),
80  fZcut(0.1),
81  fReclusterizer(kCAAlgo),
82  fUseChargedConstituents(kTRUE),
83  fUseNeutralConstituents(kTRUE),
84  fHistos(nullptr),
85  fPtBinning(nullptr)
86 {
87 
88 }
89 
91  if(fPtBinning) delete fPtBinning;
92  if(fHistos) delete fHistos;
93 }
94 
97 
98  double R = GetJetContainer("datajets")->GetJetRadius();
99  if(!fPtBinning) fPtBinning = new TLinearBinning(300, 0., 300.); // Use fine binning for data, rebin offline
100  std::unique_ptr<TBinning> zgBinning(GetZgBinning()),
101  rgBinning(GetRgBinning(R)),
102  nsdBinning(new TLinearBinning(22, -1.5, 20.5)), // Negative bins for untagged jets
103  thetagBinning(new TLinearBinning(11, -0.1, 1.));
104  TArrayD edgesPt;
105  fPtBinning->CreateBinEdges(edgesPt);
106 
107  fHistos = new THistManager("histosSoftdrop");
108  fHistos->CreateTH1("hEventCounter", "EventCounter", 1, 0.5, 1.5);
109  fHistos->CreateTH1("hJetPtRaw", "raw jet pt", 300, 0., 300.);
110  fHistos->CreateTH2("hZgVsPt", "zg vs pt", *zgBinning, *fPtBinning, "s");
111  fHistos->CreateTH2("hRgVsPt", "rg vs pt", *rgBinning, *fPtBinning, "s");
112  fHistos->CreateTH2("hNsdVsPt", "nsd vs pt", *nsdBinning, *fPtBinning, "s");
113  fHistos->CreateTH2("hThetagVsPt", "thetag vs pt", *thetagBinning, *fPtBinning, "s");
115  fHistos->CreateTH2("hZgVsPtWeighted", "zg vs pt (weighted)", *zgBinning, *fPtBinning, "s");
116  fHistos->CreateTH2("hRgVsPtWeighted", "rg vs pt (weighted)", *rgBinning, *fPtBinning, "s");
117  fHistos->CreateTH2("hNsdVsPtWeighted", "nsd vs pt (weighted)", *nsdBinning, *fPtBinning, "s");
118  fHistos->CreateTH2("hThetagVsPtWeighted", "thetag vs pt (weighted)", *thetagBinning, *fPtBinning), "s";
119  fHistos->CreateTH1("hEventCounterWeighted", "Event counter, weighted", 1., 0.5, 1.5);
120  fHistos->CreateTH1("hJetPtRawWeighted", "raw jet pt", 300, 0., 300., "s");
121  }
122 
123  // A bit of QA stuff
124  fHistos->CreateTH2("hQANEFPt", "Neutral energy fraction; p_{t} (GeV/c); NEF", 350, 0., 350., 100, 0., 1.);
125  fHistos->CreateTH2("hQAZchPt", "z_{ch,max}; p_{t} (GeV/c); z_{ch,max}", 350, 0., 350., 100, 0., 1.);
126  fHistos->CreateTH2("hQAZnePt", "z_{ne,max}; p_{t} (GeV/c); z_{ne,max}", 350, 0., 350., 100, 0., 1.);
127  fHistos->CreateTH2("hQANChPt", "Number of charged constituents; p_{t} (GeV/c); N_{ch}", 350, 0., 350., 100, 0., 100.);
128  fHistos->CreateTH2("hQANnePt", "Number of neutral constituents; p_{t} (GeV/c); N_{ne}", 350, 0., 350., 100, 0., 100.);
129 
130  for(auto h : *fHistos->GetListOfHistograms()) fOutput->Add(h);
131  PostData(1, fOutput);
132 }
133 
135  if(!(fInputHandler->IsEventSelected() & fTriggerBits)) return false;
136  if(fTriggerString.length()) {
137  if(!fInputEvent->GetFiredTriggerClasses().Contains(fTriggerString)) return false;
138  }
139  return true;
140 }
141 
145 }
146 
148  auto jets = GetJetContainer("datajets");
149  if(!jets) {
150  AliErrorStream() << "Jet container not found" << std::endl;
151  return false;
152  }
153  auto clusters = GetClusterContainer(0);
154  if(fUseNeutralConstituents && !clusters) {
155  AliErrorStream() << "Cluster container not found, but neutral constituents requested" << std::endl;
156  }
157  auto tracks = GetTrackContainer(0);
158  if(fUseChargedConstituents && !tracks) {
159  AliErrorStream() << "Track container not found, but charged constituent requested." << std::endl;
160  return false;
161  }
162 
163  Double_t weight = fUseDownscaleWeight ? 1./GetDownscaleWeight() : 1.;
164  Double_t Rjet = jets->GetJetRadius();
165  fHistos->FillTH1("hEventCounter", 1., weight);
166  if(fUseDownscaleWeight) fHistos->FillTH1("hEventCounterWeighted", 1., weight);
167 
168  for(auto jet : jets->accepted()){
169  AliDebugStream(2) << "Next accepted jet with pt " << jet->Pt() << std::endl;
170  fHistos->FillTH1("hJetPtRaw", jet->Pt());
171  if(fUseDownscaleWeight) fHistos->FillTH1("hJetPtRawWeighted", jet->Pt(), weight);
172  auto zgparams = MakeSoftdrop(*jet, jets->GetJetRadius(), tracks, clusters);
173  bool untagged = zgparams[0] < fZcut;
174  AliDebugStream(2) << "Found jet with pt " << jet->Pt() << " and zg " << zgparams[0] << std::endl;
175  fHistos->FillTH2("hZgVsPt", zgparams[0], jet->Pt());
176  fHistos->FillTH2("hRgVsPt", untagged ? -0.01 : zgparams[2], jet->Pt());
177  fHistos->FillTH2("hNsdVsPt", untagged ? -1. : zgparams[5], jet->Pt());
178  fHistos->FillTH2("hThetagVsPt", untagged ? -0.05 : zgparams[2]/Rjet, jet->Pt());
179  if(fUseDownscaleWeight) {
180  fHistos->FillTH2("hZgVsPtWeighted", zgparams[0], jet->Pt(), weight);
181  fHistos->FillTH2("hRgVsPtWeighted", untagged ? -0.01 : zgparams[2], jet->Pt(), weight);
182  fHistos->FillTH2("hNsdVsPtWeighted", untagged ? -1. : zgparams[5], jet->Pt(), weight);
183  fHistos->FillTH2("hThetagVsPtWeighted", untagged ? -0.05 : zgparams[2]/Rjet, jet->Pt(), weight);
184  }
185 
186  // Fill QA plots - trigger cluster independent
187  // Those plots have been in before (as part of the Tree) but were
188  // removed in order to reduce the disk space consumption.
189  fHistos->FillTH2("hQANEFPt", jet->Pt(), jet->NEF(), weight);
190  if(clusters){
191  auto leadcluster = jet->GetLeadingCluster(clusters->GetArray());
192  if(leadcluster){
193  TLorentzVector ptvec;
194  leadcluster->GetMomentum(ptvec, fVertex, (AliVCluster::VCluUserDefEnergy_t)clusters->GetDefaultClusterEnergy());
195  fHistos->FillTH2("hQAZnePt", jet->Pt(), jet->GetZ(ptvec.Px(), ptvec.Py(), ptvec.Pz()), weight);
196  }
197  }
198  if(tracks){
199  auto leadingtrack = jet->GetLeadingTrack(tracks->GetArray());
200  if(leadingtrack) fHistos->FillTH2("hQAZchPt", jet->Pt(), jet->GetZ(leadingtrack->Px(), leadingtrack->Py(), leadingtrack->Pz()), weight);
201  }
202  fHistos->FillTH2("hQANChPt", jet->Pt(), jet->GetNumberOfTracks(), weight);
203  fHistos->FillTH2("hQANnePt", jet->Pt(), jet->GetNumberOfClusters(), weight);
204  }
205  return true;
206 }
207 
209  Double_t weight = 1.;
210  TString triggerclass;
211  if(fTriggerString == "INT7") triggerclass = "CINT7-B-NOPF-CENT";
212  else if(fTriggerString == "EJ1") triggerclass = "CEMC7EJ1-B-NOPF-CENTNOTRD";
213  else if(fTriggerString == "EJ2") triggerclass = "CEMC7EJ2-B-NOPF-CENT";
214  if(triggerclass.Length()) weight = PWG::EMCAL::AliEmcalDownscaleFactorsOCDB::Instance()->GetDownscaleFactorForTriggerClass(triggerclass);
215  return weight;
216 }
217 
219  auto binning = new TCustomBinning;
220  binning->SetMinimum(0.);
221  binning->AddStep(fZcut, fZcut);
222  binning->AddStep(0.5, 0.05);
223  return binning;
224 }
225 
227  auto binning = new TCustomBinning;
228  binning->SetMinimum(-0.05); // Negative bin for untagged jets
229  binning->AddStep(R, 0.05);
230  return binning;
231 }
232 
233 std::vector<double> AliAnalysisTaskEmcalSoftDropData::MakeSoftdrop(const AliEmcalJet &jet, double jetradius, const AliParticleContainer *tracks, const AliClusterContainer *clusters) const {
234  const int kClusterOffset = 30000; // In order to handle tracks and clusters in the same index space the cluster index needs and offset, large enough so that there is no overlap with track indices
235  std::vector<fastjet::PseudoJet> constituents;
236  bool isMC = dynamic_cast<const AliMCParticleContainer *>(tracks);
237  AliDebugStream(2) << "Make new jet substrucutre for " << (isMC ? "MC" : "data") << " jet: Number of tracks " << jet.GetNumberOfTracks() << ", clusters " << jet.GetNumberOfClusters() << std::endl;
238  if(tracks && (fUseChargedConstituents || isMC)){ // Neutral particles part of particle container in case of MC
239  AliDebugStream(1) << "Jet substructure: Using charged constituents" << std::endl;
240  for(int itrk = 0; itrk < jet.GetNumberOfTracks(); itrk++){
241  auto track = jet.TrackAt(itrk, tracks->GetArray());
242  if(!track->Charge() && !fUseNeutralConstituents) continue; // Reject neutral constituents in case of using only charged consituents
243  if(track->Charge() && !fUseChargedConstituents) continue; // Reject charged constituents in case of using only neutral consituents
244  fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
245  constituentTrack.set_user_index(jet.TrackAt(itrk));
246  constituents.push_back(constituentTrack);
247  }
248  }
249 
250  if(clusters && fUseNeutralConstituents){
251  AliDebugStream(1) << "Jet substructure: Using neutral constituents" << std::endl;
252  for(int icl = 0; icl < jet.GetNumberOfClusters(); icl++) {
253  auto cluster = jet.ClusterAt(icl, clusters->GetArray());
254  TLorentzVector clustervec;
255  cluster->GetMomentum(clustervec, fVertex, (AliVCluster::VCluUserDefEnergy_t)clusters->GetDefaultClusterEnergy());
256  fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
257  constituentCluster.set_user_index(jet.ClusterAt(icl) + kClusterOffset);
258  constituents.push_back(constituentCluster);
259  }
260  }
261 
262  AliDebugStream(3) << "Found " << constituents.size() << " constituents for jet with pt=" << jet.Pt() << " GeV/c" << std::endl;
263  if(!constituents.size()){
264  AliErrorStream() << "Jet has 0 constituents." << std::endl;
265  throw 1;
266  }
267  // Redo jet finding on constituents with a
268  fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
269  fastjet::ClusterSequence jetfinder(constituents, jetdef);
270  std::vector<fastjet::PseudoJet> outputjets = jetfinder.inclusive_jets(0);
271  auto sdjet = outputjets[0];
272  fastjet::contrib::SoftDrop softdropAlgorithm(fBeta, fZcut);
273  softdropAlgorithm.set_verbose_structure(kTRUE);
274  fastjet::JetAlgorithm reclusterizingAlgorithm;
275  switch(fReclusterizer) {
276  case kCAAlgo: reclusterizingAlgorithm = fastjet::cambridge_aachen_algorithm; break;
277  case kKTAlgo: reclusterizingAlgorithm = fastjet::kt_algorithm; break;
278  case kAKTAlgo: reclusterizingAlgorithm = fastjet::antikt_algorithm; break;
279  };
280 #if FASTJET_VERSION_NUMBER >= 30302
281  fastjet::Recluster reclusterizer(reclusterizingAlgorithm, 1, fastjet::Recluster::keep_only_hardest);
282 #else
283  fastjet::contrib::Recluster reclusterizer(reclusterizingAlgorithm, 1, true);
284 #endif
285  softdropAlgorithm.set_reclustering(kTRUE, &reclusterizer);
286  AliDebugStream(4) << "Jet has " << sdjet.constituents().size() << " constituents" << std::endl;
287  auto groomed = softdropAlgorithm(sdjet);
288  auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
289 
290  std::vector<double> result ={softdropstruct.symmetry(),
291  groomed.m(),
292  softdropstruct.delta_R(),
293  groomed.perp(),
294  softdropstruct.mu(),
295  static_cast<double>(softdropstruct.dropped_count())};
296  return result;
297 }
298 
300  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
301 
302  Bool_t isAOD(kFALSE);
303  AliInputEventHandler *inputhandler = static_cast<AliInputEventHandler *>(mgr->GetInputEventHandler());
304  if(inputhandler) {
305  if(inputhandler->IsA() == AliAODInputHandler::Class()){
306  std::cout << "Analysing AOD events\n";
307  isAOD = kTRUE;
308  } else {
309  std::cout << "Analysing ESD events\n";
310  }
311  }
312 
313  std::stringstream taskname;
314  taskname << "SoftdropDataMaker_R" << std::setw(2) << std::setfill('0') << int(jetradius*10) << trigger;
315  AliAnalysisTaskEmcalSoftDropData *datamaker = new AliAnalysisTaskEmcalSoftDropData(taskname.str().data());
316  datamaker->SelectCollisionCandidates(AliVEvent::kAny);
317  mgr->AddTask(datamaker);
318 
319  AliTrackContainer *tracks(nullptr);
320  if((jettype == AliJetContainer::kChargedJet) || (jettype == AliJetContainer::kFullJet)){
322  std::cout << "Track container name: " << tracks->GetName() << std::endl;
323  tracks->SetMinPt(0.15);
324  }
325  AliClusterContainer *clusters(nullptr);
326  if((jettype == AliJetContainer::kFullJet) || (jettype == AliJetContainer::kNeutralJet)){
327  std::cout << "Using full or neutral jets ..." << std::endl;
329  std::cout << "Cluster container name: " << clusters->GetName() << std::endl;
330  clusters->SetClusHadCorrEnergyCut(0.3); // 300 MeV E-cut
331  clusters->SetDefaultClusterEnergy(AliVCluster::kHadCorr);
332  } else {
333  std::cout << "Using charged jets ... " << std::endl;
334  }
335 
336  AliJetContainer *datajets = datamaker->AddJetContainer(
337  jettype,
339  recombinationScheme,
340  jetradius,
342  tracks, clusters);
343  datajets->SetName("datajets");
344  datajets->SetJetPtCut(0.);
345  datajets->SetMaxTrackPt(1000.);
346 
347  std::string jettypestring;
348  switch(jettype) {
349  case AliJetContainer::kFullJet: jettypestring = "FullJets"; break;
350  case AliJetContainer::kChargedJet: jettypestring = "ChargedJets"; break;
351  case AliJetContainer::kNeutralJet: jettypestring = "NeutralJets"; break;
352  default: jettypestring = "Undef";
353  };
354 
355  ULong_t triggerbits(AliVEvent::kINT7);
356  std::string triggerstring(trigger);
357  std::cout << "Found trigger " << triggerstring << std::endl;
358  if(triggerstring == "EJ1") {
359  std::cout << "Setting binning mode for EJ1" << std::endl;
360  triggerbits = AliVEvent::kEMCEJE;
361  } else if(triggerstring == "EJ2") {
362  std::cout << "Setting binning mode for EJ2" << std::endl;
363  triggerbits = AliVEvent::kEMCEJE;
364  }
365  datamaker->SetSelectTrigger(triggerbits, trigger.data());
366 
367  // Connecting containers
368  std::stringstream outputfile, histname;
369  outputfile << mgr->GetCommonFileName() << ":SoftDropResponse_" << jettypestring << "_R" << std::setw(2) << std::setfill('0') << int(jetradius * 10.) << "_" << trigger;
370  histname << "SoftDropResponseHistos_" << jettypestring << "_R" << std::setw(2) << std::setfill('0') << int(jetradius * 10.) << "_" << trigger;
371  mgr->ConnectInput(datamaker, 0, mgr->GetCommonInputContainer());
372  mgr->ConnectOutput(datamaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
373 
374  return datamaker;
375 }
double Double_t
Definition: External.C:58
Class creating a linear binning, used in the histogram manager.
AliJetContainer * GetJetContainer(Int_t i=0) const
void SetName(const char *n)
Set the name of the class of the objets inside the underlying array.
virtual Bool_t IsTriggerSelected()
Selection of a hardware trigger.
Container with name, TClonesArray and cuts for particles.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
Int_t ClusterAt(Int_t idx) const
Definition: AliEmcalJet.h:137
static AliEmcalDownscaleFactorsOCDB * Instance()
void SetMinPt(Double_t min)
AliJetContainer * AddJetContainer(const char *n, TString defaultCutType, Float_t jetRadius=0.4)
virtual void CreateBinEdges(TArrayD &binedges) const =0
Double_t GetDownscaleFactorForTriggerClass(const TString &trigger) const
Interface for binnings used by the histogram handler.
Definition: TBinning.h:23
static AliAnalysisTaskEmcalSoftDropData * AddTaskEmcalSoftDropData(Double_t jetradius, AliJetContainer::EJetType_t jettype, AliJetContainer::ERecoScheme_t recombinationScheme, EMCAL_STRINGVIEW trigger)
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
Container for particles within the EMCAL framework.
Int_t GetDefaultClusterEnergy() const
Int_t TrackAt(Int_t idx) const
Definition: AliEmcalJet.h:160
UShort_t GetNumberOfTracks() const
Definition: AliEmcalJet.h:139
TPC fiducial acceptance (each eta edge narrowed by jet R)
Definition: AliEmcalJet.h:68
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
Create a new TH2 within the container.
int Int_t
Definition: External.C:63
UShort_t GetNumberOfClusters() const
Definition: AliEmcalJet.h:138
void SetJetPtCut(Float_t cut)
virtual Bool_t Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
void SetSelectTrigger(UInt_t triggerbits, const char *triggerstring)
THashList * GetListOfHistograms() const
Get the list of histograms.
Definition: THistManager.h:671
virtual void RunChanged(Int_t newrun)
Process tasks relevant when a file with a different run number is processed.
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
Helper class creating user defined custom binning.
TClonesArray * GetArray() const
unsigned long ULong_t
Definition: External.C:38
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
Double_t Pt() const
Definition: AliEmcalJet.h:109
const char * GetName() const
Bool_t isMC
Float_t GetJetRadius() const
AliEmcalList * fOutput
!output list
std::vector< double > MakeSoftdrop(const AliEmcalJet &jet, double jetradius, const AliParticleContainer *tracks, const AliClusterContainer *clusters) const
Double_t fVertex[3]
!event vertex
AliTrackContainer * AddTrackContainer(const char *n)
Create new track container and attach it to the task.
AliTrackContainer * GetTrackContainer(Int_t i=0) const
#define EMCAL_STRINGVIEW
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Definition: AliEmcalJet.h:51
Container class for histograms.
Definition: THistManager.h:99
void UserCreateOutputObjects()
Main initialization function on the worker.
bool Bool_t
Definition: External.C:53
void SetDefaultClusterEnergy(Int_t d)
void SetMaxTrackPt(Float_t b)
Container structure for EMCAL clusters.
Container for MC-true particles within the EMCAL framework.
EMCal fiducial acceptance (each eta, phi edge narrowed by jet R)
Definition: AliEmcalJet.h:70
Container for jet within the EMCAL jet framework.
void SetClusHadCorrEnergyCut(Double_t cut)
void SetMinimum(Double_t min)
static TString ClusterContainerNameFactory(Bool_t isAOD)
Get name of the default cluster container.
static TString TrackContainerNameFactory(Bool_t isAOD)
Get name of the default track container.