rivet is hosted by Hepforge, IPPP Durham
ATLAS_2011_I926145.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 #include "Rivet/Projections/WFinder.hh"
00006 #include "Rivet/Projections/ZFinder.hh"
00007 
00008 namespace Rivet {
00009 
00010   using namespace Cuts;
00011 
00012   /// @brief Measurement of electron and muon differential cross section from heavy flavour production
00013   ///
00014   /// lepton cross sections differential in pT
00015   ///
00016   /// @author Paul Bell, Holger Schulz
00017 
00018 
00019   class ATLAS_2011_I926145 : public Analysis {
00020   public:
00021 
00022     /// Constructor
00023     ATLAS_2011_I926145()
00024       : Analysis("ATLAS_2011_I926145")
00025     {
00026     }
00027 
00028 
00029   public:
00030 
00031     /// Book histograms and initialise projections before the run
00032     void init() {
00033 
00034       ///projection for electrons
00035       Cut cuts = (   etaIn(-2.00, -1.52)
00036            | etaIn(-1.37,  1.37)
00037            | etaIn( 1.52,  2.00) ) & (pT >= 7.0*GeV);
00038       IdentifiedFinalState elecs(cuts);
00039       elecs.acceptId(PID::ELECTRON);
00040       elecs.acceptId(PID::POSITRON);
00041       addProjection(elecs, "elecs");
00042 
00043       //projection for muons -- same phase space as above??? Not sure if the crack region has
00044       //to be removed for the muons as well
00045       std::vector<std::pair<double, double> > eta_m;
00046       //eta_m.push_back(make_pair(-2.00,-1.52));
00047       //eta_m.push_back(make_pair(-1.37,1.37));
00048       //eta_m.push_back(make_pair(1.52,2.00));
00049       //IdentifiedFinalState muons(eta_m, 7.0*GeV);
00050       IdentifiedFinalState muons(etaIn(-2.0,2.0) & (pT >= 7.0*GeV));
00051       muons.acceptId(PID::MUON);
00052       muons.acceptId(PID::ANTIMUON);
00053       addProjection(muons, "muons");
00054 
00055       //projection for muons full range
00056       IdentifiedFinalState muons_full(etaIn(-2.5,2.5) & (pT >= 4.0*GeV));
00057       muons_full.acceptId(PID::MUON);
00058       muons_full.acceptId(PID::ANTIMUON);
00059       addProjection(muons_full, "muons_full");
00060       Cut cut20 = etaIn(-2.0,2.0);
00061       Cut cut25 = etaIn(-2.5,2.5);
00062       const FinalState fs20(cut20);
00063       const FinalState fs25(cut25);
00064 
00065       /// @todo Bare Zs ...
00066       ZFinder zfinder_e(fs20, cut20, PID::ELECTRON, 66.0*GeV, 116.0*GeV, 0.1, ZFinder::NOCLUSTER);
00067       addProjection(zfinder_e, "ZFinder_e");
00068       ZFinder zfinder_mu(fs20, cut20, PID::MUON, 66.0*GeV, 116.0*GeV, 0.1, ZFinder::NOCLUSTER);
00069       addProjection(zfinder_mu, "ZFinder_mu");
00070       ZFinder zfinder_mufull(fs25, cut25, PID::MUON, 66.0*GeV, 116.0*GeV, 0.1, ZFinder::NOCLUSTER);
00071       addProjection(zfinder_mufull, "ZFinder_mufull");
00072 
00073       /// @todo ... but dressed Ws?
00074       WFinder wfinder_e(fs20, cut20, PID::ELECTRON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
00075       addProjection(wfinder_e, "WFinder_e");
00076       WFinder wfinder_mu(fs20, cut20, PID::MUON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
00077       addProjection(wfinder_mu, "WFinder_mu");
00078       WFinder wfinder_mufull(fs25, cut25, PID::MUON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
00079       addProjection(wfinder_mufull, "WFinder_mufull");
00080 
00081       // Book histograms
00082       _histPt_elecs      = bookHisto1D(1 ,1 ,1);
00083       _histPt_muons      = bookHisto1D(2 ,1 ,1);
00084       _histPt_muons_full = bookHisto1D(3 ,1 ,1);
00085     }
00086 
00087     /// Perform the per-event analysis
00088     void analyze(const Event& event) {
00089       const double weight = event.weight();
00090 
00091       const FinalState& elecs      = applyProjection<FinalState>(event, "elecs");
00092       const FinalState& muons      = applyProjection<FinalState>(event, "muons");
00093       const FinalState& muons_full = applyProjection<FinalState>(event, "muons_full");
00094 
00095       // Veto event if no lepton is present
00096       if (elecs.size() == 0 && muons.size() == 0 && muons_full.size() == 0) {
00097         vetoEvent;
00098       }
00099 
00100       // Check for W and or Z bosons in event
00101       //
00102       // Z veto
00103       const ZFinder& zfinder_e      = applyProjection<ZFinder>(event, "ZFinder_e");
00104       const ZFinder& zfinder_mu     = applyProjection<ZFinder>(event, "ZFinder_mu");
00105       const ZFinder& zfinder_mufull = applyProjection<ZFinder>(event, "ZFinder_mufull");
00106 
00107       if (zfinder_e.bosons().size() > 0 || zfinder_mu.bosons().size() > 0 || zfinder_mufull.bosons().size() > 0) {
00108           MSG_DEBUG("Num elec Z-bosons found: " << zfinder_e.bosons().size());
00109           MSG_DEBUG("Num muon Z-bosons found: " << zfinder_mu.bosons().size());
00110           MSG_DEBUG("Num muon Z-bosons found (|eta|<2.5): " << zfinder_mufull.bosons().size());
00111           vetoEvent;
00112       }
00113 
00114       // W veto
00115       const WFinder& wfinder_e      = applyProjection<WFinder>(event, "WFinder_e");
00116       const WFinder& wfinder_mu     = applyProjection<WFinder>(event, "WFinder_mu");
00117       const WFinder& wfinder_mufull = applyProjection<WFinder>(event, "WFinder_mufull");
00118 
00119       if (wfinder_e.bosons().size() > 0 || wfinder_mu.bosons().size() > 0 || wfinder_mufull.bosons().size() > 0) {
00120           MSG_DEBUG("Num elec W-bosons found: " << wfinder_e.bosons().size());
00121           MSG_DEBUG("Num muon W-bosons found: " << wfinder_mu.bosons().size());
00122           MSG_DEBUG("Num muon W-bosons found (|eta|<2.5): " << wfinder_mufull.bosons().size());
00123           vetoEvent;
00124       }
00125 
00126 
00127       // Electron histogram
00128       if (elecs.size() > 0) {
00129         foreach (const Particle& ele, elecs.particles()) {
00130           if (ele.pT()*GeV < 26.0) {
00131             _histPt_elecs->fill(ele.pT()*GeV, weight);
00132           }
00133         }
00134       }
00135 
00136       // Muon histogram
00137       if (muons.size() > 0) {
00138         foreach (const Particle& muo, muons.particles()) {
00139           if (muo.pT()*GeV < 26.0) {
00140             _histPt_muons->fill(muo.pT()*GeV, weight);
00141           }
00142         }
00143       }
00144 
00145       // Muon full histogram
00146       if (muons_full.size() > 0) {
00147         foreach (const Particle& muo, muons_full.particles()) {
00148           if (muo.pT()*GeV < 100.0) {
00149             _histPt_muons_full->fill(muo.pT()*GeV, weight);
00150           }
00151         }
00152       }
00153     }
00154 
00155     /// Normalise histograms etc., after the run
00156     void finalize() {
00157 
00158       // Data cross-section is given in nb! x-sections in rivet are in pb!
00159       scale(_histPt_elecs,      crossSection()/nanobarn/sumOfWeights());
00160       scale(_histPt_muons,      crossSection()/nanobarn/sumOfWeights());
00161       scale(_histPt_muons_full, crossSection()/nanobarn/sumOfWeights());
00162     }
00163 
00164 
00165 
00166   private:
00167 
00168     /// @name Histograms
00169     Histo1DPtr _histPt_elecs;
00170     Histo1DPtr _histPt_muons;
00171     Histo1DPtr _histPt_muons_full;
00172   };
00173 
00174 
00175   // The hook for the plugin system
00176   DECLARE_RIVET_PLUGIN(ATLAS_2011_I926145);
00177 
00178 }