rivet is hosted by Hepforge, IPPP Durham
CMS_2015_I1346843.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/ChargedLeptons.hh"
00005 #include "Rivet/Projections/NeutralFinalState.hh"
00006 #include "Rivet/Projections/IdentifiedFinalState.hh"
00007 
00008 namespace Rivet {
00009 
00010 
00011   /// Differential cross-section of FSR photons in Z decays
00012   class CMS_2015_I1346843 : public Analysis {
00013   public:
00014 
00015     /// Constructor
00016     DEFAULT_RIVET_ANALYSIS_CTOR(CMS_2015_I1346843);
00017 
00018     /// Book histograms and initialise projections before the run
00019     void init() {
00020 
00021       Cut c_photons = Cuts::pT >= 5.0*GeV && (Cuts::etaIn(-2.5, 1.4) || Cuts::etaIn(1.6, 2.5));
00022       IdentifiedFinalState photons(c_photons);
00023       photons.acceptId(PID::PHOTON);
00024       declare(photons, "PHOTFS");
00025 
00026       Cut c_muons   = Cuts::pT > 9*GeV && Cuts::abseta < 2.4;
00027       IdentifiedFinalState muons(c_muons);
00028       muons.acceptIdPair(PID::MUON);
00029       declare(muons, "MUFS");
00030 
00031 
00032       _hist_pho_et           = bookHisto1D(1, 1, 1);  // photon transverse energy
00033       _hist_pho_et_wide      = bookHisto1D(1, 2, 1);  // photon transverse energy (0.5 < dr < 3.0)
00034       _hist_pho_et_close     = bookHisto1D(1, 3, 1);  // photon transverse energy (0.05 < dr < 0.5)
00035       _hist_pho_et_lqt       = bookHisto1D(1, 4, 1);  // photon transverse energy (q_T < 10)
00036       _hist_pho_et_hqt       = bookHisto1D(1, 5, 1);  // photon transverse energy (q_T > 50)
00037       _hist_pho_dr           = bookHisto1D(2, 1, 1);  // delta_R
00038       _hist_pho_dr_lqt       = bookHisto1D(2, 2, 1);  // delta_R (q_T < 10)
00039       _hist_pho_dr_hqt       = bookHisto1D(2, 3, 1);  // delta_R  (q_T > 50)
00040     }
00041 
00042 
00043     // Perform the per-event analysis
00044     void analyze(const Event& event) {
00045 
00046       const Particles muons = apply<IdentifiedFinalState>(event, "MUFS").particlesByPt();
00047 
00048       if (muons.size() < 2) vetoEvent;
00049       if (muons[0].pT()/GeV < 31) vetoEvent;
00050       if (muons[0].charge()*muons[1].charge() > 0) vetoEvent;
00051       const double mZ = (muons[0].momentum() + muons[1].momentum()).mass();
00052       if (!inRange(mZ, 30*GeV, 87*GeV)) vetoEvent;
00053 
00054       const Particles photons = apply<IdentifiedFinalState>(event, "PHOTFS").particlesByPt();
00055       // We want the photon with the highest pT that does not come from a decay
00056       foreach(const Particle& p, photons) {
00057         if (p.fromDecay() || !p.isStable()) continue;
00058 
00059         const double dR = std::min(deltaR(p, muons[0]), deltaR(p, muons[1]) );
00060         if (!inRange(dR, 0.05, 3.0)) continue;
00061 
00062         // Calculate the three-body (mu,mu,gamma) transverse momentum
00063         const double qT = (muons[0].mom() + muons[1].mom() + p.mom()).pT();
00064 
00065         // Fill the analysis histograms
00066         _hist_pho_et->fill(p.pT()/GeV, event.weight());
00067         _hist_pho_dr->fill(dR, event.weight());
00068 
00069         (dR <= 0.5 ? _hist_pho_et_close : _hist_pho_et_wide)->fill(p.pT()/GeV, event.weight());
00070 
00071         if (qT / GeV < 10.) {
00072           _hist_pho_et_lqt->fill(p.pT()/GeV, event.weight());
00073           _hist_pho_dr_lqt->fill(dR, event.weight());
00074         }
00075 
00076         if (qT / GeV > 50.) {
00077           _hist_pho_et_hqt->fill(p.pT()/GeV, event.weight());
00078           _hist_pho_dr_hqt->fill(dR, event.weight());
00079         }
00080 
00081         break; // Exit the loop since we found the highest pT lepton already
00082       }
00083     }
00084 
00085 
00086     /// Normalise histograms etc., after the run
00087     void finalize() {
00088       scale(_hist_pho_et,       crossSection() / sumOfWeights());
00089       scale(_hist_pho_et_wide,  crossSection() / sumOfWeights());
00090       scale(_hist_pho_et_close, crossSection() / sumOfWeights());
00091       scale(_hist_pho_et_lqt,   crossSection() / sumOfWeights());
00092       scale(_hist_pho_et_hqt,   crossSection() / sumOfWeights());
00093       scale(_hist_pho_dr,       crossSection() / sumOfWeights());
00094       scale(_hist_pho_dr_lqt,   crossSection() / sumOfWeights());
00095       scale(_hist_pho_dr_hqt,   crossSection() / sumOfWeights());
00096     }
00097 
00098 
00099   private:
00100 
00101     Histo1DPtr _hist_pho_et;
00102     Histo1DPtr _hist_pho_et_wide, _hist_pho_et_close;
00103     Histo1DPtr _hist_pho_et_lqt,  _hist_pho_et_hqt;
00104     Histo1DPtr _hist_pho_dr;
00105     Histo1DPtr _hist_pho_dr_lqt, _hist_pho_dr_hqt;
00106 
00107   };
00108 
00109 
00110   DECLARE_RIVET_PLUGIN(CMS_2015_I1346843);
00111 
00112 }