rivet is hosted by Hepforge, IPPP Durham
MC_ZZINC.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analysis.hh"
00003 #include "Rivet/Projections/ZFinder.hh"
00004 #include "Rivet/Projections/VetoedFinalState.hh"
00005 
00006 namespace Rivet {
00007 
00008 
00009   /// @brief MC validation analysis for Z[ee]Z[mumu] events
00010   class MC_ZZINC : public Analysis {
00011   public:
00012 
00013     /// Default constructor
00014     MC_ZZINC()
00015       : Analysis("MC_ZZINC")
00016     {    }
00017 
00018 
00019     /// @name Analysis methods
00020     //@{
00021 
00022     /// Book histograms
00023     void init() {
00024       Cut cut = Cuts::abseta < 3.5 && Cuts::pT > 25*GeV;
00025       ZFinder zeefinder(FinalState(), cut, PID::ELECTRON, 65*GeV, 115*GeV,
00026                         0.2, ZFinder::CLUSTERNODECAY, ZFinder::TRACK);
00027       addProjection(zeefinder, "ZeeFinder");
00028 
00029       VetoedFinalState zmminput;
00030       zmminput.addVetoOnThisFinalState(zeefinder);
00031       ZFinder zmmfinder(zmminput, cut, PID::MUON, 65*GeV, 115*GeV,
00032                         0.2, ZFinder::CLUSTERNODECAY, ZFinder::TRACK);
00033       addProjection(zmmfinder, "ZmmFinder");
00034 
00035       // Properties of the pair momentum
00036       double sqrts = sqrtS()>0. ? sqrtS() : 14000.;
00037       _h_ZZ_pT = bookHisto1D("ZZ_pT", logspace(100, 1.0, 0.5*sqrts/GeV));
00038       _h_ZZ_pT_peak = bookHisto1D("ZZ_pT_peak", 25, 0.0, 25.0);
00039       _h_ZZ_eta = bookHisto1D("ZZ_eta", 40, -7.0, 7.0);
00040       _h_ZZ_phi = bookHisto1D("ZZ_phi", 25, 0.0, TWOPI);
00041       _h_ZZ_m = bookHisto1D("ZZ_m", logspace(100, 150.0, 180.0 + 0.25*sqrts/GeV));
00042 
00043       // Correlations between the ZZ
00044       _h_ZZ_dphi = bookHisto1D("ZZ_dphi", 25, 0.0, PI);  /// @todo non-linear?
00045       _h_ZZ_deta = bookHisto1D("ZZ_deta", 25, -7.0, 7.0);
00046       _h_ZZ_dR = bookHisto1D("ZZ_dR", 25, 0.5, 7.0);
00047       _h_ZZ_dpT = bookHisto1D("ZZ_dpT", logspace(100, 1.0, 0.5*sqrts/GeV));
00048       _h_ZZ_costheta_planes = bookHisto1D("ZZ_costheta_planes", 25, -1.0, 1.0);
00049 
00050       // Properties of the Z bosons
00051       _h_Z_pT = bookHisto1D("Z_pT", logspace(100, 10.0, 0.25*sqrts/GeV));
00052       _h_Z_eta = bookHisto1D("Z_eta", 70, -7.0, 7.0);
00053 
00054       // Properties of the leptons
00055       _h_Zl_pT = bookHisto1D("Zl_pT", logspace(100, 30.0, 0.1*sqrts/GeV));
00056       _h_Zl_eta = bookHisto1D("Zl_eta", 40, -3.5, 3.5);
00057 
00058       // Correlations between the opposite charge leptons
00059       _h_ZeZm_dphi = bookHisto1D("ZeZm_dphi", 25, 0.0, PI);
00060       _h_ZeZm_deta = bookHisto1D("ZeZm_deta", 25, -5.0, 5.0);
00061       _h_ZeZm_dR = bookHisto1D("ZeZm_dR", 25, 0.5, 5.0);
00062       _h_ZeZm_m = bookHisto1D("ZeZm_m", 100, 0.0, 300.0);
00063 
00064     }
00065 
00066 
00067 
00068     /// Do the analysis
00069     void analyze(const Event& e) {
00070       const ZFinder& zeefinder = applyProjection<ZFinder>(e, "ZeeFinder");
00071       if (zeefinder.bosons().size() != 1) vetoEvent;
00072       const ZFinder& zmmfinder = applyProjection<ZFinder>(e, "ZmmFinder");
00073       if (zmmfinder.bosons().size() != 1) vetoEvent;
00074 
00075       // Z momenta
00076       const FourMomentum& zee = zeefinder.bosons()[0].momentum();
00077       const FourMomentum& zmm = zmmfinder.bosons()[0].momentum();
00078       const FourMomentum zz = zee + zmm;
00079       // Lepton momenta
00080       const FourMomentum& ep = zeefinder.constituents()[0].momentum();
00081       const FourMomentum& em = zeefinder.constituents()[1].momentum();
00082       const FourMomentum& mp = zmmfinder.constituents()[0].momentum();
00083       const FourMomentum& mm = zmmfinder.constituents()[1].momentum();
00084 
00085       const double weight = e.weight();
00086       _h_ZZ_pT->fill(zz.pT()/GeV, weight);
00087       _h_ZZ_pT_peak->fill(zz.pT()/GeV, weight);
00088       _h_ZZ_eta->fill(zz.eta(), weight);
00089       _h_ZZ_phi->fill(zz.phi(), weight);
00090       if (zz.mass2() > 0.0) ///< @todo Protection still needed?
00091         _h_ZZ_m->fill(zz.mass()/GeV, weight);
00092 
00093       _h_ZZ_dphi->fill(deltaPhi(zee, zmm), weight);
00094       _h_ZZ_deta->fill(zee.eta()-zmm.eta(), weight);
00095       _h_ZZ_dR->fill(deltaR(zee,zmm), weight);
00096       _h_ZZ_dpT->fill(fabs(zee.pT()-zmm.pT()), weight);
00097 
00098       const Vector3 crossZee = ep.p3().cross(em.p3());
00099       const Vector3 crossZmm = mp.p3().cross(mm.p3());
00100       const double costheta = crossZee.dot(crossZmm)/crossZee.mod()/crossZmm.mod();
00101       _h_ZZ_costheta_planes->fill(costheta, weight);
00102 
00103       _h_Z_pT->fill(zee.pT()/GeV, weight);
00104       _h_Z_pT->fill(zmm.pT()/GeV, weight);
00105       _h_Z_eta->fill(zee.eta(), weight);
00106       _h_Z_eta->fill(zmm.eta(), weight);
00107 
00108       _h_Zl_pT->fill(ep.pT()/GeV, weight);
00109       _h_Zl_pT->fill(em.pT()/GeV, weight);
00110       _h_Zl_pT->fill(mp.pT()/GeV, weight);
00111       _h_Zl_pT->fill(mm.pT()/GeV, weight);
00112       _h_Zl_eta->fill(ep.eta(), weight);
00113       _h_Zl_eta->fill(em.eta(), weight);
00114       _h_Zl_eta->fill(mp.eta(), weight);
00115       _h_Zl_eta->fill(mm.eta(), weight);
00116 
00117       _h_ZeZm_dphi->fill(deltaPhi(ep, mm), weight);
00118       _h_ZeZm_deta->fill(ep.eta()-mm.eta(), weight);
00119       _h_ZeZm_dR->fill(deltaR(ep, mm), weight);
00120       const FourMomentum epmm = ep + mm;
00121       const double m_epmm = (epmm.mass2() > 0) ? epmm.mass() : 0; ///< @todo Protection still needed?
00122       _h_ZeZm_m->fill(m_epmm/GeV, weight);
00123     }
00124 
00125 
00126     /// Finalize
00127     void finalize() {
00128       const double s = crossSection()/picobarn/sumOfWeights();
00129       scale(_h_ZZ_pT, s);
00130       scale(_h_ZZ_pT_peak, s);
00131       scale(_h_ZZ_eta, s);
00132       scale(_h_ZZ_phi, s);
00133       scale(_h_ZZ_m, s);
00134       scale(_h_ZZ_dphi, s);
00135       scale(_h_ZZ_deta, s);
00136       scale(_h_ZZ_dR, s);
00137       scale(_h_ZZ_dpT, s);
00138       scale(_h_ZZ_costheta_planes, s);
00139       scale(_h_Z_pT, s);
00140       scale(_h_Z_eta, s);
00141       scale(_h_Zl_pT, s);
00142       scale(_h_Zl_eta, s);
00143       scale(_h_ZeZm_dphi, s);
00144       scale(_h_ZeZm_deta, s);
00145       scale(_h_ZeZm_dR, s);
00146       scale(_h_ZeZm_m, s);
00147     }
00148 
00149     //@}
00150 
00151 
00152   private:
00153 
00154     /// @name Histograms
00155     //@{
00156     Histo1DPtr _h_ZZ_pT;
00157     Histo1DPtr _h_ZZ_pT_peak;
00158     Histo1DPtr _h_ZZ_eta;
00159     Histo1DPtr _h_ZZ_phi;
00160     Histo1DPtr _h_ZZ_m;
00161     Histo1DPtr _h_ZZ_dphi;
00162     Histo1DPtr _h_ZZ_deta;
00163     Histo1DPtr _h_ZZ_dR;
00164     Histo1DPtr _h_ZZ_dpT;
00165     Histo1DPtr _h_ZZ_costheta_planes;
00166     Histo1DPtr _h_Z_pT;
00167     Histo1DPtr _h_Z_eta;
00168     Histo1DPtr _h_Zl_pT;
00169     Histo1DPtr _h_Zl_eta;
00170     Histo1DPtr _h_ZeZm_dphi;
00171     Histo1DPtr _h_ZeZm_deta;
00172     Histo1DPtr _h_ZeZm_dR;
00173     Histo1DPtr _h_ZeZm_m;
00174     //@}
00175 
00176   };
00177 
00178 
00179 
00180   // The hook for the plugin system
00181   DECLARE_RIVET_PLUGIN(MC_ZZINC);
00182 
00183 }