Rivet analyses referenceCDF_2001_I564673Field \& Stuart Run I underlying event analysis.Experiment: CDF (Tevatron Run 1) Inspire ID: 564673 Status: VALIDATED Authors:
Beam energies: (900.0, 900.0) GeV Run details:
The original CDF underlying event analysis, based on decomposing each event into a transverse structure with ``toward'', ``away'' and ``transverse'' regions defined relative to the azimuthal direction of the leading jet in the event. Since the toward region is by definition dominated by the hard process, as is the away region by momentum balance in the matrix element, the transverse region is most sensitive to multi-parton interactions. The transverse regions occupy $|\phi| \in [60^\circ, 120^\circ]$ for $|\eta| < 1$. The $p_\perp$ ranges for the leading jet are divided experimentally into the `min-bias' sample from 0--20 GeV, and the `JET20' sample from 18--49 GeV. Source code: CDF_2001_I564673.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/ChargedFinalState.hh"
4#include "Rivet/Projections/FastJets.hh"
5#include "Rivet/Projections/TriggerCDFRun0Run1.hh"
6#include "Rivet/Projections/ConstLossyFinalState.hh"
7//#include "Rivet/Projections/SmearedParticles.hh"
8
9namespace Rivet {
10
11
12 /// @brief Field-Stuart CDF Run I track-jet underlying event analysis
13 ///
14 /// @author Andy Buckley
15 ///
16 /// The "original" underlying event analysis, using a non-standard track-jet algorithm.
17 ///
18 /// @par Run conditions
19 ///
20 /// @arg \f$ \sqrt{s} = \f$ 1800 GeV
21 /// @arg Run with generic QCD events.
22 /// @arg Several \f$ p_\perp^\text{min} \f$ cutoffs are probably required to fill the profile histograms:
23 /// @arg \f$ p_\perp^\text{min} = \f$ 0 (min bias), 10, 20 GeV
24 class CDF_2001_I564673 : public Analysis {
25 public:
26
27 RIVET_DEFAULT_ANALYSIS_CTOR(CDF_2001_I564673);
28
29
30 /// @name Analysis methods
31 /// @{
32
33 // Book histograms
34 void init() {
35 declare(TriggerCDFRun0Run1(), "Trigger");
36 // Randomly discard 8% of charged particles as a kind of hacky detector correction.
37 const ChargedFinalState cfs(Cuts::abseta < 1.0 && Cuts::pT > 0.5*GeV);
38 /// @todo Replace ConstLossyFinalState with SmearedParticles
39 const ConstLossyFinalState lossyfs(cfs, 0.08);
40 //const SmearedParticles lossyfs(cfs, [](const Particle&){ return 0.92; });
41
42 declare(lossyfs, "FS");
43 declare(FastJets(lossyfs, JetAlg::TRACKJET, 0.7), "TrackJet");
44
45 book(_numvsDeltaPhi2, 1, 1, 1);
46 book(_numvsDeltaPhi5, 1, 1, 2);
47 book(_numvsDeltaPhi30, 1, 1, 3);
48 book(_pTvsDeltaPhi2, 2, 1, 1);
49 book(_pTvsDeltaPhi5, 2, 1, 2);
50 book(_pTvsDeltaPhi30, 2, 1, 3);
51
52 book(_numTowardMB, 3, 1, 1);
53 book(_numTransMB, 3, 1, 2);
54 book(_numAwayMB, 3, 1, 3);
55 book(_numTowardJ20, 4, 1, 1);
56 book(_numTransJ20, 4, 1, 2);
57 book(_numAwayJ20, 4, 1, 3);
58
59 book(_ptsumTowardMB, 5, 1, 1);
60 book(_ptsumTransMB, 5, 1, 2);
61 book(_ptsumAwayMB, 5, 1, 3);
62 book(_ptsumTowardJ20, 6, 1, 1);
63 book(_ptsumTransJ20, 6, 1, 2);
64 book(_ptsumAwayJ20, 6, 1, 3);
65
66 book(_ptTrans2, 7, 1, 1);
67 book(_ptTrans5, 7, 1, 2);
68 book(_ptTrans30, 7, 1, 3);
69
70 book(_totalNumTrans2, "totalNumTrans2");
71 book(_totalNumTrans5, "totalNumTrans5");
72 book(_totalNumTrans30, "totalNumTrans30");
73 book(_sumWeightsPtLead2, "sumWeightsPtLead2");
74 book(_sumWeightsPtLead5, "sumWeightsPtLead5");
75 book(_sumWeightsPtLead30, "sumWeightsPtLead30");
76
77 _htmp_num_dphi_2 = std::make_shared<YODA::Profile1D>(refData(1, 1, 1).binning());
78 _htmp_num_dphi_5 = std::make_shared<YODA::Profile1D>(refData(1, 1, 2).binning());
79 _htmp_num_dphi_30 = std::make_shared<YODA::Profile1D>(refData(1, 1, 3).binning());
80 _htmp_pt_dphi_2 = std::make_shared<YODA::Profile1D>(refData(2, 1, 1).binning());
81 _htmp_pt_dphi_5 = std::make_shared<YODA::Profile1D>(refData(2, 1, 2).binning());
82 _htmp_pt_dphi_30 = std::make_shared<YODA::Profile1D>(refData(2, 1, 3).binning());
83
84 }
85
86
87 /// Do the analysis
88 void analyze(const Event& event) {
89 // Trigger
90 const bool trigger = apply<TriggerCDFRun0Run1>(event, "Trigger").minBiasDecision();
91 if (!trigger) vetoEvent;
92
93 // Get jets, sorted by pT
94 const Jets jets = apply<JetFinder>(event, "TrackJet").jetsByPt();
95 if (jets.empty()) vetoEvent;
96 const Jet jet1 = jets.front();
97 const double ptLead = jet1.pT();
98
99 // Cut on highest pT jet: combined 0.5 GeV < pT(lead) < 50 GeV
100 if (ptLead/GeV < 0.5) vetoEvent;
101 if (ptLead/GeV > 50.0) vetoEvent;
102
103 // Count sum of all event weights in three pT_lead regions
104 if (ptLead/GeV > 2.0) _sumWeightsPtLead2->fill();
105 if (ptLead/GeV > 5.0) _sumWeightsPtLead5->fill();
106 if (ptLead/GeV > 30.0) _sumWeightsPtLead30->fill();
107
108 // Run over tracks
109 double ptSumToward(0.0), ptSumAway(0.0), ptSumTrans(0.0);
110 size_t numToward(0), numTrans(0), numAway(0);
111
112 _htmp_num_dphi_2->reset(); _htmp_num_dphi_5->reset(); _htmp_num_dphi_30->reset();
113 _htmp_pt_dphi_2->reset(); _htmp_pt_dphi_5->reset(); _htmp_pt_dphi_30->reset();
114
115 // Final state charged particles
116 /// @todo Non-trackjet track efficiencies are corrected?
117 const Particles& tracks = apply<FinalState>(event, "FS").particles();
118
119 for (const Particle& p : tracks) {
120 const double dPhi = deltaPhi(p, jet1);
121 const double pT = p.pT();
122
123 if (dPhi < PI/3.0) {
124 ptSumToward += pT;
125 ++numToward;
126 }
127 else if (dPhi < 2*PI/3.0) {
128 ptSumTrans += pT;
129 ++numTrans;
130 // Fill transverse pT distributions
131 if (ptLead/GeV > 2.0) {
132 _ptTrans2->fill(pT/GeV);
133 _totalNumTrans2->fill();
134 }
135 if (ptLead/GeV > 5.0) {
136 _ptTrans5->fill(pT/GeV);
137 _totalNumTrans5->fill();
138 }
139 if (ptLead/GeV > 30.0) {
140 _ptTrans30->fill(pT/GeV);
141 _totalNumTrans30->fill();
142 }
143 }
144 else {
145 ptSumAway += pT;
146 ++numAway;
147 }
148
149 // Fill tmp histos to bin event's track Nch & pT in dphi
150 const double dPhideg = 180*dPhi/M_PI;
151 if (ptLead/GeV > 2.0) {
152 _htmp_num_dphi_2->fill(dPhideg, 1);
153 _htmp_pt_dphi_2->fill(dPhideg, pT/GeV);
154 }
155 if (ptLead/GeV > 5.0) {
156 _htmp_num_dphi_5->fill(dPhideg, 1);
157 _htmp_pt_dphi_5->fill(dPhideg, pT/GeV);
158 }
159 if (ptLead/GeV > 30.0) {
160 _htmp_num_dphi_30->fill(dPhideg, 1);
161 _htmp_pt_dphi_30->fill(dPhideg, pT/GeV);
162 }
163 }
164
165 // Update the "proper" dphi profile histograms
166 for (int i = 1; i < 51; i++) { ///< @todo Should really explicitly iterate over nbins for each temp histo
167 if (ptLead/GeV > 2.0) {
168 const double x2 = _htmp_pt_dphi_2->bin(i).xMid();
169 const double num2 = (_htmp_num_dphi_2->bin(i).numEntries()) ? _htmp_num_dphi_2->bin(i).yMean() : 0.0;
170 const double pt2 = (_htmp_num_dphi_2->bin(i).numEntries()) ? _htmp_pt_dphi_2->bin(i).yMean() : 0.0;
171 _numvsDeltaPhi2->fill(x2, num2);
172 _pTvsDeltaPhi2->fill(x2, pt2);
173 }
174 if (ptLead/GeV > 5.0) {
175 const double x5 = _htmp_pt_dphi_5->bin(i).xMid();
176 const double num5 = (_htmp_num_dphi_5->bin(i).numEntries()) ? _htmp_num_dphi_5->bin(i).yMean() : 0.0;
177 const double pt5 = (_htmp_num_dphi_5->bin(i).numEntries()) ? _htmp_pt_dphi_5->bin(i).yMean() : 0.0;
178 _numvsDeltaPhi5->fill(x5, num5);
179 _pTvsDeltaPhi5->fill(x5, pt5);
180 }
181 if (ptLead/GeV > 30.0) {
182 const double x30 = _htmp_pt_dphi_30->bin(i).xMid();
183 const double num30 = (_htmp_num_dphi_30->bin(i).numEntries()) ? _htmp_num_dphi_30->bin(i).yMean() : 0.0;
184 const double pt30 = (_htmp_num_dphi_30->bin(i).numEntries()) ? _htmp_pt_dphi_30->bin(i).yMean() : 0.0;
185 _numvsDeltaPhi30->fill(x30, num30);
186 _pTvsDeltaPhi30->fill(x30, pt30);
187 }
188 }
189
190 // Log some event details about pT
191 MSG_DEBUG("pT [lead; twd, away, trans] = [" << ptLead << "; "
192 << ptSumToward << ", " << ptSumAway << ", " << ptSumTrans << "]");
193
194 // Update the pT profile histograms
195 _ptsumTowardMB->fill(ptLead/GeV, ptSumToward/GeV);
196 _ptsumTowardJ20->fill(ptLead/GeV, ptSumToward/GeV);
197
198 _ptsumTransMB->fill(ptLead/GeV, ptSumTrans/GeV);
199 _ptsumTransJ20->fill(ptLead/GeV, ptSumTrans/GeV);
200
201 _ptsumAwayMB->fill(ptLead/GeV, ptSumAway/GeV);
202 _ptsumAwayJ20->fill(ptLead/GeV, ptSumAway/GeV);
203
204 // Log some event details about Nch
205 MSG_DEBUG("N [twd, away, trans] = [" << ptLead << "; "
206 << numToward << ", " << numTrans << ", " << numAway << "]");
207
208 // Update the N_track profile histograms
209 _numTowardMB->fill(ptLead/GeV, numToward);
210 _numTowardJ20->fill(ptLead/GeV, numToward);
211
212 _numTransMB->fill(ptLead/GeV, numTrans);
213 _numTransJ20->fill(ptLead/GeV, numTrans);
214
215 _numAwayMB->fill(ptLead/GeV, numAway);
216 _numAwayJ20->fill(ptLead/GeV, numAway);
217 }
218
219
220 /// Normalize histos
221 void finalize() {
222 normalize(_ptTrans2, *_totalNumTrans2 / *_sumWeightsPtLead2);
223 normalize(_ptTrans5, *_totalNumTrans5 / *_sumWeightsPtLead5);
224 normalize(_ptTrans30, *_totalNumTrans30 / *_sumWeightsPtLead30);
225 }
226
227 /// @}
228
229
230 private:
231
232 /// Sum total number of charged particles in the trans region, in 3 \f$ p_\perp^\text{lead} \f$ bins.
233 CounterPtr _totalNumTrans2, _totalNumTrans5, _totalNumTrans30;
234
235 /// Sum the total number of events in 3 \f$ p_\perp^\text{lead} \f$ bins.
236 CounterPtr _sumWeightsPtLead2,_sumWeightsPtLead5, _sumWeightsPtLead30;
237
238
239 /// @name Histogram collections
240 /// @{
241
242 // The sumpt vs. dphi and Nch vs. dphi histos
243 Profile1DPtr _numvsDeltaPhi2, _numvsDeltaPhi5, _numvsDeltaPhi30;
244 Profile1DPtr _pTvsDeltaPhi2, _pTvsDeltaPhi5, _pTvsDeltaPhi30;
245
246 /// Profile histograms, binned in the \f$ p_T \f$ of the leading jet, for
247 /// the \f$ p_T \f$ sum in the toward, transverse and away regions.
248 Profile1DPtr _ptsumTowardMB, _ptsumTransMB, _ptsumAwayMB;
249 Profile1DPtr _ptsumTowardJ20, _ptsumTransJ20, _ptsumAwayJ20;
250
251 /// Profile histograms, binned in the \f$ p_T \f$ of the leading jet, for
252 /// the number of charged particles per jet in the toward, transverse and
253 /// away regions.
254 Profile1DPtr _numTowardMB, _numTransMB, _numAwayMB;
255 Profile1DPtr _numTowardJ20, _numTransJ20, _numAwayJ20;
256
257 /// Histogram of \f$ p_T \f$ distribution for 3 different \f$ p_{T1} \f$ IR cutoffs.
258 Histo1DPtr _ptTrans2, _ptTrans5, _ptTrans30;
259
260 // Temporary histos that bin N and pT in dphi
261 YODA::Profile1DPtr _htmp_num_dphi_2, _htmp_num_dphi_5, _htmp_num_dphi_30;
262 YODA::Profile1DPtr _htmp_pt_dphi_2, _htmp_pt_dphi_5, _htmp_pt_dphi_30;
263
264 /// @}
265
266 };
267
268
269
270 RIVET_DECLARE_ALIASED_PLUGIN(CDF_2001_I564673, CDF_2001_S4751469);
271
272}
|