Rivet analyses referenceATLAS_2011_I926145Measurement of electron and muon differential cross-section from heavy-flavour decaysExperiment: ATLAS (LHC) Inspire ID: 926145 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
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}
|