rivet is hosted by Hepforge, IPPP Durham
ATLAS_2013_I1216670.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/WFinder.hh"
00005 #include "Rivet/Projections/FastJets.hh"
00006 #include "Rivet/Projections/VetoedFinalState.hh"
00007 
00008 namespace Rivet {
00009 
00010   /// @brief MPI sensitive di-jet balance variables for W->ejj or W->mujj events.
00011   class ATLAS_2013_I1216670 : public Analysis {
00012   public:
00013 
00014     /// @name Constructor
00015     ATLAS_2013_I1216670()
00016       : Analysis("ATLAS_2013_I1216670")
00017     {    }
00018 
00019 
00020     /// @name Analysis methods
00021     //@{
00022 
00023     /// Book histograms, set up projections for W and jets
00024     void init() {
00025 
00026       _h_delta_jets_n = bookHisto1D(1, 1, 1);
00027       _h_delta_jets   = bookHisto1D(2, 1, 1);
00028 
00029       FinalState fs;
00030 
00031       Cut cuts = Cuts::abseta < 2.5 && Cuts::pT >= 20*GeV;
00032 
00033       WFinder w_e_finder(fs, cuts, PID::ELECTRON, 40*GeV, MAXDOUBLE, 0.0*GeV, 0.0, WFinder::CLUSTERNODECAY, 
00034                          WFinder::NOTRACK, WFinder::TRANSMASS);
00035       addProjection(w_e_finder, "W_E_FINDER");
00036 
00037       WFinder w_mu_finder(fs, cuts, PID::MUON, 40*GeV, MAXDOUBLE, 0.0*GeV, 0.0, WFinder::CLUSTERNODECAY, 
00038                           WFinder::NOTRACK, WFinder::TRANSMASS);
00039       addProjection(w_mu_finder, "W_MU_FINDER");
00040 
00041       VetoedFinalState jet_fs(fs);
00042       jet_fs.addVetoOnThisFinalState(getProjection<WFinder>("W_E_FINDER"));
00043       jet_fs.addVetoOnThisFinalState(getProjection<WFinder>("W_MU_FINDER"));
00044       FastJets jets(jet_fs, FastJets::ANTIKT, 0.4);
00045       addProjection(jets, "JETS");
00046 
00047     }
00048 
00049     /// Do the analysis
00050     void analyze(const Event &e) {
00051 
00052       double weight = e.weight();
00053 
00054       const WFinder& w_e_finder  = applyProjection<WFinder>(e, "W_E_FINDER" );
00055       const WFinder& w_mu_finder = applyProjection<WFinder>(e, "W_MU_FINDER");
00056       Particle lepton, neutrino;
00057       Jets all_jets, jets;
00058   
00059       // Find exactly 1 W->e or W->mu boson
00060       if(w_e_finder.bosons().size() == 1 && w_mu_finder.bosons().size() == 0) {
00061         MSG_DEBUG(" Event identified as W->e nu."); 
00062         if( !(w_e_finder.mT() > 40*GeV && w_e_finder.constituentNeutrino().Et() > 25.0*GeV) )  vetoEvent;
00063         lepton = w_e_finder.constituentLepton();
00064       } else if(w_mu_finder.bosons().size() == 1 && w_e_finder.bosons().size() == 0) {
00065         MSG_DEBUG(" Event identified as W->mu nu.");  
00066         if( !(w_mu_finder.mT() > 40*GeV && w_mu_finder.constituentNeutrino().Et() > 25.0*GeV) )  vetoEvent;
00067         lepton = w_mu_finder.constituentLepton();
00068       } else {
00069         MSG_DEBUG(" No W found passing cuts.");    
00070         vetoEvent;
00071       }
00072 
00073       all_jets = applyProjection<FastJets>(e, "JETS").jetsByPt(Cuts::pt>20.0*GeV && Cuts::absrap<2.8);
00074 
00075       // Remove jets DeltaR < 0.5 from W lepton
00076       for(Jets::iterator it = all_jets.begin(); it != all_jets.end(); ++it) {
00077         double distance = deltaR( lepton, (*it) );
00078         if(distance < 0.5) {
00079           MSG_DEBUG("   Veto jet DeltaR " << distance << " from W lepton"); 
00080         } else {
00081           jets.push_back(*it);
00082         }
00083       }
00084       
00085       // Exactly two jets required
00086       if( jets.size() != 2 )  vetoEvent;
00087 
00088       // Calculate analysis quantities from the two jets
00089       double delta_jets = (jets.front().momentum() + jets.back().momentum()).pT();
00090       double total_pt = jets.front().momentum().pT() + jets.back().momentum().pT();
00091       double delta_jets_n = delta_jets / total_pt;
00092       
00093       _h_delta_jets->fill(   delta_jets,   weight ); // Jet pT balance
00094       _h_delta_jets_n->fill( delta_jets_n, weight ); // Jet pT balance, normalised by scalar dijet pT
00095       
00096     }
00097 
00098     /// Finalize
00099     void finalize() {
00100 
00101       // Data is normalised to 0.03 and 3
00102       normalize(_h_delta_jets_n, 0.03);
00103       normalize(_h_delta_jets  , 3.0 );
00104 
00105     }
00106 
00107     //@}
00108 
00109   private:
00110 
00111     /// @name Histograms
00112     //@{
00113     Histo1DPtr _h_delta_jets_n;
00114     Histo1DPtr _h_delta_jets;
00115     //@}
00116 
00117   };
00118 
00119   // The hook for the plugin system
00120   DECLARE_RIVET_PLUGIN(ATLAS_2013_I1216670);
00121 
00122 }