rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2012_CONF_2012_105

Search for supersymmetry with 2 same-sign leptons, jets and missing transverse energy
Experiment: ATLAS (LHC)
Status: OBSOLETE
Authors:
  • Peter Richardson
References:
  • ATLAS-CONF-2012-105
Beams: p+ p+
Beam energies: (4000.0, 4000.0) GeV
Run details:
  • BSM signal events at 8000 GeV.

Results of the search for the production of supersymmetric particles decaying into final states with missing transverse momentum and two isolated same-sign leptons, electrons or muons. The analysis uses a data sample collected during the first half of 2012 that corresponds to a total integrated luminosity o1 $5.8\,\text{fb}^{-1}$ of $\sqrt{s} = 8$\,TeV proton-proton collisions recorded with the ATLAS detector at the Large Hadron Collider. Opposite-sign and same-sign dilepton events are studied separately.

Source code: ATLAS_2012_CONF_2012_105.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#include "Rivet/Projections/VetoedFinalState.hh"
  9
 10namespace Rivet {
 11
 12
 13  class ATLAS_2012_CONF_2012_105 : public Analysis {
 14  public:
 15
 16    /// Constructor
 17    ATLAS_2012_CONF_2012_105()
 18      : Analysis("ATLAS_2012_CONF_2012_105")
 19    {    }
 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 > 20*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, FastJets::ANTIKT, 0.4), "AntiKtJets04");
 42
 43      // all tracks (to do deltaR with leptons)
 44      declare(ChargedFinalState(Cuts::abseta < 3 && Cuts::pT > 0.5*GeV), "cfs");
 45
 46      // for pTmiss
 47      declare(VisibleFinalState(Cuts::abseta < 4.5), "vfs");
 48
 49      // book histograms
 50
 51      // counts in signal regions
 52      book(_count_ee   ,"count_ee"  , 1, 0., 1.);
 53      book(_count_emu  ,"count_emu" , 1, 0., 1.);
 54      book(_count_mumu ,"count_mumu", 1, 0., 1.);
 55      book(_count_ll   ,"count_ll"  , 1, 0., 1.);
 56
 57      // histograms from paper
 58      book(_hist_eTmiss_ee   ,"eTmiss_ee"  , 8, 0., 400.);
 59      book(_hist_eTmiss_emu  ,"eTmiss_emu" , 8, 0., 400.);
 60      book(_hist_eTmiss_mumu ,"eTmiss_mumu", 8, 0., 400.);
 61      book(_hist_eTmiss_ll   ,"eTmiss_ll"  , 8, 0., 400.);
 62    }
 63
 64    /// Perform the event analysis
 65    void analyze(const Event& event) {
 66
 67      // get the jet candidates
 68      Jets cand_jets;
 69      for (const Jet& jet :
 70               apply<FastJets>(event, "AntiKtJets04").jetsByPt(20.0*GeV) ) {
 71        if ( fabs( jet.eta() ) < 2.8 ) {
 72          cand_jets.push_back(jet);
 73        }
 74      }
 75
 76      // electron candidates
 77      Particles cand_e =
 78        apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
 79
 80      // Discard jets that overlap with electrons
 81      Jets recon_jets;
 82      for ( const Jet& jet : cand_jets ) {
 83        bool away_from_e = true;
 84        for ( const Particle & e : cand_e ) {
 85          if ( deltaR(e.momentum(),jet.momentum()) <= 0.2 ) {
 86            away_from_e = false;
 87            break;
 88          }
 89        }
 90        if ( away_from_e ) recon_jets.push_back( jet );
 91      }
 92      // get the charged tracks for isolation
 93      Particles chg_tracks =
 94        apply<ChargedFinalState>(event, "cfs").particles();
 95
 96      // Reconstructed electrons
 97      Particles recon_leptons;
 98      for ( const Particle & e : cand_e ) {
 99        // check not near a jet
100        bool e_near_jet = false;
101        for ( const Jet& jet : recon_jets ) {
102          if ( deltaR(e.momentum(),jet.momentum()) < 0.4 ) {
103            e_near_jet = true;
104            break;
105          }
106        }
107        if ( e_near_jet ) continue;
108        // check the isolation
109        double pTinCone = -e.pT();
110        for ( const Particle & track : chg_tracks ) {
111          if ( deltaR(e.momentum(),track.momentum()) < 0.2 )
112            pTinCone += track.pT();
113        }
114        if ( pTinCone < 0.1*e.perp() )
115          recon_leptons.push_back(e);
116      }
117
118      // Reconstructed Muons
119      Particles cand_mu =
120        apply<IdentifiedFinalState>(event,"muons").particlesByPt();
121      for ( const Particle & mu : cand_mu ) {
122        // check not near a jet
123        bool mu_near_jet = false;
124        for ( const Jet& jet : recon_jets ) {
125          if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 ) {
126            mu_near_jet = true;
127            break;
128          }
129        }
130        if ( mu_near_jet ) continue;
131        // isolation
132        double pTinCone = -mu.pT();
133        for ( const Particle & track : chg_tracks ) {
134          if ( deltaR(mu.momentum(),track.momentum()) < 0.2 )
135            pTinCone += track.pT();
136        }
137        if ( pTinCone < 1.8*GeV )
138          recon_leptons.push_back(mu);
139      }
140
141      // pTmiss
142      Particles vfs_particles
143        = apply<VisibleFinalState>(event, "vfs").particles();
144      FourMomentum pTmiss;
145      for ( const Particle & p : vfs_particles ) {
146        pTmiss -= p.momentum();
147      }
148      double eTmiss = pTmiss.pT();
149
150      // Exactly two leptons for each event
151      if ( recon_leptons.size() != 2) vetoEvent;
152      // ensure 1st hardest
153      if(recon_leptons[0].perp()<recon_leptons[1].perp())
154        std::swap(recon_leptons[0],recon_leptons[1]);
155      // only keep same sign
156      if(recon_leptons[0].pid()*recon_leptons[1].pid()<0)
157        vetoEvent;
158      // at least 4 jets pt>50
159      if(recon_jets.size()<4||recon_jets[3].perp()<50.)
160        vetoEvent;
161
162      if(recon_leptons[0].pid()!=recon_leptons[1].pid())
163        _hist_eTmiss_emu ->fill(eTmiss);
164      else if(recon_leptons[0].abspid()==PID::ELECTRON)
165        _hist_eTmiss_ee ->fill(eTmiss);
166      else if(recon_leptons[0].abspid()==PID::MUON)
167        _hist_eTmiss_mumu->fill(eTmiss);
168      _hist_eTmiss_ll->fill(eTmiss);
169
170      if(eTmiss>150.) {
171        if(recon_leptons[0].pid()!=recon_leptons[1].pid())
172          _count_emu ->fill(0.5);
173        else if(recon_leptons[0].abspid()==PID::ELECTRON)
174          _count_ee  ->fill(0.5);
175        else if(recon_leptons[0].abspid()==PID::MUON)
176          _count_mumu->fill(0.5);
177        _count_ll->fill(0.5);
178      }
179
180    }
181
182    //@}
183
184
185    void finalize() {
186
187      double norm = crossSection()/femtobarn*5.8/sumOfWeights();
188      // event counts
189      scale(_count_ee  ,norm);
190      scale(_count_emu ,norm);
191      scale(_count_mumu,norm);
192      scale(_count_ll  ,norm);
193      // histograms
194      scale(_hist_eTmiss_ee  ,norm*50.);
195      scale(_hist_eTmiss_emu ,norm*50.);
196      scale(_hist_eTmiss_mumu,norm*50.);
197      scale(_hist_eTmiss_ll  ,norm*50.);
198
199    }
200
201  private:
202
203    /// @name Histograms
204    //@{
205    Histo1DPtr _count_ee  ;
206    Histo1DPtr _count_emu ;
207    Histo1DPtr _count_mumu;
208    Histo1DPtr _count_ll  ;
209
210    Histo1DPtr _hist_eTmiss_ee;
211    Histo1DPtr _hist_eTmiss_emu;
212    Histo1DPtr _hist_eTmiss_mumu;
213    Histo1DPtr _hist_eTmiss_ll;
214    //@}
215  };
216
217  // The hook for the plugin system
218  RIVET_DECLARE_PLUGIN(ATLAS_2012_CONF_2012_105);
219
220}