32 #include <fastjet/ClusterSequence.hh>
33 #include <fastjet/contrib/Nsubjettiness.hh>
34 #include <fastjet/contrib/SoftDrop.hh>
36 #include <TLorentzVector.h>
41 #include "AliAODInputHandler.h"
42 #include "AliAnalysisManager.h"
53 #include "AliVCluster.h"
54 #include "AliVParticle.h"
60 namespace EmcalTriggerJets {
67 fReclusterizer(kCAAlgo),
68 fTriggerSelectionBits(AliVEvent::kAny),
69 fTriggerSelectionString(
"")
79 fReclusterizer(kCAAlgo),
80 fTriggerSelectionBits(AliVEvent::kAny),
81 fTriggerSelectionString(
"")
84 DefineOutput(2, TTree::Class());
97 varnames[0] =
"Radius";
98 varnames[1] =
"EventWeight";
99 varnames[2] =
"PtJetRec";
100 varnames[3] =
"PtJetSim";
101 varnames[4] =
"EJetRec";
102 varnames[5] =
"EJetSim";
103 varnames[6] =
"RhoPtRec";
104 varnames[7] =
"RhoPtSim";
105 varnames[8] =
"RhoMassRec";
106 varnames[9] =
"RhoMassSim";
107 varnames[10] =
"AreaRec";
108 varnames[11] =
"AreaSim";
109 varnames[12] =
"NEFRec";
110 varnames[13] =
"NEFSim";
111 varnames[14] =
"MassRec";
112 varnames[15] =
"MassSim";
113 varnames[16] =
"ZgMeasured";
114 varnames[17] =
"ZgTrue";
115 varnames[18] =
"RgMeasured";
116 varnames[19] =
"RgTrue";
117 varnames[20] =
"MgMeasured";
118 varnames[21] =
"MgTrue";
119 varnames[22] =
"PtgMeasured";
120 varnames[23] =
"PtgTrue";
121 varnames[24] =
"MugMeasured";
122 varnames[25] =
"MugTrue";
123 varnames[26] =
"OneSubjettinessMeasured";
124 varnames[27] =
"OneSubjettinessTrue";
125 varnames[28] =
"TwoSubjettinessMeasured";
126 varnames[29] =
"TwoSubjettinessTrue";
127 varnames[30] =
"AngularityMeasured";
128 varnames[31] =
"AngularityTrue";
129 varnames[32] =
"PtDMeasured";
130 varnames[33] =
"PtDTrue";
131 varnames[34] =
"NCharged";
132 varnames[35] =
"NNeutral";
133 varnames[36] =
"NConstTrue";
134 varnames[37] =
"NDroppedMeasured";
135 varnames[38] =
"NDroppedTrue";
137 for(
int ib = 0; ib <
kTNVar; ib++){
152 TString rhoTagData = datajets ? TString::Format(
"R%02d", static_cast<Int_t>(datajets->
GetJetRadius() * 10.)) :
"",
153 rhoTagMC = mcjets ? TString::Format(
"R%02d", static_cast<Int_t>(mcjets->
GetJetRadius() * 10.)) :
"";
159 AliDebugStream(2) <<
"Found rho parameter for reconstructed pt: " << (rhoPtRec ?
"yes" :
"no") <<
", value: " << (rhoPtRec ? rhoPtRec->GetVal() : 0.) << std::endl;
160 AliDebugStream(2) <<
"Found rho parameter for sim pt: " << (rhoPtSim ?
"yes" :
"no") <<
", value: " << (rhoPtSim ? rhoPtSim->GetVal() : 0.) << std::endl;
161 AliDebugStream(2) <<
"Found rho parameter for reconstructed Mass: " << (rhoMassRec ?
"yes" :
"no") <<
", value: " << (rhoMassRec ? rhoMassRec->GetVal() : 0.) << std::endl;
162 AliDebugStream(2) <<
"Found rho parameter for sim Mass: " << (rhoMassSim ?
"yes" :
"no") <<
", value: " << (rhoMassSim ? rhoMassSim->GetVal() : 0.) << std::endl;
174 if(rhoPtRec) rhoparameters[0] = rhoPtRec->GetVal();
175 if(rhoPtSim) rhoparameters[1] = rhoPtSim->GetVal();
176 if(rhoMassRec) rhoparameters[2] = rhoMassRec->GetVal();
177 if(rhoMassSim) rhoparameters[3] = rhoMassSim->GetVal();
189 nsubjettinessSettings.
fBeta = 1.;
190 nsubjettinessSettings.
fRadius = 0.4;
192 if(mcjets && !datajets) {
194 AliDebugStream(1) <<
"In MC pure jet branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
195 for(
auto jet : mcjets->
accepted()) {
199 ptd[2] = {0.,
MakePtD(*jet, particles,
nullptr)};
200 FillTree(mcjets->
GetJetRadius(), weight,
nullptr, jet,
nullptr, &(structure.
fSoftDrop),
nullptr, &(structure.
fNsubjettiness), angularity, ptd, rhoparameters);
202 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
209 AliDebugStream(1) <<
"In data jets branch: found" << datajets->
GetNJets() <<
" jets, " << datajets->
GetNAcceptedJets() <<
" were accepted\n";
210 AliDebugStream(1) <<
"Having MC information: " << (mcjets ? TString::Format(
"yes, with %d jets", mcjets->
GetNJets()) :
"no") << std::endl;
211 for(
auto jet : datajets->
accepted()) {
212 double pt = jet->Pt(), pz = jet->Pz(), E = jet->E(), M = TMath::Sqrt(E*E - pt*pt - pz*pz);
213 AliDebugStream(2) <<
"Next jet: pt:" << jet->Pt() <<
", E: " << E <<
", pz: " << pz <<
", M(self): " << M <<
"M(fj)" << jet->M() << std::endl;
216 if(!associatedJet)
continue;
221 ptd[2] = {
MakePtD(*jet, tracks, clusters),
MakePtD(*associatedJet, particles,
nullptr)};
222 FillTree(datajets->
GetJetRadius(), weight, jet, associatedJet, &(structureData.
fSoftDrop), &(structureMC.fSoftDrop), &(structureData.
fNsubjettiness), &(structureMC.fNsubjettiness), angularity, ptd, rhoparameters);
224 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
230 ptd[2] = {
MakePtD(*jet, tracks, clusters), 0.};
231 FillTree(datajets->
GetJetRadius(), weight, jet,
nullptr, &(structure.
fSoftDrop),
nullptr, &(structure.
fNsubjettiness),
nullptr, angularity, ptd, rhoparameters);
233 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
319 if(dataSubjettiness) {
345 const int kClusterOffset = 30000;
346 std::vector<fastjet::PseudoJet> constituents;
348 AliVTrack *track =
static_cast<AliVTrack *
>(jet.
TrackAt(itrk, tracks->GetArray()));
349 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
350 constituentTrack.set_user_index(jet.
TrackAt(itrk));
351 constituents.push_back(constituentTrack);
356 AliVCluster *cluster = jet.
ClusterAt(icl, clusters->GetArray());
357 TLorentzVector clustervec;
359 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
360 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
361 constituents.push_back(constituentCluster);
366 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
367 std::vector<fastjet::PseudoJet> outputjets;
369 fastjet::ClusterSequence jetfinder(constituents, jetdef);
370 outputjets = jetfinder.inclusive_jets(0);
373 }
catch (fastjet::Error &e) {
374 AliErrorStream() <<
" FJ Exception caught: " << e.message() << std::endl;
380 fastjet::contrib::SoftDrop softdropAlgorithm(cutparameters.
fBeta, cutparameters.
fZ);
381 softdropAlgorithm.set_verbose_structure(kTRUE);
382 std::unique_ptr<fastjet::contrib::Recluster> reclusterizer(
new fastjet::contrib::Recluster(cutparameters.
fRecluserAlgo, 1,
true));
383 softdropAlgorithm.set_reclustering(kTRUE, reclusterizer.get());
384 fastjet::PseudoJet groomed = softdropAlgorithm(jet);
388 groomed.structure_of<fastjet::contrib::SoftDrop>().delta_R(),
390 groomed.structure_of<fastjet::contrib::SoftDrop>().mu(),
391 groomed.structure_of<fastjet::contrib::SoftDrop>().dropped_count()});
397 fastjet::contrib::Nsubjettiness (1,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet),
398 fastjet::contrib::Nsubjettiness (2,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet)
405 TVector3 jetvec(jet.
Px(), jet.
Py(), jet.
Pz());
409 AliVParticle *track = jet.
TrackAt(itrk, tracks->GetArray());
411 AliErrorStream() <<
"Associated constituent particle / track not found\n";
414 TVector3 trackvec(track->Px(), track->Py(), track->Pz());
416 num += track->Pt() * trackvec.DrEtaPhi(jetvec);
422 AliVCluster *clust = jet.
ClusterAt(icl, clusters->GetArray());
424 AliErrorStream() <<
"Associated constituent cluster not found\n";
427 TLorentzVector clusterp;
430 num += clusterp.Pt() * clusterp.Vect().DrEtaPhi(jetvec);
431 den += clusterp.Pt();
442 AliVParticle *trk = jet.
TrackAt(itrk, particles->GetArray());
444 AliErrorStream() <<
"Associated constituent particle / track not found\n";
447 num += trk->Pt() * trk->Pt();
453 AliVCluster *clust = jet.
ClusterAt(icl, clusters->GetArray());
455 AliErrorStream() <<
"Associated constituent cluster not found\n";
458 TLorentzVector clusterp;
460 num += clusterp.Pt() * clusterp.Pt();
461 den += clusterp.Pt();
464 return TMath::Sqrt(num)/den;
471 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
473 if(inputhandler->IsA() == AliAODInputHandler::Class()) isAOD = kTRUE;
477 mgr->AddTask(treemaker);
483 particles->SetMinPt(0.);
492 mcjets->SetName(
"mcjets");
498 tracks->SetMinPt(0.15);
500 if(jettype ==
kFull){
501 std::cout <<
"Using full jets ..." << std::endl;
506 std::cout <<
"Using charged jets ... " << std::endl;
516 datajets->SetName(
"datajets");
523 TString triggerstring(trigger);
524 if(triggerstring.Contains(
"INT7")) {
526 }
else if(triggerstring.Contains(
"EJ1")) {
529 }
else if(triggerstring.Contains(
"EJ2")) {
536 TString outputfile = mgr->GetCommonFileName();
537 outputfile += TString::Format(
":JetSubstructure_R%02d_%s",
int(jetradius * 10.), trigger);
538 mgr->ConnectInput(treemaker, 0, mgr->GetCommonInputContainer());
539 mgr->ConnectOutput(treemaker, 1, mgr->CreateContainer(
"JetSubstructureHistos_" + TString::Format(
"R%0d_",
int(jetradius * 10.)) + trigger, AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile));
540 mgr->ConnectOutput(treemaker, 2, mgr->CreateContainer(
"JetSubstuctureTree_" + TString::Format(
"R%0d_",
int(jetradius * 10.)) + trigger, TTree::Class(), AliAnalysisManager::kOutputContainer, Form(
"JetSubstructureTree_R%02d_%s.root", static_cast<int>(jetradius*10.), trigger)));
TTree * fJetSubstructureTree
! Tree with jet substructure information
Double_t fBeta
Cut on Beta.
void SetTriggerString(TString triggerstring)
Double_t MakePtD(const AliEmcalJet &jet, const AliParticleContainer *const particles, const AliClusterContainer *const clusters) const
AliJetContainer * GetJetContainer(Int_t i=0) const
Double_t fRg
Groomed jet radius.
virtual void UserCreateOutputObjects()
AliNSubjettinessDefinition fSubjettinessSettings
Container with name, TClonesArray and cuts for particles.
void SetUseAliAnaUtils(Bool_t b, Bool_t bRejPilup=kTRUE)
AliJetSubstructureData MakeJetSubstructure(const AliEmcalJet &jet, double jetradius, const AliParticleContainer *tracks, const AliClusterContainer *clusters, const AliJetSubstructureSettings &settings) const
AliEmcalJet * MatchedJet() const
Double_t fMug
Mass Drop parameter.
Int_t ClusterAt(Int_t idx) const
TString fTriggerSelectionString
Trigger selection string.
Tree with jet substructure information.
AliSoftDropParameters fSoftDrop
AliJetContainer * AddJetContainer(const char *n, TString defaultCutType, Float_t jetRadius=0.4)
Structure for results from the soft drop algorithm.
Double_t fZg
Groomed jet z.
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.
void SetVzRange(Double_t min, Double_t max)
Double_t fPtg
Groomed jet pt.
Double_t fMg
Groomed jet mass.
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
Double_t fJetTreeData[kTNVar]
Variable storage for the jet tree.
fastjet::JetAlgorithm fRecluserAlgo
Reclusterization algorithm.
UShort_t GetNumberOfConstituents() const
Container for particles within the EMCAL framework.
Int_t GetDefaultClusterEnergy() const
Int_t TrackAt(Int_t idx) const
UShort_t GetNumberOfTracks() const
AliParticleContainer * GetParticleContainer(Int_t i=0) const
Get particle container attached to this task.
static AliAnalysisTaskEmcalJetSubstructureTree * AddEmcalJetSubstructureTreeMaker(Bool_t isMC, Bool_t isData, Double_t jetradius, JetType_t jettype, AliJetContainer::ERecoScheme_t recombinationScheme, const char *name)
Double_t fTwoSubjettiness
2-subjettiness
AliRhoParameter * GetRhoFromEvent(const char *name)
AliSoftdropDefinition fSoftdropSettings
UShort_t GetNumberOfClusters() const
void SetJetPtCut(Float_t cut)
Int_t fNDropped
Number of dropped subjets.
AliNSubjettinessParameters MakeNsubjettinessParameters(const fastjet::PseudoJet &jet, const AliNSubjettinessDefinition &cut) const
Double_t fOneSubjettiness
1-subjettiness
Definition for the algorithm obtaining the softdrop parameters.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
virtual ~AliAnalysisTaskEmcalJetSubstructureTree()
AliMCParticleContainer * AddMCParticleContainer(const char *n)
Create new container for MC particles and attach it to the task.
Double_t MakeAngularity(const AliEmcalJet &jet, const AliParticleContainer *tracks, const AliClusterContainer *clusters) const
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
Double_t fSDZCut
Soft drop z-cut.
void SetTriggerBits(UInt_t triggersel)
Double_t fSDBetaCut
Soft drop beta cut.
Float_t GetJetRadius() const
AliEmcalList * fOutput
!output list
Reclusterizer_t fReclusterizer
Reclusterizer method.
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
void SetMakeGeneralHistograms(Bool_t g)
Base task in the EMCAL jet framework.
void FillTree(double r, double weight, const AliEmcalJet *datajet, const AliEmcalJet *mcjet, AliSoftDropParameters *dataSoftdrop, AliSoftDropParameters *mcsoftdrop, AliNSubjettinessParameters *dataSubjettiness, AliNSubjettinessParameters *mcSubjettiness, Double_t *angularity, Double_t *ptd, Double_t *rhoparameters)
Represent a jet reconstructed using the EMCal jet framework.
AliSoftDropParameters MakeSoftDropParameters(const fastjet::PseudoJet &jet, const AliSoftdropDefinition &cut) const
void UserCreateOutputObjects()
Main initialization function on the worker.
AliAnalysisTaskEmcalJetSubstructureTree()
const AliJetIterableContainer accepted() const
void SetDefaultClusterEnergy(Int_t d)
Container structure for EMCAL clusters.
EMCal fiducial acceptance (each eta, phi edge narrowed by jet R)
Container for jet within the EMCAL jet framework.
AliNSubjettinessParameters fNsubjettiness
TList * OpenFile(const char *fname)
void SetClusHadCorrEnergyCut(Double_t cut)
UInt_t fTriggerSelectionBits
Trigger selection bits.
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.