rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2012_I1180197

Search for supersymmetry at 7 TeV in final states with jets, missing transverse momentum and isolated leptons with the ATLAS detector.
Experiment: ATLAS (LHC)
Inspire ID: 1180197
Status: UNVALIDATED
Authors:
  • Peter Richardson
References: Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • BSM signal events at 7000 GeV.

One and two lepton search for supersymmmetric particles by ATLAS at 7 TeV. Event counts in the signal regions are implemented as one-bin histograms. Histograms for effective mass are implemented for the two signal hard lepton signal regions and the ratio of missing transverse energy to effective mass for the soft lepton region. Only the one lepton plots are currently implemented as taken from the CONF note.

Source code: ATLAS_2012_I1180197.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/VetoedFinalState.hh"
  8#include "Rivet/Projections/FastJets.hh"
  9
 10namespace Rivet {
 11
 12
 13  class ATLAS_2012_I1180197 : public Analysis {
 14  public:
 15
 16    /// Constructor
 17    ATLAS_2012_I1180197()
 18      : Analysis("ATLAS_2012_I1180197")
 19    {    }
 20
 21
 22    /// @name Analysis methods
 23    /// @{
 24
 25    /// Book histograms and initialize projections before the run
 26    void init() {
 27
 28      // projection to find the electrons
 29      IdentifiedFinalState elecs(Cuts::abseta < 2.47 && Cuts::pT > 7*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 > 6*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.9), "vfs");
 48
 49      // Book histograms
 50      book(_count_1l_3jet_all_channel  ,"count_1l_3jet_all_channel", 1, 0., 1.);
 51      book(_count_1l_3jet_e_channel    ,"count_1l_3jet_e_channel"  , 1, 0., 1.);
 52      book(_count_1l_3jet_mu_channel   ,"count_1l_3jet_mu_channel" , 1, 0., 1.);
 53      book(_count_1l_4jet_all_channel  ,"count_1l_4jet_all_channel", 1, 0., 1.);
 54      book(_count_1l_4jet_e_channel    ,"count_1l_4jet_e_channel"  , 1, 0., 1.);
 55      book(_count_1l_4jet_mu_channel   ,"count_1l_4jet_mu_channel" , 1, 0., 1.);
 56      book(_count_1l_soft_all_channel  ,"count_1l_soft_all_channel", 1, 0., 1.);
 57      book(_count_1l_soft_e_channel    ,"count_1l_soft_e_channel"  , 1, 0., 1.);
 58      book(_count_1l_soft_mu_channel   ,"count_1l_soft_mu_channel" , 1, 0., 1.);
 59
 60      book(_count_2l_2jet_all_channel  ,"count_2l_2jet_all_channel" , 1, 0., 1.);
 61      book(_count_2l_2jet_ee_channel   ,"count_2l_2jet_ee_channel"  , 1, 0., 1.);
 62      book(_count_2l_2jet_emu_channel  ,"count_2l_2jet_emu_channel" , 1, 0., 1.);
 63      book(_count_2l_2jet_mumu_channel ,"count_2l_2jet_mumu_channel", 1, 0., 1.);
 64      book(_count_2l_4jet_all_channel  ,"count_2l_4jet_all_channel" , 1, 0., 1.);
 65      book(_count_2l_4jet_ee_channel   ,"count_2l_4jet_ee_channel"  , 1, 0., 1.);
 66      book(_count_2l_4jet_emu_channel  ,"count_2l_4jet_emu_channel" , 1, 0., 1.);
 67      book(_count_2l_4jet_mumu_channel ,"count_2l_4jet_mumu_channel", 1, 0., 1.);
 68      book(_hist_1l_m_eff_3jet        ,"hist_1l_m_eff_3jet"       ,  6, 400., 1600.);
 69      book(_hist_1l_m_eff_4jet        ,"hist_1l_m_eff_4jet"       ,  4, 800., 1600.);
 70      book(_hist_1l_eTmiss_m_eff_soft ,"hist_1l_eTmiss_m_eff_soft",  6, 0.1 , 0.7  );
 71      book(_hist_2l_m_eff_2jet        ,"hist_2l_m_eff_2jet"       ,  5, 700., 1700.);
 72      book(_hist_2l_m_eff_4jet        ,"hist_2l_m_eff_4jet"       ,  5, 600., 1600.);
 73    }
 74
 75
 76    /// Perform the per-event analysis
 77    void analyze(const Event& event) {
 78
 79      // get the candiate jets
 80      Jets cand_jets = apply<FastJets>(event, "AntiKtJets04").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 4.5);
 81      // charged tracks for isolation
 82      Particles chg_tracks = apply<ChargedFinalState>(event, "cfs").particles();
 83      // find the electrons
 84      Particles cand_soft_e,cand_hard_e;
 85      for( const Particle & e : apply<IdentifiedFinalState>(event, "elecs").particlesByPt()) {
 86        double pT  = e.pT();
 87        double eta = e.eta();
 88        // remove any leptons within 0.4 of any candidate jets
 89        bool e_near_jet = false;
 90        for ( const Jet& jet : cand_jets ) {
 91          double dR = deltaR(e.momentum(),jet.momentum());
 92          if ( inRange(dR, 0.2, 0.4) ) {
 93            e_near_jet = true;
 94            break;
 95          }
 96        }
 97        if ( e_near_jet ) continue;
 98        // soft selection
 99        if (pT > 7*GeV && !(fabs(eta) > 1.37 && fabs(eta) < 1.52)) {
100          cand_soft_e.push_back(e);
101        }
102        // hard selection
103        if (pT > 10*GeV) cand_hard_e.push_back(e);
104      }
105      Particles cand_soft_mu,cand_hard_mu;
106      for (const Particle& mu : apply<IdentifiedFinalState>(event, "muons").particlesByPt()) {
107        double pT  = mu.pT();
108        double eta = mu.eta();
109        // remove any leptons within 0.4 of any candidate jets
110        bool mu_near_jet = false;
111        for ( const Jet& jet : cand_jets ) {
112          if ( deltaR(mu.momentum(),jet.momentum()) < 0.4 ) {
113            mu_near_jet = true;
114            break;
115          }
116        }
117        if ( mu_near_jet ) continue;
118        // soft selection
119        if (pT > 6*GeV && !inRange(fabs(eta), 1.37, 1.52)) {
120          cand_soft_mu.push_back(mu);
121        }
122        // hard selection
123        if (pT > 10*GeV) cand_hard_mu.push_back(mu);
124      }
125      // pTcone around muon track (hard)
126      Particles recon_hard_mu;
127      for ( const Particle & mu : cand_hard_mu ) {
128        double pTinCone = -mu.pT();
129        for ( const Particle & track : chg_tracks ) {
130          if ( deltaR(mu.momentum(),track.momentum()) < 0.2 )
131            pTinCone += track.pT();
132        }
133        if ( pTinCone < 1.8*GeV ) recon_hard_mu.push_back(mu);
134      }
135      // pTcone around muon track (soft)
136      Particles recon_soft_mu;
137      for ( const Particle & mu : cand_soft_mu ) {
138        double pTinCone = -mu.pT();
139        if(-pTinCone>20.) continue;
140        for ( const Particle & track : chg_tracks ) {
141          if ( deltaR(mu.momentum(),track.momentum()) < 0.2 )
142            pTinCone += track.pT();
143        }
144        if ( pTinCone < 1.8*GeV ) recon_soft_mu.push_back(mu);
145      }
146      // pTcone around electron track (hard)
147      Particles recon_hard_e;
148      for ( const Particle & e : cand_hard_e ) {
149        double pTinCone = -e.pT();
150        for ( const Particle & track : chg_tracks ) {
151          if ( deltaR(e.momentum(),track.momentum()) < 0.2 )
152            pTinCone += track.pT();
153        }
154        if ( pTinCone < 0.1 * e.pT() ) recon_hard_e.push_back(e);
155      }
156      // pTcone around electron track (soft)
157      Particles recon_soft_e;
158      for ( const Particle & e : cand_soft_e ) {
159        double pTinCone = -e.pT();
160        if(-pTinCone>25.) continue;
161        for ( const Particle & track : chg_tracks ) {
162          if ( deltaR(e.momentum(),track.momentum()) < 0.2 )
163            pTinCone += track.pT();
164        }
165        if ( pTinCone < 0.1 * e.pT() ) recon_soft_e.push_back(e);
166      }
167
168      // pTmiss
169      FourMomentum pTmiss;
170      for ( const Particle & p :
171                apply<VisibleFinalState>(event, "vfs").particles() ) {
172        pTmiss -= p.momentum();
173      }
174      double eTmiss = pTmiss.pT();
175
176      // hard lepton selection
177      if( ! recon_hard_e.empty() || !recon_hard_mu.empty() ) {
178        // discard jets that overlap with electrons
179        Jets recon_jets;
180        for ( const Jet& jet : cand_jets ) {
181          if(jet.abseta()>2.5||
182             jet.pT() < 25*GeV) continue;
183          bool away_from_e = true;
184          for ( const Particle & e : cand_hard_e ) {
185            if ( deltaR(e.momentum(),jet.momentum()) < 0.2 ) {
186              away_from_e = false;
187              break;
188            }
189          }
190          if ( away_from_e ) recon_jets.push_back( jet );
191        }
192        // both selections require at least 2 jets
193        // meff calculation
194        double HT=0.;
195        for( const Jet & jet : recon_jets) {
196          HT += jet.pT();
197        }
198        double m_eff_inc  = HT+eTmiss;
199        unsigned int njet = recon_jets.size();
200        // 1 lepton only
201        if( recon_hard_e.size() + recon_hard_mu.size() == 1 && njet >=3 )  {
202          // get the lepton
203          Particle lepton = recon_hard_e.empty() ?
204            recon_hard_mu[0] : recon_hard_e[0];
205          // lepton variables
206          double pT = lepton.pT();
207          double mT  = 2.*(pT*eTmiss -
208                           lepton.px()*pTmiss.px() -
209                           lepton.py()*pTmiss.py());
210          mT = sqrt(mT);
211          HT += pT;
212          m_eff_inc += pT;
213          // apply the cuts on the leptons and min no. of jets
214          if( ( ( lepton.abspid() == PID::ELECTRON && pT > 25. ) ||
215                ( lepton.abspid() == PID::MUON     && pT > 20. ) ) &&
216              mT > 100. && eTmiss > 250. ) {
217            double m_eff = pT+eTmiss;
218            for (size_t ix = 0; ix < 3; ++ix)
219              m_eff += recon_jets[ix].pT();
220            // 3 jet channel
221            if ( (njet == 3 || recon_jets[3].pT() < 80*GeV ) &&
222                recon_jets[0].pT() > 100*GeV ) {
223              if (eTmiss/m_eff > 0.3) {
224                if (m_eff_inc > 1200*GeV) {
225                  _count_1l_3jet_all_channel->fill(0.5);
226                  if (lepton.abspid() == PID::ELECTRON )
227                    _count_1l_3jet_e_channel->fill(0.5);
228                  else
229                    _count_1l_3jet_mu_channel->fill(0.5);
230                }
231                _hist_1l_m_eff_3jet->fill(min(1599., m_eff_inc));
232              }
233            }
234            // 4 jet channel
235            else if (njet >=4 && recon_jets[3].pT() > 80*GeV) {
236              m_eff += recon_jets[3].pT();
237              if (eTmiss/m_eff>0.2) {
238                if (m_eff_inc > 800*GeV) {
239                  _count_1l_4jet_all_channel->fill(0.5);
240                  if(lepton.abspid() == PID::ELECTRON )
241                    _count_1l_4jet_e_channel->fill(0.5);
242                  else
243                    _count_1l_4jet_mu_channel->fill(0.5);
244                }
245                _hist_1l_m_eff_4jet->fill(min(1599., m_eff_inc));
246              }
247            }
248          }
249        }
250        // multi lepton
251        else if( recon_hard_e.size() + recon_hard_mu.size() >= 2 && njet >=2 ) {
252          // get all the leptons and sort them by pT
253          Particles leptons(recon_hard_e.begin(),recon_hard_e.end());
254          leptons.insert(leptons.begin(),recon_hard_mu.begin(),recon_hard_mu.end());
255          std::sort(leptons.begin(), leptons.end(), cmpMomByPt);
256          double m_eff(0.0);
257          for (size_t ix = 0; ix < leptons.size(); ++ix)
258            m_eff += leptons[ix].pT();
259          m_eff_inc += m_eff;
260          m_eff += eTmiss;
261          for (size_t ix = 0; ix < (size_t) min(4, int(recon_jets.size())); ++ix)
262            m_eff += recon_jets[ix].pT();
263          // require opposite sign leptons
264          if (leptons[0].pid()*leptons[1].pid()<0) {
265            // 2 jet
266            if (recon_jets[1].pT()>200 &&
267               ( njet<4 || (njet>=4 && recon_jets[3].pT() < 50*GeV)) && eTmiss > 300*GeV) {
268              _count_2l_2jet_all_channel->fill(0.5);
269              if (leptons[0].abspid() == PID::ELECTRON && leptons[1].abspid() == PID::ELECTRON )
270                _count_2l_2jet_ee_channel->fill(0.5);
271              else if (leptons[0].abspid() == PID::MUON && leptons[1].abspid() == PID::MUON )
272                _count_2l_2jet_mumu_channel->fill(0.5);
273              else
274                _count_2l_2jet_emu_channel->fill(0.5);
275              _hist_2l_m_eff_2jet->fill(min(1699., m_eff_inc));
276            }
277            // 4 jet
278            else if (njet >= 4 && recon_jets[3].pT() > 50*GeV &&
279                     eTmiss > 100*GeV && eTmiss/m_eff > 0.2) {
280              if ( m_eff_inc > 650*GeV ) {
281                _count_2l_4jet_all_channel->fill(0.5);
282                if (leptons[0].abspid() == PID::ELECTRON && leptons[1].abspid() == PID::ELECTRON )
283                  _count_2l_4jet_ee_channel->fill(0.5);
284                else if (leptons[0].abspid() == PID::MUON && leptons[1].abspid() == PID::MUON )
285                  _count_2l_4jet_mumu_channel->fill(0.5);
286                else
287                  _count_2l_4jet_emu_channel->fill(0.5);
288              }
289              _hist_2l_m_eff_4jet->fill(min(1599., m_eff_inc));
290            }
291          }
292        }
293      }
294      // soft lepton selection
295      if ( recon_soft_e.size() + recon_soft_mu.size() == 1 ) {
296        // discard jets that overlap with electrons
297        Jets recon_jets;
298        for ( const Jet& jet : cand_jets ) {
299          if (jet.abseta() > 2.5 || jet.pT() < 25*GeV) continue;
300          bool away_from_e = true;
301          for ( const Particle & e : cand_soft_e ) {
302            if ( deltaR(e.momentum(), jet.momentum()) < 0.2 ) {
303              away_from_e = false;
304              break;
305            }
306          }
307          if ( away_from_e ) recon_jets.push_back( jet );
308        }
309        // meff calculation
310        double HT=0.;
311        for (const Jet & jet : recon_jets) {
312          HT += jet.pT();
313        }
314        double m_eff_inc  = HT+eTmiss;
315        // get the lepton
316        Particle lepton = recon_soft_e.empty() ?
317          recon_soft_mu[0] : recon_soft_e[0];
318        // lepton variables
319        double pT = lepton.pT();
320        double mT  = 2.*(pT*eTmiss -
321                         lepton.px()*pTmiss.px() -
322                         lepton.py()*pTmiss.py());
323        mT = sqrt(mT);
324        m_eff_inc += pT;
325        double m_eff = pT+eTmiss;
326        // apply final cuts
327        if (recon_jets.size() >= 2 && recon_jets[0].pT()>130*GeV && mT > 100*GeV && eTmiss > 250*GeV) {
328          for (size_t ix = 0; ix < 2; ++ix)
329            m_eff += recon_jets[0].pT();
330          if (eTmiss/m_eff > 0.3) {
331            _count_1l_soft_all_channel->fill(0.5);
332            if (lepton.abspid() == PID::ELECTRON )
333              _count_1l_soft_e_channel->fill(0.5);
334            else
335              _count_1l_soft_mu_channel->fill(0.5);
336          }
337          _hist_1l_eTmiss_m_eff_soft->fill( eTmiss/m_eff_inc);
338        }
339      }
340    }
341
342
343    void finalize() {
344
345      double norm = 4.7* crossSection()/sumOfWeights()/femtobarn;
346      scale(_count_1l_3jet_all_channel  ,norm);
347      scale(_count_1l_3jet_e_channel    ,norm);
348      scale(_count_1l_3jet_mu_channel   ,norm);
349      scale(_count_1l_4jet_all_channel  ,norm);
350      scale(_count_1l_4jet_e_channel    ,norm);
351      scale(_count_1l_4jet_mu_channel   ,norm);
352      scale(_count_1l_soft_all_channel  ,norm);
353      scale(_count_1l_soft_e_channel    ,norm);
354      scale(_count_1l_soft_mu_channel   ,norm);
355      scale(_count_2l_2jet_all_channel  ,norm);
356      scale(_count_2l_2jet_ee_channel   ,norm);
357      scale(_count_2l_2jet_emu_channel  ,norm);
358      scale(_count_2l_2jet_mumu_channel ,norm);
359      scale(_count_2l_4jet_all_channel  ,norm);
360      scale(_count_2l_4jet_ee_channel   ,norm);
361      scale(_count_2l_4jet_emu_channel  ,norm);
362      scale(_count_2l_4jet_mumu_channel ,norm);
363
364      scale(_hist_1l_m_eff_3jet         ,200.*norm);
365      scale(_hist_1l_m_eff_4jet         ,200.*norm);
366      scale(_hist_1l_eTmiss_m_eff_soft  ,0.1*norm);
367      scale(_hist_2l_m_eff_2jet         ,200.*norm);
368      scale(_hist_2l_m_eff_4jet         ,200.*norm);
369
370    }
371
372  private:
373
374    /// @name Histos
375    /// @{
376    Histo1DPtr _count_1l_3jet_all_channel;
377    Histo1DPtr _count_1l_3jet_e_channel;
378    Histo1DPtr _count_1l_3jet_mu_channel;
379    Histo1DPtr _count_1l_4jet_all_channel;
380    Histo1DPtr _count_1l_4jet_e_channel;
381    Histo1DPtr _count_1l_4jet_mu_channel;
382    Histo1DPtr _count_1l_soft_all_channel;
383    Histo1DPtr _count_1l_soft_e_channel;
384    Histo1DPtr _count_1l_soft_mu_channel;
385    Histo1DPtr _count_2l_2jet_all_channel;
386    Histo1DPtr _count_2l_2jet_ee_channel;
387    Histo1DPtr _count_2l_2jet_emu_channel;
388    Histo1DPtr _count_2l_2jet_mumu_channel;
389    Histo1DPtr _count_2l_4jet_all_channel;
390    Histo1DPtr _count_2l_4jet_ee_channel;
391    Histo1DPtr _count_2l_4jet_emu_channel;
392    Histo1DPtr _count_2l_4jet_mumu_channel;
393    Histo1DPtr _hist_1l_m_eff_3jet;
394    Histo1DPtr _hist_1l_m_eff_4jet;
395    Histo1DPtr _hist_1l_eTmiss_m_eff_soft;
396    Histo1DPtr _hist_2l_m_eff_2jet;
397    Histo1DPtr _hist_2l_m_eff_4jet;
398    /// @}
399
400  };
401
402  RIVET_DECLARE_PLUGIN(ATLAS_2012_I1180197);
403
404}