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 cellenergybinning(1000, 0., 100),
174 timebinning(1000, -500., 500.),
175 m02binning(100, 0., 1.),
176 ncellbinning(101, -0.5, 100.5),
177 exoticsbinning(2, -0.5, 1.5);
180 fQAHistos->
CreateTH1(
"hTriggerClusterCounter",
"Event counter separating into trigger clusters", 7, -1.5, 5.5);
181 fQAHistos->
CreateTH2(
"hClusterConstE",
"EMCAL cluster energy vs jet pt; p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
182 fQAHistos->
CreateTH2(
"hClusterConstTime",
"EMCAL cluster time vs. jet pt; p_{t, jet} (GeV/c); t_{cl} (ns)", jetptbinning, timebinning);
183 fQAHistos->
CreateTH2(
"hClusterConstM02",
"EMCAL cluster M02 vs. jet pt; p{t, jet} (GeV/c); M02", jetptbinning, m02binning);
184 fQAHistos->
CreateTH2(
"hClusterConstNcell",
"EMCAL cluster ncell vs. jet pt; p{t, jet} (GeV/c); Number of cells", jetptbinning, ncellbinning);
185 fQAHistos->
CreateTH2(
"hClusterConstExotics",
"EMCAL cluster exotics cut vs jet pt; p{t, jet} (GeV/c); Cluster exotics", jetptbinning, exoticsbinning);
186 fQAHistos->
CreateTH2(
"hClusterConstMinCellEnergy",
"EMCAL Cluster const min cell energy; p{t, jet} (GeV/c); E_{cell} (GeV/c)", jetptbinning, cellenergybinning);
187 fQAHistos->
CreateTH2(
"hClusterConstMaxCellEnergy",
"EMCAL Cluster const max (seed) cell energy; p{t, jet} (GeV/c); E_{cell} (GeV/c)", jetptbinning, cellenergybinning);
190 #ifdef EXPERIMENTAL_JETCONSTITUENTS 191 fQAHistos->
CreateTH2(
"hChargedConstituentPt",
"charged constituent pt vs jet pt (via constituent map); p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
192 fQAHistos->
CreateTH2(
"hChargedIndexPt",
"charged constituent pt vs jet pt (via index map); p_{t, jet} (GeV/c); p_{t, ch} (GeV/c)", jetptbinning, clusterenergybinning);
194 fQAHistos->
CreateTH2(
"hClusterConstituentEDefault",
"cluster constituent default energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
195 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);
196 fQAHistos->
CreateTH2(
"hClusterConstituentEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
197 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);
198 fQAHistos->
CreateTH2(
"hClusterIndexEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (via index map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
199 fQAHistos->
CreateTH2(
"hLeadingChargedConstituentPt",
"Pt of the leading charged constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
200 fQAHistos->
CreateTH2(
"hLeadingClusterConstituentPt",
"Pt of the leading cluster constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
205 std::string treename = this->GetOutputSlot(2)->GetContainer()->GetName();
264 std::stringstream rhoTagData, rhoTagMC;
265 if(datajets) rhoTagData <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(datajets->
GetJetRadius() * 10.);
266 if(mcjets) rhoTagMC <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(mcjets->
GetJetRadius() * 10.);
269 std::string rhoSparseData =
"RhoSparse_Full_" + rhoTagData.str(), rhoSparseMC =
"RhoSparse_Full_" + rhoTagMC.str(),
270 rhoMassData =
"RhoMassSparse_Full_" + rhoTagData.str(), rhoMassMC =
"RhoMassSparse_Full_" + rhoTagMC.str();
275 AliDebugStream(2) <<
"Found rho parameter for reconstructed pt: " << (rhoPtRec ?
"yes" :
"no") <<
", value: " << (rhoPtRec ? rhoPtRec->GetVal() : 0.) << std::endl;
276 AliDebugStream(2) <<
"Found rho parameter for sim pt: " << (rhoPtSim ?
"yes" :
"no") <<
", value: " << (rhoPtSim ? rhoPtSim->GetVal() : 0.) << std::endl;
277 AliDebugStream(2) <<
"Found rho parameter for reconstructed Mass: " << (rhoMassRec ?
"yes" :
"no") <<
", value: " << (rhoMassRec ? rhoMassRec->GetVal() : 0.) << std::endl;
278 AliDebugStream(2) <<
"Found rho parameter for sim Mass: " << (rhoMassSim ?
"yes" :
"no") <<
", value: " << (rhoMassSim ? rhoMassSim->GetVal() : 0.) << std::endl;
280 rhoPtRec ? rhoPtRec->GetVal() : 0.,
281 rhoPtSim ? rhoPtSim->GetVal() : 0.,
282 rhoMassRec ? rhoMassRec->GetVal() : 0.,
283 rhoMassSim ? rhoMassSim->GetVal() : 0.
288 AliDebugStream(1) <<
"Inspecting jet radius " << (datajets ? datajets->
GetJetRadius() : mcjets->
GetJetRadius()) << std::endl;
292 if(datajets && !mcjets){
294 std::vector<std::string> clusternames;
296 for(
auto t : triggerinfos) {
297 if(std::find(clusternames.begin(), clusternames.end(), t.Triggercluster()) == clusternames.end()) clusternames.emplace_back(t.Triggercluster());
299 bool isCENT = (std::find(clusternames.begin(), clusternames.end(),
"CENT") != clusternames.end()),
300 isCENTNOTRD = (std::find(clusternames.begin(), clusternames.end(),
"CENTNOTRD") != clusternames.end()),
301 isCALO = (std::find(clusternames.begin(), clusternames.end(),
"CALO") != clusternames.end()),
302 isCALOFAST = (std::find(clusternames.begin(), clusternames.end(),
"CALOFAST") != clusternames.end());
303 if(isCENT || isCENTNOTRD) {
308 if(isCALO || isCALOFAST){
321 auto triggerstring =
MatchTrigger(selectionString.Data());
322 AliDebugStream(2) <<
"Getting downscale correction factor for trigger string " << triggerstring << std::endl;
325 AliDebugStream(1) <<
"Using downscale weight " << weight << std::endl;
343 nsubjettinessSettings.
fBeta = 1.;
344 nsubjettinessSettings.
fRadius = 0.4;
347 AliDebugStream(1) <<
"In data jets branch: found " << datajets->
GetNJets() <<
" jets, " << datajets->
GetNAcceptedJets() <<
" were accepted\n";
348 AliDebugStream(1) <<
"Having MC information: " << (mcjets ? TString::Format(
"yes, with %d jets", mcjets->
GetNJets()) :
"no") << std::endl;
350 AliDebugStream(1) <<
"In MC jets branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
352 for(
auto jet : datajets->
accepted()) {
353 double pt = jet->Pt(), pz = jet->Pz(), E = jet->E(), M = TMath::Sqrt(E*E - pt*pt - pz*pz);
354 AliDebugStream(2) <<
"Next jet: pt:" << jet->Pt() <<
", E: " << E <<
", pz: " << pz <<
", M(self): " << M <<
"M(fj)" << jet->M() << std::endl;
359 AliDebugStream(2) <<
"Not found associated jet" << std::endl;
377 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
379 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
392 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
394 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
401 AliDebugStream(1) <<
"In MC pure jet branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
412 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
414 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
424 AliDebugStream(1) <<
"Trigger selection called\n";
426 AliErrorStream() <<
"Impossible combination: Neither rec nor true event available. Rejecting ..." << std::endl;
433 AliDebugStream(1) <<
"Applying trigger selection for trigger bits " << std::bitset<sizeof(decltype(fTriggerSelectionBits)) * 8>(
fTriggerSelectionBits) <<
"and trigger selection string " <<
fTriggerSelectionString << std::endl;
435 AliDebugStream(1) <<
"Passed trigger bit selection" << std::endl;
438 AliDebugStream(1) <<
"Passed trigger string section" << std::endl;
441 AliDebugStream(1) <<
"Found trigger decision object: " << (trgselresult ?
"yes" :
"no") << std::endl;
443 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
447 AliDebugStream(1) <<
"Data event selected" << std::endl;
452 if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7))
return false;
455 AliDebugStream(1) <<
"Found trigger decision object: " << (mctrigger ?
"yes" :
"no") << std::endl;
457 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
468 AliCDBManager * cdb = AliCDBManager::Instance();
469 if(!fMCEvent && cdb){
471 AliCDBEntry *en = cdb->Get(
"GRP/CTP/Config");
472 AliTriggerConfiguration *trg =
static_cast<AliTriggerConfiguration *
>(en->GetObject());
473 std::vector<std::string> clusternames;
474 for(
auto c : trg->GetClusters()) {
475 AliTriggerCluster *clust =
static_cast<AliTriggerCluster *
>(
c);
476 std::string clustname = clust->GetName();
477 auto iscent = clustname.find(
"CENT") != std::string::npos, iscalo = clustname.find(
"CALO") != std::string::npos;
478 if(!(iscalo || iscent))
continue;
479 clusternames.emplace_back(clustname);
483 fLumiMonitor =
new TH1F(
"hLumiMonitor",
"Luminosity monitor", clusternames.size(), 0, clusternames.size());
485 for(
auto c : clusternames) {
486 fLumiMonitor->GetXaxis()->SetBinLabel(currentbin++,
c.data());
495 if(fInputEvent->GetFiredTriggerClasses().Contains(
"INT7")) {
497 auto int7trigger = trigger.IsTriggerClass(
"INT7");
498 auto bunchcrossing = trigger.BunchCrossing() ==
"B";
499 auto nopf = trigger.PastFutureProtection() ==
"NOPF";
500 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;
501 if(int7trigger && bunchcrossing && nopf) {
502 double downscale = downscalefactors->GetDownscaleFactorForTriggerClass(trigger.ExpandClassName());
503 AliDebugStream(5) <<
"Using downscale " << downscale << std::endl;
504 fLumiMonitor->Fill(trigger.Triggercluster().data(), 1./downscale);
513 result.
fPt = TMath::Abs(jet.
Pt());
526 const int kClusterOffset = 30000;
527 std::vector<fastjet::PseudoJet> constituents;
529 AliDebugStream(2) <<
"Make new jet substrucutre for " << (isMC ?
"MC" :
"data") <<
" jet: Number of tracks " << jet.
GetNumberOfTracks() <<
", clusters " << jet.
GetNumberOfClusters() << std::endl;
531 AliDebugStream(1) <<
"Jet substructure: Using charged constituents" << std::endl;
533 auto track = jet.
TrackAt(itrk, tracks->GetArray());
536 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
537 constituentTrack.set_user_index(jet.
TrackAt(itrk));
538 constituents.push_back(constituentTrack);
543 AliDebugStream(1) <<
"Jet substructure: Using neutral constituents" << std::endl;
545 auto cluster = jet.
ClusterAt(icl, clusters->GetArray());
546 TLorentzVector clustervec;
548 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
549 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
550 constituents.push_back(constituentCluster);
554 AliDebugStream(3) <<
"Found " << constituents.size() <<
" constituents for jet with pt=" << jet.
Pt() <<
" GeV/c" << std::endl;
555 if(!constituents.size()){
556 AliErrorStream() <<
"Jet has 0 constituents." << std::endl;
560 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
561 std::vector<fastjet::PseudoJet> outputjets;
563 fastjet::ClusterSequence jetfinder(constituents, jetdef);
564 outputjets = jetfinder.inclusive_jets(0);
567 }
catch (fastjet::Error &e) {
568 AliErrorStream() <<
" FJ Exception caught: " << e.message() << std::endl;
571 AliErrorStream() <<
"Softdrop exception caught: " << e.
what() << std::endl;
577 fastjet::contrib::SoftDrop softdropAlgorithm(cutparameters.
fBeta, cutparameters.
fZ);
578 softdropAlgorithm.set_verbose_structure(kTRUE);
579 std::unique_ptr<fastjet::contrib::Recluster> reclusterizer(
new fastjet::contrib::Recluster(cutparameters.
fRecluserAlgo, 1,
true));
580 softdropAlgorithm.set_reclustering(kTRUE, reclusterizer.get());
581 AliDebugStream(4) <<
"Jet has " << jet.constituents().size() <<
" constituents" << std::endl;
582 auto groomed = softdropAlgorithm(jet);
584 auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
588 softdropstruct.delta_R(),
590 softdropstruct.delta_R(),
592 softdropstruct.dropped_count()});
594 }
catch(std::bad_cast &e) {
601 fastjet::contrib::Nsubjettiness (1,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet),
602 fastjet::contrib::Nsubjettiness (2,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet)
610 TVector3 jetvec(jet.
Px(), jet.
Py(), jet.
Pz());
614 AliDebugStream(1) <<
"Angularity: Using charged constituents" << std::endl;
616 auto track = jet.
TrackAt(itrk, tracks->GetArray());
618 AliErrorStream() <<
"Associated constituent particle / track not found\n";
623 TVector3 trackvec(track->Px(), track->Py(), track->Pz());
625 num += track->Pt() * trackvec.DrEtaPhi(jetvec);
630 AliDebugStream(1) <<
"Using neutral constituents" << std::endl;
632 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
634 AliErrorStream() <<
"Associated constituent cluster not found\n";
637 TLorentzVector clusterp;
640 num += clusterp.Pt() * clusterp.Vect().DrEtaPhi(jetvec);
641 den += clusterp.Pt();
653 AliDebugStream(1) <<
"Using charged constituents" << std::endl;
655 auto trk = jet.
TrackAt(itrk, particles->GetArray());
657 AliErrorStream() <<
"Associated constituent particle / track not found\n";
662 num += trk->Pt() * trk->Pt();
667 AliDebugStream(1) <<
"Using neutral constituents" << std::endl;
669 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
671 AliErrorStream() <<
"Associated constituent cluster not found\n";
674 TLorentzVector clusterp;
676 num += clusterp.Pt() * clusterp.Pt();
677 den += clusterp.Pt();
680 return TMath::Sqrt(num)/den;
685 auto clust = jet->
ClusterAt(icl, clusters->GetArray());
686 AliDebugStream(3) <<
"cluster time " << clust->GetTOF() << std::endl;
691 fQAHistos->
FillTH2(
"hClusterConstExotics", jet->
Pt(), clust->GetIsExotic() ? 1. : 0.);
693 double mincell(100000.), maxcell(0.);
694 for(
int icell = 0; icell < clust->GetNCells(); icell++){
695 double ecell = clust->E() * clust->GetCellAmplitudeFraction(icell);
696 if(ecell < mincell) mincell = ecell;
697 if(ecell > maxcell) maxcell = ecell;
702 #ifdef EXPERIMENTAL_JETCONSTITUENTS 708 #ifdef EXPERIMENTAL_JETCONSTITUENTS 711 auto part = jet->
TrackAt(itrk, cont->GetArray());
716 AliDebugStream(2) <<
"Jet: Number of particle constituents: " << jet->
GetParticleConstituents().size() << std::endl;
719 AliDebugStream(3) <<
"Found particle constituent with pt " << part.Pt() <<
", from VParticle " << part.GetParticle()->Pt() << std::endl;
724 AliDebugStream(2) <<
"Jet: Number of cluster constituents: " << jet->
GetClusterConstituents().size() << std::endl;
727 AliDebugStream(3) <<
"Found cluster constituent with energy " << clust.E() <<
" using energy definition " <<
static_cast<int>(clust.GetDefaultEnergyType()) << std::endl;
729 fQAHistos->
FillTH2(
"hClusterConstituentENLC", jet->
Pt(), clust.GetCluster()->GetNonLinCorrEnergy());
730 fQAHistos->
FillTH2(
"hClusterConstituentEHC", jet->
Pt(), clust.GetCluster()->GetHadCorrEnergy());
737 fQAHistos->
FillTH1(
"hLeadingClusterConstituentPt", jet->
Pt(), leadingcluster->GetCluster()->GetHadCorrEnergy());
740 fQAHistos->
FillTH1(
"hLeadingChargedConstituentPt", jet->
Pt(), leadingcharged->GetParticle()->Pt());
749 auto part = jet.
TrackAt(ipart, particles->GetArray());
751 if(part->Charge()) ncharged++;
763 std::vector<std::string> tokens;
765 std::stringstream decoder(fInputEvent->GetFiredTriggerClasses().Data());
766 while(std::getline(decoder, result,
' ')) tokens.emplace_back(result);
768 for(
auto t : tokens) {
769 if(t.find(triggertoken) != std::string::npos) {
779 const std::array<std::string, 8> kEMCALTriggers = {
780 "EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2" 782 bool isEMCAL =
false;
783 for(
auto emcaltrg : kEMCALTriggers) {
784 if(triggerstring.find(emcaltrg) != std::string::npos) {
796 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
798 if(inputhandler->IsA() == AliAODInputHandler::Class()){
799 std::cout <<
"Analysing AOD events\n";
802 std::cout <<
"Analysing ESD events\n";
806 std::stringstream taskname;
807 taskname <<
"JetSubstructureTreemaker_R" << std::setw(2) << std::setfill(
'0') << int(jetradius*10) << trigger;
809 mgr->AddTask(treemaker);
817 particles->SetMinPt(0.);
826 mcjets->SetName(
"mcjets");
834 std::cout <<
"Track container name: " << tracks->GetName() << std::endl;
835 tracks->SetMinPt(0.15);
839 std::cout <<
"Using full or neutral jets ..." << std::endl;
841 std::cout <<
"Cluster container name: " << clusters->GetName() << std::endl;
845 std::cout <<
"Using charged jets ... " << std::endl;
855 datajets->SetName(
"datajets");
862 std::string triggerstring(trigger);
863 if(triggerstring.find(
"INT7") != std::string::npos) {
865 }
else if(triggerstring.find(
"EJ1") != std::string::npos) {
868 }
else if(triggerstring.find(
"EJ2") != std::string::npos) {
871 }
else if(triggerstring.find(
"EG1") != std::string::npos) {
874 }
else if(triggerstring.find(
"EG2") != std::string::npos) {
880 std::string jettypestring;
885 default: jettypestring =
"Undef";
889 std::stringstream outputfile, histname, treename;
890 outputfile << mgr->GetCommonFileName() <<
":JetSubstructure_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
891 histname <<
"JetSubstructureHistos_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
892 treename <<
"JetSubstructureTree_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
893 mgr->ConnectInput(treemaker, 0, mgr->GetCommonInputContainer());
894 mgr->ConnectOutput(treemaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
895 mgr->ConnectOutput(treemaker, 2, mgr->CreateContainer(treename.str().data(), TTree::Class(), AliAnalysisManager::kOutputContainer, mgr->GetCommonFileName()));
901 LinkBranch(jettree, &fZg, Form(
"Zg%s", tag),
"D");
902 LinkBranch(jettree, &fRg, Form(
"Rg%s", tag),
"D");
903 LinkBranch(jettree, &fMg, Form(
"Mg%s", tag),
"D");
904 LinkBranch(jettree, &fPtg, Form(
"Ptg%s", tag),
"D");
905 LinkBranch(jettree, &fMug, Form(
"Mug%s", tag),
"D");
906 LinkBranch(jettree, &fDeltaR, Form(
"DeltaRg%s", tag),
"D");
907 LinkBranch(jettree, &fNDropped, Form(
"NDropped%s", tag),
"I");
911 LinkBranch(jettree, &fOneSubjettiness, Form(
"OneSubjettiness%s", tag),
"D");
912 LinkBranch(jettree, &fTwoSubjettiness, Form(
"TwoSubjettiness%s", tag),
"D");
916 LinkBranch(jettree, &fAngularity, Form(
"Angularity%s", tag),
"D");
917 LinkBranch(jettree, &fPtD, Form(
"PtD%s", tag),
"D");
921 LinkBranch(jettree, &fPt, Form(
"PtJet%s", tag),
"D");
922 LinkBranch(jettree, &fE, Form(
"EJet%s", tag),
"D");
923 LinkBranch(jettree, &fEta, Form(
"Eta%s", tag),
"D");
924 LinkBranch(jettree, &fPhi, Form(
"Phi%s", tag),
"D");
925 LinkBranch(jettree, &fArea, Form(
"Area%s", tag),
"D");
926 LinkBranch(jettree, &fMass, Form(
"Mass%s", tag),
"D");
927 LinkBranch(jettree, &fNEF, Form(
"NEF%s", tag),
"D");
928 LinkBranch(jettree, &fNCharged, Form(
"NCharged%s", tag),
"I");
929 LinkBranch(jettree, &fNNeutral, Form(
"NNeutral%s", tag),
"I");
933 LinkBranch(jettree, &fJetRadius,
"Radius",
"D");
934 LinkBranch(jettree, &fEventWeight,
"EventWeight",
"D");
935 LinkBranch(jettree, &fTriggerClusterIndex,
"TriggerClusterIndex",
"I");
937 std::string varnames[] = {
"RhoPtRec",
"RhoPtSim",
"RhoMassRec",
"RhoMassSim"};
938 for(
int i = 0; i < 4; i++){
939 LinkBranch(jettree, fRhoParamters + i, varnames[i].data(),
"D");
944 void LinkBranch(
TTree *jettree,
void *data,
const char *branchname,
const char *type) {
945 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.