35 #include <TLorentzVector.h> 38 #include <fastjet/ClusterSequence.hh> 39 #include <fastjet/PseudoJet.hh> 40 #include <fastjet/contrib/SoftDrop.hh> 41 #include <fastjet/config.h> 42 #if FASJET_VERSION_NUMBER >= 30302 43 #include <fastjet/tools/Recluster.hh> 45 #include <fastjet/contrib/Recluster.hh> 48 #include <RooUnfoldResponse.h> 50 #include <AliAODEvent.h> 51 #include <AliAODInputHandler.h> 52 #include <AliAnalysisManager.h> 60 #include <AliVCluster.h> 61 #include <AliVParticle.h> 62 #include <AliVTrack.h> 66 using namespace
PWGJE::EMCALJetTasks;
70 fBinningMode(kSDModeINT7),
71 fFractionResponseClosure(0.5),
74 fReclusterizer(kCAAlgo),
75 fUseChargedConstituents(true),
76 fUseNeutralConstituents(true),
77 fSampleSplitter(
nullptr),
78 fPartLevelPtBinning(
nullptr),
79 fDetLevelPtBinning(
nullptr),
81 fZgResponseClosure(
nullptr),
82 fZgPartLevel(
nullptr),
84 fZgPartLevelTruncated(
nullptr),
85 fZgPartLevelClosureNoResp(
nullptr),
86 fZgDetLevelClosureNoResp(
nullptr),
87 fZgPartLevelClosureResp(
nullptr),
88 fZgDetLevelClosureResp(
nullptr)
93 AliAnalysisTaskEmcalSoftDropResponse::AliAnalysisTaskEmcalSoftDropResponse(
const char *name):
95 fBinningMode(kSDModeINT7),
96 fFractionResponseClosure(0.5),
99 fReclusterizer(kCAAlgo),
100 fUseChargedConstituents(true),
101 fUseNeutralConstituents(true),
109 fZgPartLevelTruncated(
nullptr),
110 fZgPartLevelClosureNoResp(
nullptr),
111 fZgDetLevelClosureNoResp(
nullptr),
112 fZgPartLevelClosureResp(
nullptr),
113 fZgDetLevelClosureResp(
nullptr)
132 TArrayD binEdgesZg, binEdgesPtPart, binEdgesPtDet;
133 zgbinning->CreateBinEdges(binEdgesZg);
137 fZgDetLevel =
new TH2D(
"hZgDetLevel",
"Zg response at detector level", binEdgesZg.GetSize() - 1, binEdgesZg.GetArray(), binEdgesPtDet.GetSize() - 1, binEdgesPtDet.GetArray());
138 fZgPartLevel =
new TH2D(
"hZgPartLevel",
"Zg response at particle level", binEdgesZg.GetSize() - 1, binEdgesZg.GetArray(), binEdgesPtDet.GetSize() - 1, binEdgesPtDet.GetArray());
139 fZgPartLevelTruncated =
new TH2D(
"hZgPartLevelTruncated",
"Zg response at particle level (truncated)", binEdgesZg.GetSize() - 1, binEdgesZg.GetArray(), binEdgesPtDet.GetSize() - 1, binEdgesPtDet.GetArray());
142 fZgPartLevelClosureNoResp =
new TH2D(
"hZgPartLevelClosureNoResp",
"Zg response at particle level (closure test, jets not used for the response matrix)", binEdgesZg.GetSize() - 1, binEdgesZg.GetArray(), binEdgesPtDet.GetSize() - 1, binEdgesPtDet.GetArray());
143 fZgDetLevelClosureNoResp =
new TH2D(
"hZgDetLevelClosureNoResp",
"Zg response at detector level (closure test, jets not used for the response matrix)", binEdgesZg.GetSize() - 1, binEdgesZg.GetArray(), binEdgesPtDet.GetSize() - 1, binEdgesPtDet.GetArray());
144 fZgPartLevelClosureResp =
new TH2D(
"hZgPartLevelClosureResp",
"Zg response at particle level (closure test, jets used for the response matrix)", binEdgesZg.GetSize() - 1, binEdgesZg.GetArray(), binEdgesPtDet.GetSize() - 1, binEdgesPtDet.GetArray());
145 fZgDetLevelClosureResp =
new TH2D(
"hZgDetLevelClosureResp",
"Zg response at detector level (closure test, jets used for the response matrix)", binEdgesZg.GetSize() - 1, binEdgesZg.GetArray(), binEdgesPtDet.GetSize() - 1, binEdgesPtDet.GetArray());
147 fZgResponse =
new RooUnfoldResponse(
"hZgResponse",
"z_{g} response matrix");
149 fZgResponseClosure =
new RooUnfoldResponse(
"hZgResponseClosure",
"z_{g} response matrix for the closure test");
156 fOutput->Add(fZgPartLevelTruncated);
157 fOutput->Add(fZgPartLevelClosureNoResp);
158 fOutput->Add(fZgDetLevelClosureNoResp);
159 fOutput->Add(fZgPartLevelClosureResp);
160 fOutput->Add(fZgDetLevelClosureResp);
171 if(!(partLevelJets || detLevelJets)) {
172 AliErrorStream() <<
"Either of the jet containers not found" << std::endl;
177 auto ptmindet =
fZgDetLevel->GetYaxis()->GetBinLowEdge(1),
180 for(
auto detjet : detLevelJets->accepted()){
181 auto partjet = detjet->ClosestJet();
182 if(!partjet)
continue;
188 std::vector<double> softdropDet, softdropPart;
190 softdropDet =
MakeSoftdrop(*detjet, detLevelJets->GetJetRadius(), tracks, clusters);
193 if(detjet->Pt() >= ptmindet && detjet->Pt() <= ptmaxdet) {
196 fZgResponse->Fill(softdropDet[0], detjet->Pt(), softdropPart[0], partjet->Pt());
197 if(closureUseResponse) {
198 fZgResponseClosure->Fill(softdropDet[0], detjet->Pt(), softdropPart[0], partjet->Pt());
207 AliErrorStream() <<
"Error in softdrop evaluation - jet will be ignored" << std::endl;
216 const int kClusterOffset = 30000;
217 std::vector<fastjet::PseudoJet> constituents;
219 AliDebugStream(2) <<
"Make new jet substrucutre for " << (isMC ?
"MC" :
"data") <<
" jet: Number of tracks " << jet.
GetNumberOfTracks() <<
", clusters " << jet.
GetNumberOfClusters() << std::endl;
221 AliDebugStream(1) <<
"Jet substructure: Using charged constituents" << std::endl;
223 auto track = jet.
TrackAt(itrk, tracks->GetArray());
226 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
227 constituentTrack.set_user_index(jet.
TrackAt(itrk));
228 constituents.push_back(constituentTrack);
233 AliDebugStream(1) <<
"Jet substructure: Using neutral constituents" << std::endl;
235 auto cluster = jet.
ClusterAt(icl, clusters->GetArray());
236 TLorentzVector clustervec;
238 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
239 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
240 constituents.push_back(constituentCluster);
244 AliDebugStream(3) <<
"Found " << constituents.size() <<
" constituents for jet with pt=" << jet.
Pt() <<
" GeV/c" << std::endl;
245 if(!constituents.size()){
246 AliErrorStream() <<
"Jet has 0 constituents." << std::endl;
250 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
251 fastjet::ClusterSequence jetfinder(constituents, jetdef);
252 std::vector<fastjet::PseudoJet> outputjets = jetfinder.inclusive_jets(0);
253 auto sdjet = outputjets[0];
254 fastjet::contrib::SoftDrop softdropAlgorithm(
fBeta,
fZcut);
255 softdropAlgorithm.set_verbose_structure(kTRUE);
256 fastjet::JetAlgorithm reclusterizingAlgorithm;
258 case kCAAlgo: reclusterizingAlgorithm = fastjet::cambridge_aachen_algorithm;
break;
259 case kKTAlgo: reclusterizingAlgorithm = fastjet::kt_algorithm;
break;
260 case kAKTAlgo: reclusterizingAlgorithm = fastjet::antikt_algorithm;
break;
262 #if FASTJET_VERSION_NUMBER >= 30302 263 fastjet::Recluster reclusterizer(reclusterizingAlgorithm, 1, fastjet::Recluster::keep_only_hardest);
265 fastjet::contrib::Recluster reclusterizer(reclusterizingAlgorithm, 1,
true);
267 softdropAlgorithm.set_reclustering(kTRUE, &reclusterizer);
268 AliDebugStream(4) <<
"Jet has " << sdjet.constituents().size() <<
" constituents" << std::endl;
269 auto groomed = softdropAlgorithm(sdjet);
270 auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
272 std::vector<double> result ={softdropstruct.symmetry(),
274 softdropstruct.delta_R(),
277 static_cast<double>(softdropstruct.dropped_count())};
286 binning->AddStep(20., 20.);
287 binning->AddStep(40., 10.);
288 binning->AddStep(80., 20.);
289 binning->AddStep(120., 40.);
290 binning->AddStep(240., 120.);
294 binning->AddStep(80., 80.);
295 binning->AddStep(140., 10.);
296 binning->AddStep(200., 20.);
297 binning->AddStep(240., 40.);
298 binning->AddStep(400., 160.);
302 binning->AddStep(70., 70.);
303 binning->AddStep(100., 10.);
304 binning->AddStep(140., 20.);
305 binning->AddStep(400., 260.);
316 binning->SetMinimum(20);
317 binning->AddStep(40., 5.);
318 binning->AddStep(60., 10.);
319 binning->AddStep(80., 20.);
320 binning->AddStep(120., 40.);
324 binning->SetMinimum(80.);
325 binning->AddStep(120., 5.);
326 binning->AddStep(160., 10.);
327 binning->AddStep(200., 20.);
331 binning->SetMinimum(70.);
332 binning->AddStep(100., 5.);
333 binning->AddStep(120., 10.);
334 binning->AddStep(140., 20.);
344 binning->AddStep(0.1, 0.1);
345 binning->AddStep(0.5, 0.05);
353 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
355 if(inputhandler->IsA() == AliAODInputHandler::Class()){
356 std::cout <<
"Analysing AOD events\n";
359 std::cout <<
"Analysing ESD events\n";
363 std::stringstream taskname;
364 taskname <<
"SoftdropResponsemaker_R" << std::setw(2) << std::setfill(
'0') << int(jetradius*10) << trigger;
366 responsemaker->SelectCollisionCandidates(AliVEvent::kINT7);
367 mgr->AddTask(responsemaker);
370 particles->SetMinPt(0.);
379 mcjets->SetName(
"partLevel");
386 std::cout <<
"Track container name: " << tracks->GetName() << std::endl;
387 tracks->SetMinPt(0.15);
391 std::cout <<
"Using full or neutral jets ..." << std::endl;
393 std::cout <<
"Cluster container name: " << clusters->GetName() << std::endl;
397 std::cout <<
"Using charged jets ... " << std::endl;
407 datajets->SetName(
"detLevel");
411 std::string jettypestring;
416 default: jettypestring =
"Undef";
420 std::string triggerstring(trigger);
421 if(triggerstring ==
"EJ1") binmode =
kSDModeEJ1;
422 else if(triggerstring ==
"EJ2") binmode =
kSDModeEJ2;
426 std::stringstream outputfile, histname;
427 outputfile << mgr->GetCommonFileName() <<
":SoftDropResponse_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
428 histname <<
"SoftDropResponseHistos_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
429 mgr->ConnectInput(responsemaker, 0, mgr->GetCommonInputContainer());
430 mgr->ConnectOutput(responsemaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
432 return responsemaker;
TH2 * fZgDetLevel
! Zg vs. pt at detector level
TBinning * GetDefaultDetLevelPtBinning() const
TH2 * fZgPartLevel
! Zg vs. pt at particle level
EBinningMode_t fBinningMode
Binning adapted to trigger.
TH2 * fZgPartLevelClosureNoResp
! Zg vs. pt at particle level for closure test (jets not used for response)
AliJetContainer * GetJetContainer(Int_t i=0) const
TH2 * fZgPartLevelClosureResp
! Zg vs. pt at particle level for closure test (jets used for response)
TBinning * fPartLevelPtBinning
Particle level pt binning.
TBinning * GetDefaultPartLevelPtBinning() const
Container with name, TClonesArray and cuts for particles.
Int_t ClusterAt(Int_t idx) const
TH2 * fZgDetLevelClosureNoResp
! Zg vs. pt at detector level for closure test (jets not used for response)
TBinning * fDetLevelPtBinning
Detector level pt binning.
AliJetContainer * AddJetContainer(const char *n, TString defaultCutType, Float_t jetRadius=0.4)
virtual void CreateBinEdges(TArrayD &binedges) const =0
void SetBinningMode(EBinningMode_t binmode)
TH2 * fZgPartLevelTruncated
! Zg vs. pt at particle level after truncation at
TH2 * fZgDetLevelClosureResp
! Zg vs. pt at detector level for closure test (jets used for response)
Interface for binnings used by the histogram handler.
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
UShort_t GetNumberOfTracks() const
Double_t fFractionResponseClosure
Fraction of events used for the response matrix in the closure test.
AliParticleContainer * GetParticleContainer(Int_t i=0) const
Get particle container attached to this task.
TPC fiducial acceptance (each eta edge narrowed by jet R)
virtual void UserCreateOutputObjects()
UShort_t GetNumberOfClusters() const
void SetJetPtCut(Float_t cut)
virtual ~AliAnalysisTaskEmcalSoftDropResponse()
TRandom * fSampleSplitter
Sample splitter.
Bool_t fUseNeutralConstituents
Use neutral constituents for softdrop.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
Double_t fZcut
Zcut (softdrop definition)
Helper class creating user defined custom binning.
virtual bool Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
RooUnfoldResponse * fZgResponseClosure
! RooUnfold response for the closure test
AliMCParticleContainer * AddMCParticleContainer(const char *n)
Create new container for MC particles and attach it to the task.
RooUnfoldResponse * fZgResponse
! RooUnfold response object
TBinning * GetZgBinning() const
Float_t GetJetRadius() const
AliEmcalList * fOutput
!output list
Bool_t fUseChargedConstituents
Use charged constituents for softdrop.
Double_t fBeta
Beta (softdrop definition)
Double_t fVertex[3]
!event vertex
AliTrackContainer * AddTrackContainer(const char *n)
Create new track container and attach it to the task.
EReclusterizer_t fReclusterizer
Reclusterizing algorithm.
AliTrackContainer * GetTrackContainer(Int_t i=0) const
void SetMakeGeneralHistograms(Bool_t g)
AliAnalysisTaskEmcalSoftDropResponse()
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
void UserCreateOutputObjects()
Main initialization function on the worker.
static AliAnalysisTaskEmcalSoftDropResponse * AddTaskEmcalSoftDropResponse(Double_t jetradius, AliJetContainer::EJetType_t jettype, AliJetContainer::ERecoScheme_t recombinationScheme, const char *trigger)
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)
Container for jet within the EMCAL jet framework.
std::vector< double > MakeSoftdrop(const AliEmcalJet &jet, double jetradius, const AliParticleContainer *tracks, const AliClusterContainer *clusters) const
void SetClusHadCorrEnergyCut(Double_t cut)
void SetMinimum(Double_t min)
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.