36 #include "AliAODInputHandler.h" 37 #include "AliAnalysisManager.h" 42 #include "AliVEventHandler.h" 53 fTriggerSelectionString(),
54 fNameTriggerDecisionContainer("EmcalTriggerDecision")
58 AliAnalysisTaskEmcalJetEnergyScale::AliAnalysisTaskEmcalJetEnergyScale(
const char *name):
63 fTriggerSelectionString(),
64 fNameTriggerDecisionContainer(
"EmcalTriggerDecision")
67 DefineOutput(1, TList::Class());
77 TLinearBinning jetPtBinning(200, 0., 200.), nefbinning(100, 0., 1.), ptdiffbinning(200, -1., 1.), jetEtaBinning(100, -0.9, 0.9), jetPhiBinning(100, 0., TMath::TwoPi());
79 const TBinning *diffbinning[3] = {&jetPtBinning, &nefbinning, &ptdiffbinning},
80 *corrbinning[3] = {&jetPtBinning, &jetPtBinning, &nefbinning},
81 *effbinning[3] = {&jetPtBinning, &jetEtaBinning, &jetPhiBinning};
88 fHistos->
CreateTHnSparse(
"hPartJetsReconstructed",
"Accepted and reconstructed particle level jets", 3, effbinning,
"s");
95 AliDebugStream(1) <<
"Next event" << std::endl;
96 if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7))
return false;
99 AliDebugStream(1) <<
"Found trigger decision object: " << (mctrigger ?
"yes" :
"no") << std::endl;
101 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
106 AliDebugStream(1) <<
"event selected" << std::endl;
111 if(!detjets || !partjets) {
112 AliErrorStream() <<
"At least one jet container missing, exiting ..." << std::endl;
115 AliDebugStream(1) <<
"Have both jet containers: part(" << partjets->GetNAcceptedJets() <<
"|" << partjets->GetNJets() <<
"), det(" << detjets->GetNAcceptedJets() <<
"|" << detjets->GetNJets() <<
")" << std::endl;
117 std::vector<AliEmcalJet *> taggedjets;
118 for(
auto detjet : detjets->accepted()){
119 AliDebugStream(2) <<
"Next jet" << std::endl;
120 auto partjet = detjet->ClosestJet();
122 AliDebugStream(2) <<
"No tagged jet" << std::endl;
125 taggedjets.emplace_back(partjet);
126 double pointCorr[3] = {partjet->Pt(), detjet->Pt(), detjet->NEF()},
127 pointDiff[3] = {partjet->Pt(), detjet->NEF(), (detjet->Pt()-partjet->Pt())/partjet->Pt()};
133 for(
auto partjet : partjets->accepted()){
134 double pvect[3] = {partjet->Pt(), partjet->Eta(), partjet->Phi()};
135 if(pvect[2] < 0) pvect[2] += TMath::TwoPi();
137 if(std::find(taggedjets.begin(), taggedjets.end(), partjet) != taggedjets.end())
fHistos->
FillTHnSparse(
"hPartJetsReconstructed", pvect);
143 const std::array<TString, 8> kEMCALTriggers = {
144 "EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2" 146 bool isEMCAL =
false;
147 for(
auto emcaltrg : kEMCALTriggers) {
148 if(triggerstring.Contains(emcaltrg)) {
159 ::Error(
"EmcalTriggerJets::AliAnalysisTaskEmcalJetEnergyScale::AddTaskJetEnergyScale",
"No analysis manager available");
163 auto inputhandler = mgr->GetInputEventHandler();
164 auto isAOD = inputhandler->IsA() == AliAODInputHandler::Class();
166 std::string jettypename;
168 bool addClusterContainer(
false), addTrackContainer(
false);
171 jettypename =
"FullJet";
173 addClusterContainer = addTrackContainer =
true;
176 jettypename =
"ChargedJet";
178 addTrackContainer =
true;
181 jettypename =
"NeutralJet";
183 addClusterContainer =
true;
187 std::stringstream taskname, tag;
188 tag << jettypename <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
189 taskname <<
"EnergyScaleTask_" << tag.str();
191 mgr->AddTask(energyscaletask);
195 partcont->SetMinPt(0.);
198 if(addClusterContainer) {
213 if(addTrackContainer) {
219 contpartjet->SetName(
"particleLevelJets");
221 std::cout <<
"Adding particle-level jet container with underling array: " << contpartjet->GetArrayName() << std::endl;
224 acceptance, tracks, clusters);
225 contdetjet->SetName(
"detectorLevelJets");
227 std::cout <<
"Adding detector-level jet container with underling array: " << contdetjet->GetArrayName() << std::endl;
229 std::stringstream outnamebuilder, listnamebuilder;
230 listnamebuilder <<
"EnergyScaleHists_" << tag.str();
231 outnamebuilder << mgr->GetCommonFileName() <<
":EnergyScaleResults_" << tag.str();
233 mgr->ConnectInput(energyscaletask, 0, mgr->GetCommonInputContainer());
234 mgr->ConnectOutput(energyscaletask, 1, mgr->CreateContainer(listnamebuilder.str().data(), TList::Class(), AliAnalysisManager::kOutputContainer, outnamebuilder.str().data()));
235 return energyscaletask;
EMCal fiducial acceptance (each eta, phi edge narrowed by jet R)
Class creating a linear binning, used in the histogram manager.
AliJetContainer * GetJetContainer(Int_t i=0) const
TString fTriggerSelectionString
Trigger selection string.
bool IsSelectEmcalTriggers(const TString &triggerstring) const
Container with name, TClonesArray and cuts for particles.
void SetUseAliAnaUtils(Bool_t b, Bool_t bRejPilup=kTRUE)
AliJetContainer * AddJetContainer(const char *n, TString defaultCutType, Float_t jetRadius=0.4)
void SetNamePartJetContainer(const char *name)
TString fNameDetectorJets
Name of the data jet container.
Interface for binnings used by the histogram handler.
TString fNameTriggerDecisionContainer
Global trigger decision container.
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
DCal fiducial acceptance (each eta, phi edge narrowed by jet R)
virtual void UserCreateOutputObjects()
void FillTHnSparse(const char *name, const double *x, double weight=1., Option_t *opt="")
JetAcceptanceType
Bit definition for jet geometry acceptance. Defined here for backwards compatibility. This will be removed. Please use AliEmcalJet::JetAcceptanceType in your code.
THashList * GetListOfHistograms() const
Get the list of histograms.
static AliAnalysisTaskEmcalJetEnergyScale * AddTaskJetEnergyScale(AliJetContainer::EJetType_t jetType, Double_t radius, Bool_t useDCAL, const char *trigger)
void SetClusNonLinCorrEnergyCut(Double_t cut)
TString fNameParticleJets
Name of the MC jet container.
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 SetNameDetJetContainer(const char *name)
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
void SetTriggerName(const char *name)
AliMCParticleContainer * AddMCParticleContainer(const char *n)
Create new container for MC particles and attach it to the task.
TPC fiducial acceptance (each eta edge narrowed by jet R)
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
Container for trigger decision object.
AliEmcalList * fOutput
!output list
AliTrackContainer * AddTrackContainer(const char *n)
Create new track container and attach it to the task.
virtual ~AliAnalysisTaskEmcalJetEnergyScale()
AliAnalysisTaskEmcalJetEnergyScale()
Base task in the EMCAL jet framework.
Container class for histograms.
THistManager * fHistos
! Histogram collection
void UserCreateOutputObjects()
Main initialization function on the worker.
void SetDefaultClusterEnergy(Int_t d)
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
Create a new THnSparse within the container.
Container structure for EMCAL clusters.
void SetClusHadCorrEnergyCut(Double_t cut)
static TString TrackContainerNameFactory(Bool_t isAOD)
Get name of the default track container.
static TString ClusterContainerNameFactory(Bool_t isAOD)
Get name of the default cluster container.