35 #include <fastjet/ClusterSequence.hh> 36 #include <fastjet/contrib/Nsubjettiness.hh> 37 #include <fastjet/contrib/SoftDrop.hh> 41 #include <TLorentzVector.h> 43 #include <TObjString.h> 47 #include "AliAODEvent.h" 48 #include "AliAODInputHandler.h" 49 #include "AliAnalysisManager.h" 50 #include "AliAnalysisDataSlot.h" 51 #include "AliAnalysisDataContainer.h" 53 #include "AliCDBEntry.h" 54 #include "AliCDBManager.h" 67 #include "AliTriggerCluster.h" 68 #include "AliTriggerConfiguration.h" 69 #include "AliVCluster.h" 70 #include "AliVParticle.h" 72 #ifdef EXPERIMENTAL_JETCONSTITUENTS 100 fReclusterizer(kCAAlgo),
102 fHasTrueEvent(false),
103 fTriggerSelectionBits(AliVEvent::kAny),
104 fTriggerSelectionString(
""),
105 fNameTriggerDecisionContainer(
"EmcalTriggerDecision"),
106 fUseTriggerSelectionForData(false),
107 fUseDownscaleWeight(false),
108 fUseChargedConstituents(true),
109 fUseNeutralConstituents(true),
114 fFillStructGlob(true)
150 DefineOutput(2, TTree::Class());
171 clusterenergybinning(200, 0., 200),
172 timebinning(1000, -500., 500.),
173 m02binning(100, 0., 1.),
174 ncellbinning(101, -0.5, 100.5);
177 fQAHistos->
CreateTH2(
"hClusterConstE",
"EMCAL cluster energy vs jet pt; p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
178 fQAHistos->
CreateTH2(
"hClusterConstTime",
"EMCAL cluster time vs. jet pt; p_{t, jet} (GeV/c); t_{cl} (ns)", jetptbinning, timebinning);
179 fQAHistos->
CreateTH2(
"hClusterConstM02",
"EMCAL cluster M02 vs. jet pt; p{t, jet} (GeV/c); M02", jetptbinning, m02binning);
180 fQAHistos->
CreateTH2(
"hClusterConstNcell",
"EMCAL cluster ncell vs. jet pt; p{t, jet} (GeV/c); Number of cells", jetptbinning, ncellbinning);
183 #ifdef EXPERIMENTAL_JETCONSTITUENTS 184 fQAHistos->
CreateTH2(
"hChargedConstituentPt",
"charged constituent pt vs jet pt (via constituent map); p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
185 fQAHistos->
CreateTH2(
"hChargedIndexPt",
"charged constituent pt vs jet pt (via index map); p_{t, jet} (GeV/c); p_{t, ch} (GeV/c)", jetptbinning, clusterenergybinning);
187 fQAHistos->
CreateTH2(
"hClusterConstituentEDefault",
"cluster constituent default energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
188 fQAHistos->
CreateTH2(
"hClusterConstituentENLC",
"cluster constituent non-linearity-corrected energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
189 fQAHistos->
CreateTH2(
"hClusterConstituentEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
190 fQAHistos->
CreateTH2(
"hClusterIndexENLC",
"cluster constituent non-linearity-corrected energy vs. jet pt (via index map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
191 fQAHistos->
CreateTH2(
"hClusterIndexEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (via index map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
192 fQAHistos->
CreateTH2(
"hLeadingChargedConstituentPt",
"Pt of the leading charged constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
193 fQAHistos->
CreateTH2(
"hLeadingClusterConstituentPt",
"Pt of the leading cluster constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
198 std::string treename = this->GetOutputSlot(2)->GetContainer()->GetName();
257 std::stringstream rhoTagData, rhoTagMC;
258 if(datajets) rhoTagData <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(datajets->
GetJetRadius() * 10.);
259 if(mcjets) rhoTagMC <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(mcjets->
GetJetRadius() * 10.);
262 std::string rhoSparseData =
"RhoSparse_Full_" + rhoTagData.str(), rhoSparseMC =
"RhoSparse_Full_" + rhoTagMC.str(),
263 rhoMassData =
"RhoMassSparse_Full_" + rhoTagData.str(), rhoMassMC =
"RhoMassSparse_Full_" + rhoTagMC.str();
268 AliDebugStream(2) <<
"Found rho parameter for reconstructed pt: " << (rhoPtRec ?
"yes" :
"no") <<
", value: " << (rhoPtRec ? rhoPtRec->GetVal() : 0.) << std::endl;
269 AliDebugStream(2) <<
"Found rho parameter for sim pt: " << (rhoPtSim ?
"yes" :
"no") <<
", value: " << (rhoPtSim ? rhoPtSim->GetVal() : 0.) << std::endl;
270 AliDebugStream(2) <<
"Found rho parameter for reconstructed Mass: " << (rhoMassRec ?
"yes" :
"no") <<
", value: " << (rhoMassRec ? rhoMassRec->GetVal() : 0.) << std::endl;
271 AliDebugStream(2) <<
"Found rho parameter for sim Mass: " << (rhoMassSim ?
"yes" :
"no") <<
", value: " << (rhoMassSim ? rhoMassSim->GetVal() : 0.) << std::endl;
273 rhoPtRec ? rhoPtRec->GetVal() : 0.,
274 rhoPtSim ? rhoPtSim->GetVal() : 0.,
275 rhoMassRec ? rhoMassRec->GetVal() : 0.,
276 rhoMassSim ? rhoMassSim->GetVal() : 0.
281 AliDebugStream(1) <<
"Inspecting jet radius " << (datajets ? datajets->
GetJetRadius() : mcjets->
GetJetRadius()) << std::endl;
285 if(datajets && !mcjets){
287 std::vector<std::string> clusternames;
289 for(
auto t : triggerinfos) {
290 if(std::find(clusternames.begin(), clusternames.end(), t.Triggercluster()) == clusternames.end()) clusternames.emplace_back(t.Triggercluster());
292 bool isCENT = (std::find(clusternames.begin(), clusternames.end(),
"CENT") != clusternames.end()),
293 isCENTNOTRD = (std::find(clusternames.begin(), clusternames.end(),
"CENTNOTRD") != clusternames.end()),
294 isCALO = (std::find(clusternames.begin(), clusternames.end(),
"CALO") != clusternames.end()),
295 isCALOFAST = (std::find(clusternames.begin(), clusternames.end(),
"CALOFAST") != clusternames.end());
306 auto triggerstring =
MatchTrigger(selectionString.Data());
307 AliDebugStream(2) <<
"Getting downscale correction factor for trigger string " << triggerstring << std::endl;
310 AliDebugStream(1) <<
"Using downscale weight " << weight << std::endl;
327 nsubjettinessSettings.
fBeta = 1.;
328 nsubjettinessSettings.
fRadius = 0.4;
331 AliDebugStream(1) <<
"In data jets branch: found " << datajets->
GetNJets() <<
" jets, " << datajets->
GetNAcceptedJets() <<
" were accepted\n";
332 AliDebugStream(1) <<
"Having MC information: " << (mcjets ? TString::Format(
"yes, with %d jets", mcjets->
GetNJets()) :
"no") << std::endl;
334 AliDebugStream(1) <<
"In MC jets branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
336 for(
auto jet : datajets->
accepted()) {
337 double pt = jet->Pt(), pz = jet->Pz(), E = jet->E(), M = TMath::Sqrt(E*E - pt*pt - pz*pz);
338 AliDebugStream(2) <<
"Next jet: pt:" << jet->Pt() <<
", E: " << E <<
", pz: " << pz <<
", M(self): " << M <<
"M(fj)" << jet->M() << std::endl;
343 AliDebugStream(2) <<
"Not found associated jet" << std::endl;
361 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
363 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
376 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
378 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
385 AliDebugStream(1) <<
"In MC pure jet branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
396 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
398 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
408 AliDebugStream(1) <<
"Trigger selection called\n";
410 AliErrorStream() <<
"Impossible combination: Neither rec nor true event available. Rejecting ..." << std::endl;
422 AliDebugStream(1) <<
"Found trigger decision object: " << (trgselresult ?
"yes" :
"no") << std::endl;
424 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
432 if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7))
return false;
435 AliDebugStream(1) <<
"Found trigger decision object: " << (mctrigger ?
"yes" :
"no") << std::endl;
437 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
448 AliCDBManager * cdb = AliCDBManager::Instance();
449 if(!fMCEvent && cdb){
451 AliCDBEntry *en = cdb->Get(
"GRP/CTP/Config");
452 AliTriggerConfiguration *trg =
static_cast<AliTriggerConfiguration *
>(en->GetObject());
453 std::vector<std::string> clusternames;
454 for(
auto c : trg->GetClusters()) {
455 AliTriggerCluster *clust =
static_cast<AliTriggerCluster *
>(
c);
456 std::string clustname = clust->GetName();
457 auto iscent = clustname.find(
"CENT") != std::string::npos, iscalo = clustname.find(
"CALO") != std::string::npos;
458 if(!(iscalo || iscent))
continue;
459 clusternames.emplace_back(clustname);
463 fLumiMonitor =
new TH1F(
"hLumiMonitor",
"Luminosity monitor", clusternames.size(), 0, clusternames.size());
465 for(
auto c : clusternames) {
466 fLumiMonitor->GetXaxis()->SetBinLabel(currentbin++,
c.data());
475 if(fInputEvent->GetFiredTriggerClasses().Contains(
"INT7")) {
477 auto int7trigger = trigger.IsTriggerClass(
"INT7");
478 auto bunchcrossing = trigger.BunchCrossing() ==
"B";
479 auto nopf = trigger.PastFutureProtection() ==
"NOPF";
480 AliDebugStream(4) <<
"Full name: " << trigger.ExpandClassName() <<
", INT7 trigger: " << (int7trigger ?
"Yes" :
"No") <<
", bunch crossing: " << (bunchcrossing ?
"Yes" :
"No") <<
", no past-future protection: " << (nopf ?
"Yes" :
"No") <<
", Cluster: " << trigger.Triggercluster() << std::endl;
481 if(int7trigger && bunchcrossing && nopf) {
482 double downscale = downscalefactors->GetDownscaleFactorForTriggerClass(trigger.ExpandClassName());
483 AliDebugStream(5) <<
"Using downscale " << downscale << std::endl;
484 fLumiMonitor->Fill(trigger.Triggercluster().data(), 1./downscale);
493 result.
fPt = TMath::Abs(jet.
Pt());
506 const int kClusterOffset = 30000;
507 std::vector<fastjet::PseudoJet> constituents;
509 AliDebugStream(2) <<
"Make new jet substrucutre for " << (isMC ?
"MC" :
"data") <<
" jet: Number of tracks " << jet.
GetNumberOfTracks() <<
", clusters " << jet.
GetNumberOfClusters() << std::endl;
512 auto track = jet.
TrackAt(itrk, tracks->GetArray());
515 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
516 constituentTrack.set_user_index(jet.
TrackAt(itrk));
517 constituents.push_back(constituentTrack);
523 auto cluster = jet.
ClusterAt(icl, clusters->GetArray());
524 TLorentzVector clustervec;
526 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
527 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
528 constituents.push_back(constituentCluster);
532 AliDebugStream(3) <<
"Found " << constituents.size() <<
" constituents for jet with pt=" << jet.
Pt() <<
" GeV/c" << std::endl;
533 if(!constituents.size()){
534 AliErrorStream() <<
"Jet has 0 constituents." << std::endl;
538 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
539 std::vector<fastjet::PseudoJet> outputjets;
541 fastjet::ClusterSequence jetfinder(constituents, jetdef);
542 outputjets = jetfinder.inclusive_jets(0);
545 }
catch (fastjet::Error &e) {
546 AliErrorStream() <<
" FJ Exception caught: " << e.message() << std::endl;
549 AliErrorStream() <<
"Softdrop exception caught: " << e.
what() << std::endl;
555 fastjet::contrib::SoftDrop softdropAlgorithm(cutparameters.
fBeta, cutparameters.
fZ);
556 softdropAlgorithm.set_verbose_structure(kTRUE);
557 std::unique_ptr<fastjet::contrib::Recluster> reclusterizer(
new fastjet::contrib::Recluster(cutparameters.
fRecluserAlgo, 1,
true));
558 softdropAlgorithm.set_reclustering(kTRUE, reclusterizer.get());
559 AliDebugStream(4) <<
"Jet has " << jet.constituents().size() <<
" constituents" << std::endl;
560 auto groomed = softdropAlgorithm(jet);
562 auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
566 softdropstruct.delta_R(),
568 softdropstruct.delta_R(),
570 softdropstruct.dropped_count()});
572 }
catch(std::bad_cast &e) {
579 fastjet::contrib::Nsubjettiness (1,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet),
580 fastjet::contrib::Nsubjettiness (2,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet)
588 TVector3 jetvec(jet.
Px(), jet.
Py(), jet.
Pz());
593 auto track = jet.
TrackAt(itrk, tracks->GetArray());
595 AliErrorStream() <<
"Associated constituent particle / track not found\n";
600 TVector3 trackvec(track->Px(), track->Py(), track->Pz());
602 num += track->Pt() * trackvec.DrEtaPhi(jetvec);
608 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
610 AliErrorStream() <<
"Associated constituent cluster not found\n";
613 TLorentzVector clusterp;
616 num += clusterp.Pt() * clusterp.Vect().DrEtaPhi(jetvec);
617 den += clusterp.Pt();
630 auto trk = jet.
TrackAt(itrk, particles->GetArray());
632 AliErrorStream() <<
"Associated constituent particle / track not found\n";
637 num += trk->Pt() * trk->Pt();
643 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
645 AliErrorStream() <<
"Associated constituent cluster not found\n";
648 TLorentzVector clusterp;
650 num += clusterp.Pt() * clusterp.Pt();
651 den += clusterp.Pt();
654 return TMath::Sqrt(num)/den;
659 auto clust = jet->
ClusterAt(icl, clusters->GetArray());
660 AliDebugStream(3) <<
"cluster time " << clust->GetTOF() << std::endl;
666 #ifdef EXPERIMENTAL_JETCONSTITUENTS 672 #ifdef EXPERIMENTAL_JETCONSTITUENTS 675 auto part = jet->
TrackAt(itrk, cont->GetArray());
680 AliDebugStream(2) <<
"Jet: Number of particle constituents: " << jet->
GetParticleConstituents().size() << std::endl;
683 AliDebugStream(3) <<
"Found particle constituent with pt " << part.Pt() <<
", from VParticle " << part.GetParticle()->Pt() << std::endl;
688 AliDebugStream(2) <<
"Jet: Number of cluster constituents: " << jet->
GetClusterConstituents().size() << std::endl;
691 AliDebugStream(3) <<
"Found cluster constituent with energy " << clust.E() <<
" using energy definition " <<
static_cast<int>(clust.GetDefaultEnergyType()) << std::endl;
693 fQAHistos->
FillTH2(
"hClusterConstituentENLC", jet->
Pt(), clust.GetCluster()->GetNonLinCorrEnergy());
694 fQAHistos->
FillTH2(
"hClusterConstituentEHC", jet->
Pt(), clust.GetCluster()->GetHadCorrEnergy());
701 fQAHistos->
FillTH1(
"hLeadingClusterConstituentPt", jet->
Pt(), leadingcluster->GetCluster()->GetHadCorrEnergy());
704 fQAHistos->
FillTH1(
"hLeadingChargedConstituentPt", jet->
Pt(), leadingcharged->GetParticle()->Pt());
713 auto part = jet.
TrackAt(ipart, particles->GetArray());
715 if(part->Charge()) ncharged++;
727 std::vector<std::string> tokens;
729 std::stringstream decoder(fInputEvent->GetFiredTriggerClasses().Data());
730 while(std::getline(decoder, result,
' ')) tokens.emplace_back(result);
732 for(
auto t : tokens) {
733 if(t.find(triggertoken) != std::string::npos) {
743 const std::array<std::string, 8> kEMCALTriggers = {
744 "EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2" 746 bool isEMCAL =
false;
747 for(
auto emcaltrg : kEMCALTriggers) {
748 if(triggerstring.find(emcaltrg) != std::string::npos) {
760 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
762 if(inputhandler->IsA() == AliAODInputHandler::Class()){
763 std::cout <<
"Analysing AOD events\n";
766 std::cout <<
"Analysing ESD events\n";
770 std::stringstream taskname;
771 taskname <<
"JetSubstructureTreemaker_R" << std::setw(2) << std::setfill(
'0') << int(jetradius*10) << trigger;
773 mgr->AddTask(treemaker);
781 particles->SetMinPt(0.);
790 mcjets->SetName(
"mcjets");
798 std::cout <<
"Track container name: " << tracks->GetName() << std::endl;
799 tracks->SetMinPt(0.15);
803 std::cout <<
"Using full or neutral jets ..." << std::endl;
805 std::cout <<
"Cluster container name: " << clusters->GetName() << std::endl;
809 std::cout <<
"Using charged jets ... " << std::endl;
819 datajets->SetName(
"datajets");
826 std::string triggerstring(trigger);
827 if(triggerstring.find(
"INT7") != std::string::npos) {
829 }
else if(triggerstring.find(
"EJ1") != std::string::npos) {
832 }
else if(triggerstring.find(
"EJ2") != std::string::npos) {
835 }
else if(triggerstring.find(
"EG1") != std::string::npos) {
838 }
else if(triggerstring.find(
"EG2") != std::string::npos) {
844 std::string jettypestring;
849 default: jettypestring =
"Undef";
853 std::stringstream outputfile, histname, treename;
854 outputfile << mgr->GetCommonFileName() <<
":JetSubstructure_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
855 histname <<
"JetSubstructureHistos_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
856 treename <<
"JetSubstructureTree_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
857 mgr->ConnectInput(treemaker, 0, mgr->GetCommonInputContainer());
858 mgr->ConnectOutput(treemaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
859 mgr->ConnectOutput(treemaker, 2, mgr->CreateContainer(treename.str().data(), TTree::Class(), AliAnalysisManager::kOutputContainer, mgr->GetCommonFileName()));
865 LinkBranch(jettree, &fZg, Form(
"Zg%s", tag),
"D");
866 LinkBranch(jettree, &fRg, Form(
"Rg%s", tag),
"D");
867 LinkBranch(jettree, &fMg, Form(
"Mg%s", tag),
"D");
868 LinkBranch(jettree, &fPtg, Form(
"Ptg%s", tag),
"D");
869 LinkBranch(jettree, &fMug, Form(
"Mug%s", tag),
"D");
870 LinkBranch(jettree, &fDeltaR, Form(
"DeltaRg%s", tag),
"D");
871 LinkBranch(jettree, &fNDropped, Form(
"NDropped%s", tag),
"I");
875 LinkBranch(jettree, &fOneSubjettiness, Form(
"OneSubjettiness%s", tag),
"D");
876 LinkBranch(jettree, &fTwoSubjettiness, Form(
"TwoSubjettiness%s", tag),
"D");
880 LinkBranch(jettree, &fAngularity, Form(
"Angularity%s", tag),
"D");
881 LinkBranch(jettree, &fPtD, Form(
"PtD%s", tag),
"D");
885 LinkBranch(jettree, &fPt, Form(
"PtJet%s", tag),
"D");
886 LinkBranch(jettree, &fE, Form(
"EJet%s", tag),
"D");
887 LinkBranch(jettree, &fEta, Form(
"Eta%s", tag),
"D");
888 LinkBranch(jettree, &fPhi, Form(
"Phi%s", tag),
"D");
889 LinkBranch(jettree, &fArea, Form(
"Area%s", tag),
"D");
890 LinkBranch(jettree, &fMass, Form(
"Mass%s", tag),
"D");
891 LinkBranch(jettree, &fNEF, Form(
"NEF%s", tag),
"D");
892 LinkBranch(jettree, &fPt, Form(
"PtJet%s", tag),
"D");
893 LinkBranch(jettree, &fNCharged, Form(
"NCharged%s", tag),
"I");
894 LinkBranch(jettree, &fNNeutral, Form(
"NNeutral%s", tag),
"I");
898 LinkBranch(jettree, &fJetRadius,
"Radius",
"D");
899 LinkBranch(jettree, &fEventWeight,
"EventWeight",
"D");
900 LinkBranch(jettree, &fTriggerClusterIndex,
"TriggerClusterIndex",
"I");
902 std::string varnames[] = {
"RhoPtRec",
"RhoPtSim",
"RhoMassRec",
"RhoMassSim"};
903 for(
int i = 0; i < 4; i++){
904 LinkBranch(jettree, fRhoParamters + i, varnames[i].data(),
"D");
909 void LinkBranch(
TTree *jettree,
void *data,
const char *branchname,
const char *type) {
910 jettree->Branch(branchname, data, Form(
"%s/%s", branchname, type));
TTree * fJetSubstructureTree
! Tree with jet substructure information
void LinkJetTreeBranches(TTree *jettree, bool fillRho)
void LinkJetTreeBranches(TTree *jettree, const char *tag)
Bool_t fFillStructGlob
Fill other substructure variables.
Bool_t fFillSoftDrop
Fill soft drop parameters.
Double_t fBeta
Cut on Beta.
Bool_t fHasRecEvent
Has reconstructed event (for trigger selection)
Bool_t fFillPart
Fill particle level information.
void LinkJetTreeBranches(TTree *jettree, const char *tag)
void SetTriggerString(TString triggerstring)
Class creating a linear binning, used in the histogram manager.
Double_t MakePtD(const AliEmcalJet &jet, const AliParticleContainer *const particles, const AliClusterContainer *const clusters) const
AliEmcalJet * ClosestJet() const
AliJetContainer * GetJetContainer(Int_t i=0) const
void LinkJetTreeBranches(TTree *jettree, const char *tag)
AliNSubjettinessParameters * fNSubTrue
! Data field for true n-subjettiness parameters in jet tree
virtual void UserCreateOutputObjects()
Int_t fNCharged
Number of charged constituents.
AliNSubjettinessDefinition fSubjettinessSettings
TH1 * fLumiMonitor
! Luminosity monitor
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
Double_t fEventWeight
event weight (downscale factor)
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
TString fTriggerSelectionString
Trigger selection string.
Tree with jet substructure information.
static AliEmcalDownscaleFactorsOCDB * Instance()
Double_t fJetRadius
jet radius
Bool_t fFillNSub
Fill N-subjettiness.
Bool_t fHasTrueEvent
Has Monte-Carlo truth (for trigger selection)
AliSoftDropParameters * fSoftDropMeasured
! Data field for measured soft drop parameters in jet tree
AliSoftDropParameters fSoftDrop
AliJetContainer * AddJetContainer(const char *n, TString defaultCutType, Float_t jetRadius=0.4)
const std::vector< PWG::JETFW::AliEmcalParticleJetConstituent > & GetParticleConstituents() const
Get container with particle (track / MC particle) constituents.
Int_t fTriggerClusterIndex
Index of the trigger cluster (0 - CENT, 1 - CENTNOTRD)
void SetHasTrueEvent(Bool_t hastrue)
Structure for results from the soft drop algorithm.
Double_t GetDownscaleFactorForTriggerClass(const TString &trigger) const
virtual void UserExecOnce()
Task initializations handled in user tasks.
const PWG::JETFW::AliEmcalParticleJetConstituent * GetLeadingParticleConstituent() const
Get the leading particle constituent.
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)
AliNSubjettinessParameters * fNSubMeasured
! Data field for measured n-subjettiness parameters in jet tree
static std::vector< PWG::EMCAL::Triggerinfo > DecodeTriggerString(const std::string &triggerstring)
Decoding trigger string.
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
fastjet::JetAlgorithm fRecluserAlgo
Reclusterization algorithm.
Container for particles within the EMCAL framework.
Int_t GetDefaultClusterEnergy() const
Int_t TrackAt(Int_t idx) const
void LinkJetTreeBranches(TTree *jettree, const char *tag)
UShort_t GetNumberOfTracks() const
AliJetKineParameters MakeJetKineParameters(const AliEmcalJet &jet) const
Double_t fNEF
Jet Neutral Energy Fraction.
AliParticleContainer * GetParticleContainer(Int_t i=0) const
Get particle container attached to this task.
Jet kinematic parameters.
TPC fiducial acceptance (each eta edge narrowed by jet R)
void SetRun(int runnumber)
AliRhoParameter * GetRhoFromEvent(const char *name)
AliSoftdropDefinition fSoftdropSettings
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.
UShort_t GetNumberOfClusters() const
void SetJetPtCut(Float_t cut)
THashList * GetListOfHistograms() const
Get the list of histograms.
Bool_t fFillRho
Fill rho parameters.
static AliAnalysisTaskEmcalJetSubstructureTree * AddEmcalJetSubstructureTreeMaker(Bool_t isMC, Bool_t isData, Double_t jetradius, AliJetContainer::EJetType_t jettype, AliJetContainer::ERecoScheme_t recombinationScheme, Bool_t useDCAL, const char *name)
void LinkBranch(TTree *jettree, void *data, const char *branchname, const char *type)
Helper function linking struct members to branches in the jet substructure tree.
AliJetStructureParameters * fJetStructureTrue
! True jet substructure paramteres
AliNSubjettinessParameters MakeNsubjettinessParameters(const fastjet::PseudoJet &jet, const AliNSubjettinessDefinition &cut) const
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
Definition for the algorithm obtaining the softdrop parameters.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
virtual const char * what() const
virtual ~AliAnalysisTaskEmcalJetSubstructureTree()
Bool_t fUseChargedConstituents
Use charged constituents.
Bool_t fUseDownscaleWeight
Use 1/downscale as weight.
virtual void RunChanged(Int_t newrun)
Process tasks relevant when a file with a different run number is processed.
AliMCParticleContainer * AddMCParticleContainer(const char *n)
Create new container for MC particles and attach it to the task.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
Double_t MakeAngularity(const AliEmcalJet &jet, const AliParticleContainer *tracks, const AliClusterContainer *clusters) const
virtual Bool_t IsTriggerSelected()
Selection of a hardware trigger.
std::string MatchTrigger(const std::string &triggerclass) const
Container for trigger decision object.
AliJetStructureParameters * fJetStructureMeasured
! Measured jet substructure parameters
THistManager * fQAHistos
! QA histos
bool IsSelectEmcalTriggers(const std::string &triggerstring) const
Double_t fSDZCut
Soft drop z-cut.
void SetTriggerBits(UInt_t triggersel)
Double_t fRhoParamters[4]
Rho parameters.
Double_t fSDBetaCut
Soft drop beta cut.
AliJetKineParameters * fKineRec
! Detector level jet kinematics
const PWG::JETFW::AliEmcalClusterJetConstituent * GetLeadingClusterConstituent() const
Get the leading cluster constituent.
void DoConstituentQA(const AliEmcalJet *jet, const AliParticleContainer *tracks, const AliClusterContainer *clusters)
Float_t GetJetRadius() const
const std::vector< PWG::JETFW::AliEmcalClusterJetConstituent > & GetClusterConstituents() const
Get container with cluster constituents.
AliEmcalList * fOutput
!output list
AliJetKineParameters * fKineSim
! Particle level jet kinematics
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.
Represent a jet reconstructed using the EMCal jet framework.
Container class for histograms.
Global jet substructure paramters.
void SetHasRecEvent(Bool_t hasrec)
AliSoftDropParameters MakeSoftDropParameters(const fastjet::PseudoJet &jet, const AliSoftdropDefinition &cut) const
AliJetTreeGlobalParameters * fGlobalTreeParams
! Global jet tree parameters (same for all jets in event)
void UserCreateOutputObjects()
Main initialization function on the worker.
AliAnalysisTaskEmcalJetSubstructureTree()
DCal fiducial acceptance (each eta, phi edge narrowed by jet R)
const AliJetIterableContainer accepted() const
void SetDefaultClusterEnergy(Int_t d)
TString fNameTriggerDecisionContainer
Global trigger decision container.
Int_t fNNeutral
Number of neutral constituents.
bool SelectJet(const AliEmcalJet &jet, const AliParticleContainer *particles) const
AliSoftDropParameters * fSoftDropTrue
! Data field for true soft drop parameters in jet tree
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.
AliNSubjettinessParameters fNsubjettiness
Bool_t fUseNeutralConstituents
Use neutral constituents.
Bool_t fUseTriggerSelectionForData
Use trigger selection on data (require trigger patch in addition to trigger selection string) ...
TList * OpenFile(const char *fname)
void SetClusHadCorrEnergyCut(Double_t cut)
UInt_t fTriggerSelectionBits
Trigger selection bits.
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.