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 AliInfoStream() <<
"Adding trigger cluster " << clustname <<
" to cluster lumi monitor" << std::endl;
480 clusternames.emplace_back(clustname);
484 fLumiMonitor =
new TH1F(
"hLumiMonitor",
"Luminosity monitor", clusternames.size(), 0, clusternames.size());
486 for(
auto c : clusternames) {
487 fLumiMonitor->GetXaxis()->SetBinLabel(currentbin++,
c.data());
496 if(fInputEvent->GetFiredTriggerClasses().Contains(
"INT7")) {
498 auto int7trigger = trigger.IsTriggerClass(
"INT7");
499 auto bunchcrossing = trigger.BunchCrossing() ==
"B";
500 auto nopf = trigger.PastFutureProtection() ==
"NOPF";
501 bool centcalo = (trigger.Triggercluster().find(
"CENT") != std::string::npos) || (trigger.Triggercluster().find(
"CALO") != std::string::npos);
502 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;
503 if(int7trigger && bunchcrossing && nopf && centcalo) {
504 double downscale = downscalefactors->GetDownscaleFactorForTriggerClass(trigger.ExpandClassName());
505 AliDebugStream(5) <<
"Using downscale " << downscale << std::endl;
506 fLumiMonitor->Fill(trigger.Triggercluster().data(), 1./downscale);
515 result.
fPt = TMath::Abs(jet.
Pt());
524 std::vector<double> zcharged, zneutral;
528 auto trk = jet.
TrackAt(icharged, tracks->GetArray());
531 if(!trk->Charge()) charged =
false;
533 auto z = jet.
GetZ(trk);
534 if(charged) zcharged.push_back(z);
535 else zneutral.push_back(z);
540 auto clust = jet.
ClusterAt(iclust, clusters->GetArray());
541 TLorentzVector clustervec;
543 auto z = jet.
GetZ(clustervec.Px(), clustervec.Py(), clustervec.Pz());
544 zneutral.push_back(z);
550 if(zcharged.size()) {
551 std::sort(zcharged.begin(), zcharged.end(), std::greater<double>());
556 std::sort(zneutral.begin(), zneutral.end(), std::greater<double>());
564 const int kClusterOffset = 30000;
565 std::vector<fastjet::PseudoJet> constituents;
567 AliDebugStream(2) <<
"Make new jet substrucutre for " << (isMC ?
"MC" :
"data") <<
" jet: Number of tracks " << jet.
GetNumberOfTracks() <<
", clusters " << jet.
GetNumberOfClusters() << std::endl;
569 AliDebugStream(1) <<
"Jet substructure: Using charged constituents" << std::endl;
571 auto track = jet.
TrackAt(itrk, tracks->GetArray());
574 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
575 constituentTrack.set_user_index(jet.
TrackAt(itrk));
576 constituents.push_back(constituentTrack);
581 AliDebugStream(1) <<
"Jet substructure: Using neutral constituents" << std::endl;
583 auto cluster = jet.
ClusterAt(icl, clusters->GetArray());
584 TLorentzVector clustervec;
586 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
587 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
588 constituents.push_back(constituentCluster);
592 AliDebugStream(3) <<
"Found " << constituents.size() <<
" constituents for jet with pt=" << jet.
Pt() <<
" GeV/c" << std::endl;
593 if(!constituents.size()){
594 AliErrorStream() <<
"Jet has 0 constituents." << std::endl;
598 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
599 std::vector<fastjet::PseudoJet> outputjets;
601 fastjet::ClusterSequence jetfinder(constituents, jetdef);
602 outputjets = jetfinder.inclusive_jets(0);
605 }
catch (fastjet::Error &e) {
606 AliErrorStream() <<
" FJ Exception caught: " << e.message() << std::endl;
609 AliErrorStream() <<
"Softdrop exception caught: " << e.
what() << std::endl;
615 fastjet::contrib::SoftDrop softdropAlgorithm(cutparameters.
fBeta, cutparameters.
fZ);
616 softdropAlgorithm.set_verbose_structure(kTRUE);
617 std::unique_ptr<fastjet::contrib::Recluster> reclusterizer(
new fastjet::contrib::Recluster(cutparameters.
fRecluserAlgo, 1,
true));
618 softdropAlgorithm.set_reclustering(kTRUE, reclusterizer.get());
619 AliDebugStream(4) <<
"Jet has " << jet.constituents().size() <<
" constituents" << std::endl;
620 auto groomed = softdropAlgorithm(jet);
622 auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
626 softdropstruct.delta_R(),
628 softdropstruct.delta_R(),
630 softdropstruct.dropped_count()});
632 }
catch(std::bad_cast &e) {
639 fastjet::contrib::Nsubjettiness (1,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet),
640 fastjet::contrib::Nsubjettiness (2,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet)
648 TVector3 jetvec(jet.
Px(), jet.
Py(), jet.
Pz());
652 AliDebugStream(1) <<
"Angularity: Using charged constituents" << std::endl;
654 auto track = jet.
TrackAt(itrk, tracks->GetArray());
656 AliErrorStream() <<
"Associated constituent particle / track not found\n";
661 TVector3 trackvec(track->Px(), track->Py(), track->Pz());
663 num += track->Pt() * trackvec.DrEtaPhi(jetvec);
668 AliDebugStream(1) <<
"Using neutral constituents" << std::endl;
670 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
672 AliErrorStream() <<
"Associated constituent cluster not found\n";
675 TLorentzVector clusterp;
678 num += clusterp.Pt() * clusterp.Vect().DrEtaPhi(jetvec);
679 den += clusterp.Pt();
691 AliDebugStream(1) <<
"Using charged constituents" << std::endl;
693 auto trk = jet.
TrackAt(itrk, particles->GetArray());
695 AliErrorStream() <<
"Associated constituent particle / track not found\n";
700 num += trk->Pt() * trk->Pt();
705 AliDebugStream(1) <<
"Using neutral constituents" << std::endl;
707 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
709 AliErrorStream() <<
"Associated constituent cluster not found\n";
712 TLorentzVector clusterp;
714 num += clusterp.Pt() * clusterp.Pt();
715 den += clusterp.Pt();
718 return TMath::Sqrt(num)/den;
723 auto clust = jet->
ClusterAt(icl, clusters->GetArray());
724 AliDebugStream(3) <<
"cluster time " << clust->GetTOF() << std::endl;
729 fQAHistos->
FillTH2(
"hClusterConstExotics", jet->
Pt(), clust->GetIsExotic() ? 1. : 0.);
731 double mincell(100000.), maxcell(0.);
732 for(
int icell = 0; icell < clust->GetNCells(); icell++){
733 double ecell = clust->E() * clust->GetCellAmplitudeFraction(icell);
734 if(ecell < mincell) mincell = ecell;
735 if(ecell > maxcell) maxcell = ecell;
740 #ifdef EXPERIMENTAL_JETCONSTITUENTS 746 #ifdef EXPERIMENTAL_JETCONSTITUENTS 749 auto part = jet->
TrackAt(itrk, cont->GetArray());
754 AliDebugStream(2) <<
"Jet: Number of particle constituents: " << jet->
GetParticleConstituents().size() << std::endl;
757 AliDebugStream(3) <<
"Found particle constituent with pt " << part.Pt() <<
", from VParticle " << part.GetParticle()->Pt() << std::endl;
762 AliDebugStream(2) <<
"Jet: Number of cluster constituents: " << jet->
GetClusterConstituents().size() << std::endl;
765 AliDebugStream(3) <<
"Found cluster constituent with energy " << clust.E() <<
" using energy definition " <<
static_cast<int>(clust.GetDefaultEnergyType()) << std::endl;
767 fQAHistos->
FillTH2(
"hClusterConstituentENLC", jet->
Pt(), clust.GetCluster()->GetNonLinCorrEnergy());
768 fQAHistos->
FillTH2(
"hClusterConstituentEHC", jet->
Pt(), clust.GetCluster()->GetHadCorrEnergy());
775 fQAHistos->
FillTH1(
"hLeadingClusterConstituentPt", jet->
Pt(), leadingcluster->GetCluster()->GetHadCorrEnergy());
778 fQAHistos->
FillTH1(
"hLeadingChargedConstituentPt", jet->
Pt(), leadingcharged->GetParticle()->Pt());
787 auto part = jet.
TrackAt(ipart, particles->GetArray());
789 if(part->Charge()) ncharged++;
801 std::vector<std::string> tokens;
803 std::stringstream decoder(fInputEvent->GetFiredTriggerClasses().Data());
804 while(std::getline(decoder, result,
' ')) tokens.emplace_back(result);
806 for(
auto t : tokens) {
807 if(t.find(triggertoken) != std::string::npos) {
817 const std::array<std::string, 8> kEMCALTriggers = {
818 "EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2" 820 bool isEMCAL =
false;
821 for(
auto emcaltrg : kEMCALTriggers) {
822 if(triggerstring.find(emcaltrg) != std::string::npos) {
834 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
836 if(inputhandler->IsA() == AliAODInputHandler::Class()){
837 std::cout <<
"Analysing AOD events\n";
840 std::cout <<
"Analysing ESD events\n";
844 std::stringstream taskname;
845 taskname <<
"JetSubstructureTreemaker_R" << std::setw(2) << std::setfill(
'0') << int(jetradius*10) << trigger;
847 mgr->AddTask(treemaker);
855 particles->SetMinPt(0.);
864 mcjets->SetName(
"mcjets");
872 std::cout <<
"Track container name: " << tracks->GetName() << std::endl;
873 tracks->SetMinPt(0.15);
877 std::cout <<
"Using full or neutral jets ..." << std::endl;
879 std::cout <<
"Cluster container name: " << clusters->GetName() << std::endl;
883 std::cout <<
"Using charged jets ... " << std::endl;
893 datajets->SetName(
"datajets");
900 std::string triggerstring(trigger);
901 if(triggerstring.find(
"INT7") != std::string::npos) {
903 }
else if(triggerstring.find(
"EJ1") != std::string::npos) {
906 }
else if(triggerstring.find(
"EJ2") != std::string::npos) {
909 }
else if(triggerstring.find(
"EG1") != std::string::npos) {
912 }
else if(triggerstring.find(
"EG2") != std::string::npos) {
918 std::string jettypestring;
923 default: jettypestring =
"Undef";
927 std::stringstream outputfile, histname, treename;
928 outputfile << mgr->GetCommonFileName() <<
":JetSubstructure_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
929 histname <<
"JetSubstructureHistos_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
930 treename <<
"JetSubstructureTree_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
931 mgr->ConnectInput(treemaker, 0, mgr->GetCommonInputContainer());
932 mgr->ConnectOutput(treemaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
933 mgr->ConnectOutput(treemaker, 2, mgr->CreateContainer(treename.str().data(), TTree::Class(), AliAnalysisManager::kOutputContainer, mgr->GetCommonFileName()));
939 LinkBranch(jettree, &fZg, Form(
"Zg%s", tag),
"D");
940 LinkBranch(jettree, &fRg, Form(
"Rg%s", tag),
"D");
941 LinkBranch(jettree, &fMg, Form(
"Mg%s", tag),
"D");
942 LinkBranch(jettree, &fPtg, Form(
"Ptg%s", tag),
"D");
943 LinkBranch(jettree, &fMug, Form(
"Mug%s", tag),
"D");
944 LinkBranch(jettree, &fDeltaR, Form(
"DeltaRg%s", tag),
"D");
945 LinkBranch(jettree, &fNDropped, Form(
"NDropped%s", tag),
"I");
949 LinkBranch(jettree, &fOneSubjettiness, Form(
"OneSubjettiness%s", tag),
"D");
950 LinkBranch(jettree, &fTwoSubjettiness, Form(
"TwoSubjettiness%s", tag),
"D");
954 LinkBranch(jettree, &fAngularity, Form(
"Angularity%s", tag),
"D");
955 LinkBranch(jettree, &fPtD, Form(
"PtD%s", tag),
"D");
959 LinkBranch(jettree, &fPt, Form(
"PtJet%s", tag),
"D");
960 LinkBranch(jettree, &fE, Form(
"EJet%s", tag),
"D");
961 LinkBranch(jettree, &fEta, Form(
"Eta%s", tag),
"D");
962 LinkBranch(jettree, &fPhi, Form(
"Phi%s", tag),
"D");
963 LinkBranch(jettree, &fArea, Form(
"Area%s", tag),
"D");
964 LinkBranch(jettree, &fMass, Form(
"Mass%s", tag),
"D");
965 LinkBranch(jettree, &fNEF, Form(
"NEF%s", tag),
"D");
966 LinkBranch(jettree, &fNCharged, Form(
"NCharged%s", tag),
"I");
967 LinkBranch(jettree, &fNNeutral, Form(
"NNeutral%s", tag),
"I");
968 LinkBranch(jettree, &fZLeading, Form(
"ZLeading%s", tag),
"D");
969 LinkBranch(jettree, &fZLeadingCharged, Form(
"ZLeadingCharged%s", tag),
"D");
970 LinkBranch(jettree, &fZLeadingNeutral, Form(
"ZLeadingNeutral%s", tag),
"D");
974 LinkBranch(jettree, &fJetRadius,
"Radius",
"D");
975 LinkBranch(jettree, &fEventWeight,
"EventWeight",
"D");
976 LinkBranch(jettree, &fTriggerClusterIndex,
"TriggerClusterIndex",
"I");
978 std::string varnames[] = {
"RhoPtRec",
"RhoPtSim",
"RhoMassRec",
"RhoMassSim"};
979 for(
int i = 0; i < 4; i++){
980 LinkBranch(jettree, fRhoParamters + i, varnames[i].data(),
"D");
985 void LinkBranch(
TTree *jettree,
void *data,
const char *branchname,
const char *type) {
986 jettree->Branch(branchname, data, Form(
"%s/%s", branchname, type));
TTree * fJetSubstructureTree
! Tree with jet substructure information
void LinkJetTreeBranches(TTree *jettree, bool fillRho)
Double_t fZLeadingNeutral
z of the leading neutral constituent
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)
Double_t fZLeadingCharged
z of the leading charged constituent
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.
Double_t fZLeading
z of the leading constituent
Int_t GetDefaultClusterEnergy() const
Int_t TrackAt(Int_t idx) const
void LinkJetTreeBranches(TTree *jettree, const char *tag)
UShort_t GetNumberOfTracks() 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.
Double_t GetZ(const Double_t trkPx, const Double_t trkPy, const Double_t trkPz) const
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)
AliJetKineParameters MakeJetKineParameters(const AliEmcalJet &jet, JetRecType_t rectype, const AliParticleContainer *const particles, const AliClusterContainer *const clusters) const
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.