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: 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, JetAlg::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 = apply<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::abseta < 2.8 && Cuts::pT > 20*GeV);
 69
 70      // electron candidates
 71      Particles cand_e = apply<IdentifiedFinalState>(event, "elecs").particlesByPt();
 72
 73      // Discard jets that overlap with electrons
 74      Jets recon_jets;
 75      for ( const Jet& jet : cand_jets ) {
 76        bool away_from_e = true;
 77        for ( const Particle & e : cand_e ) {
 78          if ( deltaR(e.momentum(),jet.momentum()) <= 0.2 ) {
 79            away_from_e = false;
 80            break;
 81          }
 82        }
 83        if ( away_from_e ) recon_jets.push_back( jet );
 84      }
 85      // get the charged tracks for isolation
 86      Particles chg_tracks =
 87        apply<ChargedFinalState>(event, "cfs").particles();
 88
 89      // Reconstructed electrons
 90      Particles recon_leptons;
 91      for ( const Particle & e : cand_e ) {
 92        // check not near a jet
 93        bool e_near_jet = false;
 94        for ( const Jet& jet : recon_jets ) {
 95          if ( deltaR(e.momentum(),jet.momentum()) < 0.4 ) {
 96            e_near_jet = true;
 97            break;
 98          }
 99        }
100        if ( e_near_jet ) continue;
101        // check the isolation
102        double pTinCone = -e.pT();
103        for ( const Particle & track : chg_tracks ) {
104          if ( deltaR(e.momentum(),track.momentum()) < 0.2 )
105            pTinCone += track.pT();
106        }
107        if ( pTinCone < 0.1*e.perp() )
108          recon_leptons.push_back(e);
109      }
110
111      // Reconstructed Muons
112      Particles cand_mu =
113        apply<IdentifiedFinalState>(event,"muons").particlesByPt();
114      for ( const Particle & mu : cand_mu ) {
115        // check not near a jet
116        bool mu_near_jet = false;
117        for ( const Jet& jet : recon_jets ) {
118          if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 ) {
119            mu_near_jet = true;
120            break;
121          }
122        }
123        if ( mu_near_jet ) continue;
124        // isolation
125        double pTinCone = -mu.pT();
126        for ( const Particle & track : chg_tracks ) {
127          if ( deltaR(mu.momentum(),track.momentum()) < 0.2 )
128            pTinCone += track.pT();
129        }
130        if ( pTinCone < 1.8*GeV )
131          recon_leptons.push_back(mu);
132      }
133
134      // pTmiss
135      Particles vfs_particles
136        = apply<VisibleFinalState>(event, "vfs").particles();
137      FourMomentum pTmiss;
138      for ( const Particle & p : vfs_particles ) {
139        pTmiss -= p.momentum();
140      }
141      double eTmiss = pTmiss.pT();
142
143      // Exactly two leptons for each event
144      if ( recon_leptons.size() != 2) vetoEvent;
145      // ensure 1st hardest
146      if(recon_leptons[0].perp()<recon_leptons[1].perp())
147        std::swap(recon_leptons[0],recon_leptons[1]);
148      // only keep same sign
149      if(recon_leptons[0].pid()*recon_leptons[1].pid()<0)
150        vetoEvent;
151      // at least 4 jets pt>50
152      if(recon_jets.size()<4||recon_jets[3].perp()<50.)
153        vetoEvent;
154
155      if(recon_leptons[0].pid()!=recon_leptons[1].pid())
156        _hist_eTmiss_emu ->fill(eTmiss);
157      else if(recon_leptons[0].abspid()==PID::ELECTRON)
158        _hist_eTmiss_ee ->fill(eTmiss);
159      else if(recon_leptons[0].abspid()==PID::MUON)
160        _hist_eTmiss_mumu->fill(eTmiss);
161      _hist_eTmiss_ll->fill(eTmiss);
162
163      if(eTmiss>150.) {
164        if(recon_leptons[0].pid()!=recon_leptons[1].pid())
165          _count_emu ->fill(0.5);
166        else if(recon_leptons[0].abspid()==PID::ELECTRON)
167          _count_ee  ->fill(0.5);
168        else if(recon_leptons[0].abspid()==PID::MUON)
169          _count_mumu->fill(0.5);
170        _count_ll->fill(0.5);
171      }
172
173    }
174
175    /// @}
176
177
178    void finalize() {
179
180      double norm = crossSection()/femtobarn*5.8/sumOfWeights();
181      // event counts
182      scale(_count_ee  ,norm);
183      scale(_count_emu ,norm);
184      scale(_count_mumu,norm);
185      scale(_count_ll  ,norm);
186      // histograms
187      scale(_hist_eTmiss_ee  ,norm*50.);
188      scale(_hist_eTmiss_emu ,norm*50.);
189      scale(_hist_eTmiss_mumu,norm*50.);
190      scale(_hist_eTmiss_ll  ,norm*50.);
191
192    }
193
194  private:
195
196    /// @name Histograms
197    /// @{
198    Histo1DPtr _count_ee  ;
199    Histo1DPtr _count_emu ;
200    Histo1DPtr _count_mumu;
201    Histo1DPtr _count_ll  ;
202
203    Histo1DPtr _hist_eTmiss_ee;
204    Histo1DPtr _hist_eTmiss_emu;
205    Histo1DPtr _hist_eTmiss_mumu;
206    Histo1DPtr _hist_eTmiss_ll;
207    /// @}
208  };
209
210  RIVET_DECLARE_PLUGIN(ATLAS_2012_CONF_2012_105);
211
212}