rivet is hosted by Hepforge, IPPP Durham
Rivet 3.1.6
Event.hh
1// -*- C++ -*-
2#ifndef RIVET_Event_HH
3#define RIVET_Event_HH
4
5#include "Rivet/Config/RivetCommon.hh"
6#include "Rivet/Particle.hh"
7#include "Rivet/Projection.hh"
8
9namespace Rivet {
10
11
22 class Event {
23 public:
24
26
27
29 Event(const GenEvent* ge, const vector<size_t>& indices = {}, bool strip = false)
30 : _weightIndices(indices), _genevent_original(ge) {
31 assert(ge);
32 _genevent = *ge;
33 if ( strip ) _strip(_genevent);
34 _init(*ge);
35 }
36
39 Event(const GenEvent& ge, const vector<size_t>& indices = {}, bool strip = false)
40 : _weightIndices(indices), _genevent_original(&ge), _genevent(ge) {
41 if ( strip ) _strip(_genevent);
42 _init(ge);
43 }
44
46 Event(const Event& e)
47 : _weightIndices(e._weightIndices),
48 _genevent_original(e._genevent_original),
49 _genevent(e._genevent)
50 { }
51
53
54
56
57
59 const GenEvent* genEvent() const { return &_genevent; }
60
62 const GenEvent* originalGenEvent() const { return _genevent_original; }
63
66
68 double sqrtS() const;
69
71 double asqrtS() const;
72
74
75
77
78
80 const Particles& allParticles() const;
81
85 inline Particles allParticles(const Cut& c) const {
86 return filter_select(allParticles(), c);
87 }
88
92 template <typename FN>
93 inline Particles allParticles(const FN& f) const {
94 return filter_select(allParticles(), f);
95 }
96
98 std::valarray<double> weights() const;
99
101 std::vector<std::pair<double, double>> crossSections() const;
102
104 DEPRECATED("Event weight does not need to be included anymore. For compatibility, it's always == 1 now.")
105 double weight() const { return 1.0; }
107
109
110
124 template <typename PROJ>
125 const PROJ& applyProjection(PROJ& p) const {
126 static bool docaching = getEnvParam("RIVET_CACHE_PROJECTIONS", true);
127 if (docaching) {
128 MSG_TRACE("Applying projection " << &p << " (" << p.name() << ") -> comparing to projections " << _projections);
129 // First search for this projection *or an equivalent* in the already-executed list
130 const Projection* cpp(&p);
132 // std::set<const Projection*>::const_iterator old = _projections.find(cpp);
133 std::set<const Projection*>::const_iterator old = std::begin(_projections);
134 std::uintptr_t recpp = reinterpret_cast<std::uintptr_t>(cpp);
135 for (; old != _projections.end(); ++old)
136 if (reinterpret_cast<std::uintptr_t>(*old) == recpp) break;
137 if (old != _projections.end()) {
138 MSG_TRACE("Equivalent projection found -> returning already-run projection " << *old);
139 const Projection& pRef = **old;
140 return pcast<PROJ>(pRef);
141 }
142 MSG_TRACE("No equivalent projection in the already-run list -> projecting now");
143 } else {
144 MSG_TRACE("Applying projection " << &p << " (" << p.name() << ") WITHOUT projection caching & comparison");
145 }
146 // If this one hasn't been run yet on this event, run it and add to the list
147 Projection* pp = const_cast<Projection*>(&p);
148 pp->_isValid = true;
149 pp->project(*this);
150 if (docaching) _projections.insert(pp);
151 return p;
152 }
153
154
156 template <typename PROJ>
157 const PROJ& applyProjection(PROJ* pp) const {
158 if (!pp) throw Error("Event::applyProjection(PROJ*): Projection pointer is null.");
159 return applyProjection(*pp);
160 }
161
163
164
165 private:
166
168 Log& getLog() const;
169
171 void _init(const GenEvent& ge);
172
175 void _strip(GenEvent & ge);
176
177 // /// @brief Convert the GenEvent to use conventional alignment
178 // ///
179 // /// For example, FHerwig only produces DIS events in the unconventional
180 // /// hadron-lepton orientation and has to be corrected for DIS analysis
181 // /// portability.
182 // void _geNormAlignment();
183
188 const std::vector<size_t> _weightIndices;
189
196 const GenEvent* _genevent_original;
197
207 mutable GenEvent _genevent;
208
211 mutable Particles _particles;
212
214 mutable std::set<ConstProjectionPtr> _projections;
215
217 mutable std::valarray<double> _weights;
218
220 mutable std::vector<std::pair<double,double>> _xsecs;
221 };
222
223
224}
225
226#endif
Representation of a HepMC event, and enabler of Projection caching.
Definition: Event.hh:22
const PROJ & applyProjection(PROJ &p) const
Add a projection p to this Event.
Definition: Event.hh:125
const PROJ & applyProjection(PROJ *pp) const
Add a projection p to this Event by pointer.
Definition: Event.hh:157
double weight() const
Obsolete weight method. Always returns 1 now.
Definition: Event.hh:105
double asqrtS() const
Get the beam centre-of-mass energy per nucleon.
Event(const GenEvent &ge, const vector< size_t > &indices={}, bool strip=false)
Definition: Event.hh:39
double sqrtS() const
Get the beam centre-of-mass energy.
Particles allParticles(const Cut &c) const
All the raw GenEvent particles, wrapped in Rivet::Particle objects, but with a Cut applied.
Definition: Event.hh:85
Event(const Event &e)
Copy constructor.
Definition: Event.hh:46
Particles allParticles(const FN &f) const
All the raw GenEvent particles, wrapped in Rivet::Particle objects, but with a selection function app...
Definition: Event.hh:93
const Particles & allParticles() const
All the raw GenEvent particles, wrapped in Rivet::Particle objects.
Event(const GenEvent *ge, const vector< size_t > &indices={}, bool strip=false)
Constructor from a HepMC GenEvent pointer.
Definition: Event.hh:29
const GenEvent * originalGenEvent() const
The generated event obtained from an external event generator.
Definition: Event.hh:62
const GenEvent * genEvent() const
The generated event obtained from an external event generator.
Definition: Event.hh:59
std::valarray< double > weights() const
The generation weights associated with the event.
std::vector< std::pair< double, double > > crossSections() const
The generation cross-sections associated with the event.
ParticlePair beams() const
Get the beam particles.
Logging system for controlled & formatted writing to stdout.
Definition: Logging.hh:10
Specialised vector of Particle objects.
Definition: Particle.hh:25
Base class for all Rivet projections.
Definition: Projection.hh:29
virtual void project(const Event &e)=0
Jets filter_select(const Jets &jets, const Cut &c)
Filter a jet collection in-place to the subset that passes the supplied Cut.
Definition: JetUtils.hh:157
#define MSG_TRACE(x)
Lowest-level, most verbose messaging, using MSG_LVL.
Definition: Logging.hh:193
double p(const ParticleBase &p)
Unbound function access to p.
Definition: ParticleBaseUtils.hh:653
T getEnvParam(const std::string name, const T &fallback)
Get a parameter from a named environment variable, with automatic type conversion.
Definition: Utils.hh:678
Definition: MC_Cent_pPb.hh:10
std::pair< Particle, Particle > ParticlePair
Typedef for a pair of Particle objects.
Definition: Particle.hh:42
Generic runtime Rivet error.
Definition: Exceptions.hh:12