MC_WWJETS.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include "Rivet/Analyses/MC_JetAnalysis.hh"
00003 #include "Rivet/Projections/WFinder.hh"
00004 #include "Rivet/Projections/FastJets.hh"
00005 #include "Rivet/Projections/VetoedFinalState.hh"
00006 #include "Rivet/Tools/Logging.hh"
00007 #include "Rivet/Tools/ParticleIdUtils.hh"
00008 #include "Rivet/RivetAIDA.hh"
00009 
00010 namespace Rivet {
00011 
00012   /// @brief MC validation analysis for W^+[enu]W^-[munu] + jets events
00013   class MC_WWJETS : public MC_JetAnalysis {
00014   public:
00015 
00016     /// Default constructor
00017     MC_WWJETS()
00018       : MC_JetAnalysis("MC_WWJETS", 4, "Jets")
00019     {
00020       setNeedsCrossSection(true);
00021     }
00022 
00023 
00024     /// @name Analysis methods
00025     //@{
00026 
00027     /// Book histograms
00028     void init() {
00029       WFinder wenufinder(-3.5, 3.5, 25.0*GeV, ELECTRON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
00030       addProjection(wenufinder, "WenuFinder");
00031       WFinder wmnufinder(-3.5, 3.5, 25.0*GeV, MUON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
00032       addProjection(wmnufinder, "WmnuFinder");
00033       VetoedFinalState jetinput;
00034       jetinput
00035           .addVetoOnThisFinalState(wenufinder.constituentsFinalState())
00036           .addVetoOnThisFinalState(wenufinder.clusteredPhotonsFinalState())
00037           .addVetoOnThisFinalState(wmnufinder.constituentsFinalState())
00038           .addVetoOnThisFinalState(wmnufinder.clusteredPhotonsFinalState());
00039       FastJets jetpro(jetinput, FastJets::KT, 0.7);
00040       addProjection(jetpro, "Jets");
00041 
00042       // properties of the pair momentum
00043       _h_WW_pT = bookHistogram1D("WW_pT", logBinEdges(100, 1.0, 0.5*sqrtS()));
00044       _h_WW_pT_peak = bookHistogram1D("WW_pT_peak", 25, 0.0, 25.0);
00045       _h_WW_eta = bookHistogram1D("WW_eta", 40, -7.0, 7.0);
00046       _h_WW_phi = bookHistogram1D("WW_phi", 25, 0.0, TWOPI);
00047       _h_WW_m = bookHistogram1D("WW_m", logBinEdges(100, 150.0, 180.0+0.25*sqrtS()));
00048 
00049       // correlations between the WW
00050       _h_WW_dphi = bookHistogram1D("WW_dphi", 25, 0.0, PI);  /// @todo non-linear?
00051       _h_WW_deta = bookHistogram1D("WW_deta", 25, -7.0, 7.0);
00052       _h_WW_dR = bookHistogram1D("WW_dR", 25, 0.5, 7.0);
00053       _h_WW_dpT = bookHistogram1D("WW_dpT", logBinEdges(100, 1.0, 0.5*sqrtS()));
00054       _h_WW_costheta_planes = bookHistogram1D("WW_costheta_planes", 25, -1.0, 1.0);
00055 
00056       /// @todo fuer WW: missing ET
00057 
00058       // properties of the W bosons
00059       _h_W_pT = bookHistogram1D("W_pT", logBinEdges(100, 10.0, 0.25*sqrtS()));
00060       _h_W_eta = bookHistogram1D("W_eta", 70, -7.0, 7.0);
00061 
00062       // properties of the leptons
00063       _h_Wl_pT = bookHistogram1D("Wl_pT", logBinEdges(100, 30.0, 0.1
00064                                                       *sqrtS()));
00065       _h_Wl_eta = bookHistogram1D("Wl_eta", 40, -3.5, 3.5);
00066 
00067       // correlations between the opposite charge leptons
00068       _h_WeWm_dphi = bookHistogram1D("WeWm_dphi", 25, 0.0, PI);
00069       _h_WeWm_deta = bookHistogram1D("WeWm_deta", 25, -5.0, 5.0);
00070       _h_WeWm_dR = bookHistogram1D("WeWm_dR", 25, 0.5, 5.0);
00071       _h_WeWm_m = bookHistogram1D("WeWm_m", 100, 0.0, 300.0);
00072 
00073       // correlations with jets
00074       _h_WW_jet1_deta = bookHistogram1D("WW_jet1_deta", 70, -7.0, 7.0);
00075       _h_WW_jet1_dR = bookHistogram1D("WW_jet1_dR", 25, 1.5, 7.0);
00076       _h_We_jet1_dR = bookHistogram1D("We_jet1_dR", 25, 0.0, 7.0);
00077 
00078       // global stuff
00079       _h_HT = bookHistogram1D("HT", logBinEdges(100, 100.0, 0.5*sqrtS()));
00080       _h_jets_dphi_12 = bookHistogram1D("jets_dphi_12", 25.0, 0.0, PI);
00081       _h_jets_m_12 = bookHistogram1D("jets_m_12", logBinEdges(100, 1.0, 0.25*sqrtS()));
00082 
00083       MC_JetAnalysis::init();
00084     }
00085 
00086 
00087 
00088     /// Do the analysis
00089     void analyze(const Event & e) {
00090       const double weight = e.weight();
00091 
00092       const WFinder& wenufinder = applyProjection<WFinder>(e, "WenuFinder");
00093       if (wenufinder.particles().size()!=1) {
00094         vetoEvent;
00095       }
00096 
00097       const WFinder& wmnufinder = applyProjection<WFinder>(e, "WmnuFinder");
00098       if (wmnufinder.particles().size()!=1) {
00099         vetoEvent;
00100       }
00101 
00102       FourMomentum wenu(wenufinder.particles()[0].momentum());
00103       FourMomentum wmnu(wmnufinder.particles()[0].momentum());
00104       FourMomentum ww(wenu+wmnu);
00105       // find leptons
00106       FourMomentum ep(0.0,0.0,0.0,0.0), enu(0.0,0.0,0.0,0.0);
00107       if (PID::threeCharge(wenufinder.constituentsFinalState().particles()[0])>0.0) {
00108         ep=wenufinder.constituentsFinalState().particles()[0].momentum();
00109         enu=wenufinder.constituentsFinalState().particles()[1].momentum();
00110       }
00111       else {
00112         ep=wenufinder.constituentsFinalState().particles()[1].momentum();
00113         enu=wenufinder.constituentsFinalState().particles()[0].momentum();
00114       }
00115       FourMomentum mnu(0.0,0.0,0.0,0.0), mm(0.0,0.0,0.0,0.0);
00116       if (PID::threeCharge(wmnufinder.constituentsFinalState().particles()[0])==0.0) {
00117         mnu=wmnufinder.constituentsFinalState().particles()[0].momentum();
00118         mm=wmnufinder.constituentsFinalState().particles()[1].momentum();
00119       }
00120       else {
00121         mnu=wmnufinder.constituentsFinalState().particles()[1].momentum();
00122         mm=wmnufinder.constituentsFinalState().particles()[0].momentum();
00123       }
00124 
00125       _h_WW_pT->fill(ww.pT(),weight);
00126       _h_WW_pT_peak->fill(ww.pT(),weight);
00127       _h_WW_eta->fill(ww.eta(),weight);
00128       _h_WW_phi->fill(ww.azimuthalAngle(),weight);
00129       double mww2=ww.mass2();
00130       if (mww2>0.0) _h_WW_m->fill(sqrt(mww2), weight);
00131 
00132       _h_WW_dphi->fill(mapAngle0ToPi(wenu.phi()-wmnu.phi()), weight);
00133       _h_WW_deta->fill(wenu.eta()-wmnu.eta(), weight);
00134       _h_WW_dR->fill(deltaR(wenu,wmnu), weight);
00135       _h_WW_dpT->fill(fabs(wenu.pT()-wmnu.pT()), weight);
00136 
00137       Vector3 crossWenu = ep.vector3().cross(enu.vector3());
00138       Vector3 crossWmnu = mm.vector3().cross(mnu.vector3());
00139       double costheta = crossWenu.dot(crossWmnu)/crossWenu.mod()/crossWmnu.mod();
00140       _h_WW_costheta_planes->fill(costheta, weight);
00141 
00142       _h_W_pT->fill(wenu.pT(),weight);
00143       _h_W_pT->fill(wmnu.pT(),weight);
00144       _h_W_eta->fill(wenu.eta(),weight);
00145       _h_W_eta->fill(wmnu.eta(),weight);
00146 
00147       _h_Wl_pT->fill(ep.pT(), weight);
00148       _h_Wl_pT->fill(mm.pT(), weight);
00149       _h_Wl_eta->fill(ep.eta(), weight);
00150       _h_Wl_eta->fill(mm.eta(), weight);
00151 
00152       _h_WeWm_dphi->fill(mapAngle0ToPi(ep.phi()-mm.phi()), weight);
00153       _h_WeWm_deta->fill(ep.eta()-mm.eta(), weight);
00154       _h_WeWm_dR->fill(deltaR(ep,mm), weight);
00155       double m2=FourMomentum(ep+mm).mass2();
00156       if (m2 < 0) m2 = 0.0;
00157       _h_WeWm_m->fill(sqrt(m2), weight);
00158 
00159       const FastJets& jetpro = applyProjection<FastJets>(e, "Jets");
00160       const Jets& jets = jetpro.jetsByPt(20.0*GeV);
00161       if (jets.size() > 0) {
00162         _h_WW_jet1_deta->fill(ww.eta()-jets[0].momentum().eta(), weight);
00163         _h_WW_jet1_dR->fill(deltaR(ww, jets[0].momentum()), weight);
00164         _h_We_jet1_dR->fill(deltaR(ep, jets[0].momentum()), weight);
00165       }
00166 
00167       double HT=ep.pT()+mm.pT()+FourMomentum(enu+mnu).pT();
00168       foreach (const Jet& jet, jets) {
00169         HT+=jet.momentum().pT();
00170       }
00171       foreach (const Particle& p, wenufinder.clusteredPhotonsFinalState().particles()) {
00172         HT+=p.momentum().pT();
00173       }
00174       foreach (const Particle& p, wmnufinder.clusteredPhotonsFinalState().particles()) {
00175         HT+=p.momentum().pT();
00176       }
00177       if (HT>0.0) _h_HT->fill(HT, weight);
00178 
00179       if (jets.size()>1) {
00180         FourMomentum jet1(jets[0].momentum());
00181         FourMomentum jet2(jets[1].momentum());
00182         _h_jets_dphi_12->fill(mapAngle0ToPi(jet1.phi()-jet2.phi()), weight);
00183         _h_jets_m_12->fill(FourMomentum(jet1+jet2).mass(), weight);
00184       }
00185 
00186       MC_JetAnalysis::analyze(e);
00187     }
00188 
00189 
00190     /// Finalize
00191     void finalize() {
00192       double norm=crossSection()/sumOfWeights();
00193       scale(_h_WW_pT, norm);
00194       scale(_h_WW_pT_peak, norm);
00195       scale(_h_WW_eta, norm);
00196       scale(_h_WW_phi, norm);
00197       scale(_h_WW_m, norm);
00198       scale(_h_WW_dphi, norm);
00199       scale(_h_WW_deta, norm);
00200       scale(_h_WW_dR, norm);
00201       scale(_h_WW_dpT, norm);
00202       scale(_h_WW_costheta_planes, norm);
00203       scale(_h_W_pT, norm);
00204       scale(_h_W_eta, norm);
00205       scale(_h_Wl_pT, norm);
00206       scale(_h_Wl_eta, norm);
00207       scale(_h_WeWm_dphi, norm);
00208       scale(_h_WeWm_deta, norm);
00209       scale(_h_WeWm_dR, norm);
00210       scale(_h_WeWm_m, norm);
00211       scale(_h_WW_jet1_deta, norm);
00212       scale(_h_WW_jet1_dR, norm);
00213       scale(_h_We_jet1_dR, norm);
00214       scale(_h_jets_dphi_12, norm);
00215       scale(_h_jets_m_12, norm);
00216       scale(_h_HT, norm);
00217 
00218       MC_JetAnalysis::finalize();
00219     }
00220 
00221     //@}
00222 
00223 
00224   private:
00225 
00226     /// @name Histograms
00227     //@{
00228     AIDA::IHistogram1D * _h_WW_pT;
00229     AIDA::IHistogram1D * _h_WW_pT_peak;
00230     AIDA::IHistogram1D * _h_WW_eta;
00231     AIDA::IHistogram1D * _h_WW_phi;
00232     AIDA::IHistogram1D * _h_WW_m;
00233     AIDA::IHistogram1D * _h_WW_dphi;
00234     AIDA::IHistogram1D * _h_WW_deta;
00235     AIDA::IHistogram1D * _h_WW_dR;
00236     AIDA::IHistogram1D * _h_WW_dpT;
00237     AIDA::IHistogram1D * _h_WW_costheta_planes;
00238     AIDA::IHistogram1D * _h_W_pT;
00239     AIDA::IHistogram1D * _h_W_eta;
00240     AIDA::IHistogram1D * _h_Wl_pT;
00241     AIDA::IHistogram1D * _h_Wl_eta;
00242     AIDA::IHistogram1D * _h_WeWm_dphi;
00243     AIDA::IHistogram1D * _h_WeWm_deta;
00244     AIDA::IHistogram1D * _h_WeWm_dR;
00245     AIDA::IHistogram1D * _h_WeWm_m;
00246     AIDA::IHistogram1D * _h_WW_jet1_deta;
00247     AIDA::IHistogram1D * _h_WW_jet1_dR;
00248     AIDA::IHistogram1D * _h_We_jet1_dR;
00249     AIDA::IHistogram1D * _h_jets_dphi_12;
00250     AIDA::IHistogram1D * _h_jets_m_12;
00251     AIDA::IHistogram1D * _h_HT;
00252     //@}
00253 
00254   };
00255 
00256 
00257 
00258   // This global object acts as a hook for the plugin system
00259   AnalysisBuilder<MC_WWJETS> plugin_MC_WWJETS;
00260 
00261 }