1 #ifndef TRUTHRIVETTOOLS_HIGGSTEMPLATECROSSSECTIONS_CC 2 #define TRUTHRIVETTOOLS_HIGGSTEMPLATECROSSSECTIONS_CC 5 #include "Rivet/Analysis.hh" 6 #include "Rivet/Particle.hh" 7 #include "Rivet/Projections/FastJets.hh" 23 : Analysis(
"HiggsTemplateCrossSections"),
35 if ( ptcl.genParticle()->end_vertex() ) {
36 if ( !
hasChild(ptcl.genParticle(),ptcl.pdgId()) )
return ptcl;
44 const GenVertex* prodVtx = p.genParticle()->production_vertex();
45 if (prodVtx ==
nullptr)
return false;
47 for (
const auto & ancestor:
particles(prodVtx, HepMC::ancestors)){
48 for (
auto part:ptcls )
49 if ( ancestor==
part.genParticle() )
return true;
63 if (
child.pdgId()==pdgID)
return true;
70 if (
parent->pdg_id()==pdgID)
return true;
76 for (
auto child:p.children())
77 if (PID::isQuark(
child.pdgId()))
return true;
90 static int Nwarnings = 0;
91 if (
msg!=
"" && ++Nwarnings < NmaxWarnings )
104 HiggsClassification
cat;
105 cat.prodMode = prodMode;
113 "Unkown Higgs production mechanism. Cannot classify event." 114 " Classification for all events will most likely fail.");
122 GenVertex *HSvtx =
event.genEvent()->signal_process_vertex();
127 if ( !PID::isHiggs(ptcl->pdg_id()) )
continue;
129 if ( ptcl->end_vertex() && !
hasChild(ptcl,PID::HIGGS) ) {
130 cat.higgs =
Particle(ptcl); ++Nhiggs;
134 if ( HSvtx==
nullptr && ptcl->production_vertex() && !
hasParent(ptcl,PID::HIGGS) )
135 HSvtx = ptcl->production_vertex();
141 "Current event has "+std::to_string(Nhiggs)+
" Higgs bosons. There must be only one.");
142 if (cat.higgs.children().size()<2)
144 "Could not identify Higgs boson decay products.");
146 if (HSvtx ==
nullptr)
155 bool is_uncatdV =
false;
156 Particles uncatV_decays;
157 FourMomentum uncatV_p4(0,0,0,0);
158 FourVector uncatV_v4(0,0,0,0);
159 int nWs=0, nZs=0, nTop=0;
160 if (
isVH(prodMode) ) {
162 if (PID::isW(ptcl->pdg_id())) { ++nWs; cat.V=
Particle(ptcl); }
163 if (PID::isZ(ptcl->pdg_id())) { ++nZs; cat.V=
Particle(ptcl); }
168 if (!PID::isHiggs(ptcl->pdg_id())) {
170 uncatV_p4 +=
Particle(ptcl).momentum();
175 is_uncatdV =
true; cat.V =
Particle(24,uncatV_p4);
181 if (
isVH(prodMode) && !cat.V.genParticle()->end_vertex() )
184 if (
isVH(prodMode) && cat.V.children().size()<2 )
187 if ( ( prodMode==
HTXS::WH && (nZs>0||nWs!=1) ) ||
190 std::to_string(nZs)+
" Z-bosons. Inconsitent with VH expectation.");
198 if ( !PID::isTop(ptcl->pdg_id()) )
continue;
201 if ( top.genParticle()->end_vertex() )
202 for (
auto child:top.children())
208 if ( (prodMode==
HTXS::TTH && Ws.size()<2) || (prodMode==
HTXS::TH && Ws.empty() ) )
220 Particles leptonicVs;
223 }
else leptonicVs = uncatV_decays;
224 for (
auto W:Ws )
if ( W.genParticle()->end_vertex() && !
quarkDecay(W) ) leptonicVs += W;
227 const ParticleVector FS = applyProjection<FinalState>(
event,
"FS").
particles();
229 FourMomentum sum(0,0,0,0), vSum(0,0,0,0), hSum(0,0,0,0);
238 if ( !leptonicVs.empty() &&
originateFrom(
p,leptonicVs) )
continue;
243 cat.p4decay_higgs = hSum;
244 cat.p4decay_V = vSum;
247 FastJets
jets(fps_temp, FastJets::ANTIKT, 0.4 );
250 cat.jets25 = jets.jetsByPt(
Cuts::pT > 25.0 );
251 cat.jets30 = jets.jetsByPt(
Cuts::pT > 30.0 );
271 cat.stage1_cat_pTjet25GeV =
getStage1Category(prodMode,cat.higgs,cat.jets25,cat.V);
272 cat.stage1_cat_pTjet30GeV =
getStage1Category(prodMode,cat.higgs,cat.jets30,cat.V);
286 for (
size_t i=1;
i<bins.size();++
i)
287 if (x<bins[
i])
return i-1;
288 return bins.size()-1;
295 if (jets.size()<2)
return 0;
296 const FourMomentum &j1=jets[0].momentum(), &j2=jets[1].momentum();
297 bool VBFtopo = (j1+j2).
mass() > 400.0 &&
std::abs(j1.rapidity()-j2.rapidity()) > 2.8;
298 return VBFtopo ? (j1+j2+higgs.momentum()).
pt()<25 ? 2 : 1 : 0;
309 int ctrlHiggs =
std::abs(higgs.rapidity())<2.5;
317 return Category(prodMode*10 + ctrlHiggs);
326 int Njets=jets.size(), ctrlHiggs =
std::abs(higgs.rapidity())<2.5, fwdHiggs = !ctrlHiggs;
327 double pTj1 = !jets.empty() ? jets[0].momentum().pt() : 0;
352 double mjj = jets.size()>1 ? (jets[0].mom()+jets[1].mom()).
mass():0;
399 printf(
"==============================================================\n");
400 printf(
"======== HiggsTemplateCrossSections Initialization =========\n");
401 printf(
"==============================================================\n");
405 char *pm_env = getenv(
"HIGGSPRODMODE");
406 string pm(pm_env==
nullptr?
"":pm_env);
417 MSG_WARNING(
"No HIGGSPRODMODE shell variable found. Needed when running Rivet stand-alone.");
423 addProjection(FS,
"FS");
428 printf(
"==============================================================\n");
430 printf(
"======== Sucessful Initialization =========\n");
431 printf(
"==============================================================\n");
441 const double weight =
event.weight();
444 int F=cat.stage0_cat%10,
P=cat.stage1_cat_pTjet30GeV/100;
445 hist_stage0->fill( cat.stage0_cat/10*2+F, weight );
448 vector<int>
offset({0,1,13,19,24,29,33,35,37,39});
463 if (cat.jets30.size()>=2) {
464 const FourMomentum &j1 = cat.jets30[0].momentum(), &j2 = cat.jets30[1].momentum();
472 MSG_INFO (
" ====================================================== ");
473 MSG_INFO (
" Higgs Template X-Sec Categorization Tool ");
474 MSG_INFO (
" Status Code Summary ");
475 MSG_INFO (
" ====================================================== ");
480 MSG_INFO (
" >>>> --> the following errors occured:");
488 MSG_INFO (
" ====================================================== ");
489 MSG_INFO (
" ====================================================== ");
511 hist_pT_V = bookHisto1D(
"pT_V",80,0,400);
540 #ifdef RIVET_ANALYSIS_PATH
std::map< HTXS::ErrorCode, size_t > m_errorCount
int vbfTopology(const Jets &jets, const Particle &higgs)
VBF topolog selection 0 = fail loose selction: m_jj > 400 GeV and Dy_jj > 2.8 1 pass loose...
bool isVH(HTXS::HiggsProdMode p)
Whether the Higgs is produced in association with a vector boson (VH)
failed to identify associated vector boson
int getBin(double x, std::vector< double > bins)
Return bin index of x given the provided bin edges. 0=first bin, -1=underflow bin.
ErrorCode
Error code: whether the classification was successful or failed.
bool originateFrom(const Particle &p, const Particle &p2)
Whether particle p originates from p2.
successful classification
void printClassificationSummary()
bool hasParent(const GenParticle *ptcl, int pdgID)
Checks whether the input particle has a parent with a given PDGID.
0: Unidentified isolated particle
HiggsTemplateCrossSections()
HTXS::Stage1::Category getStage1Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V)
Stage-1 categorization.
failed to identify Higgs boson decay products
HiggsProdMode
Higgs production modes, corresponding to input sample.
Histo1DPtr hist_dijet_mass
void init() override
default Rivet Analysis::init method Booking of histograms, initializing Rivet projection Extracts Hig...
HTXS::HiggsProdMode m_HiggsProdMode
void analyze(const Event &event) override
bool hasChild(const GenParticle *ptcl, int pdgID)
Checks whether the input particle has a child with a given PDGID.
bool quarkDecay(const Particle &p)
Return true is particle decays to quarks.
failed momentum conservation
DECLARE_RIVET_PLUGIN(CMS_2013_I1224539_DIJET)
Particle getLastInstance(Particle ptcl)
follow a "propagating" particle and return its last instance
Abs< T >::type abs(const T &t)
Namespace for Stage0 categorization.
Higgs Template Cross Section namespace.
failed to identify associated vector boson decay products
void setHiggsProdMode(HTXS::HiggsProdMode prodMode)
Sets the Higgs production mode.
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
HiggsClassification classifyEvent(const Event &event, const HTXS::HiggsProdMode prodMode)
Main classificaion method.
failed to identify Higgs boson
Histo1DPtr hist_stage1_pTjet30
Rivet routine for classifying MC events according to the Higgs template cross section categories...
failed to identify hard scatter vertex
std::pair< OmniClusterRef, TrackingParticleRef > P
HTXS::Stage0::Category getStage0Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Particle &V)
Stage-0 HTXS categorization.
HiggsClassification error(HiggsClassification &cat, HTXS::ErrorCode err, std::string msg="", int NmaxWarnings=20)
Returns the classification object with the error code set. Prints an warning message, and keeps track of number of errors.
bool originateFrom(const Particle &p, const Particles &ptcls)
Whether particle p originate from any of the ptcls.
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Histo1DPtr hist_stage1_pTjet25
production mode not defined
Histo1DPtr hist_deltay_jj
failed to identify top decay