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#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}