Rivet  3.1.5
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 
9 namespace 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 
65  ParticlePair beams() const;
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 
101  std::valarray<double> weights() 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 
219  };
220 
221 
222 }
223 
224 #endif
const GenEvent * originalGenEvent() const
The generated event obtained from an external event generator.
Definition: Event.hh:62
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
Definition: MC_Cent_pPb.hh:10
T getEnvParam(const std::string name, const T &fallback)
Get a parameter from a named environment variable, with automatic type conversion.
Definition: Utils.hh:667
double asqrtS() const
Get the beam centre-of-mass energy per nucleon.
const Particles & allParticles() const
All the raw GenEvent particles, wrapped in Rivet::Particle objects.
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
Event(const GenEvent &ge, const vector< size_t > &indices={}, bool strip=false)
Definition: Event.hh:39
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
const PROJ & applyProjection(PROJ *pp) const
Add a projection p to this Event by pointer.
Definition: Event.hh:157
Event(const GenEvent *ge, const vector< size_t > &indices={}, bool strip=false)
Constructor from a HepMC GenEvent pointer.
Definition: Event.hh:29
ParticlePair beams() const
Get the beam particles.
const GenEvent * genEvent() const
The generated event obtained from an external event generator.
Definition: Event.hh:59
Logging system for controlled & formatted writing to stdout.
Definition: Logging.hh:10
Generic runtime Rivet error.
Definition: Exceptions.hh:12
virtual void project(const Event &e)=0
double sqrtS() const
Get the beam centre-of-mass energy.
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
Event(const Event &e)
Copy constructor.
Definition: Event.hh:46
std::valarray< double > weights() const
The generation weight associated with the event.
#define MSG_TRACE(x)
Lowest-level, most verbose messaging, using MSG_LVL.
Definition: Logging.hh:193
double weight() const
Obsolete weight method. Always returns 1 now.
Definition: Event.hh:105
Base class for all Rivet projections.
Definition: Projection.hh:29