rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2012_I1095236

$b$-jets search for supersymmetry with 0- and 1-leptons
Experiment: ATLAS (LHC)
Inspire ID: 1095236
Status: UNVALIDATED
Authors:
  • Peter Richardson
References: 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 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}