rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

CDF_2001_S4751469

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_S4751469.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_S4751469 : public Analysis {
 25  public:
 26
 27    RIVET_DEFAULT_ANALYSIS_CTOR(CDF_2001_S4751469);
 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, FastJets::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
 78
 79    /// Do the analysis
 80    void analyze(const Event& event) {
 81      // Trigger
 82      const bool trigger = apply<TriggerCDFRun0Run1>(event, "Trigger").minBiasDecision();
 83      if (!trigger) vetoEvent;
 84
 85      // Get jets, sorted by pT
 86      const Jets jets = apply<JetAlg>(event, "TrackJet").jetsByPt();
 87      if (jets.empty()) vetoEvent;
 88      const Jet jet1 = jets.front();
 89      const double ptLead = jet1.pT();
 90
 91      // Cut on highest pT jet: combined 0.5 GeV < pT(lead) < 50 GeV
 92      if (ptLead/GeV < 0.5) vetoEvent;
 93      if (ptLead/GeV > 50.0) vetoEvent;
 94
 95      // Count sum of all event weights in three pT_lead regions
 96      if (ptLead/GeV > 2.0) _sumWeightsPtLead2->fill();
 97      if (ptLead/GeV > 5.0) _sumWeightsPtLead5->fill();
 98      if (ptLead/GeV > 30.0) _sumWeightsPtLead30->fill();
 99
100      // Run over tracks
101      double ptSumToward(0.0), ptSumAway(0.0), ptSumTrans(0.0);
102      size_t numToward(0), numTrans(0), numAway(0);
103
104      // Temporary histos that bin N and pT in dphi
105      Profile1D htmp_num_dphi_2(refData(1, 1, 1)), htmp_num_dphi_5(refData(1, 1, 2)), htmp_num_dphi_30(refData(1, 1, 3));
106      Profile1D htmp_pt_dphi_2(refData(2, 1, 1)), htmp_pt_dphi_5(refData(2, 1, 2)), htmp_pt_dphi_30(refData(2, 1, 3));
107
108      // Final state charged particles
109      /// @todo Non-trackjet track efficiencies are corrected?
110      const Particles& tracks = apply<FinalState>(event, "FS").particles();
111      for (const Particle& p : tracks) {
112        const double dPhi = deltaPhi(p, jet1);
113        const double pT = p.pT();
114
115        if (dPhi < PI/3.0) {
116          ptSumToward += pT;
117          ++numToward;
118        }
119        else if (dPhi < 2*PI/3.0) {
120          ptSumTrans += pT;
121          ++numTrans;
122          // Fill transverse pT distributions
123          if (ptLead/GeV > 2.0) {
124            _ptTrans2->fill(pT/GeV);
125            _totalNumTrans2->fill();
126          }
127          if (ptLead/GeV > 5.0) {
128            _ptTrans5->fill(pT/GeV);
129            _totalNumTrans5->fill();
130          }
131          if (ptLead/GeV > 30.0) {
132            _ptTrans30->fill(pT/GeV);
133            _totalNumTrans30->fill();
134          }
135        }
136        else {
137          ptSumAway += pT;
138          ++numAway;
139        }
140
141        // Fill tmp histos to bin event's track Nch & pT in dphi
142        const double dPhideg = 180*dPhi/M_PI;
143        if (ptLead/GeV > 2.0) {
144          htmp_num_dphi_2.fill(dPhideg, 1);
145          htmp_pt_dphi_2.fill (dPhideg, pT/GeV);
146        }
147        if (ptLead/GeV > 5.0) {
148          htmp_num_dphi_5.fill(dPhideg, 1);
149          htmp_pt_dphi_5.fill (dPhideg, pT/GeV);
150        }
151        if (ptLead/GeV > 30.0) {
152          htmp_num_dphi_30.fill(dPhideg, 1);
153          htmp_pt_dphi_30.fill (dPhideg, pT/GeV);
154        }
155      }
156
157      // Update the "proper" dphi profile histograms
158      for (int i = 0; i < 50; i++) { ///< @todo Should really explicitly iterate over nbins for each temp histo
159        if (ptLead/GeV > 2.0) {
160          const double x2 = htmp_pt_dphi_2.bin(i).xMid();
161          const double num2 = (htmp_num_dphi_2.bin(i).numEntries() > 0) ? htmp_num_dphi_2.bin(i).mean() : 0.0;
162          const double pt2 = (htmp_num_dphi_2.bin(i).numEntries() > 0) ? htmp_pt_dphi_2.bin(i).mean() : 0.0;
163          _numvsDeltaPhi2->fill(x2, num2);
164          _pTvsDeltaPhi2->fill(x2, pt2);
165        }
166        if (ptLead/GeV > 5.0) {
167          const double x5 = htmp_pt_dphi_5.bin(i).xMid();
168          const double num5 = (htmp_num_dphi_5.bin(i).numEntries() > 0) ? htmp_num_dphi_5.bin(i).mean() : 0.0;
169          const double pt5 = (htmp_num_dphi_5.bin(i).numEntries() > 0) ? htmp_pt_dphi_5.bin(i).mean() : 0.0;
170          _numvsDeltaPhi5->fill(x5, num5);
171          _pTvsDeltaPhi5->fill(x5, pt5);
172        }
173        if (ptLead/GeV > 30.0) {
174          const double x30 = htmp_pt_dphi_30.bin(i).xMid();
175          const double num30 = (htmp_num_dphi_30.bin(i).numEntries() > 0) ? htmp_num_dphi_30.bin(i).mean() : 0.0;
176          const double pt30 = (htmp_num_dphi_30.bin(i).numEntries() > 0) ? htmp_pt_dphi_30.bin(i).mean() : 0.0;
177          _numvsDeltaPhi30->fill(x30, num30);
178          _pTvsDeltaPhi30->fill(x30, pt30);
179        }
180      }
181
182      // Log some event details about pT
183      MSG_DEBUG("pT [lead; twd, away, trans] = [" << ptLead << "; "
184                << ptSumToward << ", " << ptSumAway << ", " << ptSumTrans << "]");
185
186      // Update the pT profile histograms
187      _ptsumTowardMB->fill(ptLead/GeV, ptSumToward/GeV);
188      _ptsumTowardJ20->fill(ptLead/GeV, ptSumToward/GeV);
189
190      _ptsumTransMB->fill(ptLead/GeV, ptSumTrans/GeV);
191      _ptsumTransJ20->fill(ptLead/GeV, ptSumTrans/GeV);
192
193      _ptsumAwayMB->fill(ptLead/GeV, ptSumAway/GeV);
194      _ptsumAwayJ20->fill(ptLead/GeV, ptSumAway/GeV);
195
196      // Log some event details about Nch
197      MSG_DEBUG("N [twd, away, trans] = [" << ptLead << "; "
198                << numToward << ", " << numTrans << ", " << numAway << "]");
199
200      // Update the N_track profile histograms
201      _numTowardMB->fill(ptLead/GeV, numToward);
202      _numTowardJ20->fill(ptLead/GeV, numToward);
203
204      _numTransMB->fill(ptLead/GeV, numTrans);
205      _numTransJ20->fill(ptLead/GeV, numTrans);
206
207      _numAwayMB->fill(ptLead/GeV, numAway);
208      _numAwayJ20->fill(ptLead/GeV, numAway);
209    }
210
211
212    /// Normalize histos
213    void finalize() {
214      normalize(_ptTrans2, *_totalNumTrans2 / *_sumWeightsPtLead2);
215      normalize(_ptTrans5, *_totalNumTrans5 / *_sumWeightsPtLead5);
216      normalize(_ptTrans30, *_totalNumTrans30 / *_sumWeightsPtLead30);
217    }
218
219    //@}
220
221
222  private:
223
224    /// Sum total number of charged particles in the trans region, in 3 \f$ p_\perp^\text{lead} \f$ bins.
225    CounterPtr _totalNumTrans2, _totalNumTrans5, _totalNumTrans30;
226
227    /// Sum the total number of events in 3 \f$ p_\perp^\text{lead} \f$ bins.
228    CounterPtr _sumWeightsPtLead2,_sumWeightsPtLead5, _sumWeightsPtLead30;
229
230
231    /// @name Histogram collections
232    //@{
233
234    // The sumpt vs. dphi and Nch vs. dphi histos
235    Profile1DPtr _numvsDeltaPhi2, _numvsDeltaPhi5, _numvsDeltaPhi30;
236    Profile1DPtr _pTvsDeltaPhi2, _pTvsDeltaPhi5, _pTvsDeltaPhi30;
237
238    /// Profile histograms, binned in the \f$ p_T \f$ of the leading jet, for
239    /// the \f$ p_T \f$ sum in the toward, transverse and away regions.
240    Profile1DPtr _ptsumTowardMB,  _ptsumTransMB,  _ptsumAwayMB;
241    Profile1DPtr _ptsumTowardJ20, _ptsumTransJ20, _ptsumAwayJ20;
242
243    /// Profile histograms, binned in the \f$ p_T \f$ of the leading jet, for
244    /// the number of charged particles per jet in the toward, transverse and
245    /// away regions.
246    Profile1DPtr _numTowardMB,  _numTransMB,  _numAwayMB;
247    Profile1DPtr _numTowardJ20, _numTransJ20, _numAwayJ20;
248
249    /// Histogram of \f$ p_T \f$ distribution for 3 different \f$ p_{T1} \f$ IR cutoffs.
250    Histo1DPtr _ptTrans2, _ptTrans5, _ptTrans30;
251    //@}
252
253  };
254
255
256
257  RIVET_DECLARE_ALIASED_PLUGIN(CDF_2001_S4751469, CDF_2001_I564673);
258
259}