Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7878998
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
100 KB
Subscribers
None
View Options
diff --git a/include/Rivet/Projections/WFinder.hh b/include/Rivet/Projections/WFinder.hh
--- a/include/Rivet/Projections/WFinder.hh
+++ b/include/Rivet/Projections/WFinder.hh
@@ -1,188 +1,138 @@
// -*- C++ -*-
#ifndef RIVET_WFinder_HH
#define RIVET_WFinder_HH
#include "Rivet/Tools/Logging.hh"
#include "Rivet/Rivet.hh"
#include "Rivet/Particle.hh"
#include "Rivet/Event.hh"
#include "Rivet/Projection.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/LeptonClusters.hh"
namespace Rivet {
/// @brief Convenience finder of leptonically decaying Ws
///
/// Chain together different projections as convenience for finding W's
/// from two leptons in the final state, including photon clustering.
class WFinder : public FinalState {
public:
/// @name Constructors
//@{
/// Constructor taking single eta/pT bounds
/// @param inputfs Input final state
/// @param etaMin,etaMax,pTmin charged lepton cuts
/// @param pid type of the charged lepton
/// @param minmass,maxmass (transverse) mass window
/// @param missingET minimal amount of missing ET (neutrinos) required
/// @param dRmax maximum dR of photons around charged lepton to take into account
/// for W reconstruction (only relevant if one of the following are true)
/// @param clusterPhotons whether such photons are supposed to be
/// clustered to the lepton object and thus W mom
/// @param trackPhotons whether such photons should be added to _theParticles
/// (cf. _trackPhotons)
/// @param useTransverseMass whether mass window should be applied using mT
WFinder(const FinalState& inputfs,
double etaMin, double etaMax,
double pTmin,
PdgId pid,
double minmass, double maxmass,
double missingET,
double dRmax, bool clusterPhotons=true, bool trackPhotons=false,
double masstarget=80.4,
bool useTransverseMass=false);
WFinder(const FinalState& inputfs,
Cut cuts,
PdgId pid,
double minmass, double maxmass,
double missingET,
double dRmax, bool clusterPhotons=true, bool trackPhotons=false,
double masstarget=80.4,
bool useTransverseMass=false);
-
- /// Constructor taking multiple eta/pT bounds
- /// @param inputfs Input final state
- /// @param etaRanges,pTmin charged lepton cuts
- /// @param pid type of the charged lepton
- /// @param minmass,maxmass (transverse) mass window
- /// @param missingET minimal amount of missing ET (neutrinos) required
- /// @param dRmax maximum dR of photons around charged lepton to take into account
- /// for W reconstruction (only relevant if one of the following are true)
- /// @param clusterPhotons whether such photons are supposed to be
- /// clustered to the lepton object and thus W mom
- /// @param trackPhotons whether such photons should be added to _theParticles
- /// (cf. _trackPhotons)
- /// @param useTransverseMass whether mass window should be applied using mT
- // WFinder(const FinalState& inputfs,
- // const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- // PdgId pid,
- // double minmass, const double maxmass,
- // double missingET,
- // double dRmax, bool clusterPhotons=true, bool trackPhotons=false,
- // double masstarget=80.4,
- // bool useTransverseMass=false);
-
-
- // /// @deprecated Constructors without inputfs -- only for backwards compatibility
- // WFinder(double, double, double, PdgId, double, double, double, double,
- // bool clusterPhotons=true, bool trackPhotons=false,
- // double masstarget=80.4, bool useTransverseMass=false);
- // /// @deprecated Constructors without inputfs -- only for backwards compatibility
- // WFinder(const std::vector<std::pair<double, double> >&, double,
- // PdgId, double, double, double, double,
- // bool clusterPhotons=true, bool trackPhotons=false,
- // double masstarget=80.4, bool useTransverseMass=false);
-
/// Clone on the heap.
virtual const Projection* clone() const {
return new WFinder(*this);
}
//@}
/// Access to the found bosons (currently either 0 or 1)
const Particles& bosons() const { return _bosons; }
/// Access to the W constituent clustered leptons (currently either of
/// size 0 if no boson was found or 1 if one boson was found)
const vector<Particle>& constituentLeptons() const { return _constituentLeptons; }
/// Access to the W constituent neutrinos (currently either of size 0 if no
/// boson was found or 1 if one boson was found)
const vector<Particle>& constituentNeutrinos() const { return _constituentNeutrinos; }
/// Access to the remaining particles, after the W and clustered photons
/// have been removed from the full final state
/// (e.g. for running a jet finder on it)
const FinalState& remainingFinalState() const;
protected:
/// Apply the projection on the supplied event.
void project(const Event& e);
/// Compare projections.
int compare(const Projection& p) const;
public:
/// Clear the projection
void clear() {
_theParticles.clear();
_bosons.clear();
_constituentLeptons.clear();
_constituentNeutrinos.clear();
}
-
- private:
-
- /// Common implementation of constructor operation, taking FS params.
- void _init(const FinalState& inputfs, Cut fsCut,
- // const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- PdgId pid,
- double minmass, double maxmass,
- double missingET,
- double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget,
- bool useTransverseMass);
-
-
private:
/// Transverse mass cuts
double _minmass, _maxmass, _masstarget;
bool _useTransverseMass;
/// Missing ET cut
double _etMiss;
/// Switch for tracking of photons (whether to add them to _theParticles)
/// This is relevant when the ZFinder::_theParticles are to be excluded
/// from e.g. the input to a jet finder, to specify whether the clustered
/// photons are to be excluded as well.
/// (Yes, some experiments make a difference between clusterPhotons and
/// trackPhotons!)
bool _trackPhotons;
/// Lepton flavour
PdgId _pid;
/// Neutrino flavour
PdgId _nu_pid;
/// list of found bosons (currently either 0 or 1)
Particles _bosons;
/// Constituent leptons (currently either 0 or 1)
Particles _constituentLeptons;
/// Constituent neutrinos (currently either 0 or 1)
Particles _constituentNeutrinos;
};
}
#endif
diff --git a/include/Rivet/Projections/ZFinder.hh b/include/Rivet/Projections/ZFinder.hh
--- a/include/Rivet/Projections/ZFinder.hh
+++ b/include/Rivet/Projections/ZFinder.hh
@@ -1,159 +1,113 @@
// -*- C++ -*-
#ifndef RIVET_ZFinder_HH
#define RIVET_ZFinder_HH
#include "Rivet/Tools/Logging.hh"
#include "Rivet/Rivet.hh"
#include "Rivet/Particle.hh"
#include "Rivet/Event.hh"
#include "Rivet/Projection.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/LeptonClusters.hh"
namespace Rivet {
/// @brief Convenience finder of leptonically decaying Zs
///
/// Chain together different projections as convenience for finding Z's
/// from two leptons in the final state, including photon clustering.
class ZFinder : public FinalState {
public:
/// @name Constructors
//@{
/// Constructor taking single eta/pT bounds
/// @param inputfs Input final state
/// @param etaMin,etaMax,pTmin lepton cuts
/// @param pid type of the leptons
/// @param minmass,maxmass mass window
/// @param dRmax maximum dR of photons around leptons to take into account
/// for Z reconstruction (only relevant if one of the following are true)
/// @param clusterPhotons whether such photons are supposed to be
/// clustered to the lepton objects and thus Z mom
/// @param trackPhotons whether such photons should be added to _theParticles
/// (cf. _trackPhotons)
ZFinder(const FinalState& inputfs,
Cut cuts,
PdgId pid,
double minmass, double maxmass,
double dRmax, bool clusterPhotons, bool trackPhotons,
double masstarget=91.2*GeV);
- ZFinder(const FinalState& inputfs,
- double etaMin, double etaMax,
- double pTmin,
- PdgId pid,
- double minmass, double maxmass,
- double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget=91.2*GeV);
-
-
- /// Constructor taking multiple eta/pT bounds
- /// @param inputfs Input final state
- /// @param etaRanges,pTmin lepton cuts
- /// @param pid type of the leptons
- /// @param minmass,maxmass mass window
- /// @param dRmax maximum dR of photons around leptons to take into account
- /// for Z reconstruction (only relevant if one of the following are true)
- /// @param clusterPhotons whether such photons are supposed to be
- /// clustered to the lepton objects and thus Z mom
- /// @param trackPhotons whether such photons should be added to _theParticles
- /// (cf. _trackPhotons)
- // ZFinder(const FinalState& inputfs,
- // const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- // PdgId pid,
- // double minmass, const double maxmass,
- // double dRmax, bool clusterPhotons, bool trackPhotons,
- // double masstarget=91.2*GeV);
-
-
- /// @deprecated Constructors without inputfs -- only for backwards compatibility
- // ZFinder(double, double, double, PdgId, double, double, double,
- // bool, bool, double masstarget=91.2*GeV);
- /// @deprecated Constructors without inputfs -- only for backwards compatibility
- // ZFinder(const std::vector<std::pair<double, double> >&, double, PdgId,
- // double, double, double, bool, bool, double masstarget=91.2*GeV);
-
-
/// Clone on the heap.
virtual const Projection* clone() const {
return new ZFinder(*this);
}
//@}
/// Access to the found bosons (currently either 0 or 1)
const Particles& bosons() const { return _bosons; }
/// Access to the Z constituent clustered leptons
/// (e.g. for more fine-grained cuts on the clustered leptons)
/// The order is going to be: positive charge constituent 1st, negative 2nd
const vector<Particle>& constituents() const { return _constituents; }
/// Access to the remaining particles, after the Z and clustered photons
/// have been removed from the full final state
/// (e.g. for running a jet finder on it)
const FinalState& remainingFinalState() const;
protected:
/// Apply the projection on the supplied event.
void project(const Event& e);
/// Compare projections.
int compare(const Projection& p) const;
public:
/// Clear the projection
void clear() {
_theParticles.clear();
_bosons.clear();
_constituents.clear();
}
private:
- /// Common implementation of constructor operation, taking FS params.
- void _init(const FinalState& inputfs, Cut fsCut,
- //const std::vector<std::pair<double, double> >& etaRanges,
- //double pTmin,
- PdgId pid,
- double minmass, double maxmass,
- double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget);
-
/// Mass cuts to apply to clustered leptons (cf. InvMassFinalState)
double _minmass, _maxmass, _masstarget;
/// Switch for tracking of photons (whether to add them to _theParticles)
/// This is relevant when the ZFinder::_theParticles are to be excluded
/// from e.g. the input to a jet finder, to specify whether the clustered
/// photons are to be excluded as well.
/// (Yes, some experiments make a difference between clusterPhotons and
/// trackPhotons!)
bool _trackPhotons;
/// Lepton flavour
PdgId _pid;
/// list of found bosons (currently either 0 or 1)
Particles _bosons;
/// Clustered leptons
vector<Particle> _constituents;
};
}
#endif
diff --git a/src/Analyses/ATLAS_2011_S9131140.cc b/src/Analyses/ATLAS_2011_S9131140.cc
--- a/src/Analyses/ATLAS_2011_S9131140.cc
+++ b/src/Analyses/ATLAS_2011_S9131140.cc
@@ -1,108 +1,113 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief ATLAS Z pT in Drell-Yan events at 7 TeV
/// @author Elena Yatsenko, Judith Katzy
class ATLAS_2011_S9131140 : public Analysis {
public:
/// Constructor
ATLAS_2011_S9131140()
: Analysis("ATLAS_2011_S9131140")
{
_sumw_el_bare = 0;
_sumw_el_dressed = 0;
_sumw_mu_bare = 0;
_sumw_mu_dressed = 0;
}
/// @name Analysis methods
//@{
void init() {
// Set up projections
FinalState fs;
- ZFinder zfinder_dressed_el(fs, -2.4, 2.4, 20, PID::ELECTRON, 66.0*GeV, 116.0*GeV, 0.1, true, false);
+ Cut cut = EtaIn(-2.4,2.4) & (Cuts::pT >= 20.0*GeV);
+
+ ZFinder zfinder_dressed_el(fs, cut, PID::ELECTRON, 66.0*GeV, 116.0*GeV, 0.1, true, false);
addProjection(zfinder_dressed_el, "ZFinder_dressed_el");
- ZFinder zfinder_bare_el(fs, -2.4, 2.4, 20, PID::ELECTRON, 66.0*GeV, 116.0*GeV, 0.0, true, false);
+
+ ZFinder zfinder_bare_el(fs, cut, PID::ELECTRON, 66.0*GeV, 116.0*GeV, 0.0, true, false);
addProjection(zfinder_bare_el, "ZFinder_bare_el");
- ZFinder zfinder_dressed_mu(fs, -2.4, 2.4, 20, PID::MUON, 66.0*GeV, 116.0*GeV, 0.1, true, false);
+
+ ZFinder zfinder_dressed_mu(fs, cut, PID::MUON, 66.0*GeV, 116.0*GeV, 0.1, true, false);
addProjection(zfinder_dressed_mu, "ZFinder_dressed_mu");
- ZFinder zfinder_bare_mu(fs, -2.4, 2.4, 20, PID::MUON, 66.0*GeV, 116.0*GeV, 0.0, true, false);
+
+ ZFinder zfinder_bare_mu(fs, cut, PID::MUON, 66.0*GeV, 116.0*GeV, 0.0, true, false);
addProjection(zfinder_bare_mu, "ZFinder_bare_mu");
// Book histograms
_hist_zpt_el_dressed = bookHisto1D(1, 1, 2); // electron "dressed"
_hist_zpt_el_bare = bookHisto1D(1, 1, 3); // electron "bare"
_hist_zpt_mu_dressed = bookHisto1D(2, 1, 2); // muon "dressed"
_hist_zpt_mu_bare = bookHisto1D(2, 1, 3); // muon "bare"
}
/// Do the analysis
void analyze(const Event& evt) {
const double weight = evt.weight();
const ZFinder& zfinder_dressed_el = applyProjection<ZFinder>(evt, "ZFinder_dressed_el");
if (!zfinder_dressed_el.bosons().empty()) {
_sumw_el_dressed += weight;
const FourMomentum pZ = zfinder_dressed_el.bosons()[0].momentum();
_hist_zpt_el_dressed->fill(pZ.pT()/GeV, weight);
}
const ZFinder& zfinder_bare_el = applyProjection<ZFinder>(evt, "ZFinder_bare_el");
if (!zfinder_bare_el.bosons().empty()) {
_sumw_el_bare += weight;
const FourMomentum pZ = zfinder_bare_el.bosons()[0].momentum();
_hist_zpt_el_bare->fill(pZ.pT()/GeV, weight);
}
const ZFinder& zfinder_dressed_mu = applyProjection<ZFinder>(evt, "ZFinder_dressed_mu");
if (!zfinder_dressed_mu.bosons().empty()) {
_sumw_mu_dressed += weight;
const FourMomentum pZ = zfinder_dressed_mu.bosons()[0].momentum();
_hist_zpt_mu_dressed->fill(pZ.pT()/GeV, weight);
}
const ZFinder& zfinder_bare_mu = applyProjection<ZFinder>(evt, "ZFinder_bare_mu");
if (!zfinder_bare_mu.bosons().empty()) {
_sumw_mu_bare += weight;
const FourMomentum pZ = zfinder_bare_mu.bosons()[0].momentum();
_hist_zpt_mu_bare->fill(pZ.pT()/GeV, weight);
}
}
void finalize() {
if (_sumw_el_dressed != 0) scale(_hist_zpt_el_dressed, 1/_sumw_el_dressed);
if (_sumw_el_bare != 0) scale(_hist_zpt_el_bare, 1/_sumw_el_bare);
if (_sumw_mu_dressed != 0) scale(_hist_zpt_mu_dressed, 1/_sumw_mu_dressed);
if (_sumw_mu_bare != 0) scale(_hist_zpt_mu_bare, 1/_sumw_mu_bare);
}
//@}
private:
double _sumw_el_bare, _sumw_el_dressed;
double _sumw_mu_bare, _sumw_mu_dressed;
Histo1DPtr _hist_zpt_el_dressed;
Histo1DPtr _hist_zpt_el_bare;
Histo1DPtr _hist_zpt_mu_dressed;
Histo1DPtr _hist_zpt_mu_bare;
};
// Hook for the plugin system
DECLARE_RIVET_PLUGIN(ATLAS_2011_S9131140);
}
diff --git a/src/Analyses/CDF_2000_S4155203.cc b/src/Analyses/CDF_2000_S4155203.cc
--- a/src/Analyses/CDF_2000_S4155203.cc
+++ b/src/Analyses/CDF_2000_S4155203.cc
@@ -1,72 +1,72 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief CDF Run I Z \f$ p_\perp \f$ in Drell-Yan events
/// @author Hendrik Hoeth
class CDF_2000_S4155203 : public Analysis {
public:
/// Constructor
CDF_2000_S4155203()
: Analysis("CDF_2000_S4155203")
{ }
/// @name Analysis methods
//@{
void init() {
// Set up projections
FinalState fs;
- ZFinder zfinder(fs, -MAXRAPIDITY, MAXRAPIDITY, 0.0*GeV, PID::ELECTRON,
+ ZFinder zfinder(fs, Cuts::open(), PID::ELECTRON,
66.0*GeV, 116.0*GeV, 0.0, false, false);
addProjection(zfinder, "ZFinder");
// Book histogram
_hist_zpt = bookHisto1D(1, 1, 1);
}
/// Do the analysis
void analyze(const Event& e) {
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size() != 1) {
MSG_DEBUG("Num e+ e- pairs found = " << zfinder.bosons().size());
vetoEvent;
}
FourMomentum pZ = zfinder.bosons()[0].momentum();
if (pZ.mass2() < 0) {
MSG_DEBUG("Negative Z mass**2 = " << pZ.mass2()/GeV2 << "!");
vetoEvent;
}
MSG_DEBUG("Dilepton mass = " << pZ.mass()/GeV << " GeV");
MSG_DEBUG("Dilepton pT = " << pZ.pT()/GeV << " GeV");
_hist_zpt->fill(pZ.pT()/GeV, e.weight());
}
void finalize() {
scale(_hist_zpt, crossSection()/picobarn/sumOfWeights());
}
//@}
private:
Histo1DPtr _hist_zpt;
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(CDF_2000_S4155203);
}
diff --git a/src/Analyses/CDF_2009_S8383952.cc b/src/Analyses/CDF_2009_S8383952.cc
--- a/src/Analyses/CDF_2009_S8383952.cc
+++ b/src/Analyses/CDF_2009_S8383952.cc
@@ -1,91 +1,91 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief CDF Z boson rapidity measurement
class CDF_2009_S8383952 : public Analysis {
public:
/// @name Constructors etc.
//@{
/// Constructor
CDF_2009_S8383952()
: Analysis("CDF_2009_S8383952")
{ }
//@}
public:
/// @name Analysis methods
//@{
/// Book histograms and initialise projections before the run
void init() {
/// Initialise and register projections here
// this seems to have been corrected completely for all selection cuts,
// i.e. eta cuts and pT cuts on leptons.
FinalState fs;
- ZFinder zfinder(fs, -MAXRAPIDITY, MAXRAPIDITY, 0.0*GeV, PID::ELECTRON,
+ ZFinder zfinder(fs, Cuts::open(), PID::ELECTRON,
66.0*GeV, 116.0*GeV, 0.2, true, true);
addProjection(zfinder, "ZFinder");
/// Book histograms here
_h_xs = bookHisto1D(1, 1, 1);
_h_yZ = bookHisto1D(2, 1, 1);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
const double weight = event.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(event, "ZFinder");
if (zfinder.bosons().size() == 1) {
double yZ = fabs(zfinder.bosons()[0].rapidity());
_h_yZ->fill(yZ, weight);
_h_xs->fill(1960.0, weight);
}
else {
MSG_DEBUG("no unique lepton pair found.");
}
}
/// Normalise histograms etc., after the run
void finalize() {
scale(_h_xs, crossSection()/sumOfWeights());
// Data seems to have been normalized for the avg of the two sides
// (+ve & -ve rapidity) rather than the sum, hence the 0.5:
scale(_h_yZ, 0.5*crossSection()/sumOfWeights());
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_yZ;
Histo1DPtr _h_xs;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(CDF_2009_S8383952);
}
diff --git a/src/Analyses/CMS_2012_I1107658.cc b/src/Analyses/CMS_2012_I1107658.cc
--- a/src/Analyses/CMS_2012_I1107658.cc
+++ b/src/Analyses/CMS_2012_I1107658.cc
@@ -1,166 +1,167 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
#include "Rivet/ParticleName.hh"
namespace Rivet {
class CMS_2012_I1107658 : public Analysis {
public:
/// Constructor
CMS_2012_I1107658() : Analysis("CMS_2012_I1107658") {}
void init() {
FinalState fs;
- ZFinder zfinder(fs, -2.4, 2.4, 20.0*GeV, PID::MUON, 4.0*GeV, 140.0*GeV, 0.2, false, false);
+ Cut cut = EtaIn(-2.4,2.4) & (Cuts::pT >= 20.0*GeV);
+ ZFinder zfinder(fs, cut, PID::MUON, 4.0*GeV, 140.0*GeV, 0.2, false, false);
addProjection(zfinder, "ZFinder");
ChargedFinalState cfs(-2.0, 2.0, 500*MeV); // For charged particles
VetoedFinalState nonmuons(cfs);
nonmuons.addVetoPairId(PID::MUON);
addProjection(nonmuons, "nonmuons");
_h_Nchg_towards_pTmumu = bookProfile1D(1, 1, 1);
_h_Nchg_transverse_pTmumu = bookProfile1D(2, 1, 1);
_h_Nchg_away_pTmumu = bookProfile1D(3, 1, 1);
_h_pTsum_towards_pTmumu = bookProfile1D(4, 1, 1);
_h_pTsum_transverse_pTmumu = bookProfile1D(5, 1, 1);
_h_pTsum_away_pTmumu = bookProfile1D(6, 1, 1);
_h_avgpT_towards_pTmumu = bookProfile1D(7, 1, 1);
_h_avgpT_transverse_pTmumu = bookProfile1D(8, 1, 1);
_h_avgpT_away_pTmumu = bookProfile1D(9, 1, 1);
_h_Nchg_towards_plus_transverse_Mmumu = bookProfile1D(10, 1, 1);
_h_pTsum_towards_plus_transverse_Mmumu = bookProfile1D(11, 1, 1);
_h_avgpT_towards_plus_transverse_Mmumu = bookProfile1D(12, 1, 1);
_h_Nchg_towards_zmass_81_101 = bookHisto1D(13, 1, 1);
_h_Nchg_transverse_zmass_81_101 = bookHisto1D(14, 1, 1);
_h_Nchg_away_zmass_81_101 = bookHisto1D(15, 1, 1);
_h_pT_towards_zmass_81_101 = bookHisto1D(16, 1, 1);
_h_pT_transverse_zmass_81_101 = bookHisto1D(17, 1, 1);
_h_pT_away_zmass_81_101 = bookHisto1D(18, 1, 1);
_h_Nchg_transverse_zpt_5 = bookHisto1D(19, 1, 1);
_h_pT_transverse_zpt_5 = bookHisto1D(20, 1, 1);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
const double weight = event.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(event, "ZFinder");
if (zfinder.bosons().size() != 1) vetoEvent;
double Zpt = zfinder.bosons()[0].pT()/GeV;
double Zphi = zfinder.bosons()[0].momentum().phi();
double Zmass = zfinder.bosons()[0].momentum().mass()/GeV;
Particles particles = applyProjection<VetoedFinalState>(event, "nonmuons").particles();
int nTowards = 0;
int nTransverse = 0;
int nAway = 0;
double ptSumTowards = 0.0;
double ptSumTransverse = 0.0;
double ptSumAway = 0.0;
foreach (const Particle& p, particles) {
double dphi = fabs(deltaPhi(Zphi, p.momentum().phi()));
double pT = p.pT();
if ( dphi < M_PI/3.0 ) {
nTowards++;
ptSumTowards += pT;
if (Zmass > 81. && Zmass < 101.) _h_pT_towards_zmass_81_101->fill(pT, weight);
} else if ( dphi < 2.*M_PI/3.0 ) {
nTransverse++;
ptSumTransverse += pT;
if (Zmass > 81. && Zmass < 101.) _h_pT_transverse_zmass_81_101->fill(pT, weight);
if (Zpt < 5.) _h_pT_transverse_zpt_5->fill(pT, weight);
} else {
nAway++;
ptSumAway += pT;
if (Zmass > 81. && Zmass < 101.) _h_pT_away_zmass_81_101->fill(pT, weight);
}
} // Loop over particles
const double area = 8./3.*M_PI;
if (Zmass > 81. && Zmass < 101.) {
_h_Nchg_towards_pTmumu-> fill(Zpt, 1./area * nTowards, weight);
_h_Nchg_transverse_pTmumu-> fill(Zpt, 1./area * nTransverse, weight);
_h_Nchg_away_pTmumu-> fill(Zpt, 1./area * nAway, weight);
_h_pTsum_towards_pTmumu-> fill(Zpt, 1./area * ptSumTowards, weight);
_h_pTsum_transverse_pTmumu-> fill(Zpt, 1./area * ptSumTransverse, weight);
_h_pTsum_away_pTmumu-> fill(Zpt, 1./area * ptSumAway, weight);
if (nTowards > 0) _h_avgpT_towards_pTmumu-> fill(Zpt, ptSumTowards/nTowards, weight);
if (nTransverse > 0) _h_avgpT_transverse_pTmumu-> fill(Zpt, ptSumTransverse/nTransverse, weight);
if (nAway > 0) _h_avgpT_away_pTmumu-> fill(Zpt, ptSumAway/nAway, weight);
_h_Nchg_towards_zmass_81_101-> fill(nTowards, weight);
_h_Nchg_transverse_zmass_81_101->fill(nTransverse, weight);
_h_Nchg_away_zmass_81_101-> fill(nAway, weight);
}
if (Zpt < 5.) {
_h_Nchg_towards_plus_transverse_Mmumu->fill(Zmass, (nTowards + nTransverse)/(2.*area), weight);
_h_pTsum_towards_plus_transverse_Mmumu->fill(Zmass, (ptSumTowards + ptSumTransverse)/(2.*area), weight);
if ((nTowards + nTransverse) > 0) _h_avgpT_towards_plus_transverse_Mmumu->fill(Zmass, (ptSumTowards + ptSumTransverse)/(nTowards + nTransverse), weight);
_h_Nchg_transverse_zpt_5->fill(nTransverse, weight);
}
}
/// Normalise histograms etc., after the run
void finalize() {
if (integral(_h_Nchg_towards_zmass_81_101) > 0) scale(_h_pT_towards_zmass_81_101, 1.0/integral(_h_Nchg_towards_zmass_81_101));
if (integral(_h_Nchg_transverse_zmass_81_101) > 0) scale(_h_pT_transverse_zmass_81_101, 1.0/integral(_h_Nchg_transverse_zmass_81_101));
if (integral(_h_Nchg_away_zmass_81_101) > 0) scale(_h_pT_away_zmass_81_101, 1.0/integral(_h_Nchg_away_zmass_81_101));
if (integral(_h_Nchg_transverse_zpt_5) > 0) scale(_h_pT_transverse_zpt_5, 1.0/integral(_h_Nchg_transverse_zpt_5));
normalize(_h_Nchg_towards_zmass_81_101);
normalize(_h_Nchg_transverse_zmass_81_101);
normalize(_h_Nchg_away_zmass_81_101);
normalize(_h_Nchg_transverse_zpt_5);
}
private:
/// @name Histogram objects
//@{
Profile1DPtr _h_Nchg_towards_pTmumu;
Profile1DPtr _h_Nchg_transverse_pTmumu;
Profile1DPtr _h_Nchg_away_pTmumu;
Profile1DPtr _h_pTsum_towards_pTmumu;
Profile1DPtr _h_pTsum_transverse_pTmumu;
Profile1DPtr _h_pTsum_away_pTmumu;
Profile1DPtr _h_avgpT_towards_pTmumu;
Profile1DPtr _h_avgpT_transverse_pTmumu;
Profile1DPtr _h_avgpT_away_pTmumu;
Profile1DPtr _h_Nchg_towards_plus_transverse_Mmumu;
Profile1DPtr _h_pTsum_towards_plus_transverse_Mmumu;
Profile1DPtr _h_avgpT_towards_plus_transverse_Mmumu;
Histo1DPtr _h_Nchg_towards_zmass_81_101;
Histo1DPtr _h_Nchg_transverse_zmass_81_101;
Histo1DPtr _h_Nchg_away_zmass_81_101;
Histo1DPtr _h_pT_towards_zmass_81_101;
Histo1DPtr _h_pT_transverse_zmass_81_101;
Histo1DPtr _h_pT_away_zmass_81_101;
Histo1DPtr _h_Nchg_transverse_zpt_5;
Histo1DPtr _h_pT_transverse_zpt_5;
//@}
};
// This global object acts as a hook for the plugin system
DECLARE_RIVET_PLUGIN(CMS_2012_I1107658);
}
diff --git a/src/Analyses/D0_2007_S7075677.cc b/src/Analyses/D0_2007_S7075677.cc
--- a/src/Analyses/D0_2007_S7075677.cc
+++ b/src/Analyses/D0_2007_S7075677.cc
@@ -1,79 +1,79 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief Measurement of D0 Run II Z \f$ p_\perp \f$ diff cross-section shape
/// @author Andy Buckley
/// @author Gavin Hesketh
/// @author Frank Siegert
class D0_2007_S7075677 : public Analysis {
public:
/// Default constructor.
D0_2007_S7075677() : Analysis("D0_2007_S7075677")
{
// Run II Z rapidity
}
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -MAXRAPIDITY, MAXRAPIDITY, 0.0*GeV, PID::ELECTRON,
+ ZFinder zfinder(fs, Cuts::open(), PID::ELECTRON,
71.0*GeV, 111.0*GeV, 0.2, true, true);
addProjection(zfinder, "ZFinder");
_h_yZ = bookHisto1D(1, 1, 1);
}
/// Do the analysis
void analyze(const Event & e) {
const double weight = e.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size() == 1) {
const Particles& el(zfinder.constituents());
if (el[0].pT() > 25.0*GeV || el[1].pT() > 25.0*GeV) {
double yZ = fabs(zfinder.bosons()[0].rapidity());
_h_yZ->fill(yZ, weight);
}
}
else {
MSG_DEBUG("No unique lepton pair found.");
}
}
// Finalize
void finalize() {
// Data seems to have been normalized for the avg of the two sides
// (+ve & -ve rapidity) rather than the sum, hence the 0.5:
normalize(_h_yZ, 0.5);
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_yZ;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(D0_2007_S7075677);
}
diff --git a/src/Analyses/D0_2008_S6879055.cc b/src/Analyses/D0_2008_S6879055.cc
--- a/src/Analyses/D0_2008_S6879055.cc
+++ b/src/Analyses/D0_2008_S6879055.cc
@@ -1,126 +1,126 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// @brief D0 measurement of the ratio \f$ \sigma(Z/\gamma^* + n \text{ jets})/\sigma(Z/\gamma^*) \f$
class D0_2008_S6879055 : public Analysis {
public:
/// Default constructor.
D0_2008_S6879055() : Analysis("D0_2008_S6879055")
{
}
/// @name Analysis methods
//@{
// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -MAXRAPIDITY, MAXRAPIDITY, 0.0*GeV, PID::ELECTRON,
+ ZFinder zfinder(fs, Cuts::open(), PID::ELECTRON,
40.0*GeV, 200.0*GeV, 0.2, true, true);
addProjection(zfinder, "ZFinder");
FastJets conefinder(zfinder.remainingFinalState(), FastJets::D0ILCONE, 0.5);
addProjection(conefinder, "ConeFinder");
_crossSectionRatio = bookHisto1D(1, 1, 1);
_pTjet1 = bookHisto1D(2, 1, 1);
_pTjet2 = bookHisto1D(3, 1, 1);
_pTjet3 = bookHisto1D(4, 1, 1);
}
/// Do the analysis
void analyze(const Event& event) {
const double weight = event.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(event, "ZFinder");
if (zfinder.bosons().size()!=1) {
vetoEvent;
}
FourMomentum e0 = zfinder.constituents()[0].momentum();
FourMomentum e1 = zfinder.constituents()[1].momentum();
const double e0eta = e0.eta();
const double e0phi = e0.phi();
const double e1eta = e1.eta();
const double e1phi = e1.phi();
vector<FourMomentum> finaljet_list;
foreach (const Jet& j, applyProjection<JetAlg>(event, "ConeFinder").jetsByPt(20.0*GeV)) {
const double jeta = j.eta();
const double jphi = j.momentum().phi();
if (fabs(jeta) < 2.5) {
if (deltaR(e0eta, e0phi, jeta, jphi) > 0.4 &&
deltaR(e1eta, e1phi, jeta, jphi) > 0.4) {
finaljet_list.push_back(j.momentum());
}
}
}
// For normalisation of crossSection data (includes events with no jets passing cuts)
_crossSectionRatio->fill(0, weight);
// Fill jet pT and multiplicities
if (finaljet_list.size() >= 1) {
_crossSectionRatio->fill(1, weight);
_pTjet1->fill(finaljet_list[0].pT(), weight);
}
if (finaljet_list.size() >= 2) {
_crossSectionRatio->fill(2, weight);
_pTjet2->fill(finaljet_list[1].pT(), weight);
}
if (finaljet_list.size() >= 3) {
_crossSectionRatio->fill(3, weight);
_pTjet3->fill(finaljet_list[2].pT(), weight);
}
if (finaljet_list.size() >= 4) {
_crossSectionRatio->fill(4, weight);
}
}
/// Finalize
void finalize() {
// Now divide by the inclusive result
scale(_crossSectionRatio,1.0/_crossSectionRatio->bin(0).area());
// Normalise jet pTs to integrals of data
// NB. There is no other way to do this, because these quantities are not
// detector-corrected
normalize(_pTjet1, 10439.0); // fixed norm OK
normalize(_pTjet2, 1461.5); // fixed norm OK
normalize(_pTjet3, 217.0); // fixed norm OK
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _crossSectionRatio;
Histo1DPtr _pTjet1;
Histo1DPtr _pTjet2;
Histo1DPtr _pTjet3;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(D0_2008_S6879055);
}
diff --git a/src/Analyses/D0_2008_S7554427.cc b/src/Analyses/D0_2008_S7554427.cc
--- a/src/Analyses/D0_2008_S7554427.cc
+++ b/src/Analyses/D0_2008_S7554427.cc
@@ -1,85 +1,85 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief D0 Run II Z \f$ p_\perp \f$ differential cross-section shape
/// @author Andy Buckley
/// @author Gavin Hesketh
/// @author Frank Siegert
class D0_2008_S7554427 : public Analysis {
public:
/// Default constructor.
D0_2008_S7554427() : Analysis("D0_2008_S7554427")
{
// Run II Z pT
}
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -MAXRAPIDITY, MAXRAPIDITY, 0.0*GeV, PID::ELECTRON,
+ ZFinder zfinder(fs, Cuts::open(), PID::ELECTRON,
40.0*GeV, 200.0*GeV, 0.2, true, true);
addProjection(zfinder, "ZFinder");
_h_ZpT = bookHisto1D(1, 1, 1);
_h_forward_ZpT = bookHisto1D(3, 1, 1);
}
/// Do the analysis
void analyze(const Event & e) {
const double weight = e.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size() == 1) {
double yZ = fabs(zfinder.bosons()[0].rapidity());
double pTZ = zfinder.bosons()[0].pT();
_h_ZpT->fill(pTZ, weight);
if (yZ > 2.0) {
_h_forward_ZpT->fill(pTZ, weight);
}
}
else {
MSG_DEBUG("No unique lepton pair found.");
}
}
// Finalize
void finalize() {
normalize(_h_ZpT);
normalize(_h_forward_ZpT);
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_ZpT;
Histo1DPtr _h_forward_ZpT;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(D0_2008_S7554427);
}
diff --git a/src/Analyses/D0_2008_S7863608.cc b/src/Analyses/D0_2008_S7863608.cc
--- a/src/Analyses/D0_2008_S7863608.cc
+++ b/src/Analyses/D0_2008_S7863608.cc
@@ -1,137 +1,138 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// @brief D0 differential Z/\f$ \gamma^* \f$ + jet + \f$ X \f$ cross sections
/// @author Gavin Hesketh, Andy Buckley, Frank Siegert
class D0_2008_S7863608 : public Analysis {
public:
/// @name Construction
//@{
/// Constructor
D0_2008_S7863608()
: Analysis("D0_2008_S7863608")
{ }
//@}
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -1.7, 1.7, 15.0*GeV, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, false, true);
+ Cut cut = EtaIn(-1.7,1.7) & (Cuts::pT >= 15.0*GeV);
+ ZFinder zfinder(fs, cut, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, false, true);
addProjection(zfinder, "ZFinder");
FastJets conefinder(zfinder.remainingFinalState(), FastJets::D0ILCONE, 0.5);
addProjection(conefinder, "ConeFinder");
_sum_of_weights_inclusive=0.0;
_h_jet_pT_cross_section = bookHisto1D(1, 1, 1);
_h_jet_pT_normalised = bookHisto1D(1, 1, 2);
_h_jet_y_cross_section = bookHisto1D(2, 1, 1);
_h_jet_y_normalised = bookHisto1D(2, 1, 2);
_h_Z_pT_cross_section = bookHisto1D(3, 1, 1);
_h_Z_pT_normalised = bookHisto1D(3, 1, 2);
_h_Z_y_cross_section = bookHisto1D(4, 1, 1);
_h_Z_y_normalised = bookHisto1D(4, 1, 2);
_h_total_cross_section = bookHisto1D(5, 1, 1);
}
// Do the analysis
void analyze(const Event& e) {
const double weight = e.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size()==1) {
_sum_of_weights_inclusive += weight;
const JetAlg& jetpro = applyProjection<JetAlg>(e, "ConeFinder");
const Jets& jets = jetpro.jetsByPt(20.0*GeV);
Jets jets_cut;
foreach (const Jet& j, jets) {
if (fabs(j.momentum().pseudorapidity()) < 2.8) {
jets_cut.push_back(j);
}
}
// Return if there are no jets:
if(jets_cut.size()<1) {
MSG_DEBUG("Skipping event " << numEvents() << " because no jets pass cuts ");
vetoEvent;
}
const FourMomentum Zmom = zfinder.bosons()[0].momentum();
// In jet pT
_h_jet_pT_cross_section->fill( jets_cut[0].pT(), weight);
_h_jet_pT_normalised->fill( jets_cut[0].pT(), weight);
_h_jet_y_cross_section->fill( fabs(jets_cut[0].rapidity()), weight);
_h_jet_y_normalised->fill( fabs(jets_cut[0].rapidity()), weight);
// In Z pT
_h_Z_pT_cross_section->fill(Zmom.pT(), weight);
_h_Z_pT_normalised->fill(Zmom.pT(), weight);
_h_Z_y_cross_section->fill(fabs(Zmom.rapidity()), weight);
_h_Z_y_normalised->fill(fabs(Zmom.rapidity()), weight);
_h_total_cross_section->fill(1960.0, weight);
}
}
/// Finalize
void finalize() {
const double invlumi = crossSection()/sumOfWeights();
scale(_h_total_cross_section, invlumi);
scale(_h_jet_pT_cross_section, invlumi);
scale(_h_jet_y_cross_section, invlumi);
scale(_h_Z_pT_cross_section, invlumi);
scale(_h_Z_y_cross_section, invlumi);
double factor=1.0/_sum_of_weights_inclusive;
if (_sum_of_weights_inclusive==0.0) factor=0.0;
scale(_h_jet_pT_normalised, factor);
scale(_h_jet_y_normalised, factor);
scale(_h_Z_pT_normalised, factor);
scale(_h_Z_y_normalised, factor);
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_jet_pT_cross_section;
Histo1DPtr _h_jet_y_cross_section;
Histo1DPtr _h_Z_pT_cross_section;
Histo1DPtr _h_Z_y_cross_section;
Histo1DPtr _h_total_cross_section;
Histo1DPtr _h_jet_pT_normalised;
Histo1DPtr _h_jet_y_normalised;
Histo1DPtr _h_Z_pT_normalised;
Histo1DPtr _h_Z_y_normalised;
//@}
double _sum_of_weights_inclusive;
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(D0_2008_S7863608);
}
diff --git a/src/Analyses/D0_2009_S8349509.cc b/src/Analyses/D0_2009_S8349509.cc
--- a/src/Analyses/D0_2009_S8349509.cc
+++ b/src/Analyses/D0_2009_S8349509.cc
@@ -1,173 +1,174 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// @brief D0 Z+jets angular distributions
class D0_2009_S8349509 : public Analysis {
public:
/// @name Constructors etc.
//@{
/// Constructor
D0_2009_S8349509()
: Analysis("D0_2009_S8349509"),
_inclusive_Z_sumofweights(0.0)
{ }
//@}
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -1.7, 1.7, 15.0*GeV, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, false, true);
+ Cut cut = EtaIn(-1.7,1.7) & (Cuts::pT >= 15.0*GeV);
+ ZFinder zfinder(fs, cut, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, false, true);
addProjection(zfinder, "ZFinder");
FastJets conefinder(zfinder.remainingFinalState(), FastJets::D0ILCONE, 0.5);
addProjection(conefinder, "ConeFinder");
_h_dphi_jet_Z25 = bookHisto1D(1, 1, 1);
_h_dphi_jet_Z45 = bookHisto1D(2, 1, 1);
_h_dy_jet_Z25 = bookHisto1D(3, 1, 1);
_h_dy_jet_Z45 = bookHisto1D(4, 1, 1);
_h_yboost_jet_Z25 = bookHisto1D(5, 1, 1);
_h_yboost_jet_Z45 = bookHisto1D(6, 1, 1);
_h_dphi_jet_Z25_xs = bookHisto1D(1, 1, 2);
_h_dphi_jet_Z45_xs = bookHisto1D(2, 1, 2);
_h_dy_jet_Z25_xs = bookHisto1D(3, 1, 2);
_h_dy_jet_Z45_xs = bookHisto1D(4, 1, 2);
_h_yboost_jet_Z25_xs = bookHisto1D(5, 1, 2);
_h_yboost_jet_Z45_xs = bookHisto1D(6, 1, 2);
_inclusive_Z_sumofweights = 0.0;
}
void analyze(const Event& event) {
const double weight = event.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(event, "ZFinder");
if (zfinder.bosons().size()==1) {
// count inclusive sum of weights for histogram normalisation
_inclusive_Z_sumofweights += weight;
const FourMomentum Zmom = zfinder.bosons()[0].momentum();
if (Zmom.pT()<25.0*GeV) {
vetoEvent;
}
Jets jets;
foreach (const Jet& j, applyProjection<JetAlg>(event, "ConeFinder").jetsByPt(20.0*GeV)) {
if (fabs(j.momentum().pseudorapidity()) < 2.8) {
jets.push_back(j);
break;
}
}
// Return if there are no jets:
if (jets.size() < 1) {
MSG_DEBUG("Skipping event " << numEvents() << " because no jets pass cuts ");
vetoEvent;
}
const FourMomentum jetmom = jets[0].momentum();
double yZ = Zmom.rapidity();
double yjet = jetmom.rapidity();
double dphi = deltaPhi(Zmom.phi(), jetmom.phi());
double dy = fabs(yZ-yjet);
double yboost = fabs(yZ+yjet)/2.0;
if (Zmom.pT() > 25.0*GeV) {
_h_dphi_jet_Z25->fill(dphi,weight);
_h_dy_jet_Z25->fill(dy, weight);
_h_yboost_jet_Z25->fill(yboost, weight);
_h_dphi_jet_Z25_xs->fill(dphi,weight);
_h_dy_jet_Z25_xs->fill(dy, weight);
_h_yboost_jet_Z25_xs->fill(yboost, weight);
}
if (Zmom.pT() > 45.0*GeV) {
_h_dphi_jet_Z45->fill(dphi,weight);
_h_dy_jet_Z45->fill(dy, weight);
_h_yboost_jet_Z45->fill(yboost, weight);
_h_dphi_jet_Z45_xs->fill(dphi,weight);
_h_dy_jet_Z45_xs->fill(dy, weight);
_h_yboost_jet_Z45_xs->fill(yboost, weight);
}
}
}
void finalize() {
if (_inclusive_Z_sumofweights == 0.0) return;
scale(_h_dphi_jet_Z25, 1.0/_inclusive_Z_sumofweights);
scale(_h_dphi_jet_Z45, 1.0/_inclusive_Z_sumofweights);
scale(_h_dy_jet_Z25, 1.0/_inclusive_Z_sumofweights);
scale(_h_dy_jet_Z45, 1.0/_inclusive_Z_sumofweights);
scale(_h_yboost_jet_Z25, 1.0/_inclusive_Z_sumofweights);
scale(_h_yboost_jet_Z45, 1.0/_inclusive_Z_sumofweights);
scale(_h_dphi_jet_Z25_xs, crossSectionPerEvent());
scale(_h_dphi_jet_Z45_xs, crossSectionPerEvent());
scale(_h_dy_jet_Z25_xs, crossSectionPerEvent());
scale(_h_dy_jet_Z45_xs, crossSectionPerEvent());
scale(_h_yboost_jet_Z25_xs, crossSectionPerEvent());
scale(_h_yboost_jet_Z45_xs, crossSectionPerEvent());
}
//@}
private:
// Data members like post-cuts event weight counters go here
private:
/// @name Histograms (normalised)
//@{
Histo1DPtr _h_dphi_jet_Z25;
Histo1DPtr _h_dphi_jet_Z45;
Histo1DPtr _h_dy_jet_Z25;
Histo1DPtr _h_dy_jet_Z45;
Histo1DPtr _h_yboost_jet_Z25;
Histo1DPtr _h_yboost_jet_Z45;
//@}
/// @name Histograms (absolute cross sections)
//@{
Histo1DPtr _h_dphi_jet_Z25_xs;
Histo1DPtr _h_dphi_jet_Z45_xs;
Histo1DPtr _h_dy_jet_Z25_xs;
Histo1DPtr _h_dy_jet_Z45_xs;
Histo1DPtr _h_yboost_jet_Z25_xs;
Histo1DPtr _h_yboost_jet_Z45_xs;
//@}
double _inclusive_Z_sumofweights;
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(D0_2009_S8349509);
}
diff --git a/src/Analyses/D0_2010_S8671338.cc b/src/Analyses/D0_2010_S8671338.cc
--- a/src/Analyses/D0_2010_S8671338.cc
+++ b/src/Analyses/D0_2010_S8671338.cc
@@ -1,72 +1,73 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief Measurement of Z(->muon muon) pT differential cross-section
/// @author Flavia Dias
class D0_2010_S8671338 : public Analysis {
public:
/// @name Construction
//@{
/// Constructor
D0_2010_S8671338() : Analysis("D0_2010_S8671338")
{ }
//@}
///@name Analysis methods
//@{
/// Add projections and book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -1.7, 1.7, 15.0*GeV, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, false, true);
+ Cut cut = EtaIn(-1.7,1.7) & (Cuts::pT >= 15.0*GeV);
+ ZFinder zfinder(fs, cut, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, false, true);
addProjection(zfinder, "ZFinder");
_h_Z_pT_normalised = bookHisto1D(1, 1, 1);
_h_Z_pT_xs = bookHisto1D(2, 1, 1);
}
// Do the analysis
void analyze(const Event& e) {
const double weight = e.weight();
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size()==1) {
double ZpT = zfinder.bosons()[0].pT()/GeV;
_h_Z_pT_normalised->fill(ZpT, weight);
_h_Z_pT_xs->fill(ZpT, weight);
}
}
/// Finalize
void finalize() {
normalize(_h_Z_pT_normalised, 1.0);
scale(_h_Z_pT_xs, crossSectionPerEvent());
}
//@}
private:
/// @name Histogram
Histo1DPtr _h_Z_pT_normalised;
Histo1DPtr _h_Z_pT_xs;
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(D0_2010_S8671338);
}
diff --git a/src/Analyses/MC_HINC.cc b/src/Analyses/MC_HINC.cc
--- a/src/Analyses/MC_HINC.cc
+++ b/src/Analyses/MC_HINC.cc
@@ -1,93 +1,94 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief MC validation analysis for higgs [-> tau tau] events
class MC_HINC : public Analysis {
public:
/// Default constructor
MC_HINC()
: Analysis("MC_HINC")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder hfinder(fs, -3.5, 3.5, 25.0*GeV, PID::TAU, 115.0*GeV, 125.0*GeV, 0.0, false, false);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder hfinder(fs, cut, PID::TAU, 115.0*GeV, 125.0*GeV, 0.0, false, false);
addProjection(hfinder, "Hfinder");
_h_H_mass = bookHisto1D("H_mass", 50, 119.7, 120.3);
_h_H_pT = bookHisto1D("H_pT", logspace(100, 1.0, 0.5*sqrtS()));
_h_H_pT_peak = bookHisto1D("H_pT_peak", 25, 0.0, 25.0);
_h_H_y = bookHisto1D("H_y", 40, -4.0, 4.0);
_h_H_phi = bookHisto1D("H_phi", 25, 0.0, TWOPI);
_h_lepton_pT = bookHisto1D("lepton_pT", logspace(100, 10.0, 0.25*sqrtS()));
_h_lepton_eta = bookHisto1D("lepton_eta", 40, -4.0, 4.0);
}
/// Do the analysis
void analyze(const Event & e) {
const ZFinder& hfinder = applyProjection<ZFinder>(e, "Hfinder");
if (hfinder.bosons().size()!=1) {
vetoEvent;
}
const double weight = e.weight();
FourMomentum hmom(hfinder.bosons()[0].momentum());
_h_H_mass->fill(hmom.mass(),weight);
_h_H_pT->fill(hmom.pT(),weight);
_h_H_pT_peak->fill(hmom.pT(),weight);
_h_H_y->fill(hmom.rapidity(),weight);
_h_H_phi->fill(hmom.azimuthalAngle(),weight);
foreach (const Particle& l, hfinder.constituents()) {
_h_lepton_pT->fill(l.pT(), weight);
_h_lepton_eta->fill(l.eta(), weight);
}
}
/// Finalize
void finalize() {
scale(_h_H_mass, crossSection()/sumOfWeights());
scale(_h_H_pT, crossSection()/sumOfWeights());
scale(_h_H_pT_peak, crossSection()/sumOfWeights());
scale(_h_H_y, crossSection()/sumOfWeights());
scale(_h_H_phi, crossSection()/sumOfWeights());
scale(_h_lepton_pT, crossSection()/sumOfWeights());
scale(_h_lepton_eta, crossSection()/sumOfWeights());
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_H_mass;
Histo1DPtr _h_H_pT;
Histo1DPtr _h_H_pT_peak;
Histo1DPtr _h_H_y;
Histo1DPtr _h_H_phi;
Histo1DPtr _h_lepton_pT;
Histo1DPtr _h_lepton_eta;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_HINC);
}
diff --git a/src/Analyses/MC_HJETS.cc b/src/Analyses/MC_HJETS.cc
--- a/src/Analyses/MC_HJETS.cc
+++ b/src/Analyses/MC_HJETS.cc
@@ -1,83 +1,84 @@
// -*- C++ -*-
#include "Rivet/Analyses/MC_JetAnalysis.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// @brief MC validation analysis for higgs [-> tau tau] + jets events
class MC_HJETS : public MC_JetAnalysis {
public:
/// Default constructor
MC_HJETS()
: MC_JetAnalysis("MC_HJETS", 4, "Jets")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder hfinder(fs, -3.5, 3.5, 25.0*GeV, PID::TAU, 115.0*GeV, 125.0*GeV, 0.0, false, false);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder hfinder(fs, cut, PID::TAU, 115.0*GeV, 125.0*GeV, 0.0, false, false);
addProjection(hfinder, "Hfinder");
FastJets jetpro(hfinder.remainingFinalState(), FastJets::ANTIKT, 0.4);
addProjection(jetpro, "Jets");
_h_H_jet1_deta = bookHisto1D("H_jet1_deta", 50, -5.0, 5.0);
_h_H_jet1_dR = bookHisto1D("H_jet1_dR", 25, 0.5, 7.0);
MC_JetAnalysis::init();
}
/// Do the analysis
void analyze(const Event & e) {
const ZFinder& hfinder = applyProjection<ZFinder>(e, "Hfinder");
if (hfinder.bosons().size()!=1) {
vetoEvent;
}
const double weight = e.weight();
FourMomentum hmom(hfinder.bosons()[0].momentum());
const Jets& jets = applyProjection<FastJets>(e, "Jets").jetsByPt(m_jetptcut);
if (jets.size() > 0) {
_h_H_jet1_deta->fill(hmom.eta()-jets[0].eta(), weight);
_h_H_jet1_dR->fill(deltaR(hmom, jets[0].momentum()), weight);
}
MC_JetAnalysis::analyze(e);
}
/// Finalize
void finalize() {
scale(_h_H_jet1_deta, crossSection()/sumOfWeights());
scale(_h_H_jet1_dR, crossSection()/sumOfWeights());
MC_JetAnalysis::finalize();
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_H_jet1_deta;
Histo1DPtr _h_H_jet1_dR;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_HJETS);
}
diff --git a/src/Analyses/MC_HKTSPLITTINGS.cc b/src/Analyses/MC_HKTSPLITTINGS.cc
--- a/src/Analyses/MC_HKTSPLITTINGS.cc
+++ b/src/Analyses/MC_HKTSPLITTINGS.cc
@@ -1,60 +1,61 @@
// -*- C++ -*-
#include "Rivet/Analyses/MC_JetSplittings.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// @brief MC validation analysis for higgs [-> tau tau] + jets events
class MC_HKTSPLITTINGS : public MC_JetSplittings {
public:
/// Default constructor
MC_HKTSPLITTINGS()
: MC_JetSplittings("MC_HKTSPLITTINGS", 4, "Jets")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder hfinder(fs, -3.5, 3.5, 25.0*GeV, PID::TAU, 115.0*GeV, 125.0*GeV, 0.0, false, false);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder hfinder(fs, cut, PID::TAU, 115.0*GeV, 125.0*GeV, 0.0, false, false);
addProjection(hfinder, "Hfinder");
FastJets jetpro(hfinder.remainingFinalState(), FastJets::KT, 0.6);
addProjection(jetpro, "Jets");
MC_JetSplittings::init();
}
/// Do the analysis
void analyze(const Event & e) {
const ZFinder& hfinder = applyProjection<ZFinder>(e, "Hfinder");
if (hfinder.bosons().size()!=1) {
vetoEvent;
}
MC_JetSplittings::analyze(e);
}
/// Finalize
void finalize() {
MC_JetSplittings::finalize();
}
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_HKTSPLITTINGS);
}
diff --git a/src/Analyses/MC_VH2BB.cc b/src/Analyses/MC_VH2BB.cc
--- a/src/Analyses/MC_VH2BB.cc
+++ b/src/Analyses/MC_VH2BB.cc
@@ -1,278 +1,279 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/WFinder.hh"
#include "Rivet/Projections/UnstableFinalState.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Math/LorentzTrans.hh"
#include "Rivet/Math/Constants.hh"
#include <cmath>
#include <vector>
namespace Rivet {
class MC_VH2BB : public Analysis {
public:
/// @name Constructors etc.
//@{
/// Constructor
MC_VH2BB()
: Analysis("MC_VH2BB")
{ }
//@}
public:
/// @name Analysis methods
//@{
vector<double> boostAngles(const FourMomentum& b1, const FourMomentum& b2, const FourMomentum& vb){
// This should take in the four-momenta of two b's (jets/hadrons) and a vector boson, for the process VB*->VBH with H->bb
// It should return the smallest angle between the virtual vector boson and one of the b's, in the rest frame of the Higgs boson.
// It should also return (as the second element of the vector) the angle between the b's, in the rest frame of the Higgs boson.
FourMomentum higgsMomentum = b1 + b2;
FourMomentum virtualVBMomentum = higgsMomentum + vb;
LorentzTransform lt( -higgsMomentum.boostVector() );
FourMomentum virtualVBMomentumBOOSTED = lt.transform(virtualVBMomentum);
FourMomentum b1BOOSTED = lt.transform(b1);
FourMomentum b2BOOSTED = lt.transform(b2);
double angle1 = b1BOOSTED.angle(virtualVBMomentumBOOSTED);
double angle2 = b2BOOSTED.angle(virtualVBMomentumBOOSTED);
double anglebb = b1BOOSTED.angle(b2BOOSTED);
vector<double> toReturn;
toReturn.push_back(angle1 < angle2 ? angle1 : angle2);
toReturn.push_back(anglebb);
return toReturn;
}
/// Book histograms and initialise projections before the run
void init() {
FinalState fs;
- ZFinder zeefinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder zeefinder(fs, cut, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zeefinder, "ZeeFinder");
- ZFinder zmmfinder(fs, -3.5, 3.5, 25.0*GeV, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ ZFinder zmmfinder(fs, cut, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zmmfinder, "ZmmFinder");
- WFinder wefinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
+ WFinder wefinder(fs, cut, PID::ELECTRON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
addProjection(wefinder, "WeFinder");
- WFinder wmfinder(fs, -3.5, 3.5, 25.0*GeV, PID::MUON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
+ WFinder wmfinder(fs, cut, PID::MUON, 60.0*GeV, 100.0*GeV, 25.0*GeV, 0.2);
addProjection(wmfinder, "WmFinder");
addProjection(fs, "FinalState");
addProjection(FastJets(fs, FastJets::ANTIKT, 0.4), "AntiKT04");
addProjection(FastJets(fs, FastJets::ANTIKT, 0.5), "AntiKT05");
addProjection(FastJets(fs, FastJets::ANTIKT, 0.6), "AntiKT06");
/// Book histograms
_h_jet_bb_Delta_eta = bookHisto1D("jet_bb_Delta_eta", 50, 0, 4);
_h_jet_bb_Delta_phi = bookHisto1D("jet_bb_Delta_phi", 50, 0, M_PI);
_h_jet_bb_Delta_pT = bookHisto1D("jet_bb_Delta_pT", 50,0, 500);
_h_jet_bb_Delta_R = bookHisto1D("jet_bb_Delta_R", 50, 0, 5);
_h_jet_b_jet_eta = bookHisto1D("jet_b_jet_eta", 50, -4, 4);
_h_jet_b_jet_multiplicity = bookHisto1D("jet_b_jet_multiplicity", 11, -0.5, 10.5);
_h_jet_b_jet_phi = bookHisto1D("jet_b_jet_phi", 50, 0, 2.*M_PI);
_h_jet_b_jet_pT = bookHisto1D("jet_b_jet_pT", 50, 0, 500);
_h_jet_H_eta_using_bb = bookHisto1D("jet_H_eta_using_bb", 50, -4, 4);
_h_jet_H_mass_using_bb = bookHisto1D("jet_H_mass_using_bb", 50, 50, 200);
_h_jet_H_phi_using_bb = bookHisto1D("jet_H_phi_using_bb", 50, 0, 2.*M_PI);
_h_jet_H_pT_using_bb = bookHisto1D("jet_H_pT_using_bb", 50, 0, 500);
_h_jet_eta = bookHisto1D("jet_eta", 50, -4, 4);
_h_jet_multiplicity = bookHisto1D("jet_multiplicity", 11, -0.5, 10.5);
_h_jet_phi = bookHisto1D("jet_phi", 50, 0, 2.*M_PI);
_h_jet_pT = bookHisto1D("jet_pT", 50, 0, 500);
_h_jet_VBbb_Delta_eta = bookHisto1D("jet_VBbb_Delta_eta", 50, 0, 4);
_h_jet_VBbb_Delta_phi = bookHisto1D("jet_VBbb_Delta_phi", 50, 0, M_PI);
_h_jet_VBbb_Delta_pT = bookHisto1D("jet_VBbb_Delta_pT", 50, 0, 500);
_h_jet_VBbb_Delta_R = bookHisto1D("jet_VBbb_Delta_R", 50, 0, 8);
_h_VB_eta = bookHisto1D("VB_eta", 50, -4, 4);
_h_VB_mass = bookHisto1D("VB_mass", 50, 60, 110);
_h_Z_multiplicity = bookHisto1D("Z_multiplicity", 11, -0.5, 10.5);
_h_W_multiplicity = bookHisto1D("W_multiplicity", 11, -0.5, 10.5);
_h_VB_phi = bookHisto1D("VB_phi", 50, 0, 2.*M_PI);
_h_VB_pT = bookHisto1D("VB_pT", 50, 0, 500);
_h_jet_bVB_angle_Hframe = bookHisto1D("jet_bVB_angle_Hframe", 50, 0, M_PI);
_h_jet_bVB_cosangle_Hframe = bookHisto1D("jet_bVB_cosangle_Hframe", 50, -1, 1);
_h_jet_bb_angle_Hframe = bookHisto1D("jet_bb_angle_Hframe", 50, 0, M_PI);
_h_jet_bb_cosangle_Hframe = bookHisto1D("jet_bb_cosangle_Hframe", 50, -1, 1);
}
/// Perform the per-event analysis
void analyze(const Event& event) {
const double weight = event.weight();
const double JETPTCUT = 30*GeV;
const ZFinder& zeefinder = applyProjection<ZFinder>(event, "ZeeFinder");
const ZFinder& zmmfinder = applyProjection<ZFinder>(event, "ZmmFinder");
const WFinder& wefinder = applyProjection<WFinder>(event, "WeFinder");
const WFinder& wmfinder = applyProjection<WFinder>(event, "WmFinder");
Jets jets = applyProjection<FastJets>(event, "AntiKT04").jetsByPt(JETPTCUT);
Particles vectorBosons = zeefinder.bosons();
/// @todo Don't we have a neater vector concatenation?
vectorBosons.insert(vectorBosons.end(), zmmfinder.bosons().begin(), zmmfinder.bosons().end());
vectorBosons.insert(vectorBosons.end(), wefinder.bosons().begin(), wefinder.bosons().end());
vectorBosons.insert(vectorBosons.end(), wmfinder.bosons().begin(), wmfinder.bosons().end());
_h_Z_multiplicity->fill(zeefinder.bosons().size() + zmmfinder.bosons().size(), weight);
_h_W_multiplicity->fill(wefinder.bosons().size() + wmfinder.bosons().size(), weight);
_h_jet_multiplicity->fill(jets.size(), weight);
// Identify the b-jets
Jets bjets;
foreach (const Jet& jet, jets) {
const double jetEta = jet.eta();
const double jetPhi = jet.momentum().phi();
const double jetPt = jet.pT();
_h_jet_eta->fill(jetEta, weight);
_h_jet_phi->fill(jetPhi, weight);
_h_jet_pT->fill(jetPt/GeV, weight);
if (jet.containsBottom() && jet.pT() > JETPTCUT) {
bjets.push_back(jet);
_h_jet_b_jet_eta->fill( jetEta , weight );
_h_jet_b_jet_phi->fill( jetPhi , weight );
_h_jet_b_jet_pT->fill( jetPt , weight );
}
}
_h_jet_b_jet_multiplicity->fill(bjets.size(), weight);
// Plot vector boson properties
foreach (const Particle& v, vectorBosons) {
_h_VB_phi->fill(v.momentum().phi(), weight);
_h_VB_pT->fill(v.pT(), weight);
_h_VB_eta->fill(v.eta(), weight);
_h_VB_mass->fill(v.momentum().mass(), weight);
}
// rest of analysis requires at least 1 b jets
if(bjets.empty()) vetoEvent;
// Construct Higgs candidates from pairs of b-jets
for (size_t i = 0; i < bjets.size()-1; ++i) {
for (size_t j = i+1; j < bjets.size(); ++j) {
const Jet& jet1 = bjets[i];
const Jet& jet2 = bjets[j];
const double deltaEtaJJ = fabs(jet1.eta() - jet2.eta());
const double deltaPhiJJ = deltaPhi(jet1.momentum(), jet2.momentum());
const double deltaRJJ = deltaR(jet1.momentum(), jet2.momentum());
const double deltaPtJJ = fabs(jet1.pT() - jet2.pT());
_h_jet_bb_Delta_eta->fill(deltaEtaJJ, weight);
_h_jet_bb_Delta_phi->fill(deltaPhiJJ, weight);
_h_jet_bb_Delta_pT->fill(deltaPtJJ, weight);
_h_jet_bb_Delta_R->fill(deltaRJJ, weight);
const FourMomentum phiggs = jet1.momentum() + jet2.momentum();
_h_jet_H_eta_using_bb->fill(phiggs.eta(), weight);
_h_jet_H_mass_using_bb->fill(phiggs.mass(), weight);
_h_jet_H_phi_using_bb->fill(phiggs.phi(), weight);
_h_jet_H_pT_using_bb->fill(phiggs.pT(), weight);
foreach (const Particle& v, vectorBosons) {
const double deltaEtaVH = fabs(phiggs.eta() - v.eta());
const double deltaPhiVH = deltaPhi(phiggs, v.momentum());
const double deltaRVH = deltaR(phiggs, v.momentum());
const double deltaPtVH = fabs(phiggs.pT() - v.pT());
_h_jet_VBbb_Delta_eta->fill(deltaEtaVH, weight);
_h_jet_VBbb_Delta_phi->fill(deltaPhiVH, weight);
_h_jet_VBbb_Delta_pT->fill(deltaPtVH, weight);
_h_jet_VBbb_Delta_R->fill(deltaRVH, weight);
// Calculate boost angles
const vector<double> angles = boostAngles(jet1.momentum(), jet2.momentum(), v.momentum());
_h_jet_bVB_angle_Hframe->fill(angles[0], weight);
_h_jet_bb_angle_Hframe->fill(angles[1], weight);
_h_jet_bVB_cosangle_Hframe->fill(cos(angles[0]), weight);
_h_jet_bb_cosangle_Hframe->fill(cos(angles[1]), weight);
}
}
}
}
/// Normalise histograms etc., after the run
void finalize() {
scale(_h_jet_bb_Delta_eta, crossSection()/sumOfWeights());
scale(_h_jet_bb_Delta_phi, crossSection()/sumOfWeights());
scale(_h_jet_bb_Delta_pT, crossSection()/sumOfWeights());
scale(_h_jet_bb_Delta_R, crossSection()/sumOfWeights());
scale(_h_jet_b_jet_eta, crossSection()/sumOfWeights());
scale(_h_jet_b_jet_multiplicity, crossSection()/sumOfWeights());
scale(_h_jet_b_jet_phi, crossSection()/sumOfWeights());
scale(_h_jet_b_jet_pT, crossSection()/sumOfWeights());
scale(_h_jet_H_eta_using_bb, crossSection()/sumOfWeights());
scale(_h_jet_H_mass_using_bb, crossSection()/sumOfWeights());
scale(_h_jet_H_phi_using_bb, crossSection()/sumOfWeights());
scale(_h_jet_H_pT_using_bb, crossSection()/sumOfWeights());
scale(_h_jet_eta, crossSection()/sumOfWeights());
scale(_h_jet_multiplicity, crossSection()/sumOfWeights());
scale(_h_jet_phi, crossSection()/sumOfWeights());
scale(_h_jet_pT, crossSection()/sumOfWeights());
scale(_h_jet_VBbb_Delta_eta, crossSection()/sumOfWeights());
scale(_h_jet_VBbb_Delta_phi, crossSection()/sumOfWeights());
scale(_h_jet_VBbb_Delta_pT, crossSection()/sumOfWeights());
scale(_h_jet_VBbb_Delta_R, crossSection()/sumOfWeights());
scale(_h_VB_eta, crossSection()/sumOfWeights());
scale(_h_VB_mass, crossSection()/sumOfWeights());
scale(_h_Z_multiplicity, crossSection()/sumOfWeights());
scale(_h_W_multiplicity, crossSection()/sumOfWeights());
scale(_h_VB_phi, crossSection()/sumOfWeights());
scale(_h_VB_pT, crossSection()/sumOfWeights());
scale(_h_jet_bVB_angle_Hframe, crossSection()/sumOfWeights());
scale(_h_jet_bb_angle_Hframe, crossSection()/sumOfWeights());
scale(_h_jet_bVB_cosangle_Hframe, crossSection()/sumOfWeights());
scale(_h_jet_bb_cosangle_Hframe, crossSection()/sumOfWeights());
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_Z_multiplicity, _h_W_multiplicity;
Histo1DPtr _h_jet_bb_Delta_eta, _h_jet_bb_Delta_phi, _h_jet_bb_Delta_pT, _h_jet_bb_Delta_R;
Histo1DPtr _h_jet_b_jet_eta, _h_jet_b_jet_multiplicity, _h_jet_b_jet_phi, _h_jet_b_jet_pT;
Histo1DPtr _h_jet_H_eta_using_bb, _h_jet_H_mass_using_bb, _h_jet_H_phi_using_bb, _h_jet_H_pT_using_bb;
Histo1DPtr _h_jet_eta, _h_jet_multiplicity, _h_jet_phi, _h_jet_pT;
Histo1DPtr _h_jet_VBbb_Delta_eta, _h_jet_VBbb_Delta_phi, _h_jet_VBbb_Delta_pT, _h_jet_VBbb_Delta_R;
Histo1DPtr _h_VB_eta, _h_VB_mass, _h_VB_phi, _h_VB_pT;
Histo1DPtr _h_jet_bVB_angle_Hframe, _h_jet_bb_angle_Hframe, _h_jet_bVB_cosangle_Hframe, _h_jet_bb_cosangle_Hframe;
//Histo1DPtr _h_jet_cuts_bb_deltaR_v_HpT;
//@}
};
// This global object acts as a hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_VH2BB);
}
diff --git a/src/Analyses/MC_ZINC.cc b/src/Analyses/MC_ZINC.cc
--- a/src/Analyses/MC_ZINC.cc
+++ b/src/Analyses/MC_ZINC.cc
@@ -1,94 +1,95 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
namespace Rivet {
/// @brief MC validation analysis for Z events
class MC_ZINC : public Analysis {
public:
/// Default constructor
MC_ZINC()
: Analysis("MC_ZINC")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder zfinder(fs, cut, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zfinder, "ZFinder");
_h_Z_mass = bookHisto1D("Z_mass", 50, 66.0, 116.0);
_h_Z_pT = bookHisto1D("Z_pT", logspace(100, 1.0, 0.5*sqrtS()));
_h_Z_pT_peak = bookHisto1D("Z_pT_peak", 25, 0.0, 25.0);
_h_Z_y = bookHisto1D("Z_y", 40, -4.0, 4.0);
_h_Z_phi = bookHisto1D("Z_phi", 25, 0.0, TWOPI);
_h_lepton_pT = bookHisto1D("lepton_pT", logspace(100, 10.0, 0.25*sqrtS()));
_h_lepton_eta = bookHisto1D("lepton_eta", 40, -4.0, 4.0);
}
/// Do the analysis
void analyze(const Event & e) {
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size()!=1) {
vetoEvent;
}
const double weight = e.weight();
FourMomentum zmom(zfinder.bosons()[0].momentum());
_h_Z_mass->fill(zmom.mass(),weight);
_h_Z_pT->fill(zmom.pT(),weight);
_h_Z_pT_peak->fill(zmom.pT(),weight);
_h_Z_y->fill(zmom.rapidity(),weight);
_h_Z_phi->fill(zmom.azimuthalAngle(),weight);
foreach (const Particle& l, zfinder.constituents()) {
_h_lepton_pT->fill(l.pT(), weight);
_h_lepton_eta->fill(l.eta(), weight);
}
}
/// Finalize
void finalize() {
scale(_h_Z_mass, crossSection()/sumOfWeights());
scale(_h_Z_pT, crossSection()/sumOfWeights());
scale(_h_Z_pT_peak, crossSection()/sumOfWeights());
scale(_h_Z_y, crossSection()/sumOfWeights());
scale(_h_Z_phi, crossSection()/sumOfWeights());
scale(_h_lepton_pT, crossSection()/sumOfWeights());
scale(_h_lepton_eta, crossSection()/sumOfWeights());
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_Z_mass;
Histo1DPtr _h_Z_pT;
Histo1DPtr _h_Z_pT_peak;
Histo1DPtr _h_Z_y;
Histo1DPtr _h_Z_phi;
Histo1DPtr _h_lepton_pT;
Histo1DPtr _h_lepton_eta;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_ZINC);
}
diff --git a/src/Analyses/MC_ZJETS.cc b/src/Analyses/MC_ZJETS.cc
--- a/src/Analyses/MC_ZJETS.cc
+++ b/src/Analyses/MC_ZJETS.cc
@@ -1,84 +1,85 @@
// -*- C++ -*-
#include "Rivet/Analyses/MC_JetAnalysis.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// @brief MC validation analysis for Z + jets events
class MC_ZJETS : public MC_JetAnalysis {
public:
/// Default constructor
MC_ZJETS()
: MC_JetAnalysis("MC_ZJETS", 4, "Jets")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder zfinder(fs, cut, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zfinder, "ZFinder");
FastJets jetpro(zfinder.remainingFinalState(), FastJets::ANTIKT, 0.4);
addProjection(jetpro, "Jets");
_h_Z_jet1_deta = bookHisto1D("Z_jet1_deta", 50, -5.0, 5.0);
_h_Z_jet1_dR = bookHisto1D("Z_jet1_dR", 25, 0.5, 7.0);
MC_JetAnalysis::init();
}
/// Do the analysis
void analyze(const Event & e) {
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size()!=1) {
vetoEvent;
}
const double weight = e.weight();
FourMomentum zmom(zfinder.bosons()[0].momentum());
const Jets& jets = applyProjection<FastJets>(e, "Jets").jetsByPt(m_jetptcut);
if (jets.size() > 0) {
_h_Z_jet1_deta->fill(zmom.eta()-jets[0].eta(), weight);
_h_Z_jet1_dR->fill(deltaR(zmom, jets[0].momentum()), weight);
}
MC_JetAnalysis::analyze(e);
}
/// Finalize
void finalize() {
scale(_h_Z_jet1_deta, crossSection()/sumOfWeights());
scale(_h_Z_jet1_dR, crossSection()/sumOfWeights());
MC_JetAnalysis::finalize();
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_Z_jet1_deta;
Histo1DPtr _h_Z_jet1_dR;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_ZJETS);
}
diff --git a/src/Analyses/MC_ZKTSPLITTINGS.cc b/src/Analyses/MC_ZKTSPLITTINGS.cc
--- a/src/Analyses/MC_ZKTSPLITTINGS.cc
+++ b/src/Analyses/MC_ZKTSPLITTINGS.cc
@@ -1,60 +1,61 @@
// -*- C++ -*-
#include "Rivet/Analyses/MC_JetSplittings.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
namespace Rivet {
/// @brief MC validation analysis for Z + jets events
class MC_ZKTSPLITTINGS : public MC_JetSplittings {
public:
/// Default constructor
MC_ZKTSPLITTINGS()
: MC_JetSplittings("MC_ZKTSPLITTINGS", 4, "Jets")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zfinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder zfinder(fs, cut, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zfinder, "ZFinder");
FastJets jetpro(zfinder.remainingFinalState(), FastJets::KT, 0.6);
addProjection(jetpro, "Jets");
MC_JetSplittings::init();
}
/// Do the analysis
void analyze(const Event & e) {
const ZFinder& zfinder = applyProjection<ZFinder>(e, "ZFinder");
if (zfinder.bosons().size()!=1) {
vetoEvent;
}
MC_JetSplittings::analyze(e);
}
/// Finalize
void finalize() {
MC_JetSplittings::finalize();
}
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_ZKTSPLITTINGS);
}
diff --git a/src/Analyses/MC_ZZINC.cc b/src/Analyses/MC_ZZINC.cc
--- a/src/Analyses/MC_ZZINC.cc
+++ b/src/Analyses/MC_ZZINC.cc
@@ -1,186 +1,187 @@
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
namespace Rivet {
/// @brief MC validation analysis for Z[ee]Z[mumu] events
class MC_ZZINC : public Analysis {
public:
/// Default constructor
MC_ZZINC()
: Analysis("MC_ZZINC")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zeefinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder zeefinder(fs, cut, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zeefinder, "ZeeFinder");
VetoedFinalState zmminput;
zmminput.addVetoOnThisFinalState(zeefinder);
- ZFinder zmmfinder(zmminput, -3.5, 3.5, 25.0*GeV, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ ZFinder zmmfinder(zmminput, cut, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zmmfinder, "ZmmFinder");
// properties of the pair momentum
_h_ZZ_pT = bookHisto1D("ZZ_pT", logspace(100, 1.0, 0.5*sqrtS()));
_h_ZZ_pT_peak = bookHisto1D("ZZ_pT_peak", 25, 0.0, 25.0);
_h_ZZ_eta = bookHisto1D("ZZ_eta", 40, -7.0, 7.0);
_h_ZZ_phi = bookHisto1D("ZZ_phi", 25, 0.0, TWOPI);
_h_ZZ_m = bookHisto1D("ZZ_m", logspace(100, 150.0, 180.0+0.25*sqrtS()));
// correlations between the ZZ
_h_ZZ_dphi = bookHisto1D("ZZ_dphi", 25, 0.0, PI); /// @todo non-linear?
_h_ZZ_deta = bookHisto1D("ZZ_deta", 25, -7.0, 7.0);
_h_ZZ_dR = bookHisto1D("ZZ_dR", 25, 0.5, 7.0);
_h_ZZ_dpT = bookHisto1D("ZZ_dpT", logspace(100, 1.0, 0.5*sqrtS()));
_h_ZZ_costheta_planes = bookHisto1D("ZZ_costheta_planes", 25, -1.0, 1.0);
// properties of the Z bosons
_h_Z_pT = bookHisto1D("Z_pT", logspace(100, 10.0, 0.25*sqrtS()));
_h_Z_eta = bookHisto1D("Z_eta", 70, -7.0, 7.0);
// properties of the leptons
_h_Zl_pT = bookHisto1D("Zl_pT", logspace(100, 30.0, 0.1
*sqrtS()));
_h_Zl_eta = bookHisto1D("Zl_eta", 40, -3.5, 3.5);
// correlations between the opposite charge leptons
_h_ZeZm_dphi = bookHisto1D("ZeZm_dphi", 25, 0.0, PI);
_h_ZeZm_deta = bookHisto1D("ZeZm_deta", 25, -5.0, 5.0);
_h_ZeZm_dR = bookHisto1D("ZeZm_dR", 25, 0.5, 5.0);
_h_ZeZm_m = bookHisto1D("ZeZm_m", 100, 0.0, 300.0);
}
/// Do the analysis
void analyze(const Event & e) {
const double weight = e.weight();
const ZFinder& zeefinder = applyProjection<ZFinder>(e, "ZeeFinder");
if (zeefinder.bosons().size()!=1) {
vetoEvent;
}
const ZFinder& zmmfinder = applyProjection<ZFinder>(e, "ZmmFinder");
if (zmmfinder.bosons().size()!=1) {
vetoEvent;
}
FourMomentum zee(zeefinder.bosons()[0].momentum());
FourMomentum zmm(zmmfinder.bosons()[0].momentum());
FourMomentum zz(zee+zmm);
// find leptons
FourMomentum ep(zeefinder.constituents()[0].momentum()),
em(zeefinder.constituents()[1].momentum()),
mp(zmmfinder.constituents()[0].momentum()),
mm(zmmfinder.constituents()[1].momentum());
_h_ZZ_pT->fill(zz.pT(),weight);
_h_ZZ_pT_peak->fill(zz.pT(),weight);
_h_ZZ_eta->fill(zz.eta(),weight);
_h_ZZ_phi->fill(zz.azimuthalAngle(),weight);
double mzz2=zz.mass2();
if (mzz2>0.0) _h_ZZ_m->fill(sqrt(mzz2), weight);
_h_ZZ_dphi->fill(mapAngle0ToPi(zee.phi()-zmm.phi()), weight);
_h_ZZ_deta->fill(zee.eta()-zmm.eta(), weight);
_h_ZZ_dR->fill(deltaR(zee,zmm), weight);
_h_ZZ_dpT->fill(fabs(zee.pT()-zmm.pT()), weight);
Vector3 crossZee = ep.vector3().cross(em.vector3());
Vector3 crossZmm = mp.vector3().cross(mm.vector3());
double costheta = crossZee.dot(crossZmm)/crossZee.mod()/crossZmm.mod();
_h_ZZ_costheta_planes->fill(costheta, weight);
_h_Z_pT->fill(zee.pT(),weight);
_h_Z_pT->fill(zmm.pT(),weight);
_h_Z_eta->fill(zee.eta(),weight);
_h_Z_eta->fill(zmm.eta(),weight);
_h_Zl_pT->fill(ep.pT(), weight);
_h_Zl_pT->fill(em.pT(), weight);
_h_Zl_pT->fill(mp.pT(), weight);
_h_Zl_pT->fill(mm.pT(), weight);
_h_Zl_eta->fill(ep.eta(), weight);
_h_Zl_eta->fill(em.eta(), weight);
_h_Zl_eta->fill(mp.eta(), weight);
_h_Zl_eta->fill(mm.eta(), weight);
_h_ZeZm_dphi->fill(mapAngle0ToPi(ep.phi()-mm.phi()), weight);
_h_ZeZm_deta->fill(ep.eta()-mm.eta(), weight);
_h_ZeZm_dR->fill(deltaR(ep,mm), weight);
double m2=FourMomentum(ep+mm).mass2();
if (m2 < 0) m2 = 0.0;
_h_ZeZm_m->fill(sqrt(m2), weight);
}
/// Finalize
void finalize() {
double norm=crossSection()/sumOfWeights();
scale(_h_ZZ_pT, norm);
scale(_h_ZZ_pT_peak, norm);
scale(_h_ZZ_eta, norm);
scale(_h_ZZ_phi, norm);
scale(_h_ZZ_m, norm);
scale(_h_ZZ_dphi, norm);
scale(_h_ZZ_deta, norm);
scale(_h_ZZ_dR, norm);
scale(_h_ZZ_dpT, norm);
scale(_h_ZZ_costheta_planes, norm);
scale(_h_Z_pT, norm);
scale(_h_Z_eta, norm);
scale(_h_Zl_pT, norm);
scale(_h_Zl_eta, norm);
scale(_h_ZeZm_dphi, norm);
scale(_h_ZeZm_deta, norm);
scale(_h_ZeZm_dR, norm);
scale(_h_ZeZm_m, norm);
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_ZZ_pT;
Histo1DPtr _h_ZZ_pT_peak;
Histo1DPtr _h_ZZ_eta;
Histo1DPtr _h_ZZ_phi;
Histo1DPtr _h_ZZ_m;
Histo1DPtr _h_ZZ_dphi;
Histo1DPtr _h_ZZ_deta;
Histo1DPtr _h_ZZ_dR;
Histo1DPtr _h_ZZ_dpT;
Histo1DPtr _h_ZZ_costheta_planes;
Histo1DPtr _h_Z_pT;
Histo1DPtr _h_Z_eta;
Histo1DPtr _h_Zl_pT;
Histo1DPtr _h_Zl_eta;
Histo1DPtr _h_ZeZm_dphi;
Histo1DPtr _h_ZeZm_deta;
Histo1DPtr _h_ZeZm_dR;
Histo1DPtr _h_ZeZm_m;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_ZZINC);
}
diff --git a/src/Analyses/MC_ZZJETS.cc b/src/Analyses/MC_ZZJETS.cc
--- a/src/Analyses/MC_ZZJETS.cc
+++ b/src/Analyses/MC_ZZJETS.cc
@@ -1,117 +1,118 @@
// -*- C++ -*-
#include "Rivet/Analyses/MC_JetAnalysis.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
namespace Rivet {
/// @brief MC validation analysis for Z[ee]Z[mumu] + jets events
class MC_ZZJETS : public MC_JetAnalysis {
public:
/// Default constructor
MC_ZZJETS()
: MC_JetAnalysis("MC_ZZJETS", 4, "Jets")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zeefinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder zeefinder(fs, cut, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zeefinder, "ZeeFinder");
VetoedFinalState zmminput;
zmminput.addVetoOnThisFinalState(zeefinder);
- ZFinder zmmfinder(zmminput, -3.5, 3.5, 25.0*GeV, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ ZFinder zmmfinder(zmminput, cut, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zmmfinder, "ZmmFinder");
VetoedFinalState jetinput;
jetinput
.addVetoOnThisFinalState(zeefinder)
.addVetoOnThisFinalState(zmmfinder);
FastJets jetpro(jetinput, FastJets::ANTIKT, 0.4);
addProjection(jetpro, "Jets");
// correlations with jets
_h_ZZ_jet1_deta = bookHisto1D("ZZ_jet1_deta", 70, -7.0, 7.0);
_h_ZZ_jet1_dR = bookHisto1D("ZZ_jet1_dR", 25, 1.5, 7.0);
_h_Ze_jet1_dR = bookHisto1D("Ze_jet1_dR", 25, 0.0, 7.0);
// global stuff
_h_HT = bookHisto1D("HT", logspace(100, 100.0, 0.5*sqrtS()));
MC_JetAnalysis::init();
}
/// Do the analysis
void analyze(const Event & e) {
const double weight = e.weight();
const ZFinder& zeefinder = applyProjection<ZFinder>(e, "ZeeFinder");
if (zeefinder.bosons().size() != 1) vetoEvent;
const ZFinder& zmmfinder = applyProjection<ZFinder>(e, "ZmmFinder");
if (zmmfinder.bosons().size() != 1) vetoEvent;
FourMomentum zee = zeefinder.bosons()[0].momentum();
FourMomentum zmm = zmmfinder.bosons()[0].momentum();
FourMomentum zz = zee + zmm;
// find leptons
FourMomentum ep = zeefinder.constituents()[0].momentum();
FourMomentum em = zeefinder.constituents()[1].momentum();
FourMomentum mp = zmmfinder.constituents()[0].momentum();
FourMomentum mm = zmmfinder.constituents()[1].momentum();
const Jets& jets = applyProjection<FastJets>(e, "Jets").jetsByPt(m_jetptcut);
if (jets.size() > 0) {
_h_ZZ_jet1_deta->fill(zz.eta()-jets[0].eta(), weight);
_h_ZZ_jet1_dR->fill(deltaR(zz, jets[0].momentum()), weight);
_h_Ze_jet1_dR->fill(deltaR(ep, jets[0].momentum()), weight);
}
double HT = ep.pT() + em.pT() + mp.pT() + mm.pT();
foreach (const Jet& jet, jets) HT += jet.pT();
if (HT > 0.0) _h_HT->fill(HT/GeV, weight);
MC_JetAnalysis::analyze(e);
}
/// Finalize
void finalize() {
const double norm = crossSection()/sumOfWeights();
scale(_h_ZZ_jet1_deta, norm);
scale(_h_ZZ_jet1_dR, norm);
scale(_h_Ze_jet1_dR, norm);
scale(_h_HT, norm);
MC_JetAnalysis::finalize();
}
//@}
private:
/// @name Histograms
//@{
Histo1DPtr _h_ZZ_jet1_deta;
Histo1DPtr _h_ZZ_jet1_dR;
Histo1DPtr _h_Ze_jet1_dR;
Histo1DPtr _h_HT;
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_ZZJETS);
}
diff --git a/src/Analyses/MC_ZZKTSPLITTINGS.cc b/src/Analyses/MC_ZZKTSPLITTINGS.cc
--- a/src/Analyses/MC_ZZKTSPLITTINGS.cc
+++ b/src/Analyses/MC_ZZKTSPLITTINGS.cc
@@ -1,74 +1,75 @@
// -*- C++ -*-
#include "Rivet/Analyses/MC_JetSplittings.hh"
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/FastJets.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
namespace Rivet {
/// @brief MC validation analysis for Z[ee]Z[mumu] + jets events
class MC_ZZKTSPLITTINGS : public MC_JetSplittings {
public:
/// Default constructor
MC_ZZKTSPLITTINGS()
: MC_JetSplittings("MC_ZZKTSPLITTINGS", 4, "Jets")
{ }
/// @name Analysis methods
//@{
/// Book histograms
void init() {
FinalState fs;
- ZFinder zeefinder(fs, -3.5, 3.5, 25.0*GeV, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ Cut cut = EtaIn(-3.5,3.5) & (Cuts::pT >= 25.0*GeV);
+ ZFinder zeefinder(fs, cut, PID::ELECTRON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zeefinder, "ZeeFinder");
VetoedFinalState zmminput;
zmminput.addVetoOnThisFinalState(zeefinder);
- ZFinder zmmfinder(zmminput, -3.5, 3.5, 25.0*GeV, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
+ ZFinder zmmfinder(zmminput, cut, PID::MUON, 65.0*GeV, 115.0*GeV, 0.2, true, true);
addProjection(zmmfinder, "ZmmFinder");
VetoedFinalState jetinput;
jetinput
.addVetoOnThisFinalState(zeefinder)
.addVetoOnThisFinalState(zmmfinder);
FastJets jetpro(jetinput, FastJets::KT, 0.6);
addProjection(jetpro, "Jets");
MC_JetSplittings::init();
}
/// Do the analysis
void analyze(const Event & e) {
const ZFinder& zeefinder = applyProjection<ZFinder>(e, "ZeeFinder");
if (zeefinder.bosons().size()!=1) {
vetoEvent;
}
const ZFinder& zmmfinder = applyProjection<ZFinder>(e, "ZmmFinder");
if (zmmfinder.bosons().size()!=1) {
vetoEvent;
}
MC_JetSplittings::analyze(e);
}
/// Finalize
void finalize() {
MC_JetSplittings::finalize();
}
//@}
};
// The hook for the plugin system
DECLARE_RIVET_PLUGIN(MC_ZZKTSPLITTINGS);
}
diff --git a/src/Projections/WFinder.cc b/src/Projections/WFinder.cc
--- a/src/Projections/WFinder.cc
+++ b/src/Projections/WFinder.cc
@@ -1,227 +1,152 @@
// -*- C++ -*-
#include "Rivet/Projections/WFinder.hh"
#include "Rivet/Projections/InvMassFinalState.hh"
#include "Rivet/Projections/MissingMomentum.hh"
#include "Rivet/Projections/MergedFinalState.hh"
#include "Rivet/Projections/LeptonClusters.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
namespace Rivet {
-
WFinder::WFinder(const FinalState& inputfs,
- double etaMin, double etaMax,
- double pTmin,
+ Cut fsCut,
PdgId pid,
double minmass, double maxmass,
double missingET,
double dRmax, bool clusterPhotons, bool trackPhotons,
double masstarget,
- bool useTransverseMass) {
- Cut eta = Range( Cuts::eta, etaMin, etaMax );
- Cut pt = Cuts::pT >= pTmin;
- _init(inputfs, eta & pt, pid, minmass, maxmass, missingET,
- dRmax, clusterPhotons, trackPhotons, masstarget, useTransverseMass);
- }
-
- WFinder::WFinder(const FinalState& inputfs,
- Cut cuts,
- PdgId pid,
- double minmass, double maxmass,
- double missingET,
- double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget,
- bool useTransverseMass) {
- _init(inputfs, cuts, pid, minmass, maxmass, missingET,
- dRmax, clusterPhotons, trackPhotons, masstarget, useTransverseMass);
- }
-
-
- // WFinder::WFinder(const FinalState& inputfs,
- // const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- // PdgId pid,
- // double minmass, double maxmass,
- // double missingET,
- // double dRmax, bool clusterPhotons, bool trackPhotons,
- // double masstarget,
- // bool useTransverseMass) {
- // _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, missingET,
- // dRmax, clusterPhotons, trackPhotons, masstarget, useTransverseMass);
- // }
-
-
- // WFinder::WFinder(double etaMin, double etaMax,
- // double pTmin,
- // PdgId pid,
- // double minmass, double maxmass,
- // double missingET,
- // double dRmax, bool clusterPhotons, bool trackPhotons,
- // double masstarget,
- // bool useTransverseMass) {
- // Cut eta = Range( Cuts::eta, etaMin, etaMax );
- // Cut pt = Cuts::pT >= pTmin;
- // FinalState inputfs;
- // _init(inputfs, eta & pt, pTmin, pid, minmass, maxmass, missingET,
- // dRmax, clusterPhotons, trackPhotons, masstarget, useTransverseMass);
- // }
-
-
- // WFinder::WFinder(const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- // PdgId pid,
- // double minmass, double maxmass,
- // double missingET,
- // double dRmax, bool clusterPhotons, bool trackPhotons,
- // double masstarget,
- // bool useTransverseMass) {
- // FinalState inputfs;
- // _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, missingET,
- // dRmax, clusterPhotons, trackPhotons, masstarget, useTransverseMass);
- // }
-
-
- void WFinder::_init(const FinalState& inputfs,
- Cut fsCut,
- // const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- PdgId pid,
- double minmass, double maxmass,
- double missingET,
- double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget,
- bool useTransverseMass)
+ bool useTransverseMass)
{
setName("WFinder");
_minmass = minmass;
_maxmass = maxmass;
_masstarget = masstarget;
_pid = pid;
_trackPhotons = trackPhotons;
_useTransverseMass = useTransverseMass;
// Check that the arguments are legal
assert(abs(_pid) == PID::ELECTRON || abs(_pid) == PID::MUON);
_nu_pid = abs(_pid) + 1;
assert(abs(_nu_pid) == PID::NU_E || abs(_nu_pid) == PID::NU_MU);
// Don't make pT or eta cuts on the neutrino
IdentifiedFinalState neutrinos(inputfs);
neutrinos.acceptNeutrinos();
addProjection(neutrinos, "Neutrinos");
// Lepton clusters
IdentifiedFinalState bareleptons(inputfs);
bareleptons.acceptIdPair(pid);
LeptonClusters leptons(inputfs, bareleptons, dRmax,
clusterPhotons, fsCut); //etaRanges, pTmin);
addProjection(leptons, "LeptonClusters");
// Add MissingMomentum proj to calc MET
MissingMomentum vismom(inputfs);
addProjection(vismom, "MissingET");
// Set ETmiss
_etMiss = missingET;
VetoedFinalState remainingFS;
remainingFS.addVetoOnThisFinalState(*this);
addProjection(remainingFS, "RFS");
}
/////////////////////////////////////////////////////
const FinalState& WFinder::remainingFinalState() const {
return getProjection<FinalState>("RFS");
}
int WFinder::compare(const Projection& p) const {
PCmp LCcmp = mkNamedPCmp(p, "LeptonClusters");
if (LCcmp != EQUIVALENT) return LCcmp;
const WFinder& other = dynamic_cast<const WFinder&>(p);
return (cmp(_minmass, other._minmass) || cmp(_maxmass, other._maxmass) ||
cmp(_useTransverseMass, other._useTransverseMass) ||
cmp(_etMiss, other._etMiss) ||
cmp(_pid, other._pid) || cmp(_trackPhotons, other._trackPhotons));
}
void WFinder::project(const Event& e) {
clear();
const LeptonClusters& leptons = applyProjection<LeptonClusters>(e, "LeptonClusters");
const FinalState& neutrinos = applyProjection<FinalState>(e, "Neutrinos");
// Make and register an invariant mass final state for the W decay leptons
vector<pair<PdgId, PdgId> > l_nu_ids;
l_nu_ids += make_pair(abs(_pid), -abs(_nu_pid));
l_nu_ids += make_pair(-abs(_pid), abs(_nu_pid));
InvMassFinalState imfs(l_nu_ids, _minmass, _maxmass, _masstarget);
imfs.useTransverseMass(_useTransverseMass);
Particles tmp;
tmp.insert(tmp.end(), leptons.clusteredLeptons().begin(), leptons.clusteredLeptons().end());
tmp.insert(tmp.end(), neutrinos.particles().begin(), neutrinos.particles().end());
imfs.calc(tmp);
if (imfs.particlePairs().size() < 1) return;
ParticlePair Wconstituents(imfs.particlePairs()[0]);
Particle p1(Wconstituents.first), p2(Wconstituents.second);
if (PID::threeCharge(p1)==0) {
_constituentLeptons += p2;
_constituentNeutrinos += p1;
} else {
_constituentLeptons += p1;
_constituentNeutrinos += p2;
}
FourMomentum pW = p1.momentum() + p2.momentum();
const int w3charge = PID::threeCharge(p1) + PID::threeCharge(p2);
assert(abs(w3charge) == 3);
const int wcharge = w3charge/3;
stringstream msg;
string wsign = (wcharge == 1) ? "+" : "-";
string wstr = "W" + wsign;
msg << wstr << " reconstructed from: " << "\n"
<< " " << p1.momentum() << " " << p1.pdgId() << "\n"
<< " + " << p2.momentum() << " " << p2.pdgId();
MSG_DEBUG(msg.str());
// Check missing ET
const MissingMomentum& vismom = applyProjection<MissingMomentum>(e, "MissingET");
/// @todo Restrict missing momentum eta range? Use vectorET()?
if (vismom.scalarEt() < _etMiss) {
MSG_DEBUG("Not enough missing ET: " << vismom.scalarEt()/GeV
<< " GeV vs. " << _etMiss/GeV << " GeV");
return;
}
// Make W Particle and insert into particles list
const PdgId wpid = (wcharge == 1) ? PID::WPLUSBOSON : PID::WMINUSBOSON;
_bosons.push_back(Particle(wpid, pW));
// Find the LeptonClusters and neutrinos which survived the IMFS cut such that we can
// extract their original particles
foreach (const Particle& p, _constituentNeutrinos) {
_theParticles.push_back(p);
}
foreach (const Particle& p, _constituentLeptons) {
foreach (const ClusteredLepton& l, leptons.clusteredLeptons()) {
if (p.pdgId()==l.pdgId() && p.momentum()==l.momentum()) {
_theParticles.push_back(l.constituentLepton());
if (_trackPhotons) {
_theParticles.insert(_theParticles.end(),
l.constituentPhotons().begin(), l.constituentPhotons().end());
}
}
}
}
}
}
diff --git a/src/Projections/ZFinder.cc b/src/Projections/ZFinder.cc
--- a/src/Projections/ZFinder.cc
+++ b/src/Projections/ZFinder.cc
@@ -1,161 +1,102 @@
// -*- C++ -*-
#include "Rivet/Projections/ZFinder.hh"
#include "Rivet/Projections/InvMassFinalState.hh"
#include "Rivet/Projections/LeptonClusters.hh"
#include "Rivet/Projections/VetoedFinalState.hh"
namespace Rivet {
ZFinder::ZFinder(const FinalState& inputfs,
- Cut cuts,
+ Cut fsCut,
PdgId pid,
double minmass, double maxmass,
double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget) {
- _init(inputfs, cuts,
- pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget);
- }
-
- ZFinder::ZFinder(const FinalState& inputfs,
- double etaMin, double etaMax,
- double pTmin,
- PdgId pid,
- double minmass, double maxmass,
- double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget) {
- Cut eta = Range( Cuts::eta, etaMin, etaMax );
- Cut pt = Cuts::pT >= pTmin;
- _init(inputfs, eta & pt, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget);
- }
-
-
- // ZFinder::ZFinder(const FinalState& inputfs,
- // const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- // PdgId pid,
- // double minmass, const double maxmass,
- // double dRmax, bool clusterPhotons, bool trackPhotons,
- // double masstarget) {
- // _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget);
- // }
-
-
- // ZFinder::ZFinder(double etaMin, double etaMax,
- // double pTmin,
- // PdgId pid,
- // double minmass, double maxmass,
- // double dRmax, bool clusterPhotons, bool trackPhotons,
- // double masstarget) {
- // vector<pair<double, double> > etaRanges;
- // etaRanges += std::make_pair(etaMin, etaMax);
- // FinalState inputfs;
- // _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget);
- // }
-
-
- // ZFinder::ZFinder(const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- // PdgId pid,
- // double minmass, const double maxmass,
- // double dRmax, bool clusterPhotons, bool trackPhotons,
- // double masstarget) {
- // FinalState inputfs;
- // _init(inputfs, etaRanges, pTmin, pid, minmass, maxmass, dRmax, clusterPhotons, trackPhotons, masstarget);
- // }
-
- void ZFinder::_init(const FinalState& inputfs, Cut fsCut,
- // const std::vector<std::pair<double, double> >& etaRanges,
- // double pTmin,
- PdgId pid,
- double minmass, double maxmass,
- double dRmax, bool clusterPhotons, bool trackPhotons,
- double masstarget)
+ double masstarget)
{
setName("ZFinder");
_minmass = minmass;
_maxmass = maxmass;
_masstarget = masstarget;
_pid = pid;
_trackPhotons = trackPhotons;
IdentifiedFinalState bareleptons(inputfs);
bareleptons.acceptIdPair(pid);
LeptonClusters leptons(inputfs, bareleptons, dRmax,
clusterPhotons, fsCut);
- // etaRanges, pTmin);
addProjection(leptons, "LeptonClusters");
VetoedFinalState remainingFS;
remainingFS.addVetoOnThisFinalState(*this);
addProjection(remainingFS, "RFS");
}
/////////////////////////////////////////////////////
const FinalState& ZFinder::remainingFinalState() const
{
return getProjection<FinalState>("RFS");
}
int ZFinder::compare(const Projection& p) const {
PCmp LCcmp = mkNamedPCmp(p, "LeptonClusters");
if (LCcmp != EQUIVALENT) return LCcmp;
const ZFinder& other = dynamic_cast<const ZFinder&>(p);
return (cmp(_minmass, other._minmass) || cmp(_maxmass, other._maxmass) ||
cmp(_pid, other._pid) || cmp(_trackPhotons, other._trackPhotons));
}
void ZFinder::project(const Event& e) {
clear();
const LeptonClusters& leptons = applyProjection<LeptonClusters>(e, "LeptonClusters");
InvMassFinalState imfs(std::make_pair(_pid, -_pid), _minmass, _maxmass, _masstarget);
Particles tmp;
tmp.insert(tmp.end(), leptons.clusteredLeptons().begin(), leptons.clusteredLeptons().end());
imfs.calc(tmp);
if (imfs.particlePairs().size() < 1) return;
ParticlePair Zconstituents(imfs.particlePairs()[0]);
Particle l1(Zconstituents.first), l2(Zconstituents.second);
if (PID::threeCharge(l1)>0.0) {
_constituents += l1, l2;
}
else {
_constituents += l2, l1;
}
FourMomentum pZ = l1.momentum() + l2.momentum();
const int z3charge = PID::threeCharge(l1.pdgId()) + PID::threeCharge(l2.pdgId());
assert(z3charge == 0);
stringstream msg;
msg << "Z reconstructed from: \n"
<< " " << l1.momentum() << " " << l1.pdgId() << "\n"
<< " + " << l2.momentum() << " " << l2.pdgId();
MSG_DEBUG(msg.str());
_bosons.push_back(Particle(PID::ZBOSON, pZ));
// Find the LeptonClusters which survived the IMFS cut such that we can
// extract their original particles
foreach (const Particle& p, _constituents) {
foreach (const ClusteredLepton& l, leptons.clusteredLeptons()) {
if (p.pdgId()==l.pdgId() && p.momentum()==l.momentum()) {
_theParticles.push_back(l.constituentLepton());
if (_trackPhotons) {
_theParticles.insert(_theParticles.end(),
l.constituentPhotons().begin(), l.constituentPhotons().end());
}
}
}
}
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 7:13 PM (1 d, 12 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805781
Default Alt Text
(100 KB)
Attached To
rRIVETHG rivethg
Event Timeline
Log In to Comment