35 #include <fastjet/ClusterSequence.hh> 36 #include <fastjet/contrib/Nsubjettiness.hh> 37 #include <fastjet/contrib/SoftDrop.hh> 41 #include <TLorentzVector.h> 43 #include <TObjString.h> 47 #include "AliAODEvent.h" 48 #include "AliAODInputHandler.h" 49 #include "AliAnalysisManager.h" 50 #include "AliAnalysisDataSlot.h" 51 #include "AliAnalysisDataContainer.h" 53 #include "AliCDBEntry.h" 54 #include "AliCDBManager.h" 66 #include "AliTriggerCluster.h" 67 #include "AliTriggerConfiguration.h" 68 #include "AliVCluster.h" 69 #include "AliVParticle.h" 71 #ifdef EXPERIMENTAL_JETCONSTITUENTS 99 fReclusterizer(kCAAlgo),
100 fTriggerSelectionBits(AliVEvent::kAny),
101 fTriggerSelectionString(
""),
102 fNameTriggerDecisionContainer(
"EmcalTriggerDecision"),
103 fUseTriggerSelectionForData(false),
104 fUseDownscaleWeight(false),
105 fUseChargedConstituents(true),
106 fUseNeutralConstituents(true),
111 fFillStructGlob(true)
145 DefineOutput(2, TTree::Class());
165 clusterenergybinning(200, 0., 200),
166 timebinning(1000, -500., 500.),
167 m02binning(100, 0., 1.),
168 ncellbinning(101, -0.5, 100.5);
171 fQAHistos->
CreateTH2(
"hClusterConstE",
"EMCAL cluster energy vs jet pt; p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
172 fQAHistos->
CreateTH2(
"hClusterConstTime",
"EMCAL cluster time vs. jet pt; p_{t, jet} (GeV/c); t_{cl} (ns)", jetptbinning, timebinning);
173 fQAHistos->
CreateTH2(
"hClusterConstM02",
"EMCAL cluster M02 vs. jet pt; p{t, jet} (GeV/c); M02", jetptbinning, m02binning);
174 fQAHistos->
CreateTH2(
"hClusterConstNcell",
"EMCAL cluster ncell vs. jet pt; p{t, jet} (GeV/c); Number of cells", jetptbinning, ncellbinning);
177 #ifdef EXPERIMENTAL_JETCONSTITUENTS 178 fQAHistos->
CreateTH2(
"hChargedConstituentPt",
"charged constituent pt vs jet pt (via constituent map); p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
179 fQAHistos->
CreateTH2(
"hChargedIndexPt",
"charged constituent pt vs jet pt (via index map); p_{t, jet} (GeV/c); p_{t, ch} (GeV/c)", jetptbinning, clusterenergybinning);
181 fQAHistos->
CreateTH2(
"hClusterConstituentEDefault",
"cluster constituent default energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
182 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);
183 fQAHistos->
CreateTH2(
"hClusterConstituentEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
184 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);
185 fQAHistos->
CreateTH2(
"hClusterIndexEHC",
"cluster constituent hadronic-corrected energy vs. jet pt (via index map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
186 fQAHistos->
CreateTH2(
"hLeadingChargedConstituentPt",
"Pt of the leading charged constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
187 fQAHistos->
CreateTH2(
"hLeadingClusterConstituentPt",
"Pt of the leading cluster constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
192 std::string treename = this->GetOutputSlot(2)->GetContainer()->GetName();
251 std::stringstream rhoTagData, rhoTagMC;
252 if(datajets) rhoTagData <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(datajets->
GetJetRadius() * 10.);
253 if(mcjets) rhoTagMC <<
"R" << std::setw(2) << std::setfill(
'0') <<
static_cast<Int_t>(mcjets->
GetJetRadius() * 10.);
256 std::string rhoSparseData =
"RhoSparse_Full_" + rhoTagData.str(), rhoSparseMC =
"RhoSparse_Full_" + rhoTagMC.str(),
257 rhoMassData =
"RhoMassSparse_Full_" + rhoTagData.str(), rhoMassMC =
"RhoMassSparse_Full_" + rhoTagMC.str();
262 AliDebugStream(2) <<
"Found rho parameter for reconstructed pt: " << (rhoPtRec ?
"yes" :
"no") <<
", value: " << (rhoPtRec ? rhoPtRec->GetVal() : 0.) << std::endl;
263 AliDebugStream(2) <<
"Found rho parameter for sim pt: " << (rhoPtSim ?
"yes" :
"no") <<
", value: " << (rhoPtSim ? rhoPtSim->GetVal() : 0.) << std::endl;
264 AliDebugStream(2) <<
"Found rho parameter for reconstructed Mass: " << (rhoMassRec ?
"yes" :
"no") <<
", value: " << (rhoMassRec ? rhoMassRec->GetVal() : 0.) << std::endl;
265 AliDebugStream(2) <<
"Found rho parameter for sim Mass: " << (rhoMassSim ?
"yes" :
"no") <<
", value: " << (rhoMassSim ? rhoMassSim->GetVal() : 0.) << std::endl;
267 rhoPtRec ? rhoPtRec->GetVal() : 0.,
268 rhoPtSim ? rhoPtSim->GetVal() : 0.,
269 rhoMassRec ? rhoMassRec->GetVal() : 0.,
270 rhoMassSim ? rhoMassSim->GetVal() : 0.
275 AliDebugStream(1) <<
"Inspecting jet radius " << (datajets ? datajets->
GetJetRadius() : mcjets->
GetJetRadius()) << std::endl;
288 AliDebugStream(1) <<
"Found trigger decision object: " << (trgselresult ?
"yes" :
"no") << std::endl;
290 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
298 std::vector<std::string> clusternames;
300 for(
auto t : triggerinfos) {
301 if(std::find(clusternames.begin(), clusternames.end(), t.fTriggerCluster) == clusternames.end()) clusternames.emplace_back(t.fTriggerCluster);
303 bool isCENT = (std::find(clusternames.begin(), clusternames.end(),
"CENT") != clusternames.end()),
304 isCENTNOTRD = (std::find(clusternames.begin(), clusternames.end(),
"CENTNOTRD") != clusternames.end()),
305 isCALO = (std::find(clusternames.begin(), clusternames.end(),
"CALO") != clusternames.end()),
306 isCALOFAST = (std::find(clusternames.begin(), clusternames.end(),
"CALOFAST") != clusternames.end());
315 AliDebugStream(1) <<
"Found trigger decision object: " << (mctrigger ?
"yes" :
"no") << std::endl;
317 AliErrorStream() <<
"Trigger decision container with name " <<
fNameTriggerDecisionContainer <<
" not found in event - not possible to select EMCAL triggers" << std::endl;
329 auto triggerstring =
MatchTrigger(selectionString.Data());
330 AliDebugStream(2) <<
"Getting downscale correction factor for trigger string " << triggerstring << std::endl;
333 AliDebugStream(1) <<
"Using downscale weight " << weight << std::endl;
350 nsubjettinessSettings.
fBeta = 1.;
351 nsubjettinessSettings.
fRadius = 0.4;
354 AliDebugStream(1) <<
"In data jets branch: found " << datajets->
GetNJets() <<
" jets, " << datajets->
GetNAcceptedJets() <<
" were accepted\n";
355 AliDebugStream(1) <<
"Having MC information: " << (mcjets ? TString::Format(
"yes, with %d jets", mcjets->
GetNJets()) :
"no") << std::endl;
357 AliDebugStream(1) <<
"In MC jets branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
359 for(
auto jet : datajets->
accepted()) {
360 double pt = jet->Pt(), pz = jet->Pz(), E = jet->E(), M = TMath::Sqrt(E*E - pt*pt - pz*pz);
361 AliDebugStream(2) <<
"Next jet: pt:" << jet->Pt() <<
", E: " << E <<
", pz: " << pz <<
", M(self): " << M <<
"M(fj)" << jet->M() << std::endl;
366 AliDebugStream(2) <<
"Not found associated jet" << std::endl;
384 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
386 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
399 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
401 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
408 AliDebugStream(1) <<
"In MC pure jet branch: found " << mcjets->
GetNJets() <<
" jets, " << mcjets->
GetNAcceptedJets() <<
" were accepted\n";
419 AliErrorStream() <<
"Error in reclusterization - skipping jet" << std::endl;
421 AliErrorStream() <<
"Error in substructure observable - skipping jet" << std::endl;
431 AliCDBManager * cdb = AliCDBManager::Instance();
432 if(!fMCEvent && cdb){
434 AliCDBEntry *en = cdb->Get(
"GRP/CTP/Config");
435 AliTriggerConfiguration *trg =
static_cast<AliTriggerConfiguration *
>(en->GetObject());
436 std::vector<std::string> clusternames;
437 for(
auto c : trg->GetClusters()) {
438 AliTriggerCluster *clust =
static_cast<AliTriggerCluster *
>(
c);
439 std::string clustname = clust->GetName();
440 auto iscent = clustname.find(
"CENT") != std::string::npos, iscalo = clustname.find(
"CALO") != std::string::npos;
441 if(!(iscalo || iscent))
continue;
442 clusternames.emplace_back(clustname);
446 fLumiMonitor =
new TH1F(
"hLumiMonitor",
"Luminosity monitor", clusternames.size(), 0, clusternames.size());
448 for(
auto c : clusternames) {
449 fLumiMonitor->GetXaxis()->SetBinLabel(currentbin++,
c.data());
458 if(fInputEvent->GetFiredTriggerClasses().Contains(
"INT7")) {
460 auto int7trigger = trigger.IsTriggerClass(
"INT7");
461 auto bunchcrossing = trigger.fBunchCrossing ==
"B";
462 auto nopf = trigger.fPastFutureProtection ==
"NOPF";
463 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.fTriggerCluster << std::endl;
464 if(int7trigger && bunchcrossing && nopf) {
465 double downscale = downscalefactors->GetDownscaleFactorForTriggerClass(trigger.ExpandClassName());
466 AliDebugStream(5) <<
"Using downscale " << downscale << std::endl;
467 fLumiMonitor->Fill(trigger.fTriggerCluster.data(), 1./downscale);
476 result.
fPt = TMath::Abs(jet.
Pt());
489 const int kClusterOffset = 30000;
490 std::vector<fastjet::PseudoJet> constituents;
492 AliDebugStream(2) <<
"Make new jet substrucutre for " << (isMC ?
"MC" :
"data") <<
" jet: Number of tracks " << jet.
GetNumberOfTracks() <<
", clusters " << jet.
GetNumberOfClusters() << std::endl;
495 auto track = jet.
TrackAt(itrk, tracks->GetArray());
498 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
499 constituentTrack.set_user_index(jet.
TrackAt(itrk));
500 constituents.push_back(constituentTrack);
506 auto cluster = jet.
ClusterAt(icl, clusters->GetArray());
507 TLorentzVector clustervec;
509 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
510 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
511 constituents.push_back(constituentCluster);
515 AliDebugStream(3) <<
"Found " << constituents.size() <<
" constituents for jet with pt=" << jet.
Pt() <<
" GeV/c" << std::endl;
516 if(!constituents.size()){
517 AliErrorStream() <<
"Jet has 0 constituents." << std::endl;
521 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
522 std::vector<fastjet::PseudoJet> outputjets;
524 fastjet::ClusterSequence jetfinder(constituents, jetdef);
525 outputjets = jetfinder.inclusive_jets(0);
528 }
catch (fastjet::Error &e) {
529 AliErrorStream() <<
" FJ Exception caught: " << e.message() << std::endl;
532 AliErrorStream() <<
"Softdrop exception caught: " << e.
what() << std::endl;
538 fastjet::contrib::SoftDrop softdropAlgorithm(cutparameters.
fBeta, cutparameters.
fZ);
539 softdropAlgorithm.set_verbose_structure(kTRUE);
540 std::unique_ptr<fastjet::contrib::Recluster> reclusterizer(
new fastjet::contrib::Recluster(cutparameters.
fRecluserAlgo, 1,
true));
541 softdropAlgorithm.set_reclustering(kTRUE, reclusterizer.get());
542 AliDebugStream(4) <<
"Jet has " << jet.constituents().size() <<
" constituents" << std::endl;
543 auto groomed = softdropAlgorithm(jet);
545 auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
549 softdropstruct.delta_R(),
551 softdropstruct.delta_R(),
553 softdropstruct.dropped_count()});
555 }
catch(std::bad_cast &e) {
562 fastjet::contrib::Nsubjettiness (1,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet),
563 fastjet::contrib::Nsubjettiness (2,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.
fBeta, cut.
fRadius, 1e100)).result(jet)
571 TVector3 jetvec(jet.
Px(), jet.
Py(), jet.
Pz());
576 auto track = jet.
TrackAt(itrk, tracks->GetArray());
578 AliErrorStream() <<
"Associated constituent particle / track not found\n";
583 TVector3 trackvec(track->Px(), track->Py(), track->Pz());
585 num += track->Pt() * trackvec.DrEtaPhi(jetvec);
591 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
593 AliErrorStream() <<
"Associated constituent cluster not found\n";
596 TLorentzVector clusterp;
599 num += clusterp.Pt() * clusterp.Vect().DrEtaPhi(jetvec);
600 den += clusterp.Pt();
613 auto trk = jet.
TrackAt(itrk, particles->GetArray());
615 AliErrorStream() <<
"Associated constituent particle / track not found\n";
620 num += trk->Pt() * trk->Pt();
626 auto clust = jet.
ClusterAt(icl, clusters->GetArray());
628 AliErrorStream() <<
"Associated constituent cluster not found\n";
631 TLorentzVector clusterp;
633 num += clusterp.Pt() * clusterp.Pt();
634 den += clusterp.Pt();
637 return TMath::Sqrt(num)/den;
642 auto clust = jet->
ClusterAt(icl, clusters->GetArray());
643 AliDebugStream(3) <<
"cluster time " << clust->GetTOF() << std::endl;
649 #ifdef EXPERIMENTAL_JETCONSTITUENTS 655 #ifdef EXPERIMENTAL_JETCONSTITUENTS 663 AliDebugStream(2) <<
"Jet: Number of particle constituents: " << jet->
GetParticleConstituents().size() << std::endl;
666 AliDebugStream(3) <<
"Found particle constituent with pt " <<
part.Pt() <<
", from VParticle " <<
part.GetParticle()->Pt() << std::endl;
671 AliDebugStream(2) <<
"Jet: Number of cluster constituents: " << jet->
GetClusterConstituents().size() << std::endl;
674 AliDebugStream(3) <<
"Found cluster constituent with energy " << clust.E() <<
" using energy definition " <<
static_cast<int>(clust.GetDefaultEnergyType()) << std::endl;
676 fQAHistos->
FillTH2(
"hClusterConstituentENLC", jet->
Pt(), clust.GetCluster()->GetNonLinCorrEnergy());
677 fQAHistos->
FillTH2(
"hClusterConstituentEHC", jet->
Pt(), clust.GetCluster()->GetHadCorrEnergy());
684 fQAHistos->
FillTH1(
"hLeadingClusterConstituentPt", jet->
Pt(), leadingcluster->GetCluster()->GetHadCorrEnergy());
687 fQAHistos->
FillTH1(
"hLeadingChargedConstituentPt", jet->
Pt(), leadingcharged->GetParticle()->Pt());
696 auto part = jet.
TrackAt(ipart, particles->GetArray());
698 if(
part->Charge()) ncharged++;
710 std::vector<Triggerinfo> result;
711 std::stringstream triggerparser(triggerstring);
712 std::string currenttrigger;
713 while(std::getline(triggerparser, currenttrigger,
' ')){
714 if(!currenttrigger.length())
continue;
715 std::vector<std::string> tokens;
716 std::stringstream triggerdecoder(currenttrigger);
718 while(std::getline(triggerdecoder, token,
'-')) tokens.emplace_back(token);
719 result.emplace_back(
Triggerinfo({tokens[0], tokens[1], tokens[2], tokens[3]}));
725 std::vector<std::string> tokens;
727 std::stringstream decoder(fInputEvent->GetFiredTriggerClasses().Data());
728 while(std::getline(decoder, result,
' ')) tokens.emplace_back(result);
730 for(
auto t : tokens) {
731 if(t.find(triggertoken) != std::string::npos) {
741 const std::array<std::string, 8> kEMCALTriggers = {
742 "EJ1",
"EJ2",
"DJ1",
"DJ2",
"EG1",
"EG2",
"DG1",
"DG2" 744 bool isEMCAL =
false;
745 for(
auto emcaltrg : kEMCALTriggers) {
746 if(triggerstring.find(emcaltrg) != std::string::npos) {
758 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
760 if(inputhandler->IsA() == AliAODInputHandler::Class()){
761 std::cout <<
"Analysing AOD events\n";
764 std::cout <<
"Analysing ESD events\n";
768 std::stringstream taskname;
769 taskname <<
"JetSubstructureTreemaker_R" << std::setw(2) << std::setfill(
'0') << int(jetradius*10) << trigger;
771 mgr->AddTask(treemaker);
777 particles->SetMinPt(0.);
786 mcjets->SetName(
"mcjets");
794 std::cout <<
"Track container name: " << tracks->GetName() << std::endl;
795 tracks->SetMinPt(0.15);
799 std::cout <<
"Using full or neutral jets ..." << std::endl;
801 std::cout <<
"Cluster container name: " << clusters->GetName() << std::endl;
805 std::cout <<
"Using charged jets ... " << std::endl;
815 datajets->SetName(
"datajets");
822 std::string triggerstring(trigger);
823 if(triggerstring.find(
"INT7") != std::string::npos) {
825 }
else if(triggerstring.find(
"EJ1") != std::string::npos) {
828 }
else if(triggerstring.find(
"EJ2") != std::string::npos) {
834 std::string jettypestring;
839 default: jettypestring =
"Undef";
843 std::stringstream outputfile, histname, treename;
844 outputfile << mgr->GetCommonFileName() <<
":JetSubstructure_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
845 histname <<
"JetSubstructureHistos_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
846 treename <<
"JetSubstructureTree_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
847 mgr->ConnectInput(treemaker, 0, mgr->GetCommonInputContainer());
848 mgr->ConnectOutput(treemaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
849 mgr->ConnectOutput(treemaker, 2, mgr->CreateContainer(treename.str().data(), TTree::Class(), AliAnalysisManager::kOutputContainer, mgr->GetCommonFileName()));
855 std::string result = fTriggerClass +
"-" + fBunchCrossing +
"-" + fPastFutureProtection +
"-" + fTriggerCluster;
860 return fTriggerClass.substr(1) == triggerclass;
864 LinkBranch(jettree, &fZg, Form(
"Zg%s", tag),
"D");
865 LinkBranch(jettree, &fRg, Form(
"Rg%s", tag),
"D");
866 LinkBranch(jettree, &fMg, Form(
"Mg%s", tag),
"D");
867 LinkBranch(jettree, &fPtg, Form(
"Ptg%s", tag),
"D");
868 LinkBranch(jettree, &fMug, Form(
"Mug%s", tag),
"D");
869 LinkBranch(jettree, &fDeltaR, Form(
"DeltaRg%s", tag),
"D");
870 LinkBranch(jettree, &fNDropped, Form(
"NDropped%s", tag),
"I");
874 LinkBranch(jettree, &fOneSubjettiness, Form(
"OneSubjettiness%s", tag),
"D");
875 LinkBranch(jettree, &fTwoSubjettiness, Form(
"TwoSubjettiness%s", tag),
"D");
879 LinkBranch(jettree, &fAngularity, Form(
"Angularity%s", tag),
"D");
880 LinkBranch(jettree, &fPtD, Form(
"PtD%s", tag),
"D");
884 LinkBranch(jettree, &fPt, Form(
"PtJet%s", tag),
"D");
885 LinkBranch(jettree, &fE, Form(
"EJet%s", tag),
"D");
886 LinkBranch(jettree, &fEta, Form(
"Eta%s", tag),
"D");
887 LinkBranch(jettree, &fPhi, Form(
"Phi%s", tag),
"D");
888 LinkBranch(jettree, &fArea, Form(
"Area%s", tag),
"D");
889 LinkBranch(jettree, &fMass, Form(
"Mass%s", tag),
"D");
890 LinkBranch(jettree, &fNEF, Form(
"NEF%s", tag),
"D");
891 LinkBranch(jettree, &fPt, Form(
"PtJet%s", tag),
"D");
892 LinkBranch(jettree, &fNCharged, Form(
"NCharged%s", tag),
"I");
893 LinkBranch(jettree, &fNNeutral, Form(
"NNeutral%s", tag),
"I");
897 LinkBranch(jettree, &fJetRadius,
"Radius",
"D");
898 LinkBranch(jettree, &fEventWeight,
"EventWeight",
"D");
899 LinkBranch(jettree, &fTriggerClusterIndex,
"TriggerClusterIndex",
"I");
901 std::string varnames[] = {
"RhoPtRec",
"RhoPtSim",
"RhoMassRec",
"RhoMassSim"};
902 for(
int i = 0; i < 4; i++){
903 LinkBranch(jettree, fRhoParamters + i, varnames[i].data(),
"D");
908 void LinkBranch(
TTree *jettree,
void *data,
const char *branchname,
const char *type) {
909 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 fFillPart
Fill particle level information.
void LinkJetTreeBranches(TTree *jettree, const char *tag)
static AliAnalysisTaskEmcalJetSubstructureTree * AddEmcalJetSubstructureTreeMaker(Bool_t isMC, Bool_t isData, Double_t jetradius, AliJetContainer::EJetType_t jettype, AliJetContainer::ERecoScheme_t recombinationScheme, const char *name)
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.
AliSoftDropParameters * fSoftDropMeasured
! Data field for measured soft drop parameters in jet tree
std::vector< Triggerinfo > DecodeTriggerString(const std::string &triggerstring) const
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)
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
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
TString part
use mixed event to constrain combinatorial background
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.
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
std::string MatchTrigger(const std::string &triggerclass) const
Container for trigger decision object.
bool IsTriggerClass(const std::string &triggerclass) const
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)
std::string ExpandClassName() const
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Container class for histograms.
Global jet substructure paramters.
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()
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.