rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

ATLAS_2011_I926145

Measurement of electron and muon differential cross-section from heavy-flavour decays
Experiment: ATLAS (LHC)
Inspire ID: 926145
Status: VALIDATED
Authors:
  • Paul Bell
  • Holger Schulz
References: Beams: p+ p+
Beam energies: (3500.0, 3500.0) GeV
Run details:
  • $pp$ to electron $+ X$ or muon $+ X$ at 7 TeV, heavy-flavour ($bb$ and $cc$) production with $B/D \to e/\mu$

Measurement of inclusive electron and muon cross sections for $7 < p_\perp <26$ GeV in $|\eta| <2.0$, excluding $1.37<|\eta|<1.52$, and muon cross section for $4 < p_\perp < 100$ GeV in $|\eta| <2.50$. The $W/Z/\gamma^*$ component must be subtracted to leave the heavy flavour contribution.

Source code: ATLAS_2011_I926145.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/PromptFinalState.hh"
  5#include "Rivet/Projections/IdentifiedFinalState.hh"
  6#include "Rivet/Projections/MissingMomentum.hh"
  7#include "Rivet/Projections/LeptonFinder.hh"
  8#include "Rivet/Projections/DileptonFinder.hh"
  9
 10namespace Rivet {
 11
 12
 13  /// @brief Measurement of electron and muon differential cross section from heavy flavour production
 14  ///
 15  /// Lepton cross-sections differential in pT
 16  ///
 17  /// @author Paul Bell, Holger Schulz
 18  class ATLAS_2011_I926145 : public Analysis {
 19  public:
 20
 21    /// Constructor
 22    RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2011_I926145);
 23
 24
 25    /// Book histograms and initialise projections before the run
 26    void init() {
 27
 28      // Electrons and muons
 29      Cut cuts = (Cuts::abseta < 1.37 || Cuts::absetaIn(1.52,  2.00)) && Cuts::pT > 7*GeV;
 30      IdentifiedFinalState elecs(cuts, {PID::ELECTRON, PID::POSITRON});
 31      declare(elecs, "elecs");
 32      IdentifiedFinalState muons(Cuts::abseta < 2 && Cuts::pT > 7*GeV, {PID::MUON, PID::ANTIMUON});
 33      declare(muons, "muons");
 34      IdentifiedFinalState muons_full(Cuts::abseta < 2.5 && Cuts::pT > 4*GeV, {PID::MUON, PID::ANTIMUON});
 35      declare(muons_full, "muons_full");
 36
 37      Cut cut20 = Cuts::abseta < 2.0;
 38      Cut cut25 = Cuts::abseta < 2.5;
 39
 40      DileptonFinder zfinder_e(91.2*GeV, 0.1, cut20 && Cuts::abspid == PID::ELECTRON, Cuts::massIn(66.0*GeV, 116.0*GeV));
 41      declare(zfinder_e, "DileptonFinder_e");
 42      DileptonFinder zfinder_mu(91.2*GeV, 0.1, cut20 && Cuts::abspid == PID::MUON, Cuts::massIn(66.0*GeV, 116.0*GeV));
 43      declare(zfinder_mu, "DileptonFinder_mu");
 44      DileptonFinder zfinder_mufull(91.2*GeV, 0.1, cut25 && Cuts::abspid == PID::MUON, Cuts::massIn(66.0*GeV, 116.0*GeV));
 45      declare(zfinder_mufull, "DileptonFinder_mufull");
 46
 47      LeptonFinder ef(0.2, cut20 && Cuts::abspid == PID::ELECTRON);
 48      declare(ef, "WElecs");
 49      LeptonFinder mf(0.2, cut20 && Cuts::abspid == PID::MUON);
 50      declare(mf, "WMuons");
 51      LeptonFinder mff(0.2, cut25 && Cuts::abspid == PID::MUON);
 52      declare(mff, "WMuonsFull");
 53      declare("MET", MissingMomentum());
 54
 55      // Book histograms
 56      book(_histPt_elecs,      1, 1, 1);
 57      book(_histPt_muons,      2, 1, 1);
 58      book(_histPt_muons_full, 3, 1, 1);
 59    }
 60
 61
 62    /// Perform the per-event analysis
 63    void analyze(const Event& event) {
 64      // Veto event if no lepton is present
 65      const Particles& elecs      = apply<FinalState>(event, "elecs").particles();
 66      const Particles& muons      = apply<FinalState>(event, "muons").particles();
 67      const Particles& muons_full = apply<FinalState>(event, "muons_full").particles();
 68      if (elecs.empty() && muons.empty() && muons_full.empty()) vetoEvent;
 69
 70      // Z veto
 71      const DileptonFinder& zfinder_e      = apply<DileptonFinder>(event, "DileptonFinder_e");
 72      const DileptonFinder& zfinder_mu     = apply<DileptonFinder>(event, "DileptonFinder_mu");
 73      const DileptonFinder& zfinder_mufull = apply<DileptonFinder>(event, "DileptonFinder_mufull");
 74      if (zfinder_e.bosons().size() > 0 || zfinder_mu.bosons().size() > 0 || zfinder_mufull.bosons().size() > 0) {
 75        MSG_DEBUG("Num elec Z-bosons found: " << zfinder_e.bosons().size());
 76        MSG_DEBUG("Num muon Z-bosons found: " << zfinder_mu.bosons().size());
 77        MSG_DEBUG("Num muon Z-bosons found (|eta|<2.5): " << zfinder_mufull.bosons().size());
 78        vetoEvent;
 79      }
 80
 81      // W veto
 82      //       60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
 83      const P4& pmiss = apply<MissingMom>(event, "MET").missingMom();
 84      const Particles& wes = apply<LeptonFinder>(event, "WElecs").particles();
 85      const int iefound = closestMatchIndex(wes, pmiss, Kin::mass, 80.4*GeV, 60*GeV, 100*GeV);
 86      const Particles& wmus = apply<LeptonFinder>(event, "WMuons").particles();
 87      const int imfound = closestMatchIndex(wmus, pmiss, Kin::mass, 80.4*GeV, 60*GeV, 100*GeV);
 88      const Particles& wfmus = apply<LeptonFinder>(event, "WMuonsFull").particles();
 89      const int ifmfound = closestMatchIndex(wfmus, pmiss, Kin::mass, 80.4*GeV, 60*GeV, 100*GeV);
 90      if (pmiss.Et() > 25*GeV && (iefound >= 0 || imfound >= 0 || ifmfound >= 0)) {
 91        MSG_DEBUG("Num elec W-bosons found: " << int(iefound >= 0));
 92        MSG_DEBUG("Num muon W-bosons found: " << int(imfound >= 0));
 93        MSG_DEBUG("Num muon W-bosons found (|eta|<2.5): " << int(ifmfound >= 0));
 94        vetoEvent;
 95      }
 96
 97      // Electron histogram
 98      if (elecs.size() > 0) {
 99        for (const Particle& ele : elecs) {
100          if (ele.pT() < 26.0*GeV) _histPt_elecs->fill(ele.pT()/GeV);
101        }
102      }
103
104      // Muon histogram
105      if (muons.size() > 0) {
106        for (const Particle& muo : muons) {
107          if (muo.pT() < 26.0*GeV) _histPt_muons->fill(muo.pT()/GeV);
108        }
109      }
110
111      // Muon full histogram
112      if (muons_full.size() > 0) {
113        for (const Particle& muo : muons_full) {
114          if (muo.pT() < 100.0*GeV) _histPt_muons_full->fill(muo.pT()/GeV);
115        }
116      }
117    }
118
119
120    /// Normalise histograms etc., after the run
121    void finalize() {
122      scale(_histPt_elecs,      crossSection()/nanobarn/sumOfWeights());
123      scale(_histPt_muons,      crossSection()/nanobarn/sumOfWeights());
124      scale(_histPt_muons_full, crossSection()/nanobarn/sumOfWeights());
125      // the last one is microbarn on HD, but cannot sync as the d02 is
126      // currently missing from HD:
127      //scale(_histPt_muons_full, crossSection()/microbarn/sumOfWeights());
128    }
129
130
131  private:
132
133    /// @name Histograms
134    /// @{
135    Histo1DPtr _histPt_elecs, _histPt_muons, _histPt_muons_full;
136    /// @}
137
138  };
139
140
141  RIVET_DECLARE_PLUGIN(ATLAS_2011_I926145);
142
143}