Rivet analyses referenceATLAS_2012_I1204784Measurement of angular correlations in Drell-Yan lepton pairs to probe $Z/\gamma^*$ boson transverse momentumExperiment: ATLAS (LHC) Inspire ID: 1204784 Status: VALIDATED Authors:
Beam energies: (3500.0, 3500.0) GeV Run details:
A measurement of angular correlations in Drell-Yan lepton pairs via the $\phi^*$ observable is presented. This variable probes the same physics as the $Z/\gamma^*$ boson transverse momentum with a better experimental resolution. The $Z/\gamma^* \to ee$ and $Z/\gamma^* \to \mu \mu$ decays produced in proton--proton collisions at a centre-of-mass energy of $\sqrt{s} = 7 \text{TeV}$ are used. Normalised differential cross sections as a function of $\phi^*$ are measured separately for electron and muon decay channels. The cross-section is also measured double differentially as a function of $\phi^*$ for three independent bins of the $Z$ boson rapidity. Source code: ATLAS_2012_I1204784.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/DileptonFinder.hh"
4
5namespace Rivet {
6
7
8 /// ATLAS Z phi* measurement
9 class ATLAS_2012_I1204784 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2012_I1204784);
14
15
16 /// Book histograms and initialise projections before the run
17 void init() {
18 Cut cuts = Cuts::abseta < 2.4 && Cuts::pT > 20*GeV;
19 DileptonFinder zfinder_dressed_el(91.2*GeV, 0.1, cuts && Cuts::abspid == PID::ELECTRON, Cuts::massIn(66*GeV, 116*GeV));
20 declare(zfinder_dressed_el, "DileptonFinder_dressed_el");
21 DileptonFinder zfinder_bare_el(91.2*GeV, 0.0, cuts && Cuts::abspid == PID::ELECTRON, Cuts::massIn(66*GeV, 116*GeV));
22 declare(zfinder_bare_el, "DileptonFinder_bare_el");
23 DileptonFinder zfinder_dressed_mu(91.2*GeV, 0.1, cuts && Cuts::abspid == PID::MUON, Cuts::massIn(66*GeV, 116*GeV));
24 declare(zfinder_dressed_mu, "DileptonFinder_dressed_mu");
25 DileptonFinder zfinder_bare_mu(91.2*GeV, 0.0, cuts && Cuts::abspid == PID::MUON, Cuts::massIn(66*GeV, 116*GeV));
26 declare(zfinder_bare_mu, "DileptonFinder_bare_mu");
27
28 // Book histograms
29 // Single-differential plots
30 book(_hist_zphistar_el_bare ,1, 1, 1);
31 book(_hist_zphistar_mu_bare ,1, 1, 2);
32 book(_hist_zphistar_el_dressed ,2, 1, 1);
33 book(_hist_zphistar_mu_dressed ,2, 1, 2);
34
35 // Double-differential plots
36 book(_h_phistar_el_bare, {0., 0.8, 1.6, 10.}, {"d03-x01-y01", "d03-x01-y02", "d03-x01-y03"});
37 book(_h_phistar_el_dressed, {0., 0.8, 1.6, 10.}, {"d03-x02-y01", "d03-x02-y02", "d03-x02-y03"});
38 book(_h_phistar_mu_bare, {0., 0.8, 1.6, 10.}, {"d04-x01-y01", "d04-x01-y02", "d04-x01-y03"});
39 book(_h_phistar_mu_dressed, {0., 0.8, 1.6, 10.}, {"d04-x02-y01", "d04-x02-y02", "d04-x02-y03"});
40
41 }
42
43
44 /// Perform the per-event analysis
45 void analyze(const Event& event) {
46
47 const DileptonFinder& zfinder_dressed_el = apply<DileptonFinder>(event, "DileptonFinder_dressed_el");
48 fillPlots(zfinder_dressed_el, _hist_zphistar_el_dressed, _h_phistar_el_dressed);
49
50 const DileptonFinder& zfinder_bare_el = apply<DileptonFinder>(event, "DileptonFinder_bare_el");
51 fillPlots(zfinder_bare_el, _hist_zphistar_el_bare, _h_phistar_el_bare);
52
53 const DileptonFinder& zfinder_dressed_mu = apply<DileptonFinder>(event, "DileptonFinder_dressed_mu");
54 fillPlots(zfinder_dressed_mu, _hist_zphistar_mu_dressed, _h_phistar_mu_dressed);
55
56 const DileptonFinder& zfinder_bare_mu = apply<DileptonFinder>(event, "DileptonFinder_bare_mu");
57 fillPlots(zfinder_bare_mu, _hist_zphistar_mu_bare, _h_phistar_mu_bare);
58 }
59
60
61 void fillPlots(const DileptonFinder& zfind, Histo1DPtr hist, Histo1DGroupPtr& binnedHist) {
62 if (zfind.bosons().size() != 1) return;
63 Particles leptons = sortBy(zfind.constituents(), cmpMomByPt);
64
65 const FourMomentum lminus = leptons[0].charge() < 0 ? leptons[0].momentum() : leptons[1].momentum();
66 const FourMomentum lplus = leptons[0].charge() < 0 ? leptons[1].momentum() : leptons[0].momentum();
67
68 const double phi_acop = M_PI - deltaPhi(lminus, lplus);
69 const double costhetastar = tanh((lminus.eta()-lplus.eta())/2.0);
70 const double sin2thetastar = (costhetastar <= 1) ? 1.0 - sqr(costhetastar) : 0;
71 const double phistar = tan(phi_acop/2.0) * sqrt(sin2thetastar);
72 hist->fill(phistar);
73
74 binnedHist->fill(zfind.bosons()[0].absrap(), phistar);
75 }
76
77
78 /// Normalise histograms etc., after the run
79 void finalize() {
80 normalize(_hist_zphistar_el_dressed);
81 normalize(_hist_zphistar_el_bare);
82 normalize(_hist_zphistar_mu_dressed);
83 normalize(_hist_zphistar_mu_bare);
84
85 normalize(_h_phistar_mu_dressed);
86 normalize(_h_phistar_mu_bare);
87 normalize(_h_phistar_el_bare);
88 normalize(_h_phistar_el_dressed);
89 }
90
91
92 private:
93
94 Histo1DGroupPtr _h_phistar_mu_dressed;
95 Histo1DGroupPtr _h_phistar_mu_bare;
96 Histo1DGroupPtr _h_phistar_el_dressed;
97 Histo1DGroupPtr _h_phistar_el_bare;
98
99 Histo1DPtr _hist_zphistar_el_dressed;
100 Histo1DPtr _hist_zphistar_el_bare;
101
102 Histo1DPtr _hist_zphistar_mu_dressed;
103 Histo1DPtr _hist_zphistar_mu_bare;
104
105 Histo1DPtr _hist_zphistar_el_bare_1;
106 Histo1DPtr _hist_zphistar_el_bare_2;
107 Histo1DPtr _hist_zphistar_el_bare_3;
108
109 Histo1DPtr _hist_zphistar_el_dressed_1;
110 Histo1DPtr _hist_zphistar_el_dressed_2;
111 Histo1DPtr _hist_zphistar_el_dressed_3;
112
113 Histo1DPtr _hist_zphistar_mu_bare_1;
114 Histo1DPtr _hist_zphistar_mu_bare_2;
115 Histo1DPtr _hist_zphistar_mu_bare_3;
116
117 Histo1DPtr _hist_zphistar_mu_dressed_1;
118 Histo1DPtr _hist_zphistar_mu_dressed_2;
119 Histo1DPtr _hist_zphistar_mu_dressed_3;
120
121 };
122
123
124 RIVET_DECLARE_PLUGIN(ATLAS_2012_I1204784);
125
126}
|