rivet is hosted by Hepforge, IPPP Durham
CDF_2009_S8233977.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/Projections/FinalState.hh"
00004 #include "Rivet/Projections/ChargedFinalState.hh"
00005 #include "Rivet/Projections/TriggerCDFRun2.hh"
00006 
00007 namespace Rivet {
00008 
00009 
00010   /// @brief CDF Run II min-bias cross-section
00011   /// @author Hendrik Hoeth
00012   ///
00013   /// Measurement of \f$ \langle p_T \rangle \f$ vs. \f$ n_\text{ch} \f$,
00014   /// the track \f$ p_T \f$ distribution, and the \f$ \sum E_T \f$ distribution.
00015   /// Particles are selected within |eta|<1 and with pT>0.4 GeV.
00016   /// There is no pT cut for the \f$ \sum E_T \f$ measurement.
00017   ///
00018   /// @par Run conditions
00019   ///
00020   /// @arg \f$ \sqrt{s} = \f$ 1960 GeV
00021   /// @arg Run with generic QCD events.
00022   /// @arg Set particles with c*tau > 10 mm stable
00023   class CDF_2009_S8233977 : public Analysis {
00024   public:
00025 
00026     /// Constructor
00027     CDF_2009_S8233977()
00028       : Analysis("CDF_2009_S8233977"),
00029         _sumWeightSelected(0.0)
00030     {    }
00031 
00032 
00033     /// @name Analysis methods
00034     //@{
00035 
00036     /// Book histograms and projections
00037     void init() {
00038       addProjection(TriggerCDFRun2(), "Trigger");
00039       addProjection(FinalState(-1.0, 1.0, 0.0*GeV), "EtFS");
00040       addProjection(ChargedFinalState(-1.0, 1.0, 0.4*GeV), "CFS");
00041 
00042       _hist_pt = bookHisto1D(1, 1, 1);
00043       _hist_pt_vs_multiplicity = bookProfile1D(2, 1, 1);
00044       _hist_sumEt = bookHisto1D(3, 1, 1);
00045     }
00046 
00047 
00048 
00049     /// Do the analysis
00050     void analyze(const Event& evt) {
00051       // MinBias Trigger
00052       const bool trigger = applyProjection<TriggerCDFRun2>(evt, "Trigger").minBiasDecision();
00053       if (!trigger) vetoEvent;
00054 
00055       // Get the event weight
00056       const double weight = evt.weight();
00057 
00058       /// @todo The pT and sum(ET) distributions look slightly different from
00059       ///       Niccolo's Monte Carlo plots. Still waiting for his answer.
00060 
00061       const ChargedFinalState& trackfs = applyProjection<ChargedFinalState>(evt, "CFS");
00062       const size_t numParticles = trackfs.size();
00063       foreach (const Particle& p, trackfs.particles()) {
00064         const double pT = p.pT() / GeV;
00065         _hist_pt_vs_multiplicity->fill(numParticles, pT, weight);
00066 
00067         // The weight for entries in the pT distribution should be weight/(pT*dPhi*dy).
00068         //
00069         // - dPhi = 2*PI
00070         //
00071         // - dy depends on the pT: They calculate y assuming the particle has the
00072         //   pion mass and assuming that eta=1:
00073         //   dy = 2 * 1/2 * ln [(sqrt(m^2 + (a+1)*pT^2) + a*pT) / (sqrt(m^2 + (a+1)*pT^2) - a*pT)]
00074         //   with a = sinh(1).
00075         //
00076         // sinh(1) = 1.1752012
00077         // m(charged pion)^2 = (139.57 MeV)^2 = 0.019479785 GeV^2
00078         const double sinh1 = 1.1752012;
00079         const double apT  = sinh1 * pT;
00080         const double mPi = 139.57*MeV;
00081         const double root = sqrt(mPi*mPi + (1+sinh1)*pT*pT);
00082         const double dy = std::log((root+apT)/(root-apT));
00083         const double dphi = TWOPI;
00084         _hist_pt->fill(pT, weight/(pT*dphi*dy));
00085       }
00086 
00087       // Calc sum(Et) from calo particles
00088       const FinalState& etfs = applyProjection<FinalState>(evt, "EtFS");
00089       double sumEt = 0.0;
00090       foreach (const Particle& p, etfs.particles()) {
00091         sumEt += p.momentum().Et();
00092       }
00093       _hist_sumEt->fill(sumEt, weight);
00094       _sumWeightSelected += evt.weight();
00095     }
00096 
00097 
00098 
00099     /// Normalize histos
00100     void finalize() {
00101       scale(_hist_sumEt, crossSection()/millibarn/(4*M_PI*_sumWeightSelected));
00102       scale(_hist_pt, crossSection()/millibarn/_sumWeightSelected);
00103       MSG_DEBUG("sumOfWeights()     = " << sumOfWeights());
00104       MSG_DEBUG("_sumWeightSelected = " << _sumWeightSelected);
00105     }
00106 
00107     //@}
00108 
00109 
00110   private:
00111 
00112     double _sumWeightSelected;
00113     Profile1DPtr _hist_pt_vs_multiplicity;
00114     Histo1DPtr _hist_pt;
00115     Histo1DPtr _hist_sumEt;
00116 
00117   };
00118 
00119 
00120 
00121   // The hook for the plugin system
00122   DECLARE_RIVET_PLUGIN(CDF_2009_S8233977);
00123 
00124 }