rivet is hosted by Hepforge, IPPP Durham
MC_DIPHOTON.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/IdentifiedFinalState.hh"
00005 
00006 namespace Rivet {
00007 
00008   
00009 
00010 
00011   /// @brief MC validation analysis for isolated di-photon events
00012   class MC_DIPHOTON : public Analysis {
00013   public:
00014 
00015     /// Constructor
00016     MC_DIPHOTON()
00017       : Analysis("MC_DIPHOTON")
00018     {    }
00019 
00020 
00021     /// @name Analysis methods
00022     //@{
00023 
00024     void init() {
00025       FinalState fs;
00026       addProjection(fs, "FS");
00027 
00028       IdentifiedFinalState ifs(Cuts::abseta < 2 && Cuts::pT > 20*GeV);
00029       ifs.acceptId(PID::PHOTON);
00030       addProjection(ifs, "IFS");
00031 
00032       _h_m_PP = bookHisto1D("m_PP", logspace(50, 1.0, 0.25*(sqrtS()>0.?sqrtS():14000.)));
00033       _h_pT_PP = bookHisto1D("pT_PP", logspace(50, 1.0, 0.25*(sqrtS()>0.?sqrtS():14000.)));
00034       _h_pT_P1 = bookHisto1D("pT_P1", 50, 0.0, 70.0);
00035       _h_pT_P2 = bookHisto1D("pT_P2", 50, 0.0, 70.0);
00036       _h_dphi_PP = bookHisto1D("dphi_PP", 20, 0.0, M_PI);
00037     }
00038 
00039 
00040     void analyze(const Event& event) {
00041       const double weight = event.weight();
00042 
00043       Particles photons = applyProjection<IdentifiedFinalState>(event, "IFS").particles();
00044 
00045       if (photons.size() < 2) {
00046         vetoEvent;
00047       }
00048 
00049       // Isolate photons with ET_sum in cone
00050       Particles isolated_photons;
00051       Particles fs = applyProjection<FinalState>(event, "FS").particlesByPt();
00052       foreach (const Particle& photon, photons) {
00053         FourMomentum mom_in_cone;
00054         double eta_P = photon.eta();
00055         double phi_P = photon.phi();
00056         foreach (const Particle& p, fs) {
00057           if (deltaR(eta_P, phi_P, p.eta(), p.phi()) < 0.4) {
00058             mom_in_cone += p.momentum();
00059           }
00060         }
00061         if (mom_in_cone.Et()-photon.Et() < 4.0*GeV) {
00062           isolated_photons.push_back(photon);
00063         }
00064       }
00065 
00066       if (isolated_photons.size() != 2) {
00067         vetoEvent;
00068       }
00069 
00070       _h_pT_P1->fill(isolated_photons[0].pT(), weight);
00071       _h_pT_P2->fill(isolated_photons[1].pT(), weight);
00072       FourMomentum mom_PP = isolated_photons[0].momentum() + isolated_photons[1].momentum();
00073       _h_m_PP->fill(mom_PP.mass(), weight);
00074       _h_pT_PP->fill(mom_PP.pT(), weight);
00075       _h_dphi_PP->fill(deltaPhi(isolated_photons[0].phi(),
00076                                 isolated_photons[1].phi()), weight);
00077     }
00078 
00079 
00080     void finalize() {
00081       scale(_h_m_PP, crossSection()/sumOfWeights());
00082       scale(_h_pT_PP, crossSection()/sumOfWeights());
00083       scale(_h_pT_P1, crossSection()/sumOfWeights());
00084       scale(_h_pT_P2, crossSection()/sumOfWeights());
00085       scale(_h_dphi_PP, crossSection()/sumOfWeights());
00086     }
00087 
00088     //@}
00089 
00090 
00091   private:
00092 
00093     /// @name Histograms
00094     //@{
00095     Histo1DPtr _h_m_PP;
00096     Histo1DPtr _h_pT_PP;
00097     Histo1DPtr _h_pT_P1;
00098     Histo1DPtr _h_pT_P2;
00099     Histo1DPtr _h_dphi_PP;
00100     //@}
00101 
00102 
00103   };
00104 
00105 
00106 
00107   // The hook for the plugin system
00108   DECLARE_RIVET_PLUGIN(MC_DIPHOTON);
00109 
00110 }