Rivet analyses referenceATLAS_2012_CONF_2012_1534 or more lepton plus missing transverse energy SUSY searchExperiment: ATLAS (LHC) Status: PRELIMINARY Authors:
Beam energies: (4000.0, 4000.0) GeV Run details:
Search for SUSY using events with 4 or more leptons in association with missing transverse energy in proton-proton collisions at a centre-of-mass energy of 8 TeV. The data sample has a total integrated luminosity of 13.0 fb$^{-1}$. There is no reference data and in addition to the control plots from the paper the number of events in the two signal regions, correctly normalized to an integrated luminosity 13.0 fb$^{-1}$, are calculated. Source code: ATLAS_2012_CONF_2012_153.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/ChargedFinalState.hh"
5#include "Rivet/Projections/VisibleFinalState.hh"
6#include "Rivet/Projections/VetoedFinalState.hh"
7#include "Rivet/Projections/IdentifiedFinalState.hh"
8#include "Rivet/Projections/FastJets.hh"
9#include "Rivet/Tools/RivetMT2.hh"
10
11namespace Rivet {
12
13
14 class ATLAS_2012_CONF_2012_153 : public Analysis {
15 public:
16
17 /// @name Constructors etc.
18 /// @{
19
20 /// Constructor
21 ATLAS_2012_CONF_2012_153()
22 : Analysis("ATLAS_2012_CONF_2012_153")
23 { }
24
25 /// @}
26
27
28
29 public:
30
31 /// @name Analysis methods
32 /// @{
33
34 /// Book histograms and initialise projections before the run
35 void init() {
36
37 // projection to find the electrons
38 IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT > 10*GeV);
39 elecs.acceptIdPair(PID::ELECTRON);
40 declare(elecs, "elecs");
41
42
43 // projection to find the muons
44 IdentifiedFinalState muons(Cuts::abseta < 2.4 && Cuts::pT > 10*GeV);
45 muons.acceptIdPair(PID::MUON);
46 declare(muons, "muons");
47
48 // for pTmiss
49 declare(VisibleFinalState(Cuts::abseta < 4.9), "vfs");
50
51 VetoedFinalState vfs;
52 vfs.addVetoPairId(PID::MUON);
53
54 /// Jet finder
55 declare(FastJets(vfs, JetAlg::ANTIKT, 0.4), "AntiKtJets04");
56
57 // all tracks (to do deltaR with leptons)
58 declare(ChargedFinalState(Cuts::abseta < 3.0), "cfs");
59
60 vector<double> edges_meff;
61 edges_meff.push_back( 0);
62 edges_meff.push_back( 150);
63 edges_meff.push_back( 300);
64 edges_meff.push_back( 500);
65 edges_meff.push_back(1000);
66 edges_meff.push_back(1500);
67
68 vector<double> edges_eT;
69 edges_eT.push_back(0);
70 edges_eT.push_back(50);
71 edges_eT.push_back(150);
72 edges_eT.push_back(300);
73 edges_eT.push_back(500);
74
75 // Book histograms
76 book(_hist_electrons ,"hist_electrons_before", 11, -0.5,10.5);
77 book(_hist_muons ,"hist_muons_before" , 11, -0.5,10.5);
78 book(_hist_leptons ,"hist_leptons_before" , 11, -0.5,10.5);
79 book(_hist_4leptons ,"hist_4leptons", 1, 0.,1.);
80 book(_hist_veto ,"hist_veto", 1, 0., 1.);
81 book(_hist_etmiss ,"hist_etmiss",edges_eT);
82 book(_hist_meff ,"hist_m_eff",edges_meff);
83 book(_count_SR1 ,"count_SR1", 1, 0., 1.);
84 book(_count_SR2 ,"count_SR2", 1, 0., 1.);
85
86 }
87
88
89 /// Perform the per-event analysis
90 void analyze(const Event& event) {
91 // get the jet candidates
92 Jets cand_jets = apply<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 2.5);
93
94 // candidate muons
95 Particles cand_mu = apply<IdentifiedFinalState>(event, "muons").particlesByPt();
96
97 // candidate electrons
98 // Discard if two electrons are within R=0.1
99 Particles temp = apply<IdentifiedFinalState>(event, "elecs").particles(cmpMomByE);
100 vector<bool> vetoed(temp.size(),false);
101 Particles cand_e;
102 for (size_t ix = 0; ix < temp.size(); ++ix) {
103 if (vetoed[ix]) continue;
104 for (size_t iy = ix+1; iy < temp.size(); ++iy) {
105 if ( deltaR(temp[ix], temp[iy]) < 0.1 ) vetoed[iy] = true;
106 }
107 if (!vetoed[ix]) cand_e.push_back(temp[ix]);
108 }
109
110 // Sort by transverse momentum
111 isortByPt(cand_e);
112
113 // resolve jet/lepton ambiguity
114 Jets recon_jets;
115 for ( const Jet& jet : cand_jets ) {
116 bool away_from_e = true;
117 for ( const Particle& e : cand_e ) {
118 if (deltaR(e, jet) <= 0.2) {
119 away_from_e = false;
120 break;
121 }
122 }
123 if (away_from_e) recon_jets.push_back( jet );
124 }
125
126 // only keep electrons more than R=0.4 from jets
127 Particles cand2_e;
128 for (const Particle& e : cand_e) {
129 // at least 0.4 from any jets
130 bool away = true;
131 for ( const Jet& jet : recon_jets ) {
132 if ( deltaR(e, jet) < 0.4 ) {
133 away = false;
134 break;
135 }
136 }
137 // if isolated keep it
138 if ( away )
139 cand2_e.push_back( e );
140 }
141
142 // only keep muons more than R=0.4 from jets
143 Particles cand2_mu;
144 for(const Particle & mu : cand_mu ) {
145 bool away = true;
146 // at least 0.4 from any jets
147 for ( const Jet& jet : recon_jets ) {
148 if ( deltaR(mu, jet) < 0.4 ) {
149 away = false;
150 break;
151 }
152 }
153 if (away) cand2_mu.push_back( mu );
154 }
155
156 // electron and muon more than 0.1 apart
157 Particles cand3_e;
158 for ( const Particle & e : cand2_e ) {
159 bool away = true;
160 for( const Particle & mu : cand2_mu ) {
161 if( deltaR(e, mu) < 0.1) {
162 away = false;
163 break;
164 }
165 }
166 if (away) cand3_e.push_back(e);
167 }
168 Particles cand3_mu;
169 for( const Particle & mu : cand2_mu ) {
170 bool away = true;
171 for ( const Particle & e : cand2_e ) {
172 if( deltaR(e, mu) < 0.1) {
173 away = false;
174 break;
175 }
176 }
177 if (away) cand3_mu.push_back(mu);
178 }
179
180 // pTmiss
181 Particles vfs_particles =
182 apply<VisibleFinalState>(event, "vfs").particles();
183 FourMomentum pTmiss;
184 for ( const Particle & p : vfs_particles ) {
185 pTmiss -= p.momentum();
186 }
187 double eTmiss = pTmiss.pT();
188
189 // apply electron isolation
190 Particles chg_tracks =
191 apply<ChargedFinalState>(event, "cfs").particles();
192 Particles cand4_e;
193 for (const Particle& e : cand3_e) {
194 // charge isolation
195 double pTinCone = -e.pT();
196 for (const Particle& track : chg_tracks) {
197 if (track.pT() > 0.4*GeV && deltaR(e, track) <= 0.3 )
198 pTinCone += track.pT();
199 }
200 if (pTinCone/e.pT() > 0.16) continue;
201 // all particles isolation
202 pTinCone = -e.pT();
203 for (const Particle& p : vfs_particles) {
204 if (p.abspid() != PID::MUON && deltaR(e, p) <= 0.3 )
205 pTinCone += p.pT();
206 }
207 if (pTinCone/e.pT() < 0.18) cand4_e.push_back(e);
208 }
209
210 // apply muon isolation
211 Particles cand4_mu;
212 for ( const Particle & mu : cand3_mu ) {
213 double pTinCone = -mu.perp();
214 for ( const Particle & track : chg_tracks ) {
215 if (track.pT() > 1*GeV && deltaR(mu, track) <= 0.3)
216 pTinCone += track.pT();
217 }
218 if (pTinCone/mu.pT() < 0.12) cand4_mu.push_back(mu);
219 }
220
221 // same SOSF pairs m>12.
222 Particles recon_e;
223 for(const Particle& e : cand4_e) {
224 bool veto = false;
225 for(const Particle& e2 : cand4_e) {
226 if (e.pid()*e2.pid() < 0 && (e.momentum()+e2.momentum()).mass() < 12*GeV) {
227 veto = true;
228 break;
229 }
230 }
231 if (!veto) recon_e.push_back(e);
232 }
233 Particles recon_mu;
234 for(const Particle& mu : cand4_mu) {
235 bool veto = false;
236 for(const Particle& mu2 : cand4_mu) {
237 if (mu.pid()*mu2.pid() < 0 && (mu.momentum()+mu2.momentum()).mass() < 12*GeV) {
238 veto = true;
239 break;
240 }
241 }
242 if (!veto) recon_mu.push_back(mu);
243 }
244
245 // now only use recon_jets, recon_mu, recon_e
246 _hist_electrons->fill(recon_e.size());
247 _hist_muons->fill(recon_mu.size());
248 _hist_leptons->fill(recon_mu.size() + recon_e.size());
249 if (recon_mu.size() + recon_e.size() > 3) {
250 _hist_4leptons->fill(0.5);
251 }
252
253 // reject events with less than 4 electrons and muons
254 if (recon_mu.size() + recon_e.size() < 4) {
255 MSG_DEBUG("To few charged leptons left after selection");
256 vetoEvent;
257 }
258
259
260 // or two lepton trigger
261 bool passDouble =
262 (recon_mu.size()>=2 && ( (recon_mu[1].pT()>14*GeV) ||
263 (recon_mu[0].pT()>18*GeV && recon_mu[1].perp() > 10*GeV) )) ||
264 (recon_e.size() >=2 && ( (recon_e [1].pT()>14*GeV) ||
265 (recon_e [0].pT()>25*GeV && recon_e [1].perp() > 10*GeV) )) ||
266 (!recon_e.empty() && !recon_mu.empty() &&
267 ( (recon_e[0].pT() > 14*GeV && recon_mu[0].pT() > 10*GeV)||
268 (recon_e[0].pT() > 10*GeV && recon_mu[0].pT() > 18*GeV) ));
269
270 // must pass a trigger
271 if (!passDouble ) {
272 MSG_DEBUG("Hardest lepton fails trigger");
273 _hist_veto->fill(0.5);
274 vetoEvent;
275 }
276
277 // calculate meff
278 double meff = eTmiss;
279 for ( const Particle & e : recon_e ) meff += e.perp();
280 for ( const Particle & mu : recon_mu ) meff += mu.perp();
281 for ( const Jet & jet : recon_jets ) {
282 const double pT = jet.pT();
283 if (pT > 40*GeV) meff += pT;
284 }
285
286 // 2/3 leptons --> find 1 SFOS pair in range and veto event
287 // 4+ leptons --> find 2 SFOS pairs and in range veto event
288 for (size_t ix = 0; ix < recon_e.size(); ++ix) {
289 for (size_t iy = ix+1; iy < recon_e.size(); ++iy) {
290 if (recon_e[ix].pid()*recon_e[iy].pid() > 0) continue;
291 const FourMomentum ppair = recon_e[ix].momentum() + recon_e[iy].momentum();
292 if (inRange(ppair.mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
293
294 // check triplets with electron
295 for (size_t iz = 0; iz < recon_e.size(); ++iz) {
296 if (iz == ix || iz == iy) continue;
297 if (inRange((ppair+recon_e[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
298 }
299
300 // check triplets with muon
301 for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
302 if (inRange((ppair+recon_mu[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
303 }
304
305 // check quadruplets with electrons
306 for (size_t iz = 0; iz < recon_e.size(); ++iz) {
307 for (size_t iw = iz+1; iw < recon_e.size(); ++iw) {
308 if (iz==ix || iz==iy || iw==ix || iw==iy) continue;
309 if (recon_e[iz].pid()*recon_e[iw].pid() > 0) continue;
310 if (inRange((ppair+recon_e[iz].momentum()+recon_e[iw].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
311 }
312 }
313 // check quadruplets with muons
314 for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
315 for (size_t iw = iz+1; iw < recon_mu.size(); ++iw) {
316 if (recon_mu[iz].pid()*recon_mu[iw].pid() > 0) continue;
317 if (inRange((ppair+recon_mu[iz].momentum()+recon_mu[iw].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
318 }
319 }
320 }
321 }
322
323 // Muon pairs
324 for (size_t ix = 0; ix < recon_mu.size(); ++ix) {
325 for (size_t iy = ix+1; iy < recon_mu.size(); ++iy) {
326 if (recon_mu[ix].pid()*recon_mu[iy].pid()>0) continue;
327 const FourMomentum ppair = recon_mu[ix].momentum()+recon_mu[iy].momentum();
328 if (inRange(ppair.mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
329
330 // check triplets with muon
331 for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
332 if (iz==ix || iz==iy) continue;
333 if (inRange((ppair+recon_mu[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
334 }
335
336 // check triplets with electron
337 for (size_t iz = 0; iz < recon_e.size(); ++iz) {
338 if (inRange((ppair+recon_e[iz].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
339 }
340
341 // check muon quadruplets
342 for (size_t iz = 0; iz < recon_mu.size(); ++iz) {
343 for (size_t iw = iz+1; iy < recon_mu.size(); ++iy) {
344 if (iz==ix || iz==iy || iw==ix || iw==iy) continue;
345 if (recon_mu[iz].pid()*recon_mu[iw].pid() > 0) continue;
346 if (inRange((ppair+recon_mu[iz].momentum()+recon_mu[iw].momentum()).mass(), 81.2*GeV, 101.2*GeV)) vetoEvent;
347 }
348 }
349 }
350 }
351
352 // Make the control plots
353 _hist_etmiss->fill(eTmiss);
354 _hist_meff ->fill(meff );
355 // Finally the counts
356 if (eTmiss > 50*GeV) _count_SR1->fill(0.5);
357 if (meff >0*GeV) _count_SR2->fill(0.5);
358
359 }
360
361 /// @}
362
363 void finalize() {
364 double norm = crossSection()/femtobarn*13./sumOfWeights();
365 scale(_hist_etmiss,norm*20.);
366 scale(_hist_meff ,norm*20.);
367 scale(_count_SR1,norm);
368 scale(_count_SR2,norm);
369 }
370
371
372 private:
373
374 /// @name Histograms
375 /// @{
376 Histo1DPtr _hist_electrons;
377 Histo1DPtr _hist_muons;
378 Histo1DPtr _hist_leptons;
379 Histo1DPtr _hist_4leptons;
380 Histo1DPtr _hist_veto;
381 Histo1DPtr _hist_etmiss;
382 Histo1DPtr _hist_meff;
383 Histo1DPtr _count_SR1;
384 Histo1DPtr _count_SR2;
385 /// @}
386
387 };
388
389 RIVET_DECLARE_PLUGIN(ATLAS_2012_CONF_2012_153);
390
391}
|