Rivet  3.1.4
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 
108 
110 
111 
125  template <typename PROJ>
126  const PROJ& applyProjection(PROJ& p) const {
127  Log& log = Log::getLog("Rivet.Event");
128  static bool docaching = getEnvParam("RIVET_CACHE_PROJECTIONS", true);
129  if (docaching) {
130  log << Log::TRACE << "Applying projection " << &p << " (" << p.name() << ") -> comparing to projections " << _projections << std::endl;
131  // First search for this projection *or an equivalent* in the already-executed list
132  const Projection* cpp(&p);
134  // std::set<const Projection*>::const_iterator old = _projections.find(cpp);
135  std::set<const Projection*>::const_iterator old = std::begin(_projections);
136  std::uintptr_t recpp = reinterpret_cast<std::uintptr_t>(cpp);
137  for (; old != _projections.end(); ++old)
138  if (reinterpret_cast<std::uintptr_t>(*old) == recpp) break;
139  if (old != _projections.end()) {
140  log << Log::TRACE << "Equivalent projection found -> returning already-run projection " << *old << std::endl;
141  const Projection& pRef = **old;
142  return pcast<PROJ>(pRef);
143  }
144  log << Log::TRACE << "No equivalent projection in the already-run list -> projecting now" << std::endl;
145  } else {
146  log << Log::TRACE << "Applying projection " << &p << " (" << p.name() << ") WITHOUT projection caching & comparison" << std::endl;
147  }
148  // If this one hasn't been run yet on this event, run it and add to the list
149  Projection* pp = const_cast<Projection*>(&p);
150  pp->_isValid = true;
151  pp->project(*this);
152  if (docaching) _projections.insert(pp);
153  return p;
154  }
155 
156 
158  template <typename PROJ>
159  const PROJ& applyProjection(PROJ* pp) const {
160  if (!pp) throw Error("Event::applyProjection(PROJ*): Projection pointer is null.");
161  return applyProjection(*pp);
162  }
163 
165 
166 
167  private:
168 
170  void _init(const GenEvent& ge);
171 
174  void _strip(GenEvent & ge);
175 
176  // /// @brief Convert the GenEvent to use conventional alignment
177  // ///
178  // /// For example, FHerwig only produces DIS events in the unconventional
179  // /// hadron-lepton orientation and has to be corrected for DIS analysis
180  // /// portability.
181  // void _geNormAlignment();
182 
187  const std::vector<size_t> _weightIndices;
188 
195  const GenEvent* _genevent_original;
196 
206  mutable GenEvent _genevent;
207 
210  mutable Particles _particles;
211 
213  mutable std::set<ConstProjectionPtr> _projections;
214 
215  };
216 
217 
218 }
219 
220 #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.
static Log & getLog(const std::string &name)
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:160
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:159
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:126
Event(const Event &e)
Copy constructor.
Definition: Event.hh:46
std::valarray< double > weights() const
The generation weight associated with the event.
double weight() const
Obsolete weight method. Always returns 1 now.
Definition: Event.hh:105
Base class for all Rivet projections.
Definition: Projection.hh:29