Rivet analyses referenceCDF_2010_S8591881_DYCDF Run 2 underlying event in Drell-YanExperiment: CDF (Tevatron Run 2) Inspire ID: 849042 Status: VALIDATED Authors:
Beam energies: (980.0, 980.0) GeV Run details:
Deepak Kar and Rick Field's measurement of the underlying event in Drell-Yan events. $Z -> ee$ and $Z -> \mu\mu$ events are selected using a $Z$ mass window cut between 70 and 110 GeV. ``Toward'', ``away'' and ``transverse'' regions are defined in the same way as in the original (2001) CDF underlying event analysis. The reconstructed $Z$ defines the $\phi$ direction of the toward region. The leptons are ignored after the $Z$ has been reconstructed. Thus the region most sensitive to the underlying event is the toward region (the recoil jet is boosted into the away region). Source code: CDF_2010_S8591881_DY.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/ChargedFinalState.hh"
4#include "Rivet/Projections/ChargedLeptons.hh"
5
6namespace Rivet {
7
8
9 /// @brief CDF Run II underlying event in Drell-Yan
10 ///
11 /// @author Hendrik Hoeth
12 ///
13 /// Measurement of the underlying event in Drell-Yan
14 /// \f$ Z/\gamma^* \to e^+ e^- \f$ and
15 /// \f$ Z/\gamma^* \to \mu^+ \mu^- \f$ events. The reconstructed
16 /// Z defines the \f$ \phi \f$ orientation. A Z mass window cut is applied.
17 ///
18 /// @par Run conditions
19 ///
20 /// @arg \f$ \sqrt{s} = \f$ 1960 GeV
21 /// @arg produce Drell-Yan events
22 /// @arg Set particles with c*tau > 10 mm stable
23 /// @arg Z decay mode: Z -> e+e- and Z -> mu+mu-
24 /// @arg gamma decay mode: gamma -> e+e- and gamma -> mu+mu-
25 /// @arg minimum invariant mass of the fermion pair coming from the Z/gamma: 70 GeV
26 class CDF_2010_S8591881_DY : public Analysis {
27 public:
28
29 RIVET_DEFAULT_ANALYSIS_CTOR(CDF_2010_S8591881_DY);
30
31
32 /// @name Analysis methods
33 //@{
34
35 void init() {
36 // Set up projections
37 const ChargedFinalState cfs(Cuts::abseta < 1.0 && Cuts::pT >= 0.5*GeV);
38 const ChargedFinalState clfs(Cuts::abseta < 1.0 && Cuts::pT >= 20*GeV);
39 declare(cfs, "FS");
40 declare(ChargedLeptons(clfs), "CL");
41
42 // Book histograms
43 book(_hist_tnchg , 1, 1, 1);
44 book(_hist_pnchg , 1, 1, 2);
45 book(_hist_anchg , 1, 1, 3);
46 book(_hist_pmaxnchg , 2, 1, 1);
47 book(_hist_pminnchg , 2, 1, 2);
48 book(_hist_pdifnchg , 2, 1, 3);
49 book(_hist_tcptsum , 3, 1, 1);
50 book(_hist_pcptsum , 3, 1, 2);
51 book(_hist_acptsum , 3, 1, 3);
52 book(_hist_pmaxcptsum , 4, 1, 1);
53 book(_hist_pmincptsum , 4, 1, 2);
54 book(_hist_pdifcptsum , 4, 1, 3);
55 book(_hist_tcptave , 5, 1, 1);
56 book(_hist_pcptave , 5, 1, 2);
57 book(_hist_tcptmax , 6, 1, 1);
58 book(_hist_pcptmax , 6, 1, 2);
59 book(_hist_zptvsnchg , 7, 1, 1);
60 book(_hist_cptavevsnchg , 8, 1, 1);
61 book(_hist_cptavevsnchgsmallzpt , 9, 1, 1);
62 }
63
64
65 /// Do the analysis
66 void analyze(const Event& e) {
67
68 const FinalState& fs = apply<FinalState>(e, "FS");
69 const size_t numParticles = fs.particles().size();
70
71 // Even if we only generate hadronic events, we still need a cut on numCharged >= 2.
72 if (numParticles < 1) {
73 MSG_DEBUG("Failed multiplicity cut");
74 vetoEvent;
75 }
76
77 // Get the leptons
78 const Particles& leptons = apply<ChargedLeptons>(e, "CL").chargedLeptons();
79
80 // We want exactly two leptons of the same flavour.
81 MSG_DEBUG("lepton multiplicity = " << leptons.size());
82 if (leptons.size() != 2 || leptons[0].pid() != -leptons[1].pid() ) vetoEvent;
83
84 // Lepton pT > 20 GeV
85 if (leptons[0].pT()/GeV <= 20 || leptons[1].pT()/GeV <= 20) vetoEvent;
86
87 // Lepton pair should have an invariant mass between 70 and 110 and |eta| < 6
88 const FourMomentum dilepton = leptons[0].momentum() + leptons[1].momentum();
89 if (!inRange(dilepton.mass()/GeV, 70., 110.) || fabs(dilepton.eta()) >= 6) vetoEvent;
90 MSG_DEBUG("Dilepton mass = " << dilepton.mass()/GeV << " GeV");
91 MSG_DEBUG("Dilepton pT = " << dilepton.pT()/GeV << " GeV");
92
93 // Calculate the observables
94 size_t numToward(0), numAway(0);
95 long int numTrans1(0), numTrans2(0);
96 double ptSumToward(0.0), ptSumTrans1(0.0), ptSumTrans2(0.0), ptSumAway(0.0);
97 double ptMaxToward(0.0), ptMaxTrans1(0.0), ptMaxTrans2(0.0), ptMaxAway(0.0);
98 const double phiZ = dilepton.azimuthalAngle();
99 const double pTZ = dilepton.pT();
100 /// @todo Replace with for
101 for (Particles::const_iterator p = fs.particles().begin(); p != fs.particles().end(); ++p) {
102 // Don't use the leptons
103 /// @todo Replace with PID::isLepton
104 if (abs(p->pid()) < 20) continue;
105
106 const double dPhi = deltaPhi(p->momentum().phi(), phiZ);
107 const double pT = p->pT();
108 double rotatedphi = p->momentum().phi() - phiZ;
109 while (rotatedphi < 0) rotatedphi += 2*PI;
110
111 if (dPhi < PI/3.0) {
112 ptSumToward += pT;
113 ++numToward;
114 if (pT > ptMaxToward)
115 ptMaxToward = pT;
116 } else if (dPhi < 2*PI/3.0) {
117 if (rotatedphi <= PI) {
118 ptSumTrans1 += pT;
119 ++numTrans1;
120 if (pT > ptMaxTrans1)
121 ptMaxTrans1 = pT;
122 }
123 else {
124 ptSumTrans2 += pT;
125 ++numTrans2;
126 if (pT > ptMaxTrans2)
127 ptMaxTrans2 = pT;
128 }
129 } else {
130 ptSumAway += pT;
131 ++numAway;
132 if (pT > ptMaxAway)
133 ptMaxAway = pT;
134 }
135 // We need to subtract the two leptons from the number of particles to get the correct multiplicity
136 _hist_cptavevsnchg->fill(numParticles-2, pT);
137 if (pTZ < 10)
138 _hist_cptavevsnchgsmallzpt->fill(numParticles-2, pT);
139 }
140
141 // Fill the histograms
142 _hist_tnchg->fill(pTZ, numToward/(4*PI/3));
143 _hist_pnchg->fill(pTZ, (numTrans1+numTrans2)/(4*PI/3));
144 _hist_pmaxnchg->fill(pTZ, (numTrans1>numTrans2 ? numTrans1 : numTrans2)/(2*PI/3));
145 _hist_pminnchg->fill(pTZ, (numTrans1<numTrans2 ? numTrans1 : numTrans2)/(2*PI/3));
146 _hist_pdifnchg->fill(pTZ, abs(numTrans1-numTrans2)/(2*PI/3));
147 _hist_anchg->fill(pTZ, numAway/(4*PI/3));
148
149 _hist_tcptsum->fill(pTZ, ptSumToward/(4*PI/3));
150 _hist_pcptsum->fill(pTZ, (ptSumTrans1+ptSumTrans2)/(4*PI/3));
151 _hist_pmaxcptsum->fill(pTZ, (ptSumTrans1>ptSumTrans2 ? ptSumTrans1 : ptSumTrans2)/(2*PI/3));
152 _hist_pmincptsum->fill(pTZ, (ptSumTrans1<ptSumTrans2 ? ptSumTrans1 : ptSumTrans2)/(2*PI/3));
153 _hist_pdifcptsum->fill(pTZ, fabs(ptSumTrans1-ptSumTrans2)/(2*PI/3));
154 _hist_acptsum->fill(pTZ, ptSumAway/(4*PI/3));
155
156 if (numToward > 0) {
157 _hist_tcptave->fill(pTZ, ptSumToward/numToward);
158 _hist_tcptmax->fill(pTZ, ptMaxToward);
159 }
160 if ((numTrans1+numTrans2) > 0) {
161 _hist_pcptave->fill(pTZ, (ptSumTrans1+ptSumTrans2)/(numTrans1+numTrans2));
162 _hist_pcptmax->fill(pTZ, (ptMaxTrans1 > ptMaxTrans2 ? ptMaxTrans1 : ptMaxTrans2));
163 }
164
165 // We need to subtract the two leptons from the number of particles to get the correct multiplicity
166 _hist_zptvsnchg->fill(numParticles-2, pTZ);
167 }
168
169
170 // void finalize() { }
171
172 //@}
173
174
175 private:
176
177 Profile1DPtr _hist_tnchg;
178 Profile1DPtr _hist_pnchg;
179 Profile1DPtr _hist_pmaxnchg;
180 Profile1DPtr _hist_pminnchg;
181 Profile1DPtr _hist_pdifnchg;
182 Profile1DPtr _hist_anchg;
183 Profile1DPtr _hist_tcptsum;
184 Profile1DPtr _hist_pcptsum;
185 Profile1DPtr _hist_pmaxcptsum;
186 Profile1DPtr _hist_pmincptsum;
187 Profile1DPtr _hist_pdifcptsum;
188 Profile1DPtr _hist_acptsum;
189 Profile1DPtr _hist_tcptave;
190 Profile1DPtr _hist_pcptave;
191 Profile1DPtr _hist_tcptmax;
192 Profile1DPtr _hist_pcptmax;
193 Profile1DPtr _hist_zptvsnchg;
194 Profile1DPtr _hist_cptavevsnchg;
195 Profile1DPtr _hist_cptavevsnchgsmallzpt;
196
197 };
198
199
200
201 RIVET_DECLARE_ALIASED_PLUGIN(CDF_2010_S8591881_DY, CDF_2010_I849042_DY);
202
203}
|