36 #include <fastjet/ClusterSequence.hh> 37 #include <fastjet/contrib/Nsubjettiness.hh> 38 #include <fastjet/contrib/SoftDrop.hh> 42 #include <TLorentzVector.h> 44 #include <TObjString.h> 48 #include "AliAODEvent.h" 49 #include "AliAODInputHandler.h" 50 #include "AliAnalysisManager.h" 51 #include "AliAnalysisDataSlot.h" 52 #include "AliAnalysisDataContainer.h" 54 #include "AliCDBEntry.h" 55 #include "AliCDBManager.h" 68 #include "AliTriggerCluster.h" 69 #include "AliTriggerConfiguration.h" 70 #include "AliVCluster.h" 71 #include "AliVParticle.h" 73 #ifdef EXPERIMENTAL_JETCONSTITUENTS 101 fReclusterizer(kCAAlgo),
103 fHasTrueEvent(false),
104 fTriggerSelectionBits(AliVEvent::kAny),
105 fTriggerSelectionString(
""),
106 fNameTriggerDecisionContainer(
"EmcalTriggerDecision"),
107 fUseTriggerSelectionForData(false),
108 fUseDownscaleWeight(false),
109 fUseChargedConstituents(true),
110 fUseNeutralConstituents(true),
115 fFillStructGlob(true)
151 DefineOutput(2, TTree::Class());
172 clusterenergybinning(200, 0., 200),
173 timebinning(1000, -500., 500.),
174 m02binning(100, 0., 1.),
175 ncellbinning(101, -0.5, 100.5);
178 fQAHistos->
CreateTH1(
"hTriggerClusterCounter",
"Event counter separating into trigger clusters", 7, -1.5, 5.5);
179 fQAHistos->
CreateTH2(
"hClusterConstE",
"EMCAL cluster energy vs jet pt; p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
180 fQAHistos->
CreateTH2(
"hClusterConstTime",
"EMCAL cluster time vs. jet pt; p_{t, jet} (GeV/c); t_{cl} (ns)", jetptbinning, timebinning);
181 fQAHistos->
CreateTH2(
"hClusterConstM02",
"EMCAL cluster M02 vs. jet pt; p{t, jet} (GeV/c); M02", jetptbinning, m02binning);
182 fQAHistos->
CreateTH2(
"hClusterConstNcell",
"EMCAL cluster ncell vs. jet pt; p{t, jet} (GeV/c); Number of cells", jetptbinning, ncellbinning);
185 #ifdef EXPERIMENTAL_JETCONSTITUENTS 186 fQAHistos->
CreateTH2(
"hChargedConstituentPt",
"charged constituent pt vs jet pt (via constituent map); p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
187 fQAHistos->
CreateTH2(
"hChargedIndexPt",
"charged constituent pt vs jet pt (via index map); p_{t, jet} (GeV/c); p_{t, ch} (GeV/c)", jetptbinning, clusterenergybinning);
189 fQAHistos->
CreateTH2(
"hClusterConstituentEDefault",
"cluster constituent default energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
190 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);
191 fQAHistos->
CreateTH2(
"hClusterConstituentEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
192 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);
193 fQAHistos->
CreateTH2(
"hClusterIndexEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (via index map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
194 fQAHistos->
CreateTH2(
"hLeadingChargedConstituentPt",
"Pt of the leading charged constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
195 fQAHistos->
CreateTH2(
"hLeadingClusterConstituentPt",
"Pt of the leading cluster constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
200 std::string treename = this->GetOutputSlot(2)->GetContainer()->GetName();
259 std::stringstream rhoTagData, rhoTagMC;
260 if(datajets) rhoTagData <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(datajets->
GetJetRadius() * 10.);
261 if(mcjets) rhoTagMC <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(mcjets->
GetJetRadius() * 10.);
264 std::string rhoSparseData =
"RhoSparse_Full_" + rhoTagData.str(), rhoSparseMC =
"RhoSparse_Full_" + rhoTagMC.str(),
265 rhoMassData =
"RhoMassSparse_Full_" + rhoTagData.str(), rhoMassMC =
"RhoMassSparse_Full_" + rhoTagMC.str();
270 AliDebugStream(2) <<
"Found rho parameter for reconstructed pt: " << (rhoPtRec ?
"yes" :
"no") <<
", value: " << (rhoPtRec ? rhoPtRec->GetVal() : 0.) << std::endl;
271 AliDebugStream(2) <<
"Found rho parameter for sim pt: " << (rhoPtSim ?
"yes" :
"no") <<
", value: " << (rhoPtSim ? rhoPtSim->GetVal() : 0.) << std::endl;
272 AliDebugStream(2) <<
"Found rho parameter for reconstructed Mass: " << (rhoMassRec ?
"yes" :
"no") <<
", value: " << (rhoMassRec ? rhoMassRec->GetVal() : 0.) << std::endl;
273 AliDebugStream(2) <<
"Found rho parameter for sim Mass: " << (rhoMassSim ?
"yes" :
"no") <<
", value: " << (rhoMassSim ? rhoMassSim->GetVal() : 0.) << std::endl;
275 rhoPtRec ? rhoPtRec->GetVal() : 0.,
276 rhoPtSim ? rhoPtSim->GetVal() : 0.,
277 rhoMassRec ? rhoMassRec->GetVal() : 0.,
278 rhoMassSim ? rhoMassSim->GetVal() : 0.
283 AliDebugStream(1) <<
"Inspecting jet radius " << (datajets ? datajets->
GetJetRadius() : mcjets->
GetJetRadius()) << std::endl;
287 if(datajets && !mcjets){
289 std::vector<std::string> clusternames;
291 for(
auto t : triggerinfos) {
292 if(std::find(clusternames.begin(), clusternames.end(), t.Triggercluster()) == clusternames.end()) clusternames.emplace_back(t.Triggercluster());
294 bool isCENT = (std::find(clusternames.begin(), clusternames.end(),
"CENT") != clusternames.end()),
295 isCENTNOTRD = (std::find(clusternames.begin(), clusternames.end(),
"CENTNOTRD") != clusternames.end()),
296 isCALO = (std::find(clusternames.begin(), clusternames.end(),
"CALO") != clusternames.end()),
297 isCALOFAST = (std::find(clusternames.begin(), clusternames.end(),
"CALOFAST") != clusternames.end());
298 if(isCENT || isCENTNOTRD) {
303 if(isCALO || isCALOFAST){
316 auto triggerstring =
MatchTrigger(selectionString.Data());
317 AliDebugStream(2) <<
"Getting downscale correction factor for trigger string " << triggerstring << std::endl;
320 AliDebugStream(1) <<
"Using downscale weight " << weight << std::endl;
338 nsubjettinessSettings.
fBeta = 1.;
339 nsubjettinessSettings.
fRadius = 0.4;
342 AliDebugStream(1) <<
"In data jets branch: found " << datajets->
GetNJets() <<
" jets, " << datajets->
GetNAcceptedJets() <<
" were accepted\n";
343 AliDebugStream(1) <<
"Having MC information: " << (mcjets ? TString::Format(
"yes, with %d jets", mcjets->
GetNJets()) :
"no") << std::endl;
345 AliDebugStream(1) <<
"In MC jets branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
347 for(
auto jet : datajets->
accepted()) {
348 double pt = jet->Pt(), pz = jet->Pz(), E = jet->E(), M = TMath::Sqrt(E*E - pt*pt - pz*pz);
349 AliDebugStream(2) <<
"Next jet: pt:" << jet->Pt() <<
", E: " << E <<
", pz: " << pz <<
", M(self): " << M <<
"M(fj)" << jet->M() << std::endl;
354 AliDebugStream(2) <<
"Not found associated jet" << std::endl;
372 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
374 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
387 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
389 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
396 AliDebugStream(1) <<
"In MC pure jet branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
407 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
409 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
419 AliDebugStream(1) <<
"Trigger selection called\n";
421 AliErrorStream() <<
"Impossible combination: Neither rec nor true event available. Rejecting ..." << std::endl;
428 AliDebugStream(1) <<
"Applying trigger selection for trigger bits " << std::bitset<sizeof(decltype(fTriggerSelectionBits)) * 8>(
fTriggerSelectionBits) <<
"and trigger selection string " <<
fTriggerSelectionString << std::endl;
430 AliDebugStream(1) <<
"Passed trigger bit selection" << std::endl;
433 AliDebugStream(1) <<
"Passed trigger string section" << std::endl;
436 AliDebugStream(1) <<
"Found trigger decision object: " << (trgselresult ?
"yes" :
"no") << std::endl;
438 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
442 AliDebugStream(1) <<
"Data event selected" << std::endl;
447 if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7))
return false;
450 AliDebugStream(1) <<
"Found trigger decision object: " << (mctrigger ?
"yes" :
"no") << std::endl;
452 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
463 AliCDBManager * cdb = AliCDBManager::Instance();
464 if(!fMCEvent && cdb){
466 AliCDBEntry *en = cdb->Get(
"GRP/CTP/Config");
467 AliTriggerConfiguration *trg =
static_cast<AliTriggerConfiguration *
>(en->GetObject());
468 std::vector<std::string> clusternames;
469 for(
auto c : trg->GetClusters()) {
470 AliTriggerCluster *clust =
static_cast<AliTriggerCluster *
>(
c);
471 std::string clustname = clust->GetName();
472 auto iscent = clustname.find(
"CENT") != std::string::npos, iscalo = clustname.find(
"CALO") != std::string::npos;
473 if(!(iscalo || iscent))
continue;
474 clusternames.emplace_back(clustname);
478 fLumiMonitor =
new TH1F(
"hLumiMonitor",
"Luminosity monitor", clusternames.size(), 0, clusternames.size());
480 for(
auto c : clusternames) {
481 fLumiMonitor->GetXaxis()->SetBinLabel(currentbin++,
c.data());
490 if(fInputEvent->GetFiredTriggerClasses().Contains(
"INT7")) {
492 auto int7trigger = trigger.IsTriggerClass(
"INT7");
493 auto bunchcrossing = trigger.BunchCrossing() ==
"B";
494 auto nopf = trigger.PastFutureProtection() ==
"NOPF";
495 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;
496 if(int7trigger && bunchcrossing && nopf) {
497 double downscale = downscalefactors->GetDownscaleFactorForTriggerClass(trigger.ExpandClassName());
498 AliDebugStream(5) <<
"Using downscale " << downscale << std::endl;
499 fLumiMonitor->Fill(trigger.Triggercluster().data(), 1./downscale);
508 result.
fPt = TMath::Abs(jet.
Pt());
521 const int kClusterOffset = 30000;
522 std::vector<fastjet::PseudoJet> constituents;
524 AliDebugStream(2) <<
"Make new jet substrucutre for " << (isMC ?
"MC" :
"data") <<
" jet: Number of tracks " << jet.
GetNumberOfTracks() <<
", clusters " << jet.
GetNumberOfClusters() << std::endl;
526 AliDebugStream(1) <<
"Jet substructure: Using charged constituents" << std::endl;
528 auto track = jet.
TrackAt(itrk, tracks->GetArray());
531 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
532 constituentTrack.set_user_index(jet.
TrackAt(itrk));
533 constituents.push_back(constituentTrack);
538 AliDebugStream(1) <<
"Jet substructure: Using neutral constituents" << std::endl;
540 auto cluster = jet.
ClusterAt(icl, clusters->GetArray());
541 TLorentzVector clustervec;
543 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
544 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
545 constituents.push_back(constituentCluster);
549 AliDebugStream(3) <<
"Found " << constituents.size() <<
" constituents for jet with pt=" << jet.
Pt() <<
" GeV/c" << std::endl;
550 if(!constituents.size()){
551 AliErrorStream() <<
"Jet has 0 constituents." << std::endl;
555 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
556 std::vector<fastjet::PseudoJet> outputjets;
558 fastjet::ClusterSequence jetfinder(constituents, jetdef);
559 outputjets = jetfinder.inclusive_jets(0);
562 }
catch (fastjet::Error &e) {
563 AliErrorStream() <<
" FJ Exception caught: " << e.message() << std::endl;
566 AliErrorStream() <<
"Softdrop exception caught: " << e.
what() << std::endl;
572 fastjet::contrib::SoftDrop softdropAlgorithm(cutparameters.
fBeta, cutparameters.
fZ);
573 softdropAlgorithm.set_verbose_structure(kTRUE);
574 std::unique_ptr<fastjet::contrib::Recluster> reclusterizer(
new fastjet::contrib::Recluster(cutparameters.
fRecluserAlgo, 1,
true));
575 softdropAlgorithm.set_reclustering(kTRUE, reclusterizer.get());
576 AliDebugStream(4) <<
"Jet has " << jet.constituents().size() <<
" constituents" << std::endl;
577 auto groomed = softdropAlgorithm(jet);
579 auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
583 softdropstruct.delta_R(),
585 softdropstruct.delta_R(),
587 softdropstruct.dropped_count()});
589 }
catch(std::bad_cast &e) {
596 fastjet::contrib::Nsubjettiness (1,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet),
597 fastjet::contrib::Nsubjettiness (2,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet)
605 TVector3 jetvec(jet.
Px(), jet.
Py(), jet.
Pz());
609 AliDebugStream(1) <<
"Angularity: Using charged constituents" << std::endl;
611 auto track = jet.
TrackAt(itrk, tracks->GetArray());
613 AliErrorStream() <<
"Associated constituent particle / track not found\n";
618 TVector3 trackvec(track->Px(), track->Py(), track->Pz());
620 num += track->Pt() * trackvec.DrEtaPhi(jetvec);
625 AliDebugStream(1) <<
"Using neutral constituents" << std::endl;
627 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
629 AliErrorStream() <<
"Associated constituent cluster not found\n";
632 TLorentzVector clusterp;
635 num += clusterp.Pt() * clusterp.Vect().DrEtaPhi(jetvec);
636 den += clusterp.Pt();
648 AliDebugStream(1) <<
"Using charged constituents" << std::endl;
650 auto trk = jet.
TrackAt(itrk, particles->GetArray());
652 AliErrorStream() <<
"Associated constituent particle / track not found\n";
657 num += trk->Pt() * trk->Pt();
662 AliDebugStream(1) <<
"Using neutral constituents" << std::endl;
664 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
666 AliErrorStream() <<
"Associated constituent cluster not found\n";
669 TLorentzVector clusterp;
671 num += clusterp.Pt() * clusterp.Pt();
672 den += clusterp.Pt();
675 return TMath::Sqrt(num)/den;
680 auto clust = jet->
ClusterAt(icl, clusters->GetArray());
681 AliDebugStream(3) <<
"cluster time " << clust->GetTOF() << std::endl;
687 #ifdef EXPERIMENTAL_JETCONSTITUENTS 693 #ifdef EXPERIMENTAL_JETCONSTITUENTS 696 auto part = jet->
TrackAt(itrk, cont->GetArray());
701 AliDebugStream(2) <<
"Jet: Number of particle constituents: " << jet->
GetParticleConstituents().size() << std::endl;
704 AliDebugStream(3) <<
"Found particle constituent with pt " << part.Pt() <<
", from VParticle " << part.GetParticle()->Pt() << std::endl;
709 AliDebugStream(2) <<
"Jet: Number of cluster constituents: " << jet->
GetClusterConstituents().size() << std::endl;
712 AliDebugStream(3) <<
"Found cluster constituent with energy " << clust.E() <<
" using energy definition " <<
static_cast<int>(clust.GetDefaultEnergyType()) << std::endl;
714 fQAHistos->
FillTH2(
"hClusterConstituentENLC", jet->
Pt(), clust.GetCluster()->GetNonLinCorrEnergy());
715 fQAHistos->
FillTH2(
"hClusterConstituentEHC", jet->
Pt(), clust.GetCluster()->GetHadCorrEnergy());
722 fQAHistos->
FillTH1(
"hLeadingClusterConstituentPt", jet->
Pt(), leadingcluster->GetCluster()->GetHadCorrEnergy());
725 fQAHistos->
FillTH1(
"hLeadingChargedConstituentPt", jet->
Pt(), leadingcharged->GetParticle()->Pt());
734 auto part = jet.
TrackAt(ipart, particles->GetArray());
736 if(part->Charge()) ncharged++;
748 std::vector<std::string> tokens;
750 std::stringstream decoder(fInputEvent->GetFiredTriggerClasses().Data());
751 while(std::getline(decoder, result,
' ')) tokens.emplace_back(result);
753 for(
auto t : tokens) {
754 if(t.find(triggertoken) != std::string::npos) {
764 const std::array<std::string, 8> kEMCALTriggers = {
765 "EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2" 767 bool isEMCAL =
false;
768 for(
auto emcaltrg : kEMCALTriggers) {
769 if(triggerstring.find(emcaltrg) != std::string::npos) {
781 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
783 if(inputhandler->IsA() == AliAODInputHandler::Class()){
784 std::cout <<
"Analysing AOD events\n";
787 std::cout <<
"Analysing ESD events\n";
791 std::stringstream taskname;
792 taskname <<
"JetSubstructureTreemaker_R" << std::setw(2) << std::setfill(
'0') << int(jetradius*10) << trigger;
794 mgr->AddTask(treemaker);
802 particles->SetMinPt(0.);
811 mcjets->SetName(
"mcjets");
819 std::cout <<
"Track container name: " << tracks->GetName() << std::endl;
820 tracks->SetMinPt(0.15);
824 std::cout <<
"Using full or neutral jets ..." << std::endl;
826 std::cout <<
"Cluster container name: " << clusters->GetName() << std::endl;
830 std::cout <<
"Using charged jets ... " << std::endl;
840 datajets->SetName(
"datajets");
847 std::string triggerstring(trigger);
848 if(triggerstring.find(
"INT7") != std::string::npos) {
850 }
else if(triggerstring.find(
"EJ1") != std::string::npos) {
853 }
else if(triggerstring.find(
"EJ2") != std::string::npos) {
856 }
else if(triggerstring.find(
"EG1") != std::string::npos) {
859 }
else if(triggerstring.find(
"EG2") != std::string::npos) {
865 std::string jettypestring;
870 default: jettypestring =
"Undef";
874 std::stringstream outputfile, histname, treename;
875 outputfile << mgr->GetCommonFileName() <<
":JetSubstructure_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
876 histname <<
"JetSubstructureHistos_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
877 treename <<
"JetSubstructureTree_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
878 mgr->ConnectInput(treemaker, 0, mgr->GetCommonInputContainer());
879 mgr->ConnectOutput(treemaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
880 mgr->ConnectOutput(treemaker, 2, mgr->CreateContainer(treename.str().data(), TTree::Class(), AliAnalysisManager::kOutputContainer, mgr->GetCommonFileName()));
886 LinkBranch(jettree, &fZg, Form(
"Zg%s", tag),
"D");
887 LinkBranch(jettree, &fRg, Form(
"Rg%s", tag),
"D");
888 LinkBranch(jettree, &fMg, Form(
"Mg%s", tag),
"D");
889 LinkBranch(jettree, &fPtg, Form(
"Ptg%s", tag),
"D");
890 LinkBranch(jettree, &fMug, Form(
"Mug%s", tag),
"D");
891 LinkBranch(jettree, &fDeltaR, Form(
"DeltaRg%s", tag),
"D");
892 LinkBranch(jettree, &fNDropped, Form(
"NDropped%s", tag),
"I");
896 LinkBranch(jettree, &fOneSubjettiness, Form(
"OneSubjettiness%s", tag),
"D");
897 LinkBranch(jettree, &fTwoSubjettiness, Form(
"TwoSubjettiness%s", tag),
"D");
901 LinkBranch(jettree, &fAngularity, Form(
"Angularity%s", tag),
"D");
902 LinkBranch(jettree, &fPtD, Form(
"PtD%s", tag),
"D");
906 LinkBranch(jettree, &fPt, Form(
"PtJet%s", tag),
"D");
907 LinkBranch(jettree, &fE, Form(
"EJet%s", tag),
"D");
908 LinkBranch(jettree, &fEta, Form(
"Eta%s", tag),
"D");
909 LinkBranch(jettree, &fPhi, Form(
"Phi%s", tag),
"D");
910 LinkBranch(jettree, &fArea, Form(
"Area%s", tag),
"D");
911 LinkBranch(jettree, &fMass, Form(
"Mass%s", tag),
"D");
912 LinkBranch(jettree, &fNEF, Form(
"NEF%s", tag),
"D");
913 LinkBranch(jettree, &fNCharged, Form(
"NCharged%s", tag),
"I");
914 LinkBranch(jettree, &fNNeutral, Form(
"NNeutral%s", tag),
"I");
918 LinkBranch(jettree, &fJetRadius,
"Radius",
"D");
919 LinkBranch(jettree, &fEventWeight,
"EventWeight",
"D");
920 LinkBranch(jettree, &fTriggerClusterIndex,
"TriggerClusterIndex",
"I");
922 std::string varnames[] = {
"RhoPtRec",
"RhoPtSim",
"RhoMassRec",
"RhoMassSim"};
923 for(
int i = 0; i < 4; i++){
924 LinkBranch(jettree, fRhoParamters + i, varnames[i].data(),
"D");
929 void LinkBranch(
TTree *jettree,
void *data,
const char *branchname,
const char *type) {
930 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.