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