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