Rivet analyses referenceATLAS_2016_CONF_2016_078ATLAS ICHEP16 0-lepton SUSY search at 13 \text{TeV} with 13.2/fbExperiment: ATLAS (LHC) Status: VALIDATED Authors:
Beams: p+ p+ Beam energies: (6500.0, 6500.0) GeV Run details:
ATLAS search for SUSY in 13 TeV $pp$ collisions at LHC Run 2, using 13.2/fb of integrated luminosity and events containing missing transverse momentum and no isolated high-energy leptons. Detailed info: https://atlas.web.cern.ch/Atlas/GROUPS/PHYSICS/CONFNOTES/ATLAS-CONF-2016-078/ Source code: ATLAS_2016_CONF_2016_078.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/PromptFinalState.hh"
5#include "Rivet/Projections/FastJets.hh"
6#include "Rivet/Projections/Sphericity.hh"
7#include "Rivet/Projections/SmearedParticles.hh"
8#include "Rivet/Projections/SmearedJets.hh"
9#include "Rivet/Projections/SmearedMET.hh"
10#include "Rivet/Tools/Cutflow.hh"
11
12namespace Rivet {
13
14
15 /// @brief ATLAS 2016 0-lepton SUSY search, from 13/fb ICHEP'16 CONF note
16 class ATLAS_2016_CONF_2016_078 : public Analysis {
17 public:
18
19 /// Constructor
20 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_CONF_2016_078);
21
22
23 /// @name Analysis methods
24 /// @{
25
26 /// Book histograms and initialise projections before the run
27 void init() {
28
29 // Initialise and register projections
30 FinalState calofs(Cuts::abseta < 3.2);
31 FastJets fj(calofs, JetAlg::ANTIKT, 0.4);
32 declare(fj, "TruthJets");
33 declare(SmearedJets(fj, JET_SMEAR_ATLAS_RUN2, //JET_BTAG_ATLAS_RUN2_MV2C10
34 [](const Jet& j) {
35 if (j.abseta() > 2.5) return 0.;
36 return j.bTagged(Cuts::pT > 5*GeV) ? 0.77 : j.cTagged(Cuts::pT > 5*GeV) ? 1/6. : 1/134.;
37 }), "RecoJets");
38
39 MissingMomentum mm(calofs);
40 declare(mm, "TruthMET");
41 declare(SmearedMET(mm, MET_SMEAR_ATLAS_RUN2), "RecoMET");
42
43 PromptFinalState es(Cuts::abseta < 2.47 && Cuts::abspid == PID::ELECTRON, TauDecaysAs::PROMPT, MuDecaysAs::PROMPT);
44 declare(es, "TruthElectrons");
45 declare(SmearedParticles(es, ELECTRON_RECOEFF_ATLAS_RUN2, ELECTRON_SMEAR_ATLAS_RUN2), "RecoElectrons");
46
47 PromptFinalState mus(Cuts::abseta < 2.7 && Cuts::abspid == PID::MUON, TauDecaysAs::PROMPT);
48 declare(mus, "TruthMuons");
49 declare(SmearedParticles(mus, MUON_EFF_ATLAS_RUN2, MUON_SMEAR_ATLAS_RUN2), "RecoMuons");
50
51
52 // Book histograms/counters
53 book(_h_2j_0800,"2j-0800");
54 book(_h_2j_1200,"2j-1200");
55 book(_h_2j_1600,"2j-1600");
56 book(_h_2j_2000,"2j-2000");
57 book(_h_3j_1200,"3j-1200");
58 book(_h_4j_1000,"4j-1000");
59 book(_h_4j_1400,"4j-1400");
60 book(_h_4j_1800,"4j-1800");
61 book(_h_4j_2200,"4j-2200");
62 book(_h_4j_2600,"4j-2600");
63 book(_h_5j_1400,"5j-1400");
64 book(_h_6j_1800,"6j-1800");
65 book(_h_6j_2200,"6j-2200");
66
67
68 // Book cut-flows
69 const vector<string> cuts23j = {"Pre-sel+MET+pT1+meff", "Njet", "Dphi_min(j123,MET)",
70 "Dphi_min(j4+,MET)", "pT2", "eta_j12", "MET/sqrtHT", "m_eff(incl)"};
71 const vector<string> cuts456j = {"Pre-sel+MET+pT1+meff", "Njet", "Dphi_min(j123,MET)",
72 "Dphi_min(j4+,MET)", "pT4", "eta_j1234", "Aplanarity", "MET/m_eff(Nj)", "m_eff(incl)"};
73 book(_flows, {"CF-2j-0800", "CF-2j-1200", "CF-2j-1600", "CF-2j-2000", "CF-3j-1200",
74 "CF-4j-1000", "CF-4j-1400", "CF-4j-1800", "CF-4j-2200", "CF-4j-2600",
75 "CF-5j-1400", "CF-6j-1800", "CF-6j-2200"});
76 for (auto& b : _flows->bins()) {
77 if (b.index() < 6) book(b, b.xEdge(), cuts23j);
78 else book(b, b.xEdge(), cuts456j);
79 }
80
81 }
82
83
84 /// Perform the per-event analysis
85 void analyze(const Event& event) {
86
87 _flows->groupfillinit();
88
89 // Same MET cut for all signal regions
90 const Vector3 vmet = -apply<SmearedMET>(event, "RecoMET").vectorEt();
91 const double met = vmet.mod();
92 if (met < 250*GeV) vetoEvent;
93
94 // Get baseline electrons, muons, and jets
95 Particles elecs = apply<ParticleFinder>(event, "RecoElectrons").particles(Cuts::pT > 10*GeV);
96 Particles muons = apply<ParticleFinder>(event, "RecoMuons").particles(Cuts::pT > 10*GeV);
97 Jets jets = apply<JetFinder>(event, "RecoJets").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 2.8); ///< @todo Pile-up subtraction
98
99 // Jet/electron/muons overlap removal and selection
100 // Remove electrons within dR = 0.2 of a b-tagged jet
101 for (const Jet& j : jets)
102 if (j.abseta() < 2.5 && j.pT() > 50*GeV && j.bTagged(Cuts::pT > 5*GeV))
103 idiscard(elecs, deltaRLess(j, 0.2, RAPIDITY));
104 // Remove any |eta| < 2.8 jet within dR = 0.2 of a remaining electron
105 for (const Particle& e : elecs)
106 idiscard(jets, deltaRLess(e, 0.2, RAPIDITY));
107 // Remove any electron with dR in [0.2, 0.4] of a remaining jet
108 for (const Jet& j : jets)
109 idiscard(elecs, [&](const Particle& e) { return inRange(deltaR(e,j, RAPIDITY), 0.2, 0.4); });
110 // Remove any muon with dR close to a remaining jet, via a functional form
111 for (const Jet& j : jets)
112 idiscard(muons, [&](const Particle& m) { return deltaR(m,j, RAPIDITY) < min(0.4, 0.04 + 10*GeV/m.pT()); });
113 // Remove any |eta| < 2.8 jet within dR = 0.2 of a remaining muon if track conditions are met
114 for (const Particle& m : muons)
115 /// @todo Add track efficiency random filtering
116 idiscard(jets, [&](const Jet& j) {
117 if (deltaR(j,m, RAPIDITY) > 0.2) return false;
118 const Particles trks = j.particles(Cuts::abscharge > 0 && Cuts::pT > 0.5*GeV);
119 return trks.size() < 3 || (m.pT() > 2*j.pT() && m.pT() > 0.7*sum(trks, pT, 0.0));
120 });
121 // Loose electron selection
122 iselect(elecs, ParticleEffFilter(ELECTRON_EFF_ATLAS_RUN2_LOOSE));
123
124 // Veto the event if there are any remaining baseline leptons
125 if (!elecs.empty()) vetoEvent;
126 if (!muons.empty()) vetoEvent;
127
128 // Passed presel & MET
129 _flows->groupfillnext();
130
131 // Get jets and their pTs
132 const Jets jets20 = jets;
133 const Jets jets50 = select(jets, Cuts::pT > 50*GeV);
134 const size_t njets50 = jets50.size(), njets20 = jets20.size();
135 if (jets50.size() < 2) vetoEvent;
136 vector<double> jetpts20, jetpts50;
137 transform(jets20, jetpts20, Kin::pT);
138 transform(jets50, jetpts50, Kin::pT);
139
140 // Construct multi-jet observables
141 const double ht = sum(jetpts20, 0.0);
142 const double met_sqrtHT = met / sqrt(ht);
143 const double meff_incl = sum(jetpts50, met);
144 const double meff_4 = (njets50 >= 4) ? sum(head(jetpts50, 4), met) : -1;
145 const double meff_5 = (njets50 >= 5) ? sum(head(jetpts50, 5), met) : -1;
146 const double meff_6 = (njets50 >= 6) ? sum(head(jetpts50, 6), met) : -1;
147 const double met_meff_4 = met / meff_4;
148 const double met_meff_5 = met / meff_5;
149 const double met_meff_6 = met / meff_6;
150
151 // Jet |eta|s
152 vector<double> jetetas20; transform(jets20, jetetas20, abseta);
153 const double etamax_2 = (njets20 >= 2) ? max(head(jetetas20, 2)) : -1;
154 const double etamax_4 = (njets20 >= 4) ? max(head(jetetas20, 4)) : -1;
155 const double etamax_6 = (njets20 >= 6) ? max(head(jetetas20, 6)) : -1;
156
157 // Get dphis between MET and jets
158 vector<double> dphimets50; transform(jets50, dphimets50, deltaPhiWRT(vmet));
159 const vector<double> dphimets50_123 = head(dphimets50, 3);
160 const vector<double> dphimets50_more = tail(dphimets50, -3);
161 const double dphimin_123 = !dphimets50_123.empty() ? min(dphimets50_123) : -1;
162 const double dphimin_more = !dphimets50_more.empty() ? min(dphimets50_more) : -1;
163
164 // Jet aplanarity
165 Sphericity sph; sph.calc(jets50);
166 const double aplanarity = sph.aplanarity();
167
168
169 //////////////////
170
171
172 // 2 jet regions
173 if (dphimin_123 > 0.8 && dphimin_more > 0.4) {
174 if (jetpts50[1] > 200*GeV && etamax_2 < 0.8) { //< implicit pT[0] cut
175 if (met_sqrtHT > 14*sqrt(GeV) && meff_incl > 800*GeV) _h_2j_0800->fill();
176 }
177 if (jetpts50[1] > 250*GeV && etamax_2 < 1.2) { //< implicit pT[0] cut
178 if (met_sqrtHT > 16*sqrt(GeV) && meff_incl > 1200*GeV) _h_2j_1200->fill();
179 if (met_sqrtHT > 18*sqrt(GeV) && meff_incl > 1600*GeV) _h_2j_1600->fill();
180 if (met_sqrtHT > 20*sqrt(GeV) && meff_incl > 2000*GeV) _h_2j_2000->fill();
181 }
182 }
183
184 // 3 jet region
185 if (njets50 >= 3 && dphimin_123 > 0.4 && dphimin_more > 0.2) {
186 if (jetpts50[0] > 600*GeV && jetpts50[2] > 50*GeV) { //< implicit pT[1] cut
187 if (met_sqrtHT > 16*sqrt(GeV) && meff_incl > 1200*GeV) _h_3j_1200->fill();
188 }
189 }
190
191 // 4 jet regions (note implicit pT[1,2] cuts)
192 if (njets50 >= 4 && dphimin_123 > 0.4 && dphimin_more > 0.4 && jetpts50[0] > 200*GeV && aplanarity > 0.04) {
193 if (jetpts50[3] > 100*GeV && etamax_4 < 1.2 && met_meff_4 > 0.25*sqrt(GeV) && meff_incl > 1000*GeV) _h_4j_1000->fill();
194 if (jetpts50[3] > 100*GeV && etamax_4 < 2.0 && met_meff_4 > 0.25*sqrt(GeV) && meff_incl > 1400*GeV) _h_4j_1400->fill();
195 if (jetpts50[3] > 100*GeV && etamax_4 < 2.0 && met_meff_4 > 0.20*sqrt(GeV) && meff_incl > 1800*GeV) _h_4j_1800->fill();
196 if (jetpts50[3] > 150*GeV && etamax_4 < 2.0 && met_meff_4 > 0.20*sqrt(GeV) && meff_incl > 2200*GeV) _h_4j_2200->fill();
197 if (jetpts50[3] > 150*GeV && met_meff_4 > 0.20*sqrt(GeV) && meff_incl > 2600*GeV) _h_4j_2600->fill();
198 }
199
200 // 5 jet region (note implicit pT[1,2,3] cuts)
201 if (njets50 >= 5 && dphimin_123 > 0.4 && dphimin_more > 0.2 && jetpts50[0] > 500*GeV) {
202 if (jetpts50[4] > 50*GeV && met_meff_5 > 0.3*sqrt(GeV) && meff_incl > 1400*GeV) _h_5j_1400->fill();
203 }
204
205 // 6 jet regions (note implicit pT[1,2,3,4] cuts)
206 if (njets50 >= 6 && dphimin_123 > 0.4 && dphimin_more > 0.2 && jetpts50[0] > 200*GeV && aplanarity > 0.08) {
207 if (jetpts50[5] > 50*GeV && etamax_6 < 2.0 && met_meff_6*sqrt(GeV) > 0.20 && meff_incl > 1800*GeV) _h_6j_1800->fill();
208 if (jetpts50[5] > 100*GeV && met_meff_6*sqrt(GeV) > 0.15 && meff_incl > 2200*GeV) _h_6j_2200->fill();
209 }
210
211 // Cutflows
212 _flows->fillnext("CF-2j-0800", {true, dphimin_123 > 0.8, dphimin_more > 0.4, jetpts50[1] > 200*GeV,
213 etamax_2 < 0.8, met_sqrtHT > 14*sqrt(GeV), meff_incl > 800*GeV});
214 _flows->fillnext("CF-2j-1200", {true, dphimin_123 > 0.8, dphimin_more > 0.4, jetpts50[1] > 250*GeV,
215 etamax_2 < 1.2, met_sqrtHT > 16*sqrt(GeV), meff_incl > 1200*GeV});
216 _flows->fillnext("CF-2j-1600", {true, dphimin_123 > 0.8, dphimin_more > 0.4, jetpts50[1] > 250*GeV,
217 etamax_2 < 1.2, met_sqrtHT > 18*sqrt(GeV), meff_incl > 1600*GeV});
218 _flows->fillnext("CF-2j-2000", {true, dphimin_123 > 0.8, dphimin_more > 0.4, jetpts50[1] > 250*GeV,
219 etamax_2 < 1.2, met_sqrtHT > 20*sqrt(GeV), meff_incl > 2000*GeV});
220 _flows->fillnext("CF-3j-1200", {njets50 >= 3, dphimin_123 > 0.4, dphimin_more > 0.2,
221 jetpts50[0] > 600*GeV && jetpts50[2] > 50*GeV, true,
222 met_sqrtHT > 16*sqrt(GeV), meff_incl > 1200*GeV});
223 _flows->fillnext("CF-4j-1000", {njets50 >= 4, dphimin_123 > 0.4, dphimin_more > 0.4,
224 jetpts50[0] > 200*GeV && jetpts50[3] > 100*GeV, etamax_4 < 1.2,
225 aplanarity > 0.04, met_meff_4 > 0.25*sqrt(GeV), meff_incl > 1000*GeV});
226 _flows->fillnext("CF-4j-1400", {njets50 >= 4, dphimin_123 > 0.4, dphimin_more > 0.4,
227 jetpts50[0] > 200*GeV && jetpts50[3] > 100*GeV, etamax_4 < 2.0,
228 aplanarity > 0.04, met_meff_4 > 0.25*sqrt(GeV), meff_incl > 1400*GeV});
229 _flows->fillnext("CF-4j-1800", {njets50 >= 4, dphimin_123 > 0.4, dphimin_more > 0.4,
230 jetpts50[0] > 200*GeV && jetpts50[3] > 100*GeV, etamax_4 < 2.0,
231 aplanarity > 0.04, met_meff_4 > 0.20*sqrt(GeV), meff_incl > 1800*GeV});
232 _flows->fillnext("CF-4j-2200", {njets50 >= 4, dphimin_123 > 0.4, dphimin_more > 0.4,
233 jetpts50[0] > 200*GeV && jetpts50[3] > 150*GeV, etamax_4 < 2.0,
234 aplanarity > 0.04, met_meff_4 > 0.20*sqrt(GeV), meff_incl > 2200*GeV});
235 _flows->fillnext("CF-4j-2600", {njets50 >= 4, dphimin_123 > 0.4, dphimin_more > 0.4,
236 jetpts50[0] > 200*GeV && jetpts50[3] > 150*GeV, true,
237 aplanarity > 0.04, met_meff_4 > 0.20*sqrt(GeV), meff_incl > 2600*GeV});
238 _flows->fillnext("CF-5j-1400", {njets50 >= 5, dphimin_123 > 0.4, dphimin_more > 0.2,
239 jetpts50[0] > 500*GeV && jetpts50[4] > 50*GeV, true, true,
240 met_meff_5 > 0.3*sqrt(GeV), meff_incl > 1400*GeV});
241 _flows->fillnext("CF-6j-1800", {njets50 >= 6, dphimin_123 > 0.4, dphimin_more > 0.2,
242 jetpts50[0] > 200*GeV && jetpts50[5] > 50*GeV, etamax_6 < 2.0,
243 aplanarity > 0.08, met_meff_6 > 0.20*sqrt(GeV), meff_incl > 1800*GeV});
244 _flows->fillnext("CF-6j-2200", {njets50 >= 6, dphimin_123 > 0.4, dphimin_more > 0.2,
245 jetpts50[0] > 200*GeV && jetpts50[5] > 100*GeV, true,
246 aplanarity > 0.08, met_meff_6 > 0.15*sqrt(GeV), meff_incl > 2200*GeV});
247
248 }
249
250
251 /// Normalise counters after the run
252 void finalize() {
253
254 const double sf = 13.3*crossSection()/femtobarn/sumOfWeights();
255 scale(_h_2j_0800, sf); scale(_h_2j_1200, sf); scale(_h_2j_1600, sf);
256 scale(_h_2j_2000, sf); scale(_h_3j_1200, sf); scale(_h_4j_1000, sf);
257 scale(_h_4j_1400, sf); scale(_h_4j_1800, sf); scale(_h_4j_2200, sf);
258 scale(_h_4j_2600, sf); scale(_h_5j_1400, sf); scale(_h_6j_1800, sf);
259 scale(_h_6j_2200, sf);
260
261 scale(_flows, sf);
262 MSG_INFO("CUTFLOWS:\n\n" << _flows);
263
264 }
265
266 /// @}
267
268
269 private:
270
271 /// @name Histograms
272 /// @{
273 CounterPtr _h_2j_0800, _h_2j_1200, _h_2j_1600, _h_2j_2000, _h_3j_1200;
274 CounterPtr _h_4j_1000, _h_4j_1400, _h_4j_1800, _h_4j_2200, _h_4j_2600;
275 CounterPtr _h_5j_1400, _h_6j_1800, _h_6j_2200;
276 /// @}
277
278 /// Cut-flows
279 CutflowsPtr _flows;
280
281 };
282
283 RIVET_DECLARE_PLUGIN(ATLAS_2016_CONF_2016_078);
284}
|