5#ifndef TRUTHRIVETTOOLS_HIGGSTEMPLATECROSSSECTIONS_H
6#define TRUTHRIVETTOOLS_HIGGSTEMPLATECROSSSECTIONS_H
9#include "Rivet/Analysis.hh"
10#include "Rivet/Particle.hh"
11#include "Rivet/Projections/FastJets.hh"
18#include "TLorentzVector.h"
39 :
Analysis(
"HiggsTemplateCrossSections"),
51 if ( ptcl.genParticle()->end_vertex() ) {
52 if ( !
hasChild(ptcl.genParticle(),ptcl.pid()) )
return ptcl;
60 auto prodVtx = p.genParticle()->production_vertex();
61 if (prodVtx ==
nullptr)
return false;
63 for (
auto ancestor:Rivet::HepMCUtils::particles(std::move(prodVtx),Relatives::ANCESTORS)){
64 for (
const auto & part:ptcls )
65 if ( ancestor==part.genParticle() )
return true;
78 for (
const Particle& child:Particle(*ptcl).children())
79 if (child.pid()==pdgID)
return true;
85 for (
auto parent:Rivet::HepMCUtils::particles(ptcl->production_vertex(),Relatives::PARENTS))
86 if (parent->pdg_id()==pdgID)
return true;
92 for (
const Particle& child:p.children())
93 if (PID::isQuark(child.pid()))
return true;
99 for (
const Particle& child:p.children())
101#
if RIVET_VERSION_CODE >= 40000
102 PID::isChargedLepton(child.pid())
104 PID::isChLepton(child.pid())
113 std::string_view
msg={},
int NmaxWarnings=20)
const {
116 const auto errIndex =
static_cast<std::size_t
>(err);
117 if (errIndex < std::size(m_errorCount)) {
118 ++m_errorCount[errIndex];
120 MSG_WARNING(
"Invalid HTXS error code: " << errIndex);
123 static std::atomic<int> Nwarnings = 0;
124 if ( !
msg.empty() && ++Nwarnings < NmaxWarnings )
135 HiggsClassification cat;
136 cat.prodMode = prodMode;
153 "Unkown Higgs production mechanism. Cannot classify event."
154 " Classification for all events will most likely fail.");
164 for (
auto ptcl : Rivet::HepMCUtils::particles(event.genEvent()) ) {
167 if ( !PID::isHiggs(ptcl->pdg_id()) )
continue;
169 if ( ptcl->end_vertex() && !
hasChild(ptcl,PID::HIGGS) ) {
170 cat.higgs = Particle(ptcl); ++Nhiggs;
174 if ( HSvtx==
nullptr && ptcl->production_vertex() && !
hasParent(ptcl,PID::HIGGS) )
175 HSvtx = ptcl->production_vertex();
181 "Current event has "+std::to_string(Nhiggs)+
" Higgs bosons. There must be only one.");
182 if (cat.higgs.children().size()<2)
184 "Could not identify Higgs boson decay products.");
186 if (HSvtx ==
nullptr)
195 bool is_uncatdV =
false;
196 Particles uncatV_decays;
197 FourMomentum uncatV_p4(0,0,0,0);
198 FourVector uncatV_v4(0,0,0,0);
200 if (
isVH(prodMode) ) {
201 for (
auto ptcl:Rivet::HepMCUtils::particles(HSvtx,Relatives::CHILDREN)) {
202 if (PID::isW(ptcl->pdg_id())) { ++nWs; cat.V=Particle(ptcl); }
203 if (PID::isZ(ptcl->pdg_id())) { ++nZs; cat.V=Particle(std::move(ptcl)); }
207 for (
auto ptcl:Rivet::HepMCUtils::particles(HSvtx,Relatives::CHILDREN)) {
208 if (!PID::isHiggs(ptcl->pdg_id())) {
209 uncatV_decays += Particle(ptcl);
210 uncatV_p4 += Particle(ptcl).momentum();
211 uncatV_v4 += Particle(std::move(ptcl)).origin();
214 is_uncatdV =
true; cat.V = Particle(24,uncatV_p4,uncatV_v4);
220 if (
isVH(prodMode) && !cat.V.genParticle()->end_vertex() )
223 if (
isVH(prodMode) && cat.V.children().size()<2 )
226 if ( ( prodMode==
HTXS::WH && (nZs>0||nWs!=1) ) ||
229 std::to_string(nZs)+
" Z-bosons. Inconsitent with VH expectation.");
236 for (
auto ptcl : Rivet::HepMCUtils::particles(std::move(HSvtx),Relatives::CHILDREN) ) {
237 if ( !PID::isTop(ptcl->pdg_id()) )
continue;
239 if (
top.genParticle()->end_vertex() )
240 for (
const auto &child:
top.children())
246 if ( (prodMode==
HTXS::TTH && Ws.size()<2) || (prodMode==
HTXS::TH && Ws.size()<1 ) )
251 for (
auto ptcl : Rivet::HepMCUtils::particles(std::move(HSvtx),Relatives::CHILDREN) ) {
252 if (PID::isW(ptcl->pdg_id())) {
268 Particles leptonicVs;
271 }
else leptonicVs = std::move(uncatV_decays);
272 for (
const auto & W:Ws )
if ( W.genParticle()->end_vertex() && !
quarkDecay(W) ) leptonicVs += W;
275 const Particles FS = apply<FinalState>(event,
"FS").particles();
277 FourMomentum sum(0,0,0,0), vSum(0,0,0,0), hSum(0,0,0,0);
278 for (
const Particle &p : FS ) {
282 if (
originateFrom(p,cat.higgs) ) { hSum += p.momentum();
continue; }
284 if (
isVH(prodMode) && !is_uncatdV &&
originateFrom(p,Ws) ) vSum += p.momentum();
286 if ( leptonicVs.size() &&
originateFrom(p,leptonicVs) )
continue;
291 cat.p4decay_higgs = hSum;
292 cat.p4decay_V = vSum;
295 FastJets jets(fps_temp,
296#
if RIVET_VERSION_CODE >= 40000
304 cat.jets25 = jets.jetsByPt( Cuts::pT > 25.0 );
305 cat.jets30 = jets.jetsByPt( Cuts::pT > 30.0 );
310 std::to_string(sum.pt())+
" GeV and m = "+std::to_string(sum.mass())+
" GeV");
323 cat.isZ2vvDecay =
false;
326 cat.stage1_cat_pTjet25GeV =
getStage1Category(prodMode,cat.higgs,cat.jets25,cat.V);
327 cat.stage1_cat_pTjet30GeV =
getStage1Category(prodMode,cat.higgs,cat.jets30,cat.V);
350 throw std::invalid_argument(
"Input value is out of bin range or bins vector is empty.");
353 for (
size_t i = 1; i <
bins.size(); ++i) {
355 return static_cast<int>(i - 1);
359 return static_cast<int>(
bins.size() - 1);
366 if (jets.size()<2)
return 0;
367 const FourMomentum &j1=jets[0].momentum(), &j2=jets[1].momentum();
368 bool VBFtopo = (j1+j2).mass() > 400.0 && std::abs(j1.rapidity()-j2.rapidity()) > 2.8;
369 return VBFtopo ? (j1+j2+higgs.momentum()).pt()<25 ? 2 : 1 : 0;
376 if (jets.size()<2)
return 0;
377 const FourMomentum &j1=jets[0].momentum(), &j2=jets[1].momentum();
378 double mjj = (j1+j2).mass();
379 if(mjj>350 && mjj<=700)
return (j1+j2+higgs.momentum()).pt()<25 ? 1 : 2;
380 else if(mjj>700)
return (j1+j2+higgs.momentum()).pt()<25 ? 3 : 4;
390 if (jets.size()<2)
return 0;
391 const FourMomentum &j1=jets[0].momentum(), &j2=jets[1].momentum();
392 double mjj = (j1+j2).mass();
393 if(mjj>350 && mjj<=700)
return (j1+j2+higgs.momentum()).pt()<25 ? 1 : 2;
394 else if(mjj>700 && mjj<=1000)
return (j1+j2+higgs.momentum()).pt()<25 ? 3 : 4;
395 else if(mjj>1000 && mjj<=1500)
return (j1+j2+higgs.momentum()).pt()<25 ? 5 : 6;
396 else if(mjj>1500)
return (j1+j2+higgs.momentum()).pt()<25 ? 7 : 8;
403 if (jets.size() < 2)
return 0;
404 const FourMomentum &j1 = jets[0].momentum(), &j2 = jets[1].momentum();
405 double mjj = (j1 + j2).mass();
406 double pthjj = (j1 + j2 + higgs.momentum()).pt();
412 int mjj_pthjj_bin = 0;
413 if (mjj > 350 && mjj <= 700)
414 mjj_pthjj_bin = pthjj < 25 ? 1 : 2;
415 else if (mjj > 700 && mjj <= 1000)
416 mjj_pthjj_bin = pthjj < 25 ? 3 : 4;
417 else if (mjj > 1000 && mjj <= 1500)
418 mjj_pthjj_bin = pthjj < 25 ? 5 : 6;
420 mjj_pthjj_bin = pthjj < 25 ? 7 : 8;
424 constexpr double pi = 3.14159265358979323846;
425 int deltaphijj_bin = mjj > 350 ? 8*
getBin(deltaphijj, {-1*
pi, -0.5*
pi, 0, 0.5*
pi,
pi}) : 0;
427 return deltaphijj_bin + mjj_pthjj_bin;
436 const Particle &higgs,
437 const Particle &V)
const {
439 int ctrlHiggs = std::abs(higgs.rapidity())<2.5;
447 return Category(prodMode*10 + ctrlHiggs);
452 const Particle &higgs,
454 const Particle &V)
const {
456 int Njets=jets.size(), ctrlHiggs = std::abs(higgs.rapidity())<2.5, fwdHiggs = !ctrlHiggs;
457 double pTj1 = jets.size() ? jets[0].momentum().pt() : 0;
478 if (std::abs(higgs.rapidity())>2.5)
return QQ2HQQ_FWDH;
482 double mjj = jets.size()>1 ? (jets[0].mom()+jets[1].mom()).mass():0;
518 const Particle &higgs,
520 const Particle &V)
const {
522 int Njets=jets.size(), ctrlHiggs = std::abs(higgs.rapidity())<2.5, fwdHiggs = !ctrlHiggs;
542 if (std::abs(higgs.rapidity())>2.5)
return QQ2HQQ_FWDH;
543 int Njets=jets.size();
547 double mjj = (jets[0].mom()+jets[1].mom()).mass();
551 else if ( mjj > 350 ) {
595 const Particle &higgs,
597 const Particle &V)
const {
599 int Njets=jets.size(), ctrlHiggs = std::abs(higgs.rapidity())<2.5, fwdHiggs = !ctrlHiggs;
606 if ( higgs.pt()>200 ){
608 double pTHj = (jets[0].momentum()+higgs.momentum()).pt();
618 double pTHjj = (jets[0].momentum()+jets[1].momentum()+higgs.momentum()).pt();
629 if (std::abs(higgs.rapidity())>2.5)
return QQ2HQQ_FWDH;
630 int Njets=jets.size();
634 double mjj = (jets[0].mom()+jets[1].mom()).mass();
635 double pTHjj = (jets[0].momentum()+jets[1].momentum()+higgs.momentum()).pt();
651 int Njets=jets.size();
659 int Njets=jets.size();
667 int Njets=jets.size();
683 const Jets &jets,
const Particle &V)
const {
685 int Njets = jets.size(), ctrlHiggs = std::abs(higgs.rapidity()) < 2.5, fwdHiggs = !ctrlHiggs;
703 if (std::abs(higgs.rapidity()) > 2.5)
return QQ2HQQ_FWDH;
704 int Njets = jets.size();
709 else if (Njets >= 2) {
710 double mjj = (jets[0].mom() + jets[1].mom()).mass();
713 else if (60 < mjj && mjj < 120)
715 else if (120 < mjj && mjj < 350)
717 else if (mjj > 350) {
718 if (higgs.pt() > 200)
728 else if (V.pt() < 75)
730 else if (V.pt() < 150)
732 else if (V.pt() < 250)
734 else if (V.pt() < 400)
736 else if (V.pt() < 600)
744 else if (V.pt() < 75)
746 else if (V.pt() < 150)
748 else if (V.pt() < 250)
750 else if (V.pt() < 400)
752 else if (V.pt() < 600)
760 else if (V.pt() < 75)
762 else if (V.pt() < 150)
764 else if (V.pt() < 250)
766 else if (V.pt() < 400)
768 else if (V.pt() < 600)
787 const Jets &jets,
const Particle &V,
const bool isTHW)
const {
789 int Njets = jets.size(), ctrlHiggs = std::abs(higgs.rapidity()) < 2.5, fwdHiggs = !ctrlHiggs;
793 std::cout <<
"[Event] pth = " << higgs.pt() <<
", yh = " << std::abs(higgs.rapidity()) <<
", njet = " << Njets <<
", ptv = " << V.pt() << std::endl;
795 double pthj = (jets[0].momentum() + higgs.momentum()).pt();
796 std::cout <<
"pthj/pth = " << pthj/higgs.pt() << std::endl;
799 double mjj = (jets[0].mom() + jets[1].mom()).mass();
800 double pthjj = (jets[0].momentum() + jets[1].momentum() + higgs.momentum()).pt();
802 jets[0].eta() > jets[1].eta()
805 std::cout <<
"mjj = " << mjj <<
", pthjj = " << pthjj <<
", dphijj = " << deltaphijj << std::endl;
811 if (higgs.pt() > 200) {
813 double pthj = (jets[0].momentum() + higgs.momentum()).pt();
814 if (pthj / higgs.pt() > 0.15)
824 double mjj = (jets[0].mom()+jets[1].mom()).mass();
825 double pthjj = (jets[0].momentum() + jets[1].momentum() + higgs.momentum()).pt();
839 if (std::abs(higgs.rapidity()) > 2.5)
return QQ2HQQ_FWDH;
840 int Njets = jets.size();
845 else if (Njets >= 2) {
846 double mjj = (jets[0].mom() + jets[1].mom()).mass();
847 double pthjj = (jets[0].momentum() + jets[1].momentum() + higgs.momentum()).pt();
849 if (higgs.pt() < 200){
861 if (higgs.pt() < 200)
863 else if (higgs.pt() < 450)
874 int Njets = jets.size();
883 int Njets = jets.size();
892 int Njets = jets.size();
922 printf(
"==============================================================\n");
923 printf(
"======== HiggsTemplateCrossSections Initialization =========\n");
924 printf(
"==============================================================\n");
928 char *pm_env = getenv(
"HIGGSPRODMODE");
929 string pm(pm_env==
nullptr?
"":pm_env);
940 MSG_WARNING(
"No HIGGSPRODMODE shell variable found. Needed when running Rivet stand-alone.");
951 printf(
"==============================================================\n");
953 printf(
"======== Sucessful Initialization =========\n");
954 printf(
"==============================================================\n");
964 const double weight = 1.;
967 int F=cat.stage0_cat%10,
P=cat.stage1_cat_pTjet30GeV/100;
971 static const vector<int> offset({0,1,13,19,24,29,33,35,37,39});
974 static const vector<int> offset1_2({0,1,18,29,35,41,47,53,55,57});
975 int off1_2 = offset1_2[
P];
977 static const vector<int> offset1_2_Fine({0,1,29,54,70,86,102,109,111,113});
978 int off1_2_Fine = offset1_2_Fine[
P];
980 static const vector<int> offset1_3({0,1,26,41,50,59,68,76,78,80});
981 int off1_3 = offset1_3[
P];
983 static const vector<int> offset1_3_fine({0,1,63,149,168,187,206,214,216,219});
984 int off1_3_fine = offset1_3_fine[
P];
1009 if (cat.jets30.size())
m_hist_pT_jet1->fill(cat.jets30[0].pt(),weight);
1010 if (cat.jets30.size()>=2) {
1011 const FourMomentum &j1 = cat.jets30[0].momentum(), &j2 = cat.jets30[1].momentum();
1014 m_hist_pT_Hjj->fill((j1+j2+cat.higgs.momentum()).pt(),weight);
1019 MSG_INFO (
" ====================================================== ");
1020 MSG_INFO (
" Higgs Template X-Sec Categorization Tool ");
1021 MSG_INFO (
" Status Code Summary ");
1022 MSG_INFO (
" ====================================================== ");
1023 bool allSuccess = (numEvents()==m_errorCount[
HTXS::SUCCESS]);
1024 if ( allSuccess )
MSG_INFO (
" >>>> All "<< m_errorCount[
HTXS::SUCCESS] <<
" events successfully categorized!");
1027 MSG_INFO (
" >>>> --> the following errors occured:");
1035 MSG_INFO (
" ====================================================== ");
1036 MSG_INFO (
" ====================================================== ");
1043 for (
auto hist:{
m_hist_stage0,
m_hist_stage1_pTjet25,
m_hist_stage1_pTjet30,
m_hist_stage1_2_pTjet25,
m_hist_stage1_2_pTjet30,
m_hist_stage1_2_fine_pTjet25,
m_hist_stage1_2_fine_pTjet30,
m_hist_stage1_3_pTjet25,
m_hist_stage1_3_pTjet30,
m_hist_stage1_3_fine_pTjet25,
m_hist_stage1_3_fine_pTjet30,
1101#ifdef RIVET_ANALYSIS_PATH
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
static const std::vector< std::string > bins
Define macros for attributes used to control the static checker.
Rivet routine for classifying MC events according to the Higgs template cross section categories.
Histo1DPtr m_hist_Njets25
int vbfTopology_Stage1_2_Fine(const Jets &jets, const Particle &higgs) const
VBF topology selection for Stage1_2 0 = fail loose selection: m_jj > 350 GeV 1 pass loose,...
HiggsTemplateCrossSections()
Histo1DPtr m_hist_stage1_2_fine_pTjet30
Histo1DPtr m_hist_stage1_3_pTjet25
HiggsClassification error(HiggsClassification &cat, HTXS::ErrorCode err, std::string_view msg={}, int NmaxWarnings=20) const
Returns the classification object with the error code set.
HTXS::HiggsProdMode m_HiggsProdMode
Histo1DPtr m_hist_stage1_2_fine_pTjet25
Histo1DPtr m_hist_stage1_pTjet30
bool originateFrom(const Particle &p, const Particle &p2) const
Whether particle p originates from p2.
void setHiggsProdMode(HTXS::HiggsProdMode prodMode)
Sets the Higgs production mode.
void init()
default Rivet Analysis::init method Booking of histograms, initializing Rivet projection Extracts Hig...
Histo1DPtr m_hist_stage1_2_pTjet30
bool originateFrom(const Particle &p, const Particles &ptcls) const
Whether particle p originate from any of the ptcls.
Histo1DPtr m_hist_y_Higgs
int vbfTopology_Stage1_2(const Jets &jets, const Particle &higgs) const
VBF topology selection 0 = fail loose selection: m_jj > 350 GeV 1 pass loose, but fail additional cut...
HTXS::Stage1_3::Category getStage1_3_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V) const
Stage-1.3 categorization.
bool isVH(HTXS::HiggsProdMode p) const
Whether the Higgs is produced in association with a vector boson (VH).
Histo1DPtr m_hist_pT_jet1
Particle getLastInstance(const Particle &ptcl) const
follow a "propagating" particle and return its last instance
Histo1DPtr m_hist_stage1_3_fine_pTjet25
HTXS::Stage1_2_Fine::Category getStage1_2_Fine_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V) const
Stage-1.2_Fine categorization.
bool quarkDecay(const Particle &p) const
Return true is particle decays to quarks.
bool hasParent(HepMC::ConstGenParticlePtr ptcl, int pdgID) const
Checks whether the input particle has a parent with a given PDGID.
int vbfTopology_Stage1_3_Fine(const Jets &jets, const Particle &higgs) const
VBF topology selection for Stage1_3 Includes additional deltaphijj binning.
int getBin(double x, const std::vector< double > &bins) const
Return bin index of x given the provided bin edges. 0=first bin, -1=underflow bin.
HiggsClassification classifyEvent(const Event &event, const HTXS::HiggsProdMode prodMode) const
Main classificaion method.
Histo1DPtr m_hist_Njets30
bool hasChild(HepMC::ConstGenParticlePtr ptcl, int pdgID) const
Checks whether the input particle has a child with a given PDGID.
Histo1DPtr m_hist_stage1_2_pTjet25
HTXS::Stage1::Category getStage1Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V) const
Stage-1 categorization.
HTXS::Stage1_3_Fine::Category getStage1_3_Fine_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V, const bool isTHW) const
Stage-1.3 Fine categorization.
Histo1DPtr m_hist_deltay_jj
void printClassificationSummary()
HTXS::Stage0::Category getStage0Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Particle &V) const
Stage-0 HTXS categorization.
Histo1DPtr m_hist_dijet_mass
void analyze(const Event &event)
bool ChLeptonDecay(const Particle &p) const
Return true if particle decays to charged leptons.
Histo1DPtr m_hist_stage1_3_fine_pTjet30
Histo1DPtr m_hist_stage1_3_pTjet30
Histo1DPtr m_hist_pT_Higgs
HTXS::Stage1_2::Category getStage1_2_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V) const
Stage-1.2 categorization.
std::array< std::atomic< size_t >, HTXS::NUM_ERRORCODES > m_errorCount ATLAS_THREAD_SAFE
Histo1DPtr m_hist_stage1_pTjet25
int vbfTopology(const Jets &jets, const Particle &higgs) const
VBF topolog selection 0 = fail loose selction: m_jj > 400 GeV and Dy_jj > 2.8 1 pass loose,...
The namespace of all packages in PhysicsAnalysis/JetTagging.
Two digit number of format PF P is digit for the physics process and F is 0 for |yH|>2....
@ QQ2HQQ_GE2J_MJJ_0_60_PTHJJ_GT25
@ GG2H_GE2J_MJJ_0_350_PTH_0_60_PTHJJ_0_25
@ QQ2HQQ_GE2J_MJJ_0_60_PTHJJ_0_25
@ QQ2HQQ_GE2J_MJJ_350_700_PTH_GT200_PTHJJ_0_25
@ GG2H_PTH_200_300_PTHJoverPTH_0_15
@ GG2H_GE2J_MJJ_0_350_PTH_0_60_PTHJJ_GT25
@ GG2H_PTH_200_300_PTHJoverPTH_GT15
Categorization Stage 1.2: Three digit integer of format PF Where P is a digit representing the proces...
@ GG2HLL_PTV_150_250_GE1J
@ QQ2HQQ_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_0_25
@ GG2H_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_0_25
@ QQ2HQQ_GE2J_MJJ_GT350_PTH_GT200
@ GG2H_GE2J_MJJ_0_350_PTH_0_60
@ QQ2HQQ_GE2J_MJJ_120_350
@ QQ2HQQ_GE2J_MJJ_0_60_PTH_0_200_PTHJJ_GT25
@ QQ2HQQ_GE2J_MJJ_0_60_PTH_0_200_PTHJJ_0_25
@ QQ2HQQ_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_0_25_DPHIJJ_MPI_MPIO2
@ GG2H_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_0_25_DPHIJJ_MPI_MPIO2
@ QQ2HQQ_GE2J_MJJ_0_60_PTH_GT200_PTHJJ_0_25
@ QQ2HQQ_GE2J_MJJ_350_700_PTH_200_450_PTHJJ_0_25_DPHIJJ_MPI_MPIO2
@ GG2H_GE2J_MJJ_0_350_PTH_0_30_PTHJJ_0_25
@ QQ2HQQ_GE2J_MJJ_350_700_PTH_GT450
@ QQ2HQQ_GE2J_MJJ_0_60_PTH_GT200_PTHJJ_GT25
@ GG2H_GE2J_MJJ_0_350_PTH_0_30_PTHJJ_GT25
Categorization Stage 1.3: Three digit integer of format PF Where P is a digit representing the proces...
@ QQ2HQQ_GE2J_MJJ_0_60_PTH_0_200
@ QQ2HQQ_GE2J_MJJ_120_350_PTH_GT200
@ GG2H_GE2J_MJJ_0_350_PTH_0_30
@ QQ2HQQ_GE2J_MJJ_120_350_PTH_0_200
@ QQ2HQQ_GE2J_MJJ_GT350_PTH_GT450
@ QQ2HQQ_GE2J_MJJ_60_120_PTH_0_200
@ QQ2HQQ_GE2J_MJJ_GT350_PTH_200_450
@ GG2HLL_PTV_250_400_GE1J
@ QQ2HLNU_PTV_250_400_GE1J
@ QQ2HQQ_GE2J_MJJ_0_60_PTH_GT200
@ QQ2HQQ_GE2J_MJJ_60_120_PTH_GT200
@ QQ2HLL_PTV_250_400_GE1J
Categorization Stage 1: Three digit integer of format PF Where P is a digit representing the process ...
@ QQ2HQQ_VBFTOPO_JET3VETO
@ QQ2HLL_PTV_150_250_GE1J
@ QQ2HLNU_PTV_150_250_GE1J
Higgs Template Cross Section namespace.
ErrorCode
Error code: whether the classification was successful or failed.
@ HS_VTX_IDENTIFICATION
failed to identify hard scatter vertex
@ PRODMODE_DEFINED
production mode not defined
@ SUCCESS
successful classification
@ VH_DECAY_IDENTIFICATION
failed to identify associated vector boson decay products
@ HIGGS_IDENTIFICATION
failed to identify Higgs boson
@ TOP_W_IDENTIFICATION
failed to identify top decay
@ HIGGS_DECAY_IDENTIFICATION
failed to identify Higgs boson decay products
@ MOMENTUM_CONSERVATION
failed momentum conservation
@ NUM_ERRORCODES
number of error codes (keep this unnumbered and last)
@ VH_IDENTIFICATION
failed to identify associated vector boson
HiggsProdMode
Higgs production modes, corresponding to input sample.
ConstGenVertexPtr signal_process_vertex(const GenEvent *e)
HepMC3::ConstGenParticlePtr ConstGenParticlePtr