rivet is hosted by Hepforge, IPPP Durham
MC_PHOTONKTSPLITTINGS.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analyses/MC_JetSplittings.hh"
00003 #include "Rivet/Projections/LeadingParticlesFinalState.hh"
00004 #include "Rivet/Projections/VetoedFinalState.hh"
00005 #include "Rivet/Projections/FastJets.hh"
00006 
00007 namespace Rivet {
00008 
00009   
00010 
00011 
00012   /// @brief MC validation analysis for photon + jets events
00013   class MC_PHOTONKTSPLITTINGS : public MC_JetSplittings {
00014   public:
00015 
00016     /// Default constructor
00017     MC_PHOTONKTSPLITTINGS()
00018       : MC_JetSplittings("MC_PHOTONKTSPLITTINGS", 4, "Jets")
00019     {    }
00020 
00021 
00022     /// @name Analysis methods
00023     //@{
00024 
00025     /// Book histograms
00026     void init() {
00027       // General FS
00028       FinalState fs(-5.0, 5.0);
00029       addProjection(fs, "FS");
00030 
00031       // Get leading photon
00032       LeadingParticlesFinalState photonfs(FinalState(-1.0, 1.0, 30.0*GeV));
00033       photonfs.addParticleId(PID::PHOTON);
00034       addProjection(photonfs, "LeadingPhoton");
00035 
00036       // FS for jets excludes the leading photon
00037       VetoedFinalState vfs(fs);
00038       vfs.addVetoOnThisFinalState(photonfs);
00039       addProjection(vfs, "JetFS");
00040       FastJets jetpro(vfs, FastJets::KT, 0.6);
00041       addProjection(jetpro, "Jets");
00042 
00043       MC_JetSplittings::init();
00044     }
00045 
00046 
00047     /// Do the analysis
00048     void analyze(const Event& e) {
00049       // Get the photon
00050       const Particles photons = applyProjection<FinalState>(e, "LeadingPhoton").particles();
00051       if (photons.size() != 1) {
00052         vetoEvent;
00053       }
00054       const FourMomentum photon = photons.front().momentum();
00055 
00056       // Get all charged particles
00057       const FinalState& fs = applyProjection<FinalState>(e, "JetFS");
00058       if (fs.empty()) {
00059         vetoEvent;
00060       }
00061 
00062       // Isolate photon by ensuring that a 0.4 cone around it contains less than 7% of the photon's energy
00063       const double egamma = photon.E();
00064       double econe = 0.0;
00065       foreach (const Particle& p, fs.particles()) {
00066         if (deltaR(photon, p.momentum()) < 0.4) {
00067           econe += p.E();
00068           // Veto as soon as E_cone gets larger
00069           if (econe/egamma > 0.07) {
00070             vetoEvent;
00071           }
00072         }
00073       }
00074 
00075       MC_JetSplittings::analyze(e);
00076     }
00077 
00078 
00079     // Finalize
00080     void finalize() {
00081       MC_JetSplittings::finalize();
00082     }
00083 
00084     //@}
00085 
00086   };
00087 
00088 
00089 
00090   // The hook for the plugin system
00091   DECLARE_RIVET_PLUGIN(MC_PHOTONKTSPLITTINGS);
00092 
00093 }