rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CDF_2001_I564673

Field \& Stuart Run I underlying event analysis.
Experiment: CDF (Tevatron Run 1)
Inspire ID: 564673
Status: VALIDATED
Authors:
  • Andy Buckley
References:
  • Phys.Rev.D65:092002,2002
  • FNAL-PUB 01/211-E
Beams: p- p+
Beam energies: (900.0, 900.0) GeV
Run details:
  • $p\bar{p}$ QCD interactions at 1800 GeV. The leading jet is binned from 0--49 GeV, and histos can usually can be filled with a single generator run without kinematic sub-samples.

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}