rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2016_CONF_2016_094

ATLAS 2016 1-lepton + many jets SUSY search at 13 \text{TeV}, from 14.8/fb CONF note
Experiment: ATLAS (LHC)
Status: UNVALIDATED
Authors:
  • Andy Buckley
No references listed
Beams: p+ p+
Beam energies: (6500.0, 6500.0) GeV
Run details:
  • BSM signal events

A search for new phenomena in final states characterized by high jet multiplicity, an isolated lepton (electron or muon), and either zero or at least three $b$-tagged jets is. The search uses 14.8/fb of $\sqrt{s} = 13 \text{TeV}$ proton--proton collision data collected by the ATLAS experiment at the Large Hadron Collider in 2015 and 2016.

Source code: ATLAS_2016_CONF_2016_094.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/PromptFinalState.hh"
  5#include "Rivet/Projections/FastJets.hh"
  6#include "Rivet/Projections/Sphericity.hh"
  7#include "Rivet/Projections/SmearedParticles.hh"
  8#include "Rivet/Projections/SmearedJets.hh"
  9#include "Rivet/Projections/SmearedMET.hh"
 10#include "Rivet/Tools/Cutflow.hh"
 11
 12namespace Rivet {
 13
 14
 15  /// @brief ATLAS 2016 1-lepton + many jets SUSY search, from 14.8/fb CONF note
 16  class ATLAS_2016_CONF_2016_094 : public Analysis {
 17  public:
 18
 19    /// Constructor
 20    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2016_CONF_2016_094);
 21
 22
 23    /// @name Analysis methods
 24    //@{
 25
 26    /// Book histograms and initialise projections before the run
 27    void init() {
 28
 29      // Initialise and register projections
 30      FinalState calofs(Cuts::abseta < 4.9);
 31      FastJets fj(calofs, FastJets::ANTIKT, 0.4);
 32      declare(fj, "TruthJets");
 33      declare(SmearedJets(fj, JET_SMEAR_ATLAS_RUN2, [](const Jet& j) {
 34            if (j.abseta() > 2.5) return 0.;
 35            return j.bTagged(Cuts::pT > 5*GeV) ? 0.80 :
 36              j.cTagged(Cuts::pT > 5*GeV) ? 1/6. : 1/106.; }), "Jets");
 37
 38      // MissingMomentum mm(calofs);
 39      // declare(mm, "TruthMET");
 40      // declare(SmearedMET(mm, MET_SMEAR_ATLAS_RUN2), "MET");
 41
 42      FinalState es(Cuts::abspid == PID::ELECTRON && Cuts::abseta < 2.47 && !Cuts::absetaIn(1.37, 1.52) && Cuts::pT > 10*GeV);
 43      declare(es, "TruthElectrons");
 44      declare(SmearedParticles(es, ELECTRON_RECOEFF_ATLAS_RUN2, ELECTRON_SMEAR_ATLAS_RUN2), "Electrons");
 45
 46      FinalState mus(Cuts::abspid == PID::MUON && Cuts::abseta < 2.4 && Cuts::pT > 10*GeV);
 47      declare(mus, "TruthMuons");
 48      declare(SmearedParticles(mus, MUON_EFF_ATLAS_RUN2, MUON_SMEAR_ATLAS_RUN2), "Muons");
 49
 50
 51      // Book histograms/counters
 52      book(_h_08j40_0b,"08j40_0b");
 53      book(_h_09j40_0b,"09j40_0b");
 54      book(_h_10j40_0b,"10j40_0b");
 55      book(_h_08j40_3b,"08j40_3b");
 56      book(_h_09j40_3b,"09j40_3b");
 57      book(_h_10j40_3b,"10j40_3b");
 58      book(_h_08j60_0b,"08j60_0b");
 59      book(_h_09j60_0b,"09j60_0b");
 60      book(_h_10j60_0b,"10j60_0b");
 61      book(_h_08j60_3b,"08j60_3b");
 62      book(_h_09j60_3b,"09j60_3b");
 63      book(_h_10j60_3b,"10j60_3b");
 64
 65    }
 66
 67
 68    /// Perform the per-event analysis
 69    void analyze(const Event& event) {
 70
 71      // Get baseline electrons, muons, and jets
 72      // NB. for electrons, we don't apply the loose ID here, since we don't want to double-count effs with later use of tight ID
 73      Particles elecs = apply<ParticleFinder>(event, "Electrons").particles();
 74      Particles muons = apply<ParticleFinder>(event, "Muons").particles();
 75      Jets jets = apply<JetAlg>(event, "Jets").jetsByPt(Cuts::pT > 20*GeV && Cuts::abseta < 2.4);
 76      ifilter_select(jets, JetEffFilter([](const Jet& j) { return j.pT() > 60*GeV ? 1.0 : 0.94; }));
 77
 78
 79      // Jet/electron/muon overlap removal and selection
 80      // Remove any untagged jet within dR = 0.2 of an electron
 81      for (const Particle& e : elecs)
 82        ifilter_discard(jets, [&](const Jet& j) { return !j.bTagged(Cuts::pT > 5*GeV) && deltaR(e, j, RAPIDITY) < 0.2; });
 83      // Remove any untagged low-multiplicity/muon-dominated jet within dR = 0.4 of a muon
 84      for (const Particle& m : muons)
 85        ifilter_discard(jets, [&](const Jet& j) {
 86            if (j.bTagged(Cuts::pT > 5*GeV)) return false; /// @note A different b-tag working point, 85%, was actually used here *sigh*
 87            if (deltaR(m, j, RAPIDITY) > 0.4) return false;
 88            if (j.particles(Cuts::abscharge != 0).size() < 3) return true;
 89            return m.pT()/j.pT() > 0.5;
 90          });
 91      // Removing leptons within dR = 0.4 of remaining jets
 92      for (const Jet& j : jets) {
 93        ifilter_discard(elecs, deltaRLess(j, 0.4, RAPIDITY));
 94        ifilter_discard(muons, deltaRLess(j, 0.4, RAPIDITY));
 95      }
 96
 97      // Signal jet and lepton selection
 98      const Jets sigjets40 = filter_select(jets, Cuts::pT > 40*GeV);
 99      const Jets sigjets60 = filter_select(sigjets40, Cuts::pT > 60*GeV);
100      const Jets sigbjets40 = filter_select(sigjets40, [](const Jet& j) { return j.bTagged(Cuts::pT > 5*GeV); });
101      const Jets sigbjets60 = filter_select(sigjets60, [](const Jet& j) { return j.bTagged(Cuts::pT > 5*GeV); });
102      const Particles sigmuons = filter_select(muons, Cuts::pT > 35*GeV);
103      Particles sigelecs = filter_select(elecs, Cuts::pT > 35*GeV);
104      ifilter_select(sigelecs, ParticleEffFilter(ELECTRON_EFF_ATLAS_RUN2_TIGHT));
105
106
107      //////////////////
108
109
110      // Event selection cuts
111      if (sigelecs.size() + sigmuons.size() != 1) vetoEvent;
112      const Particle siglepton = sigelecs.empty() ? sigmuons.front() : sigelecs.front();
113
114      /// @note The note describes Nj = 5, 6, 7, 8, 9, >= 10 and Nb = 0, 1, 2, 3, >= 4 = 30 2D bins
115      ///  for each jet cut... but only provides data for six Nj = >= 8, 9, 10, Nb = 0, >= 3 bins.
116      /// We just implement the latter for now.
117
118      // Fill counters
119      if (sigjets40.size() >= 8  && sigbjets40.empty()) _h_08j40_0b->fill();
120      if (sigjets40.size() >= 9  && sigbjets40.empty()) _h_09j40_0b->fill();
121      if (sigjets40.size() >= 10 && sigbjets40.empty()) _h_10j40_0b->fill();
122      if (sigjets40.size() >= 8  && sigbjets40.size() >= 3) _h_08j40_3b->fill();
123      if (sigjets40.size() >= 9  && sigbjets40.size() >= 3) _h_09j40_3b->fill();
124      if (sigjets40.size() >= 10 && sigbjets40.size() >= 3) _h_10j40_3b->fill();
125
126      if (sigjets60.size() >= 8  && sigbjets60.empty()) _h_08j60_0b->fill();
127      if (sigjets60.size() >= 9  && sigbjets60.empty()) _h_09j60_0b->fill();
128      if (sigjets60.size() >= 10 && sigbjets60.empty()) _h_10j60_0b->fill();
129      if (sigjets60.size() >= 8  && sigbjets60.size() >= 3) _h_08j60_3b->fill();
130      if (sigjets60.size() >= 9  && sigbjets60.size() >= 3) _h_09j60_3b->fill();
131      if (sigjets60.size() >= 10 && sigbjets60.size() >= 3) _h_10j60_3b->fill();
132
133    }
134
135
136    /// Normalise counters after the run
137    void finalize() {
138
139      const double sf = 14.8*crossSection()/femtobarn/sumOfWeights();
140      scale(_h_08j40_0b, sf); scale(_h_09j40_0b, sf); scale(_h_10j40_0b, sf);
141      scale(_h_08j40_3b, sf); scale(_h_09j40_3b, sf); scale(_h_10j40_3b, sf);
142      scale(_h_08j60_0b, sf); scale(_h_09j60_0b, sf); scale(_h_10j60_0b, sf);
143      scale(_h_08j60_3b, sf); scale(_h_09j60_3b, sf); scale(_h_10j60_3b, sf);
144
145    }
146
147    //@}
148
149
150  private:
151
152    /// @name Histograms
153    //@{
154    CounterPtr _h_08j40_0b, _h_09j40_0b, _h_10j40_0b, _h_08j40_3b, _h_09j40_3b, _h_10j40_3b;
155    CounterPtr _h_08j60_0b, _h_09j60_0b, _h_10j60_0b, _h_08j60_3b, _h_09j60_3b, _h_10j60_3b;
156    //@}
157
158
159  };
160
161
162
163  // The hook for the plugin system
164  RIVET_DECLARE_PLUGIN(ATLAS_2016_CONF_2016_094);
165
166
167}