rivet is hosted by Hepforge, IPPP Durham
CDF_2001_S4751469.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // Field & Stuart underlying event analysis at CDF.
00004 // Phys.Rev.D65:092002,2002 - no arXiv code.
00005 // FNAL-PUB 01/211-E
00006 
00007 #include "Rivet/Analysis.hh"
00008 #include "Rivet/RivetYODA.hh"
00009 #include "Rivet/Tools/Logging.hh"
00010 #include "Rivet/Projections/ChargedFinalState.hh"
00011 #include "Rivet/Projections/ConstLossyFinalState.hh"
00012 #include "Rivet/Projections/FastJets.hh"
00013 #include "Rivet/Projections/TriggerCDFRun0Run1.hh"
00014 
00015 namespace Rivet {
00016 
00017 
00018   /// @brief "Field-Stuart" CDF Run I track-jet underlying event analysis
00019   ///
00020   /// @author Andy Buckley
00021   ///
00022   /// The "original" underlying event analysis, using a non-standard track-jet algorithm.
00023   ///
00024   /// @par Run conditions
00025   ///
00026   /// @arg \f$ \sqrt{s} = \f$ 1800 GeV
00027   /// @arg Run with generic QCD events.
00028   /// @arg Several \f$ p_\perp^\text{min} \f$ cutoffs are probably required to fill the profile histograms:
00029   ///   @arg \f$ p_\perp^\text{min} = \f$ 0 (min bias), 10, 20 GeV
00030   class CDF_2001_S4751469 : public Analysis {
00031   public:
00032 
00033     /// Constructor: cuts on final state are \f$ -1 < \eta < 1 \f$
00034     /// and \f$ p_T > 0.5 \f$ GeV.
00035     CDF_2001_S4751469()
00036       : Analysis("CDF_2001_S4751469"),
00037         _totalNumTrans2(0), _totalNumTrans5(0), _totalNumTrans30(0),
00038         _sumWeightsPtLead2(0),_sumWeightsPtLead5(0), _sumWeightsPtLead30(0)
00039     {
00040     }
00041 
00042 
00043     /// @name Analysis methods
00044     //@{
00045 
00046     // Book histograms
00047     void init() {
00048       addProjection(TriggerCDFRun0Run1(), "Trigger");
00049       // Randomly discard 8% of charged particles as a kind of hacky detector correction.
00050       const ChargedFinalState cfs(-1.0, 1.0, 0.5*GeV);
00051       const ConstLossyFinalState lfs(cfs, 0.08);
00052 
00053       // const LossyFinalState<StarRandomFilter> lfs(cfs, StarRandomFilter());
00054       addProjection(lfs, "FS");
00055       addProjection(FastJets(lfs, FastJets::TRACKJET, 0.7), "TrackJet");
00056 
00057       _numvsDeltaPhi2 =  bookProfile1D(1, 1, 1);
00058       _numvsDeltaPhi5 =  bookProfile1D(1, 1, 2);
00059       _numvsDeltaPhi30 = bookProfile1D(1, 1, 3);
00060       _pTvsDeltaPhi2 =   bookProfile1D(2, 1, 1);
00061       _pTvsDeltaPhi5 =   bookProfile1D(2, 1, 2);
00062       _pTvsDeltaPhi30 =  bookProfile1D(2, 1, 3);
00063 
00064       _numTowardMB = bookProfile1D(3, 1, 1);
00065       _numTransMB = bookProfile1D(3, 1, 2);
00066       _numAwayMB = bookProfile1D(3, 1, 3);
00067       _numTowardJ20 = bookProfile1D(4, 1, 1);
00068       _numTransJ20 = bookProfile1D(4, 1, 2);
00069       _numAwayJ20 = bookProfile1D(4, 1, 3);
00070 
00071       _ptsumTowardMB = bookProfile1D(5, 1, 1);
00072       _ptsumTransMB = bookProfile1D(5, 1, 2);
00073       _ptsumAwayMB = bookProfile1D(5, 1, 3);
00074       _ptsumTowardJ20 = bookProfile1D(6, 1, 1);
00075       _ptsumTransJ20 = bookProfile1D(6, 1, 2);
00076       _ptsumAwayJ20 = bookProfile1D(6, 1, 3);
00077 
00078       _ptTrans2 = bookHisto1D(7, 1, 1);
00079       _ptTrans5 = bookHisto1D(7, 1, 2);
00080       _ptTrans30 = bookHisto1D(7, 1, 3);
00081     }
00082 
00083 
00084     /// Do the analysis
00085     void analyze(const Event& event) {
00086       // Trigger
00087       const bool trigger = applyProjection<TriggerCDFRun0Run1>(event, "Trigger").minBiasDecision();
00088       if (!trigger) vetoEvent;
00089 
00090       // Analyse, with pT > 0.5 GeV AND |eta| < 1
00091       const JetAlg& tj = applyProjection<JetAlg>(event, "TrackJet");
00092 
00093       // Final state (lossy) charged particles
00094       const FinalState& fs = applyProjection<FinalState>(event, "FS");
00095 
00096       // Get jets, sorted by pT
00097       const Jets jets = tj.jetsByPt();
00098       if (jets.empty()) {
00099         vetoEvent;
00100       }
00101 
00102       Jet leadingJet = jets.front();
00103       const double phiLead = leadingJet.phi();
00104       const double ptLead = leadingJet.ptSum();
00105 
00106       // Cut on highest pT jet: combined 0.5 GeV < pT(lead) < 50 GeV
00107       if (ptLead/GeV < 0.5) vetoEvent;
00108       if (ptLead/GeV > 50.0) vetoEvent;
00109 
00110       // Get the event weight
00111       const double weight = event.weight();
00112 
00113       // Count sum of all event weights in three pT_lead regions
00114       if (ptLead/GeV > 2.0) {
00115         _sumWeightsPtLead2 += weight;
00116       }
00117       if (ptLead/GeV > 5.0) {
00118         _sumWeightsPtLead5 += weight;
00119       }
00120       if (ptLead/GeV > 30.0) {
00121         _sumWeightsPtLead30 += weight;
00122       }
00123 
00124       // Run over tracks
00125       double ptSumToward(0.0), ptSumAway(0.0), ptSumTrans(0.0);
00126       size_t numToward(0), numTrans(0), numAway(0);
00127 
00128       // Temporary histos that bin N and pT in dphi
00129       /// @todo Copy the permanent histos to get the binnings more robustly
00130       Profile1D hist_num_dphi_2(50, 0, 180), hist_num_dphi_5(50, 0, 180), hist_num_dphi_30(50, 0, 180);
00131       Profile1D hist_pt_dphi_2(50, 0, 180), hist_pt_dphi_5(50, 0, 180), hist_pt_dphi_30(50, 0, 180);
00132 
00133       foreach (const Particle& p, fs.particles()) {
00134         // Calculate DeltaPhi(p,leadingJet)
00135         const double dPhi = deltaPhi(p.momentum().phi(), phiLead);
00136         const double pT = p.momentum().pT();
00137 
00138         if (dPhi < PI/3.0) {
00139           ptSumToward += pT;
00140           ++numToward;
00141         }
00142         else if (dPhi < 2*PI/3.0) {
00143           ptSumTrans += pT;
00144           ++numTrans;
00145           // Fill transverse pT distributions
00146           if (ptLead/GeV > 2.0) {
00147             _ptTrans2->fill(pT/GeV, weight);
00148             _totalNumTrans2 += weight;
00149           }
00150           if (ptLead/GeV > 5.0) {
00151             _ptTrans5->fill(pT/GeV, weight);
00152             _totalNumTrans5 += weight;
00153           }
00154           if (ptLead/GeV > 30.0) {
00155             _ptTrans30->fill(pT/GeV, weight);
00156             _totalNumTrans30 += weight;
00157           }
00158         }
00159         else {
00160           ptSumAway += pT;
00161           ++numAway;
00162         }
00163 
00164         // Fill tmp histos to bin event's track Nch & pT in dphi
00165         const double dPhideg = 180*dPhi/PI;
00166         if (ptLead/GeV > 2.0) {
00167           hist_num_dphi_2.fill(dPhideg, 1);
00168           hist_pt_dphi_2.fill (dPhideg, pT/GeV);
00169         }
00170         if (ptLead/GeV > 5.0) {
00171           hist_num_dphi_5.fill(dPhideg, 1);
00172           hist_pt_dphi_5.fill (dPhideg, pT/GeV);
00173         }
00174         if (ptLead/GeV > 30.0) {
00175           hist_num_dphi_30.fill(dPhideg, 1);
00176           hist_pt_dphi_30.fill (dPhideg, pT/GeV);
00177         }
00178       }
00179 
00180       // Update the "proper" dphi profile histograms
00181       for (int i = 0; i < 50; i++) {
00182         if (ptLead/GeV > 2.0) {
00183           _numvsDeltaPhi2->fill(hist_num_dphi_2.bin(i).xMean(), hist_num_dphi_2.bin(i).mean(), weight);
00184           _pTvsDeltaPhi2->fill(hist_pt_dphi_2.bin(i).xMean(), hist_pt_dphi_2.bin(i).mean(), weight);
00185         }
00186         if (ptLead/GeV > 5.0) {
00187           _numvsDeltaPhi5->fill(hist_num_dphi_5.bin(i).xMean(), hist_num_dphi_5.bin(i).mean(), weight);
00188           _pTvsDeltaPhi5->fill(hist_pt_dphi_5.bin(i).xMean(), hist_pt_dphi_5.bin(i).mean(), weight);
00189         }
00190         if (ptLead/GeV > 30.0) {
00191           _numvsDeltaPhi30->fill(hist_num_dphi_30.bin(i).xMean(), hist_num_dphi_30.bin(i).mean(), weight);
00192           _pTvsDeltaPhi30->fill(hist_pt_dphi_30.bin(i).xMean(), hist_pt_dphi_30.bin(i).mean(), weight);
00193         }
00194       }
00195 
00196       // Log some event details about pT
00197       MSG_DEBUG("pT [lead; twd, away, trans] = [" << ptLead << "; "
00198                 << ptSumToward << ", " << ptSumAway << ", " << ptSumTrans << "]");
00199 
00200       // Update the pT profile histograms
00201       _ptsumTowardMB->fill(ptLead/GeV, ptSumToward/GeV, weight);
00202       _ptsumTowardJ20->fill(ptLead/GeV, ptSumToward/GeV, weight);
00203 
00204       _ptsumTransMB->fill(ptLead/GeV, ptSumTrans/GeV, weight);
00205       _ptsumTransJ20->fill(ptLead/GeV, ptSumTrans/GeV, weight);
00206 
00207       _ptsumAwayMB->fill(ptLead/GeV, ptSumAway/GeV, weight);
00208       _ptsumAwayJ20->fill(ptLead/GeV, ptSumAway/GeV, weight);
00209 
00210       // Log some event details about Nch
00211       MSG_DEBUG("N [twd, away, trans] = [" << ptLead << "; "
00212                 << numToward << ", " << numTrans << ", " << numAway << "]");
00213 
00214       // Update the N_track profile histograms
00215       _numTowardMB->fill(ptLead/GeV, numToward, weight);
00216       _numTowardJ20->fill(ptLead/GeV, numToward, weight);
00217 
00218       _numTransMB->fill(ptLead/GeV, numTrans, weight);
00219       _numTransJ20->fill(ptLead/GeV, numTrans, weight);
00220 
00221       _numAwayMB->fill(ptLead/GeV, numAway, weight);
00222       _numAwayJ20->fill(ptLead/GeV, numAway, weight);
00223     }
00224 
00225 
00226     /// Normalize histos
00227     void finalize() {
00228       normalize(_ptTrans2, _totalNumTrans2 / _sumWeightsPtLead2);
00229       normalize(_ptTrans5, _totalNumTrans5 / _sumWeightsPtLead5);
00230       normalize(_ptTrans30, _totalNumTrans30 / _sumWeightsPtLead30);
00231     }
00232 
00233     //@}
00234 
00235 
00236   private:
00237 
00238     /// Sum total number of charged particles in the trans region, in 3 \f$ p_\perp^\text{lead} \f$ bins.
00239     double _totalNumTrans2, _totalNumTrans5, _totalNumTrans30;
00240 
00241     /// Sum the total number of events in 3 \f$ p_\perp^\text{lead} \f$ bins.
00242     double _sumWeightsPtLead2,_sumWeightsPtLead5, _sumWeightsPtLead30;
00243 
00244 
00245     /// @name Histogram collections
00246     //@{
00247     // These histos (binned in dphi) are filled per event and then reset
00248     // TODO: use LWH
00249     Profile1DPtr _hist_num_dphi_2, _hist_num_dphi_5, _hist_num_dphi_30;
00250     Profile1DPtr _hist_pt_dphi_2, _hist_pt_dphi_5, _hist_pt_dphi_30;
00251 
00252     // The sumpt vs. dphi and Nch vs. dphi histos
00253     Profile1DPtr _numvsDeltaPhi2, _numvsDeltaPhi5, _numvsDeltaPhi30;
00254     Profile1DPtr _pTvsDeltaPhi2, _pTvsDeltaPhi5, _pTvsDeltaPhi30;
00255 
00256 
00257     /// Profile histograms, binned in the \f$ p_T \f$ of the leading jet, for
00258     /// the \f$ p_T \f$ sum in the toward, transverse and away regions.
00259     Profile1DPtr _ptsumTowardMB,  _ptsumTransMB,  _ptsumAwayMB;
00260     Profile1DPtr _ptsumTowardJ20, _ptsumTransJ20, _ptsumAwayJ20;
00261 
00262     /// Profile histograms, binned in the \f$ p_T \f$ of the leading jet, for
00263     /// the number of charged particles per jet in the toward, transverse and
00264     /// away regions.
00265     Profile1DPtr _numTowardMB,  _numTransMB,  _numAwayMB;
00266     Profile1DPtr _numTowardJ20, _numTransJ20, _numAwayJ20;
00267 
00268     /// Histogram of \f$ p_T \f$ distribution for 3 different \f$ p_{T1} \f$ IR cutoffs.
00269     Histo1DPtr _ptTrans2, _ptTrans5, _ptTrans30;
00270     //@}
00271 
00272   };
00273 
00274 
00275 
00276   // The hook for the plugin system
00277   DECLARE_RIVET_PLUGIN(CDF_2001_S4751469);
00278 
00279 }