Rivet analyses referenceATLAS_2012_I11259610-lepton squark and gluino searchExperiment: ATLAS (LHC) Inspire ID: 1125961 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
0-lepton search for squarks and gluinos by ATLAS at 7 TeV. Event counts in five signal regions are implemented as one-bin histograms. Source code: ATLAS_2012_I1125961.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/FastJets.hh"
8#include "Rivet/Projections/VetoedFinalState.hh"
9
10namespace Rivet {
11
12
13
14 /// @author Peter Richardson
15 class ATLAS_2012_I1125961 : public Analysis {
16 public:
17
18 /// Constructor
19 ATLAS_2012_I1125961()
20 : Analysis("ATLAS_2012_I1125961")
21 { }
22
23
24 /// @name Analysis methods
25 /// @{
26
27 /// Book histograms and initialise projections before the run
28 void init() {
29
30 // Projection to find the electrons
31 IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT > 20*GeV);
32 elecs.acceptIdPair(PID::ELECTRON);
33 declare(elecs, "elecs");
34
35 // Projection to find the muons
36 IdentifiedFinalState muons(Cuts::abseta < 2.4 && Cuts::pT > 10*GeV);
37 muons.acceptIdPair(PID::MUON);
38 declare(muons, "muons");
39
40 // Jet finder
41 VetoedFinalState vfs;
42 vfs.addVetoPairId(PID::MUON);
43 declare(FastJets(vfs, JetAlg::ANTIKT, 0.4), "AntiKtJets04");
44
45 // All tracks (to do deltaR with leptons)
46 declare(ChargedFinalState(Cuts::abseta < 3.0), "cfs");
47
48 // Used for pTmiss (N.B. the real 'vfs' extends beyond 4.5 to |eta| = 4.9)
49 declare(VisibleFinalState(Cuts::abseta < 4.5), "vfs");
50
51 // Book histograms
52 book(_count_A_tight ,"count_A_tight" , 1, 0., 1.);
53 book(_count_A_medium ,"count_A_medium" , 1, 0., 1.);
54 book(_count_Ap_medium ,"count_Ap_medium" , 1, 0., 1.);
55 book(_count_B_tight ,"count_B_tight" , 1, 0., 1.);
56 book(_count_C_tight ,"count_C_tight" , 1, 0., 1.);
57 book(_count_C_medium ,"count_C_medium" , 1, 0., 1.);
58 book(_count_C_loose ,"count_C_loose" , 1, 0., 1.);
59 book(_count_D_tight ,"count_D_tight" , 1, 0., 1.);
60 book(_count_E_tight ,"count_E_tight" , 1, 0., 1.);
61 book(_count_E_medium ,"count_E_medium" , 1, 0., 1.);
62 book(_count_E_loose ,"count_E_loose" , 1, 0., 1.);
63
64 book(_hist_meff_A ,"hist_m_eff_A" , 30, 0., 3000.);
65 book(_hist_meff_Ap ,"hist_m_eff_Ap", 30, 0., 3000.);
66 book(_hist_meff_B ,"hist_m_eff_B" , 30, 0., 3000.);
67 book(_hist_meff_C ,"hist_m_eff_C" , 30, 0., 3000.);
68 book(_hist_meff_D ,"hist_m_eff_D" , 30, 0., 3000.);
69 book(_hist_meff_E ,"hist_m_eff_E" , 30, 0., 3000.);
70
71 }
72
73
74 /// Perform the per-event analysis
75 void analyze(const Event& event) {
76
77 Jets cand_jets = apply<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 4.9);
78
79 const Particles cand_e = apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
80
81 // Muon isolation not mentioned in hep-exp 1109.6572 but assumed to still be applicable
82 Particles cand_mu;
83 const Particles chg_tracks = apply<ChargedFinalState>(event, "cfs").particles();
84 const Particles muons = apply<IdentifiedFinalState>(event, "muons").particlesByPt();
85 for (const Particle& mu : muons) {
86 double pTinCone = -mu.pT();
87 for (const Particle& track : chg_tracks) {
88 if ( deltaR(mu.momentum(),track.momentum()) <= 0.2 ) {
89 pTinCone += track.pT();
90 }
91 }
92 if ( pTinCone < 1.8*GeV ) cand_mu.push_back(mu);
93 }
94
95 // Resolve jet-lepton overlap for jets with |eta| < 2.8
96 Jets recon_jets;
97 for ( const Jet& jet : cand_jets ) {
98 if ( fabs( jet.eta() ) >= 2.8 ) continue;
99 bool away_from_e = true;
100 for ( const Particle & e : cand_e ) {
101 if ( deltaR(e.momentum(),jet.momentum()) <= 0.2 ) {
102 away_from_e = false;
103 break;
104 }
105 }
106 if ( away_from_e ) recon_jets.push_back( jet );
107 }
108
109 Particles recon_e, recon_mu;
110
111 for ( const Particle & e : cand_e ) {
112 bool away = true;
113 for ( const Jet& jet : recon_jets ) {
114 if ( deltaR(e.momentum(),jet.momentum()) < 0.4 ) {
115 away = false;
116 break;
117 }
118 }
119 if ( away ) recon_e.push_back( e );
120 }
121
122 for ( const Particle & mu : cand_mu ) {
123 bool away = true;
124 for ( const Jet& jet : recon_jets ) {
125 if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 ) {
126 away = false;
127 break;
128 }
129 }
130 if ( away ) recon_mu.push_back( mu );
131 }
132
133 // pTmiss
134 // Based on all candidate electrons, muons and jets, plus everything else with |eta| < 4.5
135 // i.e. everything in our projection "vfs" plus the jets with |eta| > 4.5
136 Particles vfs_particles = apply<VisibleFinalState>(event, "vfs").particles();
137 FourMomentum pTmiss;
138 for ( const Particle & p : vfs_particles ) {
139 pTmiss -= p.momentum();
140 }
141 for ( const Jet& jet : cand_jets ) {
142 if ( fabs( jet.eta() ) > 4.5 ) pTmiss -= jet.momentum();
143 }
144 double eTmiss = pTmiss.pT();
145
146 // no electron pT> 20 or muons pT>10
147 if ( !recon_mu.empty() || !recon_e.empty() ) {
148 MSG_DEBUG("Charged leptons left after selection");
149 vetoEvent;
150 }
151
152 if ( eTmiss <= 160 * GeV ) {
153 MSG_DEBUG("Not enough eTmiss: " << eTmiss << " < 130");
154 vetoEvent;
155 }
156
157 if ( recon_jets.size()<2 ||
158 recon_jets[0].pT() <= 130.0 * GeV ||
159 recon_jets[0].pT() <= 60.0 * GeV ) {
160 MSG_DEBUG("No hard leading jet in " << recon_jets.size() << " jets");
161 vetoEvent;
162 }
163
164 // ==================== observables ====================
165
166 int Njets = 0;
167 double min_dPhi_All = 999.999;
168 double min_dPhi_2 = 999.999;
169 double min_dPhi_3 = 999.999;
170 double pTmiss_phi = pTmiss.phi();
171 for ( const Jet& jet : recon_jets ) {
172 if ( jet.pT() < 40 * GeV ) continue;
173 if ( Njets < 2 ) {
174 min_dPhi_2 = min( min_dPhi_2, deltaPhi( pTmiss_phi, jet.phi() ) );
175 }
176 if( Njets < 3) {
177 min_dPhi_3 = min( min_dPhi_3, deltaPhi( pTmiss_phi, jet.phi() ) );
178 }
179 min_dPhi_All = min( min_dPhi_All, deltaPhi( pTmiss_phi, jet.phi() ) );
180 ++Njets;
181 }
182
183 // inclusive meff
184 double m_eff_inc = eTmiss;
185 for ( const Jet& jet : recon_jets ) {
186 double perp = jet.pT();
187 if(perp>40.) m_eff_inc += perp;
188 }
189
190 // region A
191 double m_eff_Nj = eTmiss + recon_jets[0].pT() + recon_jets[1].pT();
192 if( min_dPhi_2 > 0.4 && eTmiss/m_eff_Nj > 0.3 ) {
193 _hist_meff_A->fill(m_eff_inc);
194 if(m_eff_inc>1900.) _count_A_tight ->fill(0.5);
195 if(m_eff_inc>1400.) _count_A_medium->fill(0.5);
196 }
197
198 // region A'
199 if( min_dPhi_2 > 0.4 && eTmiss/m_eff_Nj > 0.4 ) {
200 _hist_meff_Ap->fill(m_eff_inc);
201 if(m_eff_inc>1200.) _count_Ap_medium->fill(0.5);
202 }
203
204 // for rest of regions 3 jets pT> 60 needed
205 if(recon_jets.size()<3 || recon_jets[2].perp()<60.)
206 vetoEvent;
207
208 // region B
209 m_eff_Nj += recon_jets[2].perp();
210 if( min_dPhi_3 > 0.4 && eTmiss/m_eff_Nj > 0.25 ) {
211 _hist_meff_B->fill(m_eff_inc);
212 if(m_eff_inc>1900.) _count_B_tight ->fill(0.5);
213 }
214
215 // for rest of regions 4 jets pT> 60 needed
216 if(recon_jets.size()<4 || recon_jets[3].perp()<60.)
217 vetoEvent;
218
219 // region C
220 m_eff_Nj += recon_jets[3].perp();
221 if( min_dPhi_3 > 0.4 && min_dPhi_All > 0.2 && eTmiss/m_eff_Nj > 0.25 ) {
222 _hist_meff_C->fill(m_eff_inc);
223 if(m_eff_inc>1500.) _count_C_tight ->fill(0.5);
224 if(m_eff_inc>1200.) _count_C_medium->fill(0.5);
225 if(m_eff_inc> 900.) _count_C_loose ->fill(0.5);
226 }
227
228 // for rest of regions 5 jets pT> 40 needed
229 if(recon_jets.size()<5 || recon_jets[4].perp()<40.)
230 vetoEvent;
231
232 // region D
233 m_eff_Nj += recon_jets[4].perp();
234 if( min_dPhi_3 > 0.4 && min_dPhi_All > 0.2 && eTmiss/m_eff_Nj > 0.2 ) {
235 _hist_meff_D->fill(m_eff_inc);
236 if(m_eff_inc>1500.) _count_D_tight ->fill(0.5);
237 }
238
239 // for rest of regions 6 jets pT> 40 needed
240 if(recon_jets.size()<6 || recon_jets[5].perp()<40.)
241 vetoEvent;
242
243 // region E
244 m_eff_Nj += recon_jets[5].perp();
245 if( min_dPhi_3 > 0.4 && min_dPhi_All > 0.2 && eTmiss/m_eff_Nj > 0.15 ) {
246 _hist_meff_E->fill(m_eff_inc);
247 if(m_eff_inc>1400.) _count_E_tight ->fill(0.5);
248 if(m_eff_inc>1200.) _count_E_medium->fill(0.5);
249 if(m_eff_inc> 900.) _count_E_loose ->fill(0.5);
250 }
251 }
252
253
254 void finalize() {
255
256 double norm = crossSection()/femtobarn*4.7/sumOfWeights();
257 // these are number of events at 4.7fb^-1 per 100 GeV
258 scale( _hist_meff_A , 100. * norm );
259 scale( _hist_meff_Ap, 100. * norm );
260 scale( _hist_meff_B , 100. * norm );
261 scale( _hist_meff_C , 100. * norm );
262 scale( _hist_meff_D , 100. * norm );
263 scale( _hist_meff_E , 100. * norm );
264 // these are number of events at 4.7fb^-1
265 scale(_count_A_tight ,norm);
266 scale(_count_A_medium ,norm);
267 scale(_count_Ap_medium,norm);
268 scale(_count_B_tight ,norm);
269 scale(_count_C_tight ,norm);
270 scale(_count_C_medium ,norm);
271 scale(_count_C_loose ,norm);
272 scale(_count_D_tight ,norm);
273 scale(_count_E_tight ,norm);
274 scale(_count_E_medium ,norm);
275 scale(_count_E_loose ,norm);
276 }
277
278 /// @}
279
280
281 private:
282
283 Histo1DPtr _count_A_tight;
284 Histo1DPtr _count_A_medium;
285 Histo1DPtr _count_Ap_medium;
286 Histo1DPtr _count_B_tight;
287 Histo1DPtr _count_C_tight;
288 Histo1DPtr _count_C_medium;
289 Histo1DPtr _count_C_loose;
290 Histo1DPtr _count_D_tight;
291 Histo1DPtr _count_E_tight;
292 Histo1DPtr _count_E_medium;
293 Histo1DPtr _count_E_loose;
294
295 Histo1DPtr _hist_meff_A ;
296 Histo1DPtr _hist_meff_Ap;
297 Histo1DPtr _hist_meff_B ;
298 Histo1DPtr _hist_meff_C ;
299 Histo1DPtr _hist_meff_D ;
300 Histo1DPtr _hist_meff_E ;
301
302 };
303
304
305 RIVET_DECLARE_PLUGIN(ATLAS_2012_I1125961);
306
307}
|