rivet is hosted by Hepforge, IPPP Durham
Rivet 4.0.0
SmearedJets.hh
1// -*- C++ -*-
2#ifndef RIVET_SmearedJets_HH
3#define RIVET_SmearedJets_HH
4
5#include "Rivet/Jet.hh"
6#include "Rivet/Particle.hh"
7#include "Rivet/Projection.hh"
8#include "Rivet/Projections/JetFinder.hh"
9#include "Rivet/Tools/SmearingFunctions.hh"
10#include <functional>
11
12namespace Rivet {
13
14
16
17
19 class SmearedJets : public JetFinder {
20 public:
21
24
29 const JetSmearFn& smearFn,
30 const JetEffFn& bTagEffFn=JET_BTAG_PERFECT,
31 const JetEffFn& cTagEffFn=JET_CTAG_PERFECT)
32 : SmearedJets(ja, bTagEffFn, cTagEffFn, smearFn)
33 { }
34
35
40 template <typename... Args,
41 typename = std::enable_if_t< allArgumentsOf<JetEffSmearFn, Args...>::value >>
42 SmearedJets(const JetFinder& ja, const JetEffFn& bTagEffFn, const JetEffFn& cTagEffFn, Args&& ... effSmearFns)
43 : _detFns({JetEffSmearFn(std::forward<Args>(effSmearFns))...}), _bTagEffFn(bTagEffFn), _cTagEffFn(cTagEffFn)
44 {
45 setName("SmearedJets");
46 declare(ja, "TruthJets");
47 }
48
52
53
56
58
60 using Projection::operator =;
61
62
64 CmpState compare(const Projection& p) const {
65 // Compare truth jets definitions
66 const CmpState teq = mkPCmp(p, "TruthJets");
67 if (teq != CmpState::EQ) return teq;
68
69 // Compare lists of detector functions
70 const SmearedJets& other = dynamic_cast<const SmearedJets&>(p);
71 const CmpState nfeq = cmp(_detFns.size(), other._detFns.size());
72 if (nfeq != CmpState::EQ) return nfeq;
73 for (size_t i = 0; i < _detFns.size(); ++i) {
74 const CmpState feq = _detFns[i].cmp(other._detFns[i]);
75 if (feq != CmpState::EQ) return feq;
76 }
77 return Rivet::cmp(get_address(_bTagEffFn), get_address(other._bTagEffFn)) ||
78 Rivet::cmp(get_address(_cTagEffFn), get_address(other._cTagEffFn));
79 }
80
81
83 void project(const Event& e) {
84 // Copying and filtering
85 const Jets& truthjets = apply<JetFinder>(e, "TruthJets").jetsByPt(); //truthJets();
86 _recojets.clear(); _recojets.reserve(truthjets.size());
87 // Apply jet smearing and efficiency transforms
88 for (const Jet& j : truthjets) {
89 Jet jdet = j;
90 bool keep = true;
91 MSG_DEBUG("Truth jet: " << "mom=" << jdet.mom()/GeV << " GeV, pT=" << jdet.pT()/GeV << ", eta=" << jdet.eta());
92 for (const JetEffSmearFn& fn : _detFns) {
93 double jeff = -1;
94 std::tie(jdet, jeff) = fn(jdet); // smear & eff
95 // Re-add constituents & tags if (we assume accidentally) they were lost by the smearing function
96 if (jdet.particles().empty() && !j.particles().empty()) jdet.particles() = j.particles();
97 if (jdet.tags().empty() && !j.tags().empty()) jdet.tags() = j.tags();
98 MSG_DEBUG(" ->" << "mom=" << jdet.mom()/GeV << " GeV, pT=" << jdet.pT()/GeV << ", eta=" << jdet.eta());
99 // MSG_DEBUG("New det jet: "
100 // << "mom=" << jdet.mom()/GeV << " GeV, pT=" << jdet.pT()/GeV << ", eta=" << jdet.eta()
101 // << ", b-tag=" << boolalpha << jdet.bTagged()
102 // << ", c-tag=" << boolalpha << jdet.cTagged()
103 // << " : eff=" << 100*jeff << "%");
104 if (jeff <= 0) { keep = false; break; } //< no need to roll expensive dice (and we deal with -ve probabilities, just in case)
105 if (jeff < 1 && rand01() > jeff) { keep = false; break; } //< roll dice (and deal with >1 probabilities, just in case)
106 }
107 if (keep) _recojets.push_back(jdet);
108 }
109 // Apply tagging efficiencies, using smeared kinematics as input to the tag eff functions
110 for (Jet& j : _recojets) {
111 // Decide whether or not there should be a b-tag on this jet
112 const double beff = _bTagEffFn ? _bTagEffFn(j) : j.bTagged();
113 const bool btag = beff == 1 || (beff != 0 && rand01() < beff);
114 // Remove b-tags if needed, and add a dummy one if needed
115 if (!btag && j.bTagged()) j.tags().erase(std::remove_if(j.tags().begin(), j.tags().end(), hasBottom), j.tags().end());
116 if (btag && !j.bTagged()) j.tags().push_back(Particle(PID::BQUARK, j.mom()));
117 // Decide whether or not there should be a c-tag on this jet
118 const double ceff = _cTagEffFn ? _cTagEffFn(j) : j.cTagged();
119 const bool ctag = ceff == 1 || (ceff != 0 && rand01() < beff);
120 // Remove c-tags if needed, and add a dummy one if needed
121 if (!ctag && j.cTagged()) j.tags().erase(std::remove_if(j.tags().begin(), j.tags().end(), hasCharm), j.tags().end());
122 if (ctag && !j.cTagged()) j.tags().push_back(Particle(PID::CQUARK, j.mom()));
123 }
124 }
125
126
128 Jets _jets() const { return _recojets; }
129
131 const Jets truthJets() const {
132 return getProjection<JetFinder>("TruthJets").jetsByPt();
133 }
134
136 void reset() { _recojets.clear(); }
137
138
139 protected:
140
142 Jets _recojets;
143
145 vector<JetEffSmearFn> _detFns;
146
148 JetEffFn _bTagEffFn, _cTagEffFn;
149
150 };
151
152
153}
154
155#endif
Representation of a HepMC event, and enabler of Projection caching.
Definition Event.hh:22
Abstract base class for projections which can return a set of Jets.
Definition JetFinder.hh:23
size_t size() const
Count the jets.
Definition JetFinder.hh:147
Representation of a clustered jet of particles.
Definition Jet.hh:42
Particles & particles()
Get the particles in this jet.
Definition Jet.hh:71
Particles & tags()
Particles which have been tag-matched to this jet.
Definition Jet.hh:113
Specialised vector of Jet objects.
Definition Jet.hh:21
const FourMomentum & mom() const
Get equivalent single momentum four-vector (const) (alias).
Definition ParticleBase.hh:39
double pT() const
Get the directly (alias).
Definition ParticleBase.hh:63
double eta() const
Get the directly (alias).
Definition ParticleBase.hh:87
Particle representation, either from a HepMC::GenEvent or reconstructed.
Definition Particle.hh:45
const PROJ & declare(const PROJ &proj, const std::string &name) const
Register a contained projection (user-facing version)
Definition ProjectionApplier.hh:175
Base class for all Rivet projections.
Definition Projection.hh:29
Cmp< Projection > mkPCmp(const Projection &otherparent, const std::string &pname) const
void setName(const std::string &name)
Used by derived classes to set their name.
Definition Projection.hh:148
Wrapper projection for smearing Jets with detector resolutions and efficiencies.
Definition SmearedJets.hh:19
void project(const Event &e)
Perform the jet finding & smearing calculation.
Definition SmearedJets.hh:83
SmearedJets(const JetFinder &ja, const JetSmearFn &smearFn, const JetEffFn &bTagEffFn=JET_BTAG_PERFECT, const JetEffFn &cTagEffFn=JET_CTAG_PERFECT)
Constructor with a reco efficiency and optional tagging efficiencies.
Definition SmearedJets.hh:28
SmearedJets(const JetFinder &ja, const JetEffFn &bTagEffFn, const JetEffFn &cTagEffFn, Args &&... effSmearFns)
Constructor with a parameter pack of efficiency and smearing functions, plus optional tagging efficie...
Definition SmearedJets.hh:42
CmpState compare(const Projection &p) const
Compare to another SmearedJets.
Definition SmearedJets.hh:64
const Jets truthJets() const
Get the truth jets (sorted by pT)
Definition SmearedJets.hh:131
void reset()
Reset the projection. Smearing functions will be unchanged.
Definition SmearedJets.hh:136
RIVET_DEFAULT_PROJ_CLONE(SmearedJets)
Clone on the heap.
#define MSG_DEBUG(x)
Debug messaging, not enabled by default, using MSG_LVL.
Definition Logging.hh:182
double JET_CTAG_PERFECT(const Jet &j)
Return 1 if the given Jet contains a c, otherwise 0.
Definition JetSmearingFunctions.hh:57
double JET_BTAG_PERFECT(const Jet &j)
Return 1 if the given Jet contains a b, otherwise 0.
Definition JetSmearingFunctions.hh:53
function< Jet(const Jet &)> JetSmearFn
Typedef for Jet smearing functions/functors.
Definition JetSmearingFunctions.hh:20
function< double(const Jet &)> JetEffFn
Typedef for Jet efficiency functions/functors.
Definition JetSmearingFunctions.hh:23
Definition MC_CENT_PPB_Projections.hh:10
double rand01()
Return a uniformly sampled random number between 0 and 1.
Cmp< T > cmp(const T &t1, const T &t2)
Global helper function for easy creation of Cmp objects.
Definition Cmp.hh:255
uintptr_t get_address(std::function< T(U...)> f)
Get a function pointer / hash integer from an std::function.
Definition RivetSTL.hh:216
Functor for simultaneous efficiency-filtering and smearing of Jets.
Definition JetSmearingFunctions.hh:94