[572] | 1 | #ifndef HEPMC_GEN_EVENT_ITERATORS_H
|
---|
| 2 | #define HEPMC_GEN_EVENT_ITERATORS_H
|
---|
| 3 |
|
---|
| 4 | //--------------------------------------------------------------------------
|
---|
| 5 | //////////////////////////////////////////////////////////////////////////
|
---|
| 6 | // garren@fnal.gov, May 2009
|
---|
| 7 | //
|
---|
| 8 | //////////////////////////////////////////////////////////////////////////
|
---|
| 9 | //--------------------------------------------------------------------------
|
---|
| 10 |
|
---|
| 11 | #include <stdexcept>
|
---|
| 12 |
|
---|
| 13 | #include "GenEvent.h"
|
---|
| 14 | #include "GenVertex.h"
|
---|
| 15 |
|
---|
| 16 | namespace HepMC {
|
---|
| 17 |
|
---|
| 18 | //! GenEventVertexRange acts like a collection of vertices
|
---|
| 19 |
|
---|
| 20 | ///
|
---|
| 21 | /// \class GenEventVertexRange
|
---|
| 22 | /// HepMC::GenEventVertexRange is used to mimic a collection of
|
---|
| 23 | /// vertices for ease of use - especially with utilities such as
|
---|
| 24 | /// the Boost foreach funtion
|
---|
| 25 | ///
|
---|
| 26 | class GenEventVertexRange {
|
---|
| 27 |
|
---|
| 28 | public:
|
---|
| 29 |
|
---|
| 30 | /// the constructor requires a GenEvent
|
---|
| 31 | GenEventVertexRange( GenEvent & e ) : m_event(e) {}
|
---|
| 32 | ///
|
---|
| 33 | GenEvent::vertex_iterator begin() { return m_event.vertices_begin(); }
|
---|
| 34 | GenEvent::vertex_iterator end() { return m_event.vertices_end(); }
|
---|
| 35 |
|
---|
| 36 | private:
|
---|
| 37 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 38 | /// However, we need the copy constructor for GenEvent::vertex_range().
|
---|
| 39 | GenEventVertexRange& operator=( GenEventVertexRange & );
|
---|
| 40 |
|
---|
| 41 | private:
|
---|
| 42 | GenEvent & m_event;
|
---|
| 43 |
|
---|
| 44 | };
|
---|
| 45 |
|
---|
| 46 | //! ConstGenEventVertexRange acts like a collection of vertices
|
---|
| 47 |
|
---|
| 48 | ///
|
---|
| 49 | /// \class ConstGenEventVertexRange
|
---|
| 50 | /// HepMC::ConstGenEventVertexRange is used to mimic a collection of
|
---|
| 51 | /// vertices for ease of use - especially with utilities such as
|
---|
| 52 | /// the Boost foreach funtion
|
---|
| 53 | /// This is the const partner of GenEventVertexRange
|
---|
| 54 | ///
|
---|
| 55 | class ConstGenEventVertexRange {
|
---|
| 56 |
|
---|
| 57 | public:
|
---|
| 58 |
|
---|
| 59 | /// the constructor requires a const GenEvent
|
---|
| 60 | ConstGenEventVertexRange( GenEvent const & e ) : m_event(e) {}
|
---|
| 61 | ///
|
---|
| 62 | GenEvent::vertex_const_iterator begin() const { return m_event.vertices_begin(); }
|
---|
| 63 | GenEvent::vertex_const_iterator end() const { return m_event.vertices_end(); }
|
---|
| 64 |
|
---|
| 65 | private:
|
---|
| 66 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 67 | /// However, we need the copy constructor for GenEvent::vertex_range().
|
---|
| 68 | ConstGenEventVertexRange& operator=( ConstGenEventVertexRange & );
|
---|
| 69 |
|
---|
| 70 | private:
|
---|
| 71 | GenEvent const & m_event;
|
---|
| 72 |
|
---|
| 73 | };
|
---|
| 74 |
|
---|
| 75 | //! GenEventParticleRange acts like a collection of particles
|
---|
| 76 |
|
---|
| 77 | ///
|
---|
| 78 | /// \class GenEventParticleRange
|
---|
| 79 | /// HepMC::GenEventParticleRange is used to mimic a collection of
|
---|
| 80 | /// particles for ease of use - especially with utilities such as
|
---|
| 81 | /// the Boost foreach funtion
|
---|
| 82 | ///
|
---|
| 83 | class GenEventParticleRange {
|
---|
| 84 |
|
---|
| 85 | public:
|
---|
| 86 |
|
---|
| 87 | /// the constructor requires a GenEvent
|
---|
| 88 | GenEventParticleRange( GenEvent & e ) : m_event(e) {}
|
---|
| 89 | ///
|
---|
| 90 | GenEvent::particle_iterator begin() { return m_event.particles_begin(); }
|
---|
| 91 | GenEvent::particle_iterator end() { return m_event.particles_end(); }
|
---|
| 92 |
|
---|
| 93 | private:
|
---|
| 94 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 95 | /// However, we need the copy constructor for GenEvent::particle_range().
|
---|
| 96 | GenEventParticleRange& operator=( GenEventParticleRange & );
|
---|
| 97 |
|
---|
| 98 | private:
|
---|
| 99 | GenEvent & m_event;
|
---|
| 100 |
|
---|
| 101 | };
|
---|
| 102 |
|
---|
| 103 | //! ConstGenEventParticleRange acts like a collection of particles
|
---|
| 104 |
|
---|
| 105 | ///
|
---|
| 106 | /// \class ConstGenEventParticleRange
|
---|
| 107 | /// HepMC::ConstGenEventParticleRange is used to mimic a collection of
|
---|
| 108 | /// particles for ease of use - especially with utilities such as
|
---|
| 109 | /// the Boost foreach funtion
|
---|
| 110 | /// This is the const partner of GenEventParticleRange
|
---|
| 111 | ///
|
---|
| 112 | class ConstGenEventParticleRange {
|
---|
| 113 |
|
---|
| 114 | public:
|
---|
| 115 |
|
---|
| 116 | /// the constructor requires a const GenEvent
|
---|
| 117 | ConstGenEventParticleRange( GenEvent const & e ) : m_event(e) {}
|
---|
| 118 | ///
|
---|
| 119 | GenEvent::particle_const_iterator begin() const { return m_event.particles_begin(); }
|
---|
| 120 | GenEvent::particle_const_iterator end() const { return m_event.particles_end(); }
|
---|
| 121 |
|
---|
| 122 | private:
|
---|
| 123 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 124 | /// However, we need the copy constructor for GenEvent::particle_range().
|
---|
| 125 | ConstGenEventParticleRange& operator=( ConstGenEventParticleRange & );
|
---|
| 126 |
|
---|
| 127 | private:
|
---|
| 128 | GenEvent const & m_event;
|
---|
| 129 |
|
---|
| 130 | };
|
---|
| 131 |
|
---|
| 132 | //! GenVertexParticleRange acts like a collection of particles
|
---|
| 133 |
|
---|
| 134 | ///
|
---|
| 135 | /// \class GenVertexParticleRange
|
---|
| 136 | /// HepMC::GenVertexParticleRange is used to mimic a collection of
|
---|
| 137 | /// particles for ease of use - especially with utilities such as
|
---|
| 138 | /// the Boost foreach funtion
|
---|
| 139 | ///
|
---|
| 140 | class GenVertexParticleRange {
|
---|
| 141 |
|
---|
| 142 | public:
|
---|
| 143 |
|
---|
| 144 | /// the constructor requires a GenVertex
|
---|
| 145 | GenVertexParticleRange( GenVertex & v, IteratorRange range = relatives )
|
---|
| 146 | : m_vertex(v),m_range(range) {}
|
---|
| 147 | ///
|
---|
| 148 | GenVertex::particle_iterator begin() { return m_vertex.particles_begin(m_range); }
|
---|
| 149 | GenVertex::particle_iterator end() { return m_vertex.particles_end(m_range); }
|
---|
| 150 |
|
---|
| 151 | private:
|
---|
| 152 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 153 | /// However, we need the copy constructor for GenVertex::particles().
|
---|
| 154 | GenVertexParticleRange& operator=( GenVertexParticleRange & );
|
---|
| 155 |
|
---|
| 156 | private:
|
---|
| 157 | GenVertex & m_vertex;
|
---|
| 158 | IteratorRange m_range;
|
---|
| 159 |
|
---|
| 160 | };
|
---|
| 161 |
|
---|
| 162 | //! GenParticleProductionRange acts like a collection of particles
|
---|
| 163 |
|
---|
| 164 | ///
|
---|
| 165 | /// \class GenParticleProductionRange
|
---|
| 166 | /// HepMC::GenParticleProductionRange is used to mimic a collection of
|
---|
| 167 | /// particles associated with the particle's production vertex for ease of use
|
---|
| 168 | /// Utilities such as the Boost foreach funtion will want to use this class.
|
---|
| 169 | ///
|
---|
| 170 | class GenParticleProductionRange {
|
---|
| 171 |
|
---|
| 172 | public:
|
---|
| 173 |
|
---|
| 174 | /// the constructor requires a GenParticle
|
---|
| 175 | GenParticleProductionRange( GenParticle const & p, IteratorRange range = relatives )
|
---|
| 176 | : m_particle(p),m_range(range) {}
|
---|
| 177 | /// begin iterator throws an error if the particle production_vertex is undefined
|
---|
| 178 | GenVertex::particle_iterator begin();
|
---|
| 179 | /// end iterator throws an error if the particle production_vertex is undefined
|
---|
| 180 | GenVertex::particle_iterator end();
|
---|
| 181 |
|
---|
| 182 | private:
|
---|
| 183 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 184 | /// However, we need the copy constructor for GenVertex::particles_in().
|
---|
| 185 | GenParticleProductionRange& operator=( GenParticleProductionRange & );
|
---|
| 186 |
|
---|
| 187 | private:
|
---|
| 188 | GenParticle const & m_particle;
|
---|
| 189 | IteratorRange m_range;
|
---|
| 190 |
|
---|
| 191 | };
|
---|
| 192 |
|
---|
| 193 | class ConstGenParticleProductionRange {
|
---|
| 194 |
|
---|
| 195 | public:
|
---|
| 196 |
|
---|
| 197 | /// the constructor requires a GenParticle
|
---|
| 198 | ConstGenParticleProductionRange( GenParticle const & p, IteratorRange range = relatives )
|
---|
| 199 | : m_particle(p),m_range(range) {}
|
---|
| 200 | /// begin iterator throws an error if the particle production_vertex is undefined
|
---|
| 201 | GenVertex::particle_iterator begin();
|
---|
| 202 | /// end iterator throws an error if the particle production_vertex is undefined
|
---|
| 203 | GenVertex::particle_iterator end();
|
---|
| 204 |
|
---|
| 205 | private:
|
---|
| 206 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 207 | /// However, we need the copy constructor for GenVertex::particles_in().
|
---|
| 208 | ConstGenParticleProductionRange& operator=( ConstGenParticleProductionRange & );
|
---|
| 209 |
|
---|
| 210 | private:
|
---|
| 211 | GenParticle const & m_particle;
|
---|
| 212 | IteratorRange m_range;
|
---|
| 213 |
|
---|
| 214 | };
|
---|
| 215 |
|
---|
| 216 | //! GenParticleEndRange acts like a collection of particles
|
---|
| 217 |
|
---|
| 218 | ///
|
---|
| 219 | /// \class GenParticleEndRange
|
---|
| 220 | /// HepMC::GenParticleEndRange is used to mimic a collection of
|
---|
| 221 | /// particles associated with the particle's end vertex for ease of use
|
---|
| 222 | /// Utilities such as the Boost foreach funtion will want to use this class.
|
---|
| 223 | ///
|
---|
| 224 | class GenParticleEndRange {
|
---|
| 225 |
|
---|
| 226 | public:
|
---|
| 227 |
|
---|
| 228 | /// the constructor requires a GenParticle
|
---|
| 229 | GenParticleEndRange( GenParticle const & p, IteratorRange range = relatives )
|
---|
| 230 | : m_particle(p),m_range(range) {}
|
---|
| 231 | /// begin iterator throws an error if the particle end_vertex is undefined
|
---|
| 232 | GenVertex::particle_iterator begin();
|
---|
| 233 | /// end iterator throws an error if the particle end_vertex is undefined
|
---|
| 234 | GenVertex::particle_iterator end();
|
---|
| 235 |
|
---|
| 236 | private:
|
---|
| 237 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 238 | /// However, we need the copy constructor for GenVertex::particles_out().
|
---|
| 239 | GenParticleEndRange& operator=( GenParticleEndRange & );
|
---|
| 240 |
|
---|
| 241 | private:
|
---|
| 242 | GenParticle const & m_particle;
|
---|
| 243 | IteratorRange m_range;
|
---|
| 244 |
|
---|
| 245 | };
|
---|
| 246 |
|
---|
| 247 | class ConstGenParticleEndRange {
|
---|
| 248 |
|
---|
| 249 | public:
|
---|
| 250 |
|
---|
| 251 | /// the constructor requires a GenParticle
|
---|
| 252 | ConstGenParticleEndRange( GenParticle const & p, IteratorRange range = relatives )
|
---|
| 253 | : m_particle(p),m_range(range) {}
|
---|
| 254 | /// begin iterator throws an error if the particle end_vertex is undefined
|
---|
| 255 | GenVertex::particle_iterator begin();
|
---|
| 256 | /// end iterator throws an error if the particle end_vertex is undefined
|
---|
| 257 | GenVertex::particle_iterator end();
|
---|
| 258 |
|
---|
| 259 | private:
|
---|
| 260 | /// Because the class contains a reference, assignments are not allowed.
|
---|
| 261 | /// However, we need the copy constructor for GenVertex::particles_out().
|
---|
| 262 | ConstGenParticleEndRange& operator=( ConstGenParticleEndRange & );
|
---|
| 263 |
|
---|
| 264 | private:
|
---|
| 265 | GenParticle const & m_particle;
|
---|
| 266 | IteratorRange m_range;
|
---|
| 267 |
|
---|
| 268 | };
|
---|
| 269 |
|
---|
| 270 |
|
---|
| 271 | inline GenVertex::particle_iterator GenParticleProductionRange::begin()
|
---|
| 272 | {
|
---|
| 273 | if ( ! m_particle.production_vertex() )
|
---|
| 274 | throw(std::range_error("GenParticleProductionRange: GenParticle has no production_vertex"));
|
---|
| 275 | return m_particle.production_vertex()->particles_begin(m_range);
|
---|
| 276 | }
|
---|
| 277 |
|
---|
| 278 | inline GenVertex::particle_iterator GenParticleProductionRange::end()
|
---|
| 279 | {
|
---|
| 280 | if ( ! m_particle.production_vertex() )
|
---|
| 281 | throw(std::range_error("GenParticleProductionRange: GenParticle has no production_vertex"));
|
---|
| 282 | return m_particle.production_vertex()->particles_end(m_range);
|
---|
| 283 | }
|
---|
| 284 |
|
---|
| 285 |
|
---|
| 286 | inline GenVertex::particle_iterator ConstGenParticleProductionRange::begin()
|
---|
| 287 | {
|
---|
| 288 | if ( ! m_particle.production_vertex() )
|
---|
| 289 | throw(std::range_error("ConstGenParticleProductionRange: GenParticle has no production_vertex"));
|
---|
| 290 | return m_particle.production_vertex()->particles_begin(m_range);
|
---|
| 291 | }
|
---|
| 292 |
|
---|
| 293 | inline GenVertex::particle_iterator ConstGenParticleProductionRange::end()
|
---|
| 294 | {
|
---|
| 295 | if ( ! m_particle.production_vertex() )
|
---|
| 296 | throw(std::range_error("ConstGenParticleProductionRange: GenParticle has no production_vertex"));
|
---|
| 297 | return m_particle.production_vertex()->particles_end(m_range);
|
---|
| 298 | }
|
---|
| 299 |
|
---|
| 300 | inline GenVertex::particle_iterator GenParticleEndRange::begin()
|
---|
| 301 | {
|
---|
| 302 | if ( ! m_particle.end_vertex() )
|
---|
| 303 | throw(std::range_error("GenParticleEndRange: GenParticle has no end_vertex"));
|
---|
| 304 | return m_particle.end_vertex()->particles_begin(m_range);
|
---|
| 305 | }
|
---|
| 306 | inline GenVertex::particle_iterator GenParticleEndRange::end()
|
---|
| 307 | {
|
---|
| 308 | if ( ! m_particle.end_vertex() )
|
---|
| 309 | throw(std::range_error("GenParticleEndRange: GenParticle has no end_vertex"));
|
---|
| 310 | return m_particle.end_vertex()->particles_end(m_range);
|
---|
| 311 | }
|
---|
| 312 |
|
---|
| 313 | inline GenVertex::particle_iterator ConstGenParticleEndRange::begin()
|
---|
| 314 | {
|
---|
| 315 | if ( ! m_particle.end_vertex() )
|
---|
| 316 | throw(std::range_error("ConstGenParticleEndRange: GenParticle has no end_vertex"));
|
---|
| 317 | return m_particle.end_vertex()->particles_begin(m_range);
|
---|
| 318 | }
|
---|
| 319 | inline GenVertex::particle_iterator ConstGenParticleEndRange::end()
|
---|
| 320 | {
|
---|
| 321 | if ( ! m_particle.end_vertex() )
|
---|
| 322 | throw(std::range_error("ConstGenParticleEndRange: GenParticle has no end_vertex"));
|
---|
| 323 | return m_particle.end_vertex()->particles_end(m_range);
|
---|
| 324 | }
|
---|
| 325 |
|
---|
| 326 | } // HepMC
|
---|
| 327 |
|
---|
| 328 | #endif // HEPMC_GEN_EVENT_ITERATORS_H
|
---|