CDF_2010_S8591881_QCD.cc
Go to the documentation of this file.
00001 // -*- C++ -*- 00002 #include "Rivet/Analysis.hh" 00003 #include "Rivet/RivetYODA.hh" 00004 #include "Rivet/Tools/Logging.hh" 00005 #include "Rivet/Projections/FinalState.hh" 00006 #include "Rivet/Projections/ChargedFinalState.hh" 00007 #include "Rivet/Projections/FastJets.hh" 00008 00009 namespace Rivet { 00010 00011 00012 /// @brief CDF Run II underlying event in leading jet events 00013 /// @author Hendrik Hoeth 00014 /// 00015 /// Rick Field's measurement of the underlying event in "leading jet" events. 00016 /// The leading jet (CDF midpoint \f$ R = 0.7 \f$) must be within \f$|\eta| < 2 \f$ 00017 /// and defines the "toward" phi direction. Particles are selected in 00018 /// \f$ |\eta| < 1 \f$. For the \f$ p_\perp \f$-related observables there 00019 /// is a \f$ p_\perp > 0.5 \f$ GeV cut. For \f$ \sum E_\perp \f$ there is no 00020 /// \f$ p_\perp \f$ cut. 00021 /// 00022 /// @par Run conditions 00023 /// @arg \f$ \sqrt{s} = \f$ 1960 GeV 00024 /// @arg Run with generic QCD events. 00025 /// @arg Set particles with c*tau > 10 mm stable 00026 /// @arg Several \f$ p_\perp^\text{min} \f$ cutoffs are probably required to fill the profile histograms: 00027 /// @arg \f$ p_\perp^\text{min} = \f$ 0 (min bias), 10, 20, 50, 100, 150 GeV 00028 /// @arg The corresponding merging points are at \f$ p_T = \f$ 0, 30, 50, 80, 130, 180 GeV 00029 class CDF_2010_S8591881_QCD : public Analysis { 00030 public: 00031 00032 /// Constructor 00033 CDF_2010_S8591881_QCD() 00034 : Analysis("CDF_2010_S8591881_QCD") 00035 { 00036 } 00037 00038 00039 /// @name Analysis methods 00040 //@{ 00041 00042 void init() { 00043 // Final state for the jet finding 00044 const FinalState fsj(-4.0, 4.0, 0.0*GeV); 00045 addProjection(fsj, "FSJ"); 00046 addProjection(FastJets(fsj, FastJets::CDFMIDPOINT, 0.7), "MidpointJets"); 00047 00048 // Charged final state for the distributions 00049 const ChargedFinalState cfs(-1.0, 1.0, 0.5*GeV); 00050 addProjection(cfs, "CFS"); 00051 00052 // Book histograms 00053 _hist_tnchg = bookProfile1D(10, 1, 1); 00054 _hist_pnchg = bookProfile1D(10, 1, 2); 00055 _hist_anchg = bookProfile1D(10, 1, 3); 00056 _hist_pmaxnchg = bookProfile1D(11, 1, 1); 00057 _hist_pminnchg = bookProfile1D(11, 1, 2); 00058 _hist_pdifnchg = bookProfile1D(11, 1, 3); 00059 _hist_tcptsum = bookProfile1D(12, 1, 1); 00060 _hist_pcptsum = bookProfile1D(12, 1, 2); 00061 _hist_acptsum = bookProfile1D(12, 1, 3); 00062 _hist_pmaxcptsum = bookProfile1D(13, 1, 1); 00063 _hist_pmincptsum = bookProfile1D(13, 1, 2); 00064 _hist_pdifcptsum = bookProfile1D(13, 1, 3); 00065 _hist_pcptave = bookProfile1D(14, 1, 1); 00066 _hist_pcptmax = bookProfile1D(15, 1, 1); 00067 } 00068 00069 00070 // Do the analysis 00071 void analyze(const Event& e) { 00072 /// @todo Implement Run II min bias trigger cf. CDF_2009? 00073 00074 const FinalState& fsj = applyProjection<FinalState>(e, "FSJ"); 00075 if (fsj.particles().size() < 1) { 00076 MSG_DEBUG("Failed multiplicity cut"); 00077 vetoEvent; 00078 } 00079 00080 const Jets& jets = applyProjection<FastJets>(e, "MidpointJets").jetsByPt(); 00081 MSG_DEBUG("Jet multiplicity = " << jets.size()); 00082 00083 // We require the leading jet to be within |eta|<2 00084 if (jets.size() < 1 || fabs(jets[0].momentum().eta()) >= 2) { 00085 MSG_DEBUG("Failed leading jet cut"); 00086 vetoEvent; 00087 } 00088 00089 const double jetphi = jets[0].momentum().phi(); 00090 const double jeteta = jets[0].momentum().eta(); 00091 const double jetpT = jets[0].momentum().pT(); 00092 MSG_DEBUG("Leading jet: pT = " << jetpT 00093 << ", eta = " << jeteta << ", phi = " << jetphi); 00094 00095 // Get the event weight 00096 const double weight = e.weight(); 00097 00098 // Get the final states to work with for filling the distributions 00099 const FinalState& cfs = applyProjection<ChargedFinalState>(e, "CFS"); 00100 00101 size_t numOverall(0), numToward(0), numAway(0) ; 00102 long int numTrans1(0), numTrans2(0); 00103 double ptSumOverall(0.0), ptSumToward(0.0), ptSumTrans1(0.0), ptSumTrans2(0.0), ptSumAway(0.0); 00104 double ptMaxOverall(0.0), ptMaxToward(0.0), ptMaxTrans1(0.0), ptMaxTrans2(0.0), ptMaxAway(0.0); 00105 00106 // Calculate all the charged stuff 00107 foreach (const Particle& p, cfs.particles()) { 00108 const double dPhi = deltaPhi(p.momentum().phi(), jetphi); 00109 const double pT = p.momentum().pT(); 00110 const double phi = p.momentum().phi(); 00111 double rotatedphi = phi - jetphi; 00112 while (rotatedphi < 0) rotatedphi += 2*PI; 00113 00114 ptSumOverall += pT; 00115 ++numOverall; 00116 if (pT > ptMaxOverall) { 00117 ptMaxOverall = pT; 00118 } 00119 00120 if (dPhi < PI/3.0) { 00121 ptSumToward += pT; 00122 ++numToward; 00123 if (pT > ptMaxToward) ptMaxToward = pT; 00124 } 00125 else if (dPhi < 2*PI/3.0) { 00126 if (rotatedphi <= PI) { 00127 ptSumTrans1 += pT; 00128 ++numTrans1; 00129 if (pT > ptMaxTrans1) ptMaxTrans1 = pT; 00130 } else { 00131 ptSumTrans2 += pT; 00132 ++numTrans2; 00133 if (pT > ptMaxTrans2) ptMaxTrans2 = pT; 00134 } 00135 } 00136 else { 00137 ptSumAway += pT; 00138 ++numAway; 00139 if (pT > ptMaxAway) ptMaxAway = pT; 00140 } 00141 } // end charged particle loop 00142 00143 // Fill the histograms 00144 _hist_tnchg->fill(jetpT/GeV, numToward/(4*PI/3), weight); 00145 _hist_pnchg->fill(jetpT/GeV, (numTrans1+numTrans2)/(4*PI/3), weight); 00146 _hist_pmaxnchg->fill(jetpT/GeV, (numTrans1>numTrans2 ? numTrans1 : numTrans2)/(2*PI/3), weight); 00147 _hist_pminnchg->fill(jetpT/GeV, (numTrans1<numTrans2 ? numTrans1 : numTrans2)/(2*PI/3), weight); 00148 _hist_pdifnchg->fill(jetpT/GeV, abs(numTrans1-numTrans2)/(2*PI/3), weight); 00149 _hist_anchg->fill(jetpT/GeV, numAway/(4*PI/3), weight); 00150 00151 _hist_tcptsum->fill(jetpT/GeV, ptSumToward/GeV/(4*PI/3), weight); 00152 _hist_pcptsum->fill(jetpT/GeV, (ptSumTrans1+ptSumTrans2)/GeV/(4*PI/3), weight); 00153 _hist_pmaxcptsum->fill(jetpT/GeV, (ptSumTrans1>ptSumTrans2 ? ptSumTrans1 : ptSumTrans2)/GeV/(2*PI/3), weight); 00154 _hist_pmincptsum->fill(jetpT/GeV, (ptSumTrans1<ptSumTrans2 ? ptSumTrans1 : ptSumTrans2)/GeV/(2*PI/3), weight); 00155 _hist_pdifcptsum->fill(jetpT/GeV, fabs(ptSumTrans1-ptSumTrans2)/GeV/(2*PI/3), weight); 00156 _hist_acptsum->fill(jetpT/GeV, ptSumAway/GeV/(4*PI/3), weight); 00157 00158 if ((numTrans1+numTrans2) > 0) { 00159 _hist_pcptave->fill(jetpT/GeV, (ptSumTrans1+ptSumTrans2)/GeV/(numTrans1+numTrans2), weight); 00160 _hist_pcptmax->fill(jetpT/GeV, (ptMaxTrans1 > ptMaxTrans2 ? ptMaxTrans1 : ptMaxTrans2)/GeV, weight); 00161 } 00162 } 00163 00164 00165 void finalize() { 00166 } 00167 00168 //@} 00169 00170 00171 private: 00172 00173 Profile1DPtr _hist_tnchg; 00174 Profile1DPtr _hist_pnchg; 00175 Profile1DPtr _hist_anchg; 00176 Profile1DPtr _hist_pmaxnchg; 00177 Profile1DPtr _hist_pminnchg; 00178 Profile1DPtr _hist_pdifnchg; 00179 Profile1DPtr _hist_tcptsum; 00180 Profile1DPtr _hist_pcptsum; 00181 Profile1DPtr _hist_acptsum; 00182 Profile1DPtr _hist_pmaxcptsum; 00183 Profile1DPtr _hist_pmincptsum; 00184 Profile1DPtr _hist_pdifcptsum; 00185 Profile1DPtr _hist_pcptave; 00186 Profile1DPtr _hist_pcptmax; 00187 00188 }; 00189 00190 00191 00192 // The hook for the plugin system 00193 DECLARE_RIVET_PLUGIN(CDF_2010_S8591881_QCD); 00194 00195 } Generated on Fri Dec 21 2012 15:03:40 for The Rivet MC analysis system by ![]() |