CDF_1991_S2313472.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/RivetAIDA.hh"
00004 #include "Rivet/Tools/Logging.hh"
00005 #include "Rivet/Projections/FinalState.hh"
00006 #include "Rivet/Projections/ChargedFinalState.hh"
00007 #include "Rivet/Projections/WFinder.hh"
00008 #include "Rivet/Tools/ParticleIdUtils.hh"
00009 
00010 namespace Rivet {
00011 
00012 
00013   /// @brief CDF W boson \f$ p_\perp \f$ measurement at 1800 GeV
00014   class CDF_1991_S2313472 : public Analysis {
00015   public:
00016 
00017     /// @name Constructors etc.
00018     //@{
00019 
00020     /// Constructor
00021     CDF_1991_S2313472()
00022       : Analysis("CDF_1991_S2313472")
00023     {
00024       /// @todo Set approriate for your analysis
00025       setBeams(PROTON, ANTIPROTON);
00026 
00027       /// @todo Set whether your finalize method needs the generator cross section
00028       setNeedsCrossSection(false);
00029     }
00030 
00031     //@}
00032 
00033 
00034   public:
00035 
00036     /// @name Analysis methods
00037     //@{
00038 
00039     /// Book histograms and initialise projections before the run
00040     void init() {
00041       WFinder wfe(-5, 5, 0.0*GeV, ELECTRON, 60.0*GeV, 100.0*GeV, 20.0*GeV, 0.2);
00042       addProjection(wfe, "WFe");
00043 
00044       // Book histogram
00045       _hist_wpt = bookHistogram1D(1, 1, 1);
00046     }
00047 
00048 
00049     /// Perform the per-event analysis
00050     void analyze(const Event& event) {
00051       const double weight = event.weight();
00052       const WFinder& wf = applyProjection<WFinder>(event, "WFe");
00053       if (wf.size() == 0) {
00054         getLog() << Log::DEBUG << "No W candidates found: vetoing" << endl;
00055         vetoEvent;
00056       }
00057 
00058       // Require the electron to have ET > 20 GeV, pT > 6 GeV and |eta| < 1.1
00059       /// @todo Use separate pT and ETmiss cuts in WFinder
00060       FourMomentum p_e;
00061       int chg_e = 0;
00062 
00063       foreach (const Particle& l, wf.constituentsFinalState().particles()) {
00064         const FourMomentum pl = l.momentum();
00065         if (abs(l.pdgId()) == ELECTRON) {
00066           chg_e = PID::threeCharge(l.pdgId());
00067           p_e = pl;
00068           const double eta_e = fabs(p_e.pseudorapidity());
00069           if ( (pl.Et()/GeV < 20.0) || (pl.pT()/GeV < 6.0) || (eta_e > 1.1) ) {
00070             getLog() << Log::DEBUG << l.pdgId() << " ET,pT,eta: " << pl.Et()/GeV << "," << pl.pT()/GeV << "," << eta_e << " fails electron cut" << endl;
00071             vetoEvent;
00072           }
00073         }
00074         else if (abs(l.pdgId()) == NU_E) {
00075           FourMomentum p_nu = l.momentum();
00076           if (p_nu.Et()/GeV < 20.0) {
00077             getLog() << Log::DEBUG << l.pdgId() << " ET(miss): " << p_nu.Et() << "fails ETmiss cut" << endl;
00078             vetoEvent;
00079           }
00080         }
00081       }
00082       assert(chg_e != 0);
00083 
00084       FourMomentum pW = wf.particles()[0].momentum();
00085       getLog() << Log::DEBUG << "Dilepton mass = " << pW.mass()/GeV << " GeV"  << endl;
00086       getLog() << Log::DEBUG << "Dilepton pT   = " << pW.pT()/GeV << " GeV" << endl;
00087       _hist_wpt->fill(pW.pT()/GeV, weight);
00088     }
00089 
00090 
00091     /// Normalise histograms etc., after the run
00092     void finalize() {
00093 
00094 
00095     }
00096 
00097     //@}
00098 
00099 
00100   private:
00101 
00102     /// @name Histograms
00103     AIDA::IHistogram1D *_hist_wpt;
00104 
00105   };
00106 
00107 
00108 
00109   // This global object acts as a hook for the plugin system
00110   AnalysisBuilder<CDF_1991_S2313472> plugin_CDF_1991_S2313472;
00111 
00112 
00113 }