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