Rivet analyses referenceATLAS_2011_CONF_2011_090Single lepton search for supersymmetryExperiment: ATLAS (LHC) Status: OBSOLETE Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
Single lepton search for supersymmmetric particles by ATLAS at 7 TeV. Event counts in electron and muon signal regions are implemented as one-bin histograms. Histograms for missing transverse energy and effective mass are implemented for the two signal regions. Source code: ATLAS_2011_CONF_2011_090.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/IdentifiedFinalState.hh"
7#include "Rivet/Projections/VetoedFinalState.hh"
8#include "Rivet/Projections/FastJets.hh"
9
10namespace Rivet {
11
12
13 class ATLAS_2011_CONF_2011_090 : public Analysis {
14 public:
15
16 /// @name Constructors etc.
17 /// @{
18
19 /// Constructor
20
21 ATLAS_2011_CONF_2011_090()
22 : Analysis("ATLAS_2011_CONF_2011_090")
23 { }
24
25 /// @}
26
27
28 public:
29
30 /// @name Analysis methods
31 /// @{
32
33 /// Book histograms and initialize projections before the run
34 void init() {
35
36 // projection to find the electrons
37 IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT >= 20*GeV);
38 elecs.acceptIdPair(PID::ELECTRON);
39 declare(elecs, "elecs");
40
41 // veto region electrons (from 2010 arXiv:1102.2357v2)
42 Cut vetocut = Cuts::absetaIn(1.37, 1.52);
43 IdentifiedFinalState veto_elecs(vetocut && Cuts::pT > 10*GeV);
44 veto_elecs.acceptIdPair(PID::ELECTRON);
45 declare(veto_elecs, "veto_elecs");
46
47 // projection to find the muons
48 IdentifiedFinalState muons(Cuts::abseta < 2.4 && Cuts::pT > 10*GeV);
49 muons.acceptIdPair(PID::MUON);
50 declare(muons, "muons");
51
52 // Jet finder
53 VetoedFinalState vfs;
54 vfs.addVetoPairId(PID::MUON);
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 && Cuts::pT > 0.5*GeV), "cfs");
59
60 // for pTmiss
61 declare(VisibleFinalState(Cuts::abseta < 4.9), "vfs");
62
63 /// Book histograms
64 book(_count_mu_channel ,"count_muon_channel", 1, 0., 1.);
65 book(_count_e_channel ,"count_electron_channel", 1, 0., 1.);
66 book(_hist_eTmiss_e ,"Et_miss_e", 50, 0., 500.);
67 book(_hist_eTmiss_mu ,"Et_miss_mu", 50, 0., 500.);
68 book(_hist_m_eff_e ,"m_eff_e", 60, 0., 1500.);
69 book(_hist_m_eff_mu ,"m_eff_mu", 60, 0., 1500.);
70 book(_hist_m_eff_e_final ,"m_eff_e_final", 15, 0., 1500.);
71 book(_hist_m_eff_mu_final ,"m_eff_mu_final", 15, 0., 1500.);
72 }
73
74
75
76 /// Perform the per-event analysis
77 void analyze(const Event& event) {
78
79
80 Particles veto_e = apply<IdentifiedFinalState>(event, "veto_elecs").particles();
81 if ( ! veto_e.empty() ) {
82 MSG_DEBUG("electrons in veto region");
83 vetoEvent;
84 }
85
86 Jets cand_jets = apply<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 2.8);
87
88 Particles candtemp_e = apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
89 Particles candtemp_mu = apply<IdentifiedFinalState>(event,"muons").particlesByPt();
90 Particles chg_tracks = apply<ChargedFinalState>(event, "cfs").particles();
91 Particles cand_mu;
92 Particles cand_e;
93
94 // pTcone around muon track
95 for ( const Particle& mu : candtemp_mu ) {
96 double pTinCone = -mu.pT();
97 for ( const Particle& track : chg_tracks ) {
98 if ( deltaR(mu, track) < 0.2 )
99 pTinCone += track.pT();
100 }
101 if ( pTinCone < 1.8*GeV )
102 cand_mu.push_back(mu);
103 }
104
105
106 // pTcone around electron
107 for ( const Particle& e : candtemp_e ) {
108 double pTinCone = -e.pT();
109 for ( const Particle& track : chg_tracks ) {
110 if ( deltaR(e, track) < 0.2 )
111 pTinCone += track.pT();
112 }
113 if ( pTinCone < 0.10 * e.pT() )
114 cand_e.push_back(e);
115 }
116
117
118 // discard jets that overlap with electrons
119 Jets cand_jets_2;
120 for ( const Jet& jet : cand_jets ) {
121 bool away_from_e = true;
122 for ( const Particle & e : cand_e ) {
123 if ( deltaR(e, jet) <= 0.2 ) {
124 away_from_e = false;
125 break;
126 }
127 }
128 if ( away_from_e )
129 cand_jets_2.push_back( jet );
130 }
131
132 // only consider leptons far from jet
133 Particles recon_e, recon_mu;
134 for ( const Particle & e : cand_e ) {
135 bool e_near_jet = false;
136 for ( const Jet& jet : cand_jets_2 ) {
137 if (inRange(deltaR(e, jet), 0.2, 0.4)) e_near_jet = true;
138 }
139 if ( ! e_near_jet ) recon_e.push_back( e );
140 }
141
142 for ( const Particle & mu : cand_mu ) {
143 bool mu_near_jet = false;
144 for ( const Jet& jet : cand_jets_2 ) {
145 if ( deltaR(mu, jet) < 0.4 ) mu_near_jet = true;
146 }
147 if ( ! mu_near_jet ) recon_mu.push_back( mu );
148 }
149
150 // pTmiss
151 Particles vfs_particles
152 = apply<VisibleFinalState>(event, "vfs").particles();
153 FourMomentum pTmiss;
154 for ( const Particle & p : vfs_particles ) {
155 pTmiss -= p.momentum();
156 }
157 double eTmiss = pTmiss.pT();
158
159
160 // final jet filter
161 Jets recon_jets;
162 for ( const Jet& jet : cand_jets_2 ) {
163 recon_jets.push_back( jet );
164 }
165
166
167
168
169 // ==================== observables ====================
170
171
172 // Njets
173
174 int Njets = 0;
175 double pTmiss_phi = pTmiss.phi();
176 for ( const Jet& jet : recon_jets ) {
177 if ( jet.abseta() < 2.8 )
178 Njets+=1;
179 }
180 if ( Njets < 3 ) {
181 MSG_DEBUG("Only " << Njets << " jets w/ eta<2.8 left");
182 vetoEvent;
183 }
184
185 if ( recon_jets[0].pT() <= 60.0 * GeV ) {
186 MSG_DEBUG("No hard leading jet in " << recon_jets.size() << " jets");
187 vetoEvent;
188 }
189 for ( int i = 1; i < 3; ++i ) {
190 if ( recon_jets[i].pT() <= 25*GeV ) {
191 vetoEvent;
192 }
193 }
194
195 for ( int i = 0; i < 3; ++i ) {
196 double dPhi = deltaPhi( pTmiss_phi, recon_jets[i].phi() );
197 if ( dPhi <= 0.2 ) {
198 MSG_DEBUG("dPhi too small");
199 vetoEvent;
200 break;
201 }
202 }
203
204
205 Particles lepton;
206 if ( recon_mu.empty() && recon_e.empty() ) {
207 MSG_DEBUG("No leptons");
208 vetoEvent;
209 }
210 else {
211 for ( const Particle & mu : recon_mu )
212 lepton.push_back(mu);
213 for ( const Particle & e : recon_e )
214 lepton.push_back(e);
215 }
216
217 std::sort(lepton.begin(), lepton.end(), cmpMomByPt);
218
219 double e_id = 11;
220 double mu_id = 13;
221
222 // one hard leading lepton cut
223 if ( lepton[0].abspid() == e_id &&
224 lepton[0].pT() <= 25*GeV ) {
225 vetoEvent;
226 }
227 else if ( lepton[0].abspid() == mu_id &&
228 lepton[0].pT() <= 20*GeV ) {
229 vetoEvent;
230 }
231
232 // exactly one hard leading lepton cut
233 if(lepton.size()>1) {
234 if ( lepton[1].abspid() == e_id &&
235 lepton[1].pT() > 20*GeV ) {
236 vetoEvent;
237 }
238 else if ( lepton[1].abspid() == mu_id &&
239 lepton[1].pT() > 10*GeV ) {
240 vetoEvent;
241 }
242 }
243
244
245 // ==================== FILL ====================
246
247
248 FourMomentum pT_l = lepton[0].momentum();
249
250
251 double dPhi = deltaPhi( pT_l.phi(), pTmiss_phi);
252 double mT = sqrt( 2 * pT_l.pT() * eTmiss * (1 - cos(dPhi)) );
253
254
255 // effective mass
256 double m_eff = eTmiss + pT_l.pT()
257 + recon_jets[0].pT()
258 + recon_jets[1].pT()
259 + recon_jets[2].pT();
260
261
262 // Electron channel signal region
263
264 if ( lepton[0].abspid() == e_id ) {
265
266 _hist_eTmiss_e->fill(eTmiss);
267 _hist_m_eff_e->fill(m_eff);
268
269 if ( mT > 100*GeV && eTmiss > 125*GeV ) {
270 _hist_m_eff_e_final->fill(m_eff);
271 if ( m_eff > 500*GeV && eTmiss > 0.25*m_eff ) {
272 _count_e_channel->fill(0.5);
273 }
274 }
275 }
276
277 // Muon channel signal region
278
279 else if ( lepton[0].abspid() == mu_id ) {
280
281 _hist_eTmiss_mu->fill(eTmiss);
282 _hist_m_eff_mu->fill(m_eff);
283
284 if ( mT > 100*GeV && eTmiss > 125*GeV ) {
285 _hist_m_eff_mu_final->fill(m_eff);
286 if ( m_eff > 500*GeV && eTmiss > 0.25*m_eff ) {
287 _count_mu_channel->fill(0.5);
288 }
289 }
290
291 }
292
293
294 }
295
296 /// @}
297
298
299 void finalize() {
300 scale( _hist_eTmiss_e , 10. * 165. * crossSection()/picobarn/sumOfWeights() );
301 scale( _hist_eTmiss_mu , 10. * 165. * crossSection()/picobarn/sumOfWeights() );
302 scale( _hist_m_eff_e , 25. * 165. * crossSection()/picobarn/sumOfWeights() );
303 scale( _hist_m_eff_mu , 25. * 165. * crossSection()/picobarn/sumOfWeights() );
304 scale( _hist_m_eff_e_final , 100. * 165. * crossSection()/picobarn/sumOfWeights() );
305 scale( _hist_m_eff_mu_final, 100. * 165. * crossSection()/picobarn/sumOfWeights() );
306 }
307
308 private:
309
310 /// @name Histograms
311 /// @{
312 Histo1DPtr _count_e_channel;
313 Histo1DPtr _count_mu_channel;
314
315 Histo1DPtr _hist_eTmiss_e;
316 Histo1DPtr _hist_eTmiss_mu;
317
318 Histo1DPtr _hist_m_eff_e;
319 Histo1DPtr _hist_m_eff_mu;
320 Histo1DPtr _hist_m_eff_e_final;
321 Histo1DPtr _hist_m_eff_mu_final;
322
323
324 /// @}
325
326
327 };
328
329
330
331 RIVET_DECLARE_PLUGIN(ATLAS_2011_CONF_2011_090);
332
333}
|