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" 25 : Analysis(
"HiggsTemplateCrossSections"),
37 if ( ptcl.genParticle()->end_vertex() ) {
38 if ( !
hasChild(ptcl.genParticle(),ptcl.pdgId()) )
return ptcl;
46 const GenVertex* prodVtx = p.genParticle()->production_vertex();
47 if (prodVtx ==
nullptr)
return false;
49 for (
const auto & ancestor:
particles(prodVtx, HepMC::ancestors)){
50 for (
auto part:ptcls )
51 if ( ancestor==
part.genParticle() )
return true;
65 if (
child.pdgId()==pdgID)
return true;
73 if (
parent->pdg_id()==pdgID)
return true;
79 for (
auto child:p.children()) {
80 if (PID::isQuark(
child.pdgId()))
return true;
87 for (
auto child : p.children()) {
88 if (PID::isChLepton(
child.pdgId())) {
104 static std::atomic<int> Nwarnings{0};
105 if ( !
msg.empty() && ++Nwarnings < NmaxWarnings )
118 HiggsClassification
cat;
119 cat.prodMode = prodMode;
135 "Unkown Higgs production mechanism. Cannot classify event." 136 " Classification for all events will most likely fail.");
144 GenVertex *HSvtx =
event.genEvent()->signal_process_vertex();
149 if ( !PID::isHiggs(ptcl->pdg_id()) )
continue;
151 if ( ptcl->end_vertex() && !
hasChild(ptcl,PID::HIGGS) ) {
152 cat.higgs =
Particle(ptcl); ++Nhiggs;
156 if ( HSvtx==
nullptr && ptcl->production_vertex() && !
hasParent(ptcl,PID::HIGGS) )
157 HSvtx = ptcl->production_vertex();
163 "Current event has "+std::to_string(Nhiggs)+
" Higgs bosons. There must be only one.");
164 if (cat.higgs.children().size()<2)
166 "Could not identify Higgs boson decay products.");
168 if (HSvtx ==
nullptr)
177 bool is_uncatdV =
false;
178 Particles uncatV_decays;
179 FourMomentum uncatV_p4(0,0,0,0);
180 FourVector uncatV_v4(0,0,0,0);
181 int nWs=0, nZs=0, nTop=0;
182 if (
isVH(prodMode) ) {
184 if (PID::isW(ptcl->pdg_id())) { ++nWs; cat.V=
Particle(ptcl); }
185 if (PID::isZ(ptcl->pdg_id())) { ++nZs; cat.V=
Particle(ptcl); }
190 if (!PID::isHiggs(ptcl->pdg_id())) {
192 uncatV_p4 +=
Particle(ptcl).momentum();
197 is_uncatdV =
true; cat.V =
Particle(24,uncatV_p4);
203 if (
isVH(prodMode) && !cat.V.genParticle()->end_vertex() )
206 if (
isVH(prodMode) && cat.V.children().size()<2 )
209 if ( ( prodMode==
HTXS::WH && (nZs>0||nWs!=1) ) ||
212 std::to_string(nZs)+
" Z-bosons. Inconsitent with VH expectation.");
220 if ( !PID::isTop(ptcl->pdg_id()) )
continue;
223 if ( top.genParticle()->end_vertex() )
224 for (
auto child:top.children())
230 if ( (prodMode==
HTXS::TTH && Ws.size()<2) || (prodMode==
HTXS::TH && Ws.empty() ) )
242 Particles leptonicVs;
245 }
else leptonicVs = uncatV_decays;
246 for (
auto W:Ws )
if ( W.genParticle()->end_vertex() && !
quarkDecay(W) ) leptonicVs += W;
249 const ParticleVector FS = applyProjection<FinalState>(
event,
"FS").
particles();
251 FourMomentum sum(0,0,0,0), vSum(0,0,0,0), hSum(0,0,0,0);
260 if ( !leptonicVs.empty() &&
originateFrom(
p,leptonicVs) )
continue;
265 cat.p4decay_higgs = hSum;
266 cat.p4decay_V = vSum;
269 FastJets
jets(fps_temp, FastJets::ANTIKT, 0.4 );
272 cat.jets25 = jets.jetsByPt(
Cuts::pT > 25.0 );
273 cat.jets30 = jets.jetsByPt(
Cuts::pT > 30.0 );
292 cat.isZ2vvDecay =
false;
294 cat.isZ2vvDecay =
true;
296 cat.stage1_cat_pTjet25GeV =
getStage1Category(prodMode, cat.higgs, cat.jets25, cat.V);
297 cat.stage1_cat_pTjet30GeV =
getStage1Category(prodMode, cat.higgs, cat.jets30, cat.V);
321 for (
size_t i=1;
i<bins.size();++
i)
322 if (x<bins[
i])
return i-1;
323 return bins.size()-1;
330 if (jets.size()<2)
return 0;
331 const FourMomentum &j1=jets[0].momentum(), &j2=jets[1].momentum();
332 bool VBFtopo = (j1+j2).
mass() > 400.0 &&
std::abs(j1.rapidity()-j2.rapidity()) > 2.8;
333 return VBFtopo ? (j1+j2+higgs.momentum()).
pt()<25 ? 2 : 1 : 0;
343 const FourMomentum &j1 = jets[0].momentum(), &j2 = jets[1].momentum();
344 double mjj = (j1 + j2).
mass();
345 if (mjj > 350 && mjj <= 700)
346 return (j1 + j2 + higgs.momentum()).
pt() < 25 ? 1 : 2;
348 return (j1 + j2 + higgs.momentum()).
pt() < 25 ? 3 : 4;
362 const FourMomentum &j1 = jets[0].momentum(), &j2 = jets[1].momentum();
363 double mjj = (j1 + j2).
mass();
364 if (mjj > 350 && mjj <= 700)
365 return (j1 + j2 + higgs.momentum()).
pt() < 25 ? 1 : 2;
366 else if (mjj > 700 && mjj <= 1000)
367 return (j1 + j2 + higgs.momentum()).
pt() < 25 ? 3 : 4;
368 else if (mjj > 1000 && mjj <= 1500)
369 return (j1 + j2 + higgs.momentum()).
pt() < 25 ? 5 : 6;
371 return (j1 + j2 + higgs.momentum()).
pt() < 25 ? 7 : 8;
384 int ctrlHiggs =
std::abs(higgs.rapidity())<2.5;
392 return Category(prodMode*10 + ctrlHiggs);
401 int Njets=jets.size(), ctrlHiggs =
std::abs(higgs.rapidity())<2.5, fwdHiggs = !ctrlHiggs;
402 double pTj1 = !jets.empty() ? jets[0].momentum().pt() : 0;
427 double mjj = jets.size()>1 ? (jets[0].mom()+jets[1].mom()).
mass():0;
467 int Njets = jets.size(), ctrlHiggs =
std::abs(higgs.rapidity()) < 2.5, fwdHiggs = !ctrlHiggs;
488 int Njets=jets.size();
492 double mjj = (jets[0].mom()+jets[1].mom()).
mass();
496 else if ( mjj > 350 ) {
541 int Njets = jets.size(), ctrlHiggs =
std::abs(higgs.rapidity()) < 2.5, fwdHiggs = !ctrlHiggs;
553 double pTHjj = (jets[0].momentum()+jets[1].momentum()+higgs.momentum()).
pt();
565 int Njets=jets.size();
569 double mjj = (jets[0].mom()+jets[1].mom()).
mass();
570 double pTHjj = (jets[0].momentum()+jets[1].momentum()+higgs.momentum()).
pt();
586 int Njets=jets.size();
594 int Njets=jets.size();
602 int Njets=jets.size();
620 int Njets = jets.size(), ctrlHiggs =
std::abs(higgs.rapidity()) < 2.5, fwdHiggs = !ctrlHiggs;
628 if (higgs.pt() > 200)
645 if (
std::abs(higgs.rapidity()) > 2.5)
647 int Njets = jets.size();
652 else if (Njets >= 2) {
653 double mjj = (jets[0].mom() + jets[1].mom()).
mass();
656 else if (60 < mjj && mjj < 120)
658 else if (120 < mjj && mjj < 350)
660 else if (mjj > 350) {
661 if (higgs.pt() > 200)
672 else if (V.pt() < 75)
674 else if (V.pt() < 150)
676 else if (V.pt() > 250)
685 else if (V.pt() < 75)
687 else if (V.pt() < 150)
689 else if (V.pt() > 250)
698 else if (V.pt() < 75)
700 else if (V.pt() < 150)
702 else if (V.pt() > 250)
725 int Njets = jets.size(), ctrlHiggs =
std::abs(higgs.rapidity()) < 2.5, fwdHiggs = !ctrlHiggs;
733 if (higgs.pt() > 200) {
735 double pTHj = (jets[0].momentum() + higgs.momentum()).
pt();
736 if (pTHj / higgs.pt() > 0.15)
749 double pTHjj = (jets[0].momentum() + jets[1].momentum() + higgs.momentum()).
pt();
763 if (
std::abs(higgs.rapidity()) > 2.5)
765 int Njets = jets.size();
770 else if (Njets >= 2) {
771 double mjj = (jets[0].mom() + jets[1].mom()).
mass();
772 double pTHjj = (jets[0].momentum() + jets[1].momentum() + higgs.momentum()).
pt();
779 if (higgs.pt() < 200) {
791 int Njets = jets.size();
802 int Njets = jets.size();
813 int Njets = jets.size();
846 printf(
"==============================================================\n");
847 printf(
"======== HiggsTemplateCrossSections Initialization =========\n");
848 printf(
"==============================================================\n");
852 char *pm_env = getenv(
"HIGGSPRODMODE");
853 string pm(pm_env==
nullptr?
"":pm_env);
864 MSG_WARNING(
"No HIGGSPRODMODE shell variable found. Needed when running Rivet stand-alone.");
870 addProjection(FS,
"FS");
875 printf(
"==============================================================\n");
877 printf(
"======== Sucessful Initialization =========\n");
878 printf(
"==============================================================\n");
888 const double weight =
event.weight();
891 int F=cat.stage0_cat%10,
P=cat.stage1_cat_pTjet30GeV/100;
892 hist_stage0->fill( cat.stage0_cat/10*2+F, weight );
895 vector<int>
offset({0,1,13,19,24,29,33,35,37,39});
901 static vector<int> offset1_2({0, 1, 18, 29, 35, 41, 47, 53, 55, 57});
902 int off1_2 = offset1_2[
P];
904 static vector<int> offset1_2f({0, 1, 29, 54, 70, 86, 102, 109, 111, 113});
905 int off1_2f = offset1_2f[
P];
923 if (cat.jets30.size()>=2) {
924 const FourMomentum &j1 = cat.jets30[0].momentum(), &j2 = cat.jets30[1].momentum();
932 MSG_INFO (
" ====================================================== ");
933 MSG_INFO (
" Higgs Template X-Sec Categorization Tool ");
934 MSG_INFO (
" Status Code Summary ");
935 MSG_INFO (
" ====================================================== ");
940 MSG_INFO (
" >>>> --> the following errors occured:");
948 MSG_INFO (
" ====================================================== ");
949 MSG_INFO (
" ====================================================== ");
989 hist_pT_V = bookHisto1D(
"pT_V",80,0,400);
1022 #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.
HTXS::Stage1_2_Fine::Category getStage1_2_Fine_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V)
Stage-1.2 Fine categorization.
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.
int vbfTopology_Stage1_X_Fine(const Jets &jets, const Particle &higgs)
VBF topology selection for Stage1.1 and Stage 1.2 Fine 0 = fail loose selection: m_jj > 350 GeV 1 pas...
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.
HTXS::Stage1_1::Category getStage1_1_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V)
Stage-1.1 categorization.
bool ChLeptonDecay(const Particle &p)
Return true if particle decays to charged leptons.
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
HTXS::Stage1_1_Fine::Category getStage1_1_Fine_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V)
Stage-1_1 categorization.
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.
Histo1DPtr hist_stage1_2_pTjet25
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.
Histo1DPtr hist_stage1_2_pTjet30
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.
HTXS::Stage1_2::Category getStage1_2_Category(const HTXS::HiggsProdMode prodMode, const Particle &higgs, const Jets &jets, const Particle &V)
Stage-1.2 categorization.
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Histo1DPtr hist_stage1_2_fine_pTjet30
Histo1DPtr hist_stage1_pTjet25
production mode not defined
Histo1DPtr hist_deltay_jj
Histo1DPtr hist_stage1_2_fine_pTjet25
int vbfTopology_Stage1_X(const Jets &jets, const Particle &higgs)
VBF topology selection Stage1.1 and Stage1.2 0 = fail loose selection: m_jj > 350 GeV 1 pass loose...
failed to identify top decay