Rivet analyses referenceATLAS_2012_I1095236$b$-jets search for supersymmetry with 0- and 1-leptonsExperiment: ATLAS (LHC) Inspire ID: 1095236 Status: UNVALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
Search for supersymmmetric particles by ATLAS at 7 TeV in events with b-jets, large missing energy, and zero or one leptons. Event counts in six zero lepton and two one lepton signal regions are implemented as one-bin histograms. Histograms for missing transverse energy, and effective mass are also implemented for some signal regions. Source code: ATLAS_2012_I1095236.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/Random.hh"
10
11namespace Rivet {
12
13
14 /// @author Peter Richardson
15 class ATLAS_2012_I1095236 : public Analysis {
16 public:
17
18 /// Constructor
19 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2012_I1095236);
20
21
22 /// @name Analysis methods
23 /// @{
24
25 /// Book histograms and initialise projections before the run
26 void init() {
27
28 // Projection to find the electrons
29 IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT > 20*GeV);
30 elecs.acceptIdPair(PID::ELECTRON);
31 declare(elecs, "elecs");
32
33 // Projection to find the muons
34 IdentifiedFinalState muons(Cuts::abseta < 2.4 && Cuts::pT > 10*GeV);
35 muons.acceptIdPair(PID::MUON);
36 declare(muons, "muons");
37
38 // Jet finder
39 VetoedFinalState vfs;
40 vfs.addVetoPairId(PID::MUON);
41 declare(FastJets(vfs, JetAlg::ANTIKT, 0.4), "AntiKtJets04");
42
43 // All tracks (to do deltaR with leptons)
44 declare(ChargedFinalState(Cuts::abseta < 3.0),"cfs");
45
46 // Used for pTmiss
47 declare(VisibleFinalState((Cuts::etaIn(-4.9,4.9))),"vfs");
48
49 // Book histograms
50 book(_count_SR0_A1 ,"count_SR0_A1", 1, 0., 1.);
51 book(_count_SR0_B1 ,"count_SR0_B1", 1, 0., 1.);
52 book(_count_SR0_C1 ,"count_SR0_C1", 1, 0., 1.);
53 book(_count_SR0_A2 ,"count_SR0_A2", 1, 0., 1.);
54 book(_count_SR0_B2 ,"count_SR0_B2", 1, 0., 1.);
55 book(_count_SR0_C2 ,"count_SR0_C2", 1, 0., 1.);
56 book(_count_SR1_D ,"count_SR1_D" , 1, 0., 1.);
57 book(_count_SR1_E ,"count_SR1_E" , 1, 0., 1.);
58
59 book(_hist_meff_SR0_A1 ,"hist_m_eff_SR0_A1", 14, 400., 1800.);
60 book(_hist_meff_SR0_A2 ,"hist_m_eff_SR0_A2", 14, 400., 1800.);
61 book(_hist_meff_SR1_D_e ,"hist_meff_SR1_D_e" , 16, 600., 2200.);
62 book(_hist_meff_SR1_D_mu ,"hist_meff_SR1_D_mu", 16, 600., 2200.);
63
64 book(_hist_met_SR0_A1 ,"hist_met_SR0_A1", 14, 0., 700.);
65 book(_hist_met_SR0_A2 ,"hist_met_SR0_A2", 14, 0., 700.);
66 book(_hist_met_SR0_D_e ,"hist_met_SR1_D_e" , 15, 0., 600.);
67 book(_hist_met_SR0_D_mu ,"hist_met_SR1_D_mu", 15, 0., 600.);
68
69 }
70
71
72 /// Perform the per-event analysis
73 void analyze(const Event& event) {
74
75 Jets cand_jets = apply<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 2.8);
76
77 const Particles cand_e = apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
78
79 const Particles cand_mu = apply<IdentifiedFinalState>(event, "muons").particlesByPt();
80 // Resolve jet-lepton overlap for jets with |eta| < 2.8
81 Jets recon_jets;
82 for ( const Jet& jet : cand_jets ) {
83 if ( fabs( jet.eta() ) >= 2.8 ) continue;
84 bool away_from_e = true;
85 for ( const Particle & e : cand_e ) {
86 if ( deltaR(e.momentum(),jet.momentum()) <= 0.2 ) {
87 away_from_e = false;
88 break;
89 }
90 }
91 if ( away_from_e ) recon_jets.push_back( jet );
92 }
93
94 // get the loose leptons used to define the 0 lepton channel
95 Particles loose_e, loose_mu;
96 for ( const Particle & e : cand_e ) {
97 bool away = true;
98 for ( const Jet& jet : recon_jets ) {
99 if ( deltaR(e.momentum(),jet.momentum()) < 0.4 ) {
100 away = false;
101 break;
102 }
103 }
104 if ( away ) loose_e.push_back( e );
105 }
106 for ( const Particle & mu : cand_mu ) {
107 bool away = true;
108 for ( const Jet& jet : recon_jets ) {
109 if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 ) {
110 away = false;
111 break;
112 }
113 }
114 if ( away ) loose_mu.push_back( mu );
115 }
116 // tight leptons for the 1-lepton channel
117 Particles tight_mu;
118 Particles chg_tracks =
119 apply<ChargedFinalState>(event, "cfs").particles();
120 for ( const Particle & mu : loose_mu) {
121 if(mu.perp()<20.) continue;
122 double pTinCone = -mu.pT();
123 for ( const Particle & track : chg_tracks ) {
124 if ( deltaR(mu.momentum(),track.momentum()) <= 0.2 )
125 pTinCone += track.pT();
126 }
127 if ( pTinCone < 1.8*GeV )
128 tight_mu.push_back(mu);
129 }
130 Particles tight_e;
131 for ( const Particle & e : loose_e ) {
132 if(e.perp()<25.) continue;
133 double pTinCone = -e.perp();
134 for ( const Particle & track : chg_tracks ) {
135 if ( deltaR(e.momentum(),track.momentum()) <= 0.2 )
136 pTinCone += track.pT();
137 }
138 if (pTinCone/e.perp()<0.1) {
139 tight_e.push_back(e);
140 }
141 }
142
143 // pTmiss
144 Particles vfs_particles =
145 apply<VisibleFinalState>(event, "vfs").particles();
146 FourMomentum pTmiss;
147 for ( const Particle & p : vfs_particles ) {
148 pTmiss -= p.momentum();
149 }
150 double eTmiss = pTmiss.pT();
151
152 // get the number of b-tagged jets
153 unsigned int ntagged=0;
154 for (const Jet & jet : recon_jets ) {
155 if(jet.perp()>50. && abs(jet.eta())<2.5 &&
156 jet.bTagged() && rand01()<=0.60)
157 ++ntagged;
158 }
159
160 // ATLAS calo problem
161 if(rand01()<=0.42) {
162 for ( const Jet & jet : recon_jets ) {
163 double eta = jet.rapidity();
164 double phi = jet.azimuthalAngle(MINUSPI_PLUSPI);
165 if(jet.perp()>50 && eta>-0.1&&eta<1.5&&phi>-0.9&&phi<-0.5)
166 vetoEvent;
167 }
168 }
169
170 // at least 1 b tag
171 if(ntagged==0) vetoEvent;
172
173 // minumum Et miss
174 if(eTmiss<80.) vetoEvent;
175
176 // at least 3 jets pT > 50
177 if(recon_jets.size()<3 || recon_jets[2].perp()<50.)
178 vetoEvent;
179
180 // m_eff
181 double m_eff = eTmiss;
182 for(unsigned int ix=0;ix<3;++ix)
183 m_eff += recon_jets[ix].perp();
184
185 // delta Phi
186 double min_dPhi = 999.999;
187 double pTmiss_phi = pTmiss.phi();
188 for(unsigned int ix=0;ix<3;++ix) {
189 min_dPhi = min( min_dPhi, deltaPhi( pTmiss_phi, recon_jets[ix].phi() ) );
190 }
191
192 // 0-lepton channels
193 if(loose_e.empty() && loose_mu.empty() &&
194 recon_jets[0].perp()>130. && eTmiss>130. &&
195 eTmiss/m_eff>0.25 && min_dPhi>0.4) {
196 // jet charge cut
197 bool jetCharge = true;
198 for(unsigned int ix=0;ix<3;++ix) {
199 if(fabs(recon_jets[ix].eta())>2.) continue;
200 double trackpT=0;
201 for(const Particle & p : recon_jets[ix].particles()) {
202 if(PID::charge3(p.pid())==0) continue;
203 trackpT += p.perp();
204 }
205 if(trackpT/recon_jets[ix].perp()<0.05)
206 jetCharge = false;
207 }
208 if(jetCharge) {
209 // SR0-A region
210 if(m_eff>500.) {
211 _count_SR0_A1->fill(0.5);
212 _hist_meff_SR0_A1->fill(m_eff);
213 _hist_met_SR0_A1 ->fill(eTmiss);
214 if(ntagged>=2) {
215 _count_SR0_A2->fill(0.5);
216 _hist_meff_SR0_A2->fill(m_eff);
217 _hist_met_SR0_A2 ->fill(eTmiss);
218 }
219 }
220 // SR0-B
221 if(m_eff>700.) {
222 _count_SR0_B1->fill(0.5);
223 if(ntagged>=2) _count_SR0_B2->fill(0.5);
224 }
225 // SR0-C
226 if(m_eff>900.) {
227 _count_SR0_C1->fill(0.5);
228 if(ntagged>=2) _count_SR0_C2->fill(0.5);
229 }
230 }
231 }
232
233 // 1-lepton channels
234 if(tight_e.size() + tight_mu.size() == 1 &&
235 recon_jets.size()>=4 && recon_jets[3].perp()>50.&&
236 recon_jets[0].perp()>60.) {
237 Particle lepton = tight_e.empty() ? tight_mu[0] : tight_e[0];
238 m_eff += lepton.perp() + recon_jets[3].perp();
239 // transverse mass cut
240 double mT = 2.*(lepton.perp()*eTmiss-
241 lepton.px()*pTmiss.px()-
242 lepton.py()*pTmiss.py());
243 mT = sqrt(mT);
244 if(mT>100.&&m_eff>700.) {
245 // D region
246 _count_SR1_D->fill(0.5);
247 if(lepton.abspid()==PID::ELECTRON) {
248 _hist_meff_SR1_D_e->fill(m_eff);
249 _hist_met_SR0_D_e->fill(eTmiss);
250 }
251 else {
252 _hist_meff_SR1_D_mu->fill(m_eff);
253 _hist_met_SR0_D_mu->fill(eTmiss);
254 }
255 // E region
256 if(eTmiss>200.) {
257 _count_SR1_E->fill(0.5);
258 }
259 }
260 }
261 }
262
263
264 void finalize() {
265
266 double norm = crossSection()/femtobarn*2.05/sumOfWeights();
267 // these are number of events at 2.05fb^-1 per 100 GeV
268 scale( _hist_meff_SR0_A1 , 100. * norm );
269 scale( _hist_meff_SR0_A2 , 100. * norm );
270 scale( _hist_meff_SR1_D_e , 100. * norm );
271 scale( _hist_meff_SR1_D_mu , 100. * norm );
272 // these are number of events at 2.05fb^-1 per 50 GeV
273 scale( _hist_met_SR0_A1, 50. * norm );
274 scale( _hist_met_SR0_A2, 40. * norm );
275 // these are number of events at 2.05fb^-1 per 40 GeV
276 scale( _hist_met_SR0_D_e , 40. * norm );
277 scale( _hist_met_SR0_D_mu, 40. * norm );
278 // these are number of events at 2.05fb^-1
279 scale(_count_SR0_A1,norm);
280 scale(_count_SR0_B1,norm);
281 scale(_count_SR0_C1,norm);
282 scale(_count_SR0_A2,norm);
283 scale(_count_SR0_B2,norm);
284 scale(_count_SR0_C2,norm);
285 scale(_count_SR1_D ,norm);
286 scale(_count_SR1_E ,norm);
287 }
288
289 /// @}
290
291
292 private:
293
294 Histo1DPtr _count_SR0_A1;
295 Histo1DPtr _count_SR0_B1;
296 Histo1DPtr _count_SR0_C1;
297 Histo1DPtr _count_SR0_A2;
298 Histo1DPtr _count_SR0_B2;
299 Histo1DPtr _count_SR0_C2;
300 Histo1DPtr _count_SR1_D;
301 Histo1DPtr _count_SR1_E;
302
303 Histo1DPtr _hist_meff_SR0_A1;
304 Histo1DPtr _hist_meff_SR0_A2;
305 Histo1DPtr _hist_meff_SR1_D_e;
306 Histo1DPtr _hist_meff_SR1_D_mu;
307 Histo1DPtr _hist_met_SR0_A1;
308 Histo1DPtr _hist_met_SR0_A2;
309 Histo1DPtr _hist_met_SR0_D_e;
310 Histo1DPtr _hist_met_SR0_D_mu;
311
312 };
313
314
315 RIVET_DECLARE_PLUGIN(ATLAS_2012_I1095236);
316
317}
|