rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2011_CONF_2011_098

b-jets search for supersymmetry with 0-leptons
Experiment: ATLAS (LHC)
Status: OBSOLETE
Authors:
  • Angela Chen
References:
  • ATLAS_2011_CONF_2011_098
Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • BSM signal events at 7000 GeV.

Search for supersymmmetric particles by ATLAS at 7 TeV in events with b-jets, large missing energy, and no leptons. Event counts in four signal regions (1 b-jet, $m_eff>500$\,GeV; 1 b-jet, $m_eff>700$\,GeV; 2 b-jets, $m_eff>500$\,GeV; 2 b-jets, $m_eff>700$\,GeV) are implemented as one-bin histograms. Histograms for missing transverse energy, effective mass, and pT of the leading jet are implemented for the 1 b-tag and 2 b-tag signal regions.

Source code: ATLAS_2011_CONF_2011_098.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
  9namespace Rivet {
 10
 11
 12  class ATLAS_2011_CONF_2011_098 : public Analysis {
 13  public:
 14
 15    /// Constructor
 16    ATLAS_2011_CONF_2011_098()
 17      : Analysis("ATLAS_2011_CONF_2011_098"),
 18        //debug variables
 19        threeJA(0), threeJB(0), threeJC(0), threeJD(0), bj(0), jets(0), zerolept(0), eTmisscut(0)
 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
 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      declare(FastJets(FinalState(), FastJets::ANTIKT, 0.4), "AntiKtJets04");
 42
 43
 44      // all tracks (to do deltaR with leptons)
 45      declare(ChargedFinalState(Cuts::abseta < 3.0),"cfs");
 46
 47      // for pTmiss
 48      declare(VisibleFinalState(Cuts::abseta < 4.9),"vfs");
 49
 50
 51      /// Book histograms
 52      book(_count_threeJA     ,"count_threeJA", 1, 0., 1.);
 53      book(_count_threeJB     ,"count_threeJB", 1, 0., 1.);
 54      book(_count_threeJC     ,"count_threeJC", 1, 0., 1.);
 55      book(_count_threeJD     ,"count_threeJD", 1, 0., 1.);
 56      book(_hist_meff_1bjet   ,"meff_1bjet", 32, 0., 1600.);
 57      book(_hist_eTmiss_1bjet ,"eTmiss_1bjet", 6, 0., 600.);
 58      book(_hist_pTj_1bjet    ,"pTjet_1bjet", 20, 0., 800.);
 59      book(_hist_meff_2bjet   ,"meff_2bjet", 32, 0., 1600.);
 60      book(_hist_eTmiss_2bjet ,"eTmiss_2bjet", 6, 0., 600.);
 61      book(_hist_pTj_2bjet    ,"pTjet_2bjet", 20, 0., 800.);
 62
 63
 64    }
 65
 66
 67    /// Perform the per-event analysis
 68    void analyze(const Event& event) {
 69
 70      const double weight = 1.0;
 71
 72      // Temp: calorimeter module failure with 10% acceptance loss;
 73      // region unknown ==> randomly choose 10% of events to be vetoed
 74
 75      if ( rand()/static_cast<double>(RAND_MAX) < 0.1 )
 76        vetoEvent;
 77
 78      Jets tmp_cand_jets;
 79      for (const Jet& jet :
 80               apply<FastJets>(event, "AntiKtJets04").jetsByPt(20.0*GeV) ) {
 81        if ( fabs( jet.eta() ) < 2.8 ) {
 82          tmp_cand_jets.push_back(jet);
 83        }
 84      }
 85
 86      Particles cand_e =
 87        apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
 88      Particles cand_mu =
 89        apply<IdentifiedFinalState>(event, "muons").particlesByPt();
 90      Particles chg_tracks =
 91        apply<ChargedFinalState>(event, "cfs").particles();
 92
 93//cerr << "cand_e.size(): " << cand_e.size() << "   cand_mu.size(): " << cand_mu.size() << '\n';
 94
 95
 96      Jets cand_jets;
 97      for ( const Jet& jet : tmp_cand_jets ) {
 98        if ( fabs( jet.eta() ) >= 2.8 )
 99          cand_jets.push_back( jet );
100        else {
101          bool away_from_e = true;
102          for ( const Particle & e : cand_e ) {
103            if ( deltaR(e.momentum(),jet.momentum()) <= 0.2 ) {
104              away_from_e = false;
105              break;
106            }
107          }
108          if ( away_from_e )
109            cand_jets.push_back( jet );
110        }
111      }
112
113      Particles cand_lept;
114
115      bool isolated_e;
116      for ( const Particle & e : cand_e ) {
117        isolated_e = true;
118        for ( const Jet& jet : cand_jets ) {
119          if ( deltaR(e.momentum(),jet.momentum()) < 0.4 )
120            isolated_e = false;
121        }
122        if ( isolated_e == true )
123          cand_lept.push_back( e );
124      }
125
126
127      bool isolated_mu;
128      for ( const Particle & mu : cand_mu ) {
129	isolated_mu = true;
130	for ( const Jet& jet : cand_jets ) {
131	  if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 )
132	    isolated_mu = false;
133        }
134        if ( isolated_mu == true)
135          cand_lept.push_back( mu );
136      }
137
138
139      // pTmiss
140      Particles vfs_particles
141        = apply<VisibleFinalState>(event, "vfs").particles();
142      FourMomentum pTmiss;
143      for ( const Particle & p : vfs_particles ) {
144        pTmiss -= p.momentum();
145      }
146      double eTmiss = pTmiss.pT();
147
148
149      // bjets
150      Jets bjets,recon_jets;
151      for (const Jet& j : cand_jets) {
152	if(fabs( j.eta() ) <= 2.8) {
153	  recon_jets.push_back(j);
154	  if ( fabs( j.eta() ) <= 2.5 && j.perp()>50. &&
155	       j.bTagged() && rand()/static_cast<double>(RAND_MAX) < 0.5 )
156	    bjets.push_back(j);
157	}
158      }
159
160      if (bjets.empty())  {
161        MSG_DEBUG("No b-jet axes in acceptance");
162        vetoEvent;
163      }
164
165      ++bj;
166
167
168
169      // Jets event selection
170      if ( recon_jets.size() < 3 )
171        vetoEvent;
172      if ( recon_jets[0].pT() <= 130*GeV )
173        vetoEvent;
174      if ( recon_jets[1].pT() <= 50*GeV ||
175	   recon_jets[2].pT() <= 50*GeV )
176        vetoEvent;
177      ++jets;
178
179      // eTmiss cut
180      if ( eTmiss <= 130*GeV )
181        vetoEvent;
182
183      ++eTmisscut;
184
185      // 0-lepton requirement
186      if ( !cand_lept.empty() )
187        vetoEvent;
188      ++zerolept;
189
190      // m_eff cut
191      double m_eff = eTmiss
192        + recon_jets[0].pT()
193        + recon_jets[1].pT()
194        + recon_jets[2].pT();
195
196      if ( eTmiss / m_eff <= 0.25 )
197        vetoEvent;
198
199
200      // min_dPhi
201      double min_dPhi = 999.999;
202      for ( int i = 0; i < 3; ++i ) {
203        double dPhi = deltaPhi( pTmiss.phi(), recon_jets[i].phi() );
204        min_dPhi = min( min_dPhi, dPhi );
205      }
206
207      if ( min_dPhi <= 0.4 )
208        vetoEvent;
209
210
211
212    // ==================== FILL ====================
213
214
215      // 1 bjet
216      if ( bjets.size() >= 1 ) {
217
218        _hist_meff_1bjet->fill(m_eff, weight);
219        _hist_eTmiss_1bjet->fill(eTmiss, weight);
220        _hist_pTj_1bjet->fill(recon_jets[0].pT(), weight);
221
222        // 3JA region
223        if ( m_eff > 200*GeV ) {
224	  ++threeJA;
225        _count_threeJA->fill(0.5, weight);
226        }
227
228        // 3JB region
229        if ( m_eff > 700*GeV ) {
230	  ++threeJB;
231        _count_threeJB->fill(0.5, weight);
232        }
233      }
234
235      // 2 bjets
236      if ( bjets.size() >= 2 ) {
237
238        _hist_meff_2bjet->fill(m_eff, weight);
239        _hist_eTmiss_2bjet->fill(eTmiss, weight);
240        _hist_pTj_2bjet->fill(recon_jets[0].pT(), weight);
241
242        // 3JC region
243        if ( m_eff > 500*GeV ) {
244	  ++threeJC;
245          _count_threeJC->fill(0.5, weight);
246        }
247
248        // 3JD region
249        if ( m_eff > 700*GeV ) {
250	  ++threeJD;
251          _count_threeJD->fill(0.5, weight);
252        }
253      }
254
255
256
257
258    }
259
260    //@}
261
262
263    void finalize() {
264      scale( _hist_meff_1bjet, 50. * 830. * crossSection()/sumOfWeights() );
265      scale( _hist_eTmiss_1bjet, 100. * 830. * crossSection()/sumOfWeights() );
266      scale( _hist_pTj_1bjet, 40. * 830. * crossSection()/sumOfWeights() );
267      scale( _hist_meff_2bjet, 50. * 830. * crossSection()/sumOfWeights() );
268      scale( _hist_eTmiss_2bjet, 100. * 830. * crossSection()/sumOfWeights() );
269      scale( _hist_pTj_2bjet, 40. * 830. * crossSection()/sumOfWeights() );
270
271// cerr<< '\n'<<'\n'
272// << "Saw "
273// << bj << " events aft bjets cut, "
274// << jets << " events aft jet cuts, "
275// << eTmisscut << " events aft eTmiss cut, "
276// << zerolept << " events after 0-lept cut. "
277// << '\n'
278// << threeJA << " 3JA events, "
279// << threeJB << " 3JB events, "
280// << threeJC << " 3JC events, "
281// << threeJD << " 3JD events. "
282// << '\n'
283// ;
284
285    }
286
287
288  private:
289
290    /// @name Histograms
291    //@{
292    Histo1DPtr _count_threeJA;
293    Histo1DPtr _count_threeJB;
294    Histo1DPtr _count_threeJC;
295    Histo1DPtr _count_threeJD;
296    Histo1DPtr _hist_meff_1bjet;
297    Histo1DPtr _hist_eTmiss_1bjet;
298    Histo1DPtr _hist_pTj_1bjet;
299    Histo1DPtr _hist_meff_2bjet;
300    Histo1DPtr _hist_eTmiss_2bjet;
301    Histo1DPtr _hist_pTj_2bjet;
302
303    //@}
304
305
306// debug variables
307int threeJA;
308int threeJB;
309int threeJC;
310int threeJD;
311int bj;
312int jets;
313int zerolept;
314int eTmisscut;
315
316  };
317
318
319
320  // The hook for the plugin system
321  RIVET_DECLARE_PLUGIN(ATLAS_2011_CONF_2011_098);
322
323}