Fork me on GitHub

source: svn/trunk/Utilities/HepMC/interface/GenEvent.h@ 486

Last change on this file since 486 was 349, checked in by severine ovyn, 16 years ago

first test

File size: 29.9 KB
Line 
1//--------------------------------------------------------------------------
2#ifndef HEPMC_GEN_EVENT_H
3#define HEPMC_GEN_EVENT_H
4
5//////////////////////////////////////////////////////////////////////////
6// Matt.Dobbs@Cern.CH, September 1999, refer to:
7// M. Dobbs and J.B. Hansen, "The HepMC C++ Monte Carlo Event Record for
8// High Energy Physics", Computer Physics Communications (to be published).
9//
10// Event record for MC generators (for use at any stage of generation)
11//////////////////////////////////////////////////////////////////////////
12//
13// This class is intended as both a "container class" ( to store a MC
14// event for interface between MC generators and detector simulation )
15// and also as a "work in progress class" ( that could be used inside
16// a generator and modified as the event is built ).
17//
18// Iterators are provided which allow the user to easily obtain a
19// list of particles or vertices in an event --- this list can be filled
20// subject to some sort of selection criteria. Examples are given below
21// ( see HepMC::copy_if and std::copy )
22
23///
24/// \namespace HepMC
25/// All classes in the HepMC packages are in the HepMC namespace
26///
27namespace HepMC {
28
29 // To create a list from an iterator, use: (i.e. for a list of particles);
30 // #include <algorithm>
31 // list<GenParticle*> thelist;
32 // copy( evt->particles_begin(), evt->particles_end(),
33 // back_inserter(thelist) );
34 // to create a list subject to a condition (predicate) use:
35 // list<GenParticle*> thelist;
36 // HepMC::copy_if( evt->particles_begin(), evt->particles_end(),
37 // back_inserter(thelist), is_photon() );
38 // where is_photon() is a predicate like:
39 // class is_photon {
40 // public:
41 // bool operator() ( GenParticle const * p ) {
42 // if ( p && p->pdg_id() == 22 ) return true;
43 // return false;
44 // }
45 // };
46 // which the user defines herself.
47
48 /// define the type of iterator to use
49 template <class InputIterator, class OutputIterator, class Predicate>
50 void copy_if( InputIterator first, InputIterator last, OutputIterator out,
51 Predicate pred ) {
52 for ( ; first != last; ++first ) { if ( pred(*first) ) out = *first; }
53 }
54} // HepMC
55
56// Since a container of all vertices in the event is maintained, the time
57// required to loop over all vertices (or particles) is very fast -- and
58// the user does not gain much by first making his own list.
59// (this is not true for the GenVertex:: versions of these iterators, which
60// allow you to specify the vertex starting point and range)
61
62// Data Members:
63// signal_process_id() The integer ID that uniquely specifies this signal
64// process, i.e. MSUB in Pythia. It is necessary to
65// package this with each event rather than with the run
66// because many processes may be generated within one
67// run.
68// event_number() Strictly speaking we cannot think of any reason that
69// an event would need to know its own event number, it
70// is more likely something that would be assigned by
71// a database. It is included anyway (tradition?) since
72// we expect it may be useful for debugging. It can
73// be reset later by a database.
74// mpi() The number of multi parton interactions in the event.
75// This is NOT beam pileup. Set to -1 by default.
76// beam_particles() A pair of pointers to the incoming beam particles.
77// signal_process_vertex() pointer to the vertex containing the signal process
78// weights() Vector of doubles which specify th weight of the evnt,
79// the first entry will be the "event weight" used for
80// hit and miss etc., but a general vector is used to
81// allow for reweighting etc. We envision a list of
82// WeightTags to be included with a run class which
83// would specify the meaning of the Weights .
84// random_states() Vector of integers which specify the random number
85// generator's state for this event. It is left to the
86// generator to make use of this. We envision a vector of
87// RndmStatesTags to be included with a run class which
88// would specify the meaning of the random_states.
89//
90///////////////////////
91// Memory allocation //
92///////////////////////
93// -When a vertex (particle) is added to a event (vertex), it is "adopted"
94// and becomes the responsibility of the event (vertex) to delete that
95// particle.
96// -objects responsible for deleting memory:
97// -events delete included vertices
98// -each vertex deletes its outgoing particles which do not have decay
99// vertices
100// -each vertex deletes its incoming particles which do not
101// have creation vertices
102//
103////////////////////////
104// About the Barcodes //
105////////////////////////
106// - each vertex or particle has a barcode, which is just an integer which
107// uniquely identifies it inside the event (i.e. there is a one to one
108// mapping between particle memory addresses and particle barcodes... and
109// the same applied for vertices)
110// - The value of a barcode has NO MEANING and NO ORDER!
111// For the user's convenience, when an event is read in via an IO_method
112// from an indexed list (like the HEPEVT common block), then the index will
113// become the barcode for that particle.
114// - particle barcodes are always positive integers
115// vertex barcodes are always negative integers
116// The barcodes are chosen and set automatically when a vertex or particle
117// comes under the ownership of an event (i.e. it is contained in an event).
118// - You can tell when a particle or vertex is owned, because its
119// parent_event() return value will return a pointer to the event which owns
120// it (or null if its an orphan).
121//
122
123#include "GenVertex.h"
124#include "GenParticle.h"
125#include "WeightContainer.h"
126#include "HeavyIon.h"
127#include "PdfInfo.h"
128#include "Units.h"
129#include <map>
130#include <string>
131#include <vector>
132#include <algorithm>
133#include <iostream>
134
135namespace HepMC {
136
137 //! The GenEvent class is the core of HepMC
138
139 ///
140 /// \class GenEvent
141 /// HepMC::GenEvent contains information about generated particles.
142 /// GenEvent is structured as a set of vertices which contain the particles.
143 ///
144 class GenEvent {
145 friend class GenParticle;
146 friend class GenVertex;
147 public:
148 /// default constructor creates null pointers to HeavyIon and PdfInfo
149 GenEvent( int signal_process_id = 0, int event_number = 0,
150 GenVertex* signal_vertex = 0,
151 const WeightContainer& weights = std::vector<double>(),
152 const std::vector<long>& randomstates = std::vector<long>(),
153 Units::MomentumUnit = Units::default_momentum_unit(),
154 Units::LengthUnit = Units::default_length_unit() );
155 /// explicit constructor that takes HeavyIon and PdfInfo
156 GenEvent( int signal_process_id, int event_number,
157 GenVertex* signal_vertex, const WeightContainer& weights,
158 const std::vector<long>& randomstates,
159 const HeavyIon& ion, const PdfInfo& pdf,
160 Units::MomentumUnit = Units::default_momentum_unit(),
161 Units::LengthUnit = Units::default_length_unit() );
162 /// constructor requiring units - all else is default
163 GenEvent( Units::MomentumUnit, Units::LengthUnit,
164 int signal_process_id = 0, int event_number = 0,
165 GenVertex* signal_vertex = 0,
166 const WeightContainer& weights = std::vector<double>(),
167 const std::vector<long>& randomstates = std::vector<long>() );
168 /// explicit constructor with units first that takes HeavyIon and PdfInfo
169 GenEvent( Units::MomentumUnit, Units::LengthUnit,
170 int signal_process_id, int event_number,
171 GenVertex* signal_vertex, const WeightContainer& weights,
172 const std::vector<long>& randomstates,
173 const HeavyIon& ion, const PdfInfo& pdf );
174 GenEvent( const GenEvent& inevent ); //!< deep copy
175 GenEvent& operator=( const GenEvent& inevent ); //!< make a deep copy
176 virtual ~GenEvent(); //!<deletes all vertices/particles in this evt
177
178 void swap( GenEvent & other ); //!< swap
179
180 void print( std::ostream& ostr = std::cout ) const; //!< dumps to ostr
181 void print_version( std::ostream& ostr = std::cout ) const; //!< dumps release version to ostr
182
183 /// assign a barcode to a particle
184 GenParticle* barcode_to_particle( int barCode ) const;
185 /// assign a barcode to a vertex
186 GenVertex* barcode_to_vertex( int barCode ) const;
187
188 ////////////////////
189 // access methods //
190 ////////////////////
191
192 int signal_process_id() const; //!< unique signal process id
193 int event_number() const; //!< event number
194 int mpi() const; //!< number of multi parton interactions
195 double event_scale() const; //!< energy scale, see hep-ph/0109068
196 double alphaQCD() const; //!< QCD coupling, see hep-ph/0109068
197 double alphaQED() const; //!< QED coupling, see hep-ph/0109068
198 /// pointer to the vertex containing the signal process
199 GenVertex* signal_process_vertex() const;
200 /// test to see if we have two valid beam particles
201 bool valid_beam_particles() const;
202 /// pair of pointers to the two incoming beam particles
203 std::pair<HepMC::GenParticle*,HepMC::GenParticle*> beam_particles() const;
204
205 /// direct access to the weights container is allowed.
206 /// Thus you can use myevt.weights()[2];
207 /// to access element 2 of the weights.
208 /// or use myevt.weights().push_back( mywgt ); to add an element.
209 /// and you can set the weights with myevt.weights() = myvector;
210 WeightContainer& weights(); //!< direct access to WeightContainer
211 const WeightContainer& weights() const; //!< direct access to WeightContainer
212
213 /// access the HeavyIon container if it exists
214 HeavyIon const * heavy_ion() const;
215 HeavyIon* heavy_ion();
216 /// access the PdfInfo container if it exists
217 PdfInfo const * pdf_info() const;
218 PdfInfo* pdf_info();
219
220 /// vector of integers containing information about the random state
221 const std::vector<long>& random_states() const;
222
223 /// how many particle barcodes exist?
224 int particles_size() const;
225 /// return true if there are no particle barcodes
226 bool particles_empty() const;
227 /// how many vertex barcodes exist?
228 int vertices_size() const;
229 /// return true if there are no vertex barcodes
230 bool vertices_empty() const;
231
232 void write_units( std::ostream & os = std::cout ) const;
233
234 /// Units used by the GenParticle momentum FourVector.
235 Units::MomentumUnit momentum_unit() const;
236 /// Units used by the GenVertex position FourVector.
237 Units::LengthUnit length_unit() const;
238
239 /////////////////////
240 // mutator methods //
241 /////////////////////
242
243 bool add_vertex( GenVertex* vtx ); //!< adds to evt and adopts
244 bool remove_vertex( GenVertex* vtx ); //!< erases vtx from evt
245 void clear(); //!< empties the entire event
246
247 void set_signal_process_id( int id ); //!< set unique signal process id
248 void set_event_number( int eventno ); //!< set event number
249 void set_mpi( int ); //!< set number of multi parton interactions
250 void set_event_scale( double scale ); //!< set energy scale
251 void set_alphaQCD( double a ); //!< set QCD coupling
252 void set_alphaQED( double a ); //!< set QED coupling
253
254 /// set pointer to the vertex containing the signal process
255 void set_signal_process_vertex( GenVertex* );
256 /// set incoming beam particles
257 bool set_beam_particles(GenParticle*, GenParticle*);
258 /// use a pair of GenParticle*'s to set incoming beam particles
259 bool set_beam_particles(std::pair<HepMC::GenParticle*,HepMC::GenParticle*> const &);
260 /// provide random state information
261 void set_random_states( const std::vector<long>& randomstates );
262
263 /// provide a pointer to the HeavyIon container
264 void set_heavy_ion( const HeavyIon& ion );
265 /// provide a pointer to the PdfInfo container
266 void set_pdf_info( const PdfInfo& p );
267
268 /// set the units using enums
269 void use_units( Units::MomentumUnit, Units::LengthUnit );
270 /// set the units using strings
271 /// the string must match the enum exactly
272 void use_units( std::string&, std::string& );
273
274 public:
275 ///////////////////////////////
276 // vertex_iterators //
277 ///////////////////////////////
278 // Note: the XXX_iterator is "resolvable" as XXX_const_iterator, but
279 // not the reverse, which is consistent with STL,
280 // see Musser, Derge, Saini 2ndEd. p. 69,70.
281
282 //! const vertex iterator
283
284 /// \class vertex_const_iterator
285 /// HepMC::GenEvent::vertex_const_iterator
286 /// is used to iterate over all vertices in the event.
287 class vertex_const_iterator :
288 public std::iterator<std::forward_iterator_tag,HepMC::GenVertex*,ptrdiff_t>{
289 // Iterates over all vertices in this event
290 public:
291 /// constructor requiring vertex information
292 vertex_const_iterator(
293 const
294 std::map<int,HepMC::GenVertex*,std::greater<int> >::const_iterator& i)
295 : m_map_iterator(i) {}
296 vertex_const_iterator() {}
297 /// copy constructor
298 vertex_const_iterator( const vertex_const_iterator& i )
299 { *this = i; }
300 virtual ~vertex_const_iterator() {}
301 /// make a copy
302 vertex_const_iterator& operator=( const vertex_const_iterator& i )
303 { m_map_iterator = i.m_map_iterator; return *this; }
304 /// return a pointer to a GenVertex
305 GenVertex* operator*(void) const { return m_map_iterator->second; }
306 /// Pre-fix increment
307 vertex_const_iterator& operator++(void) //Pre-fix increment
308 { ++m_map_iterator; return *this; }
309 /// Post-fix increment
310 vertex_const_iterator operator++(int) //Post-fix increment
311 { vertex_const_iterator out(*this); ++(*this); return out; }
312 /// equality
313 bool operator==( const vertex_const_iterator& a ) const
314 { return m_map_iterator == a.m_map_iterator; }
315 /// inequality
316 bool operator!=( const vertex_const_iterator& a ) const
317 { return !(m_map_iterator == a.m_map_iterator); }
318 protected:
319 /// const iterator to a vertex map
320 std::map<int,HepMC::GenVertex*,std::greater<int> >::const_iterator
321 m_map_iterator;
322 };
323 friend class vertex_const_iterator;
324 /// begin vertex iteration
325 vertex_const_iterator vertices_begin() const
326 { return GenEvent::vertex_const_iterator(
327 m_vertex_barcodes.begin() ); }
328 /// end vertex iteration
329 vertex_const_iterator vertices_end() const
330 { return GenEvent::vertex_const_iterator(
331 m_vertex_barcodes.end() ); }
332
333
334 //! non-const vertex iterator
335
336 /// \class vertex_iterator
337 /// HepMC::GenEvent::vertex_iterator
338 /// is used to iterate over all vertices in the event.
339 class vertex_iterator :
340 public std::iterator<std::forward_iterator_tag,HepMC::GenVertex*,ptrdiff_t>{
341 // Iterates over all vertices in this event
342 public:
343 /// constructor requiring vertex information
344 vertex_iterator(
345 const
346 std::map<int,HepMC::GenVertex*,std::greater<int> >::iterator& i )
347 : m_map_iterator( i ) {}
348 vertex_iterator() {}
349 /// copy constructor
350 vertex_iterator( const vertex_iterator& i ) { *this = i; }
351 virtual ~vertex_iterator() {}
352 /// make a copy
353 vertex_iterator& operator=( const vertex_iterator& i ) {
354 m_map_iterator = i.m_map_iterator;
355 return *this;
356 }
357 /// const vertex iterator
358 operator vertex_const_iterator() const
359 { return vertex_const_iterator(m_map_iterator); }
360 /// return a pointer to a GenVertex
361 GenVertex* operator*(void) const
362 { return m_map_iterator->second; }
363 /// Pre-fix increment
364 vertex_iterator& operator++(void) //Pre-fix increment
365 { ++m_map_iterator; return *this; }
366 /// Post-fix increment
367 vertex_iterator operator++(int) //Post-fix increment
368 { vertex_iterator out(*this); ++(*this); return out; }
369 /// equality
370 bool operator==( const vertex_iterator& a ) const
371 { return m_map_iterator == a.m_map_iterator; }
372 /// inequality
373 bool operator!=( const vertex_iterator& a ) const
374 { return !(m_map_iterator == a.m_map_iterator); }
375 protected:
376 /// iterator to the vertex map
377 std::map<int,HepMC::GenVertex*,std::greater<int> >::iterator
378 m_map_iterator;
379 };
380 friend class vertex_iterator;
381 /// begin vertex iteration
382 vertex_iterator vertices_begin()
383 { return GenEvent::vertex_iterator(
384 m_vertex_barcodes.begin() ); }
385 /// end vertex iteration
386 vertex_iterator vertices_end()
387 { return GenEvent::vertex_iterator(
388 m_vertex_barcodes.end() ); }
389
390 public:
391 ///////////////////////////////
392 // particle_iterator //
393 ///////////////////////////////
394 // Example of iterating over all particles in the event:
395 // for ( GenEvent::particle_const_iterator p = particles_begin();
396 // p != particles_end(); ++p ) {
397 // (*p)->print();
398 // }
399 //
400
401 //! const particle iterator
402
403 /// \class particle_const_iterator
404 /// HepMC::GenEvent::particle_const_iterator
405 /// is used to iterate over all particles in the event.
406 class particle_const_iterator :
407 public std::iterator<std::forward_iterator_tag,HepMC::GenParticle*,ptrdiff_t>{
408 // Iterates over all vertices in this event
409 public:
410 /// iterate over particles
411 particle_const_iterator(
412 const std::map<int,HepMC::GenParticle*>::const_iterator& i )
413 : m_map_iterator(i) {}
414 particle_const_iterator() {}
415 /// copy constructor
416 particle_const_iterator( const particle_const_iterator& i )
417 { *this = i; }
418 virtual ~particle_const_iterator() {}
419 /// make a copy
420 particle_const_iterator& operator=(
421 const particle_const_iterator& i )
422 { m_map_iterator = i.m_map_iterator; return *this; }
423 /// return a pointer to GenParticle
424 GenParticle* operator*(void) const
425 { return m_map_iterator->second; }
426 /// Pre-fix increment
427 particle_const_iterator& operator++(void) //Pre-fix increment
428 { ++m_map_iterator; return *this; }
429 /// Post-fix increment
430 particle_const_iterator operator++(int) //Post-fix increment
431 { particle_const_iterator out(*this); ++(*this); return out; }
432 /// equality
433 bool operator==( const particle_const_iterator& a ) const
434 { return m_map_iterator == a.m_map_iterator; }
435 /// inequality
436 bool operator!=( const particle_const_iterator& a ) const
437 { return !(m_map_iterator == a.m_map_iterator); }
438 protected:
439 /// const iterator to the GenParticle map
440 std::map<int,HepMC::GenParticle*>::const_iterator m_map_iterator;
441 };
442 friend class particle_const_iterator;
443 /// begin particle iteration
444 particle_const_iterator particles_begin() const
445 { return GenEvent::particle_const_iterator(
446 m_particle_barcodes.begin() ); }
447 /// end particle iteration
448 particle_const_iterator particles_end() const
449 { return GenEvent::particle_const_iterator(
450 m_particle_barcodes.end() ); }
451
452 //! non-const particle iterator
453
454 /// \class particle_iterator
455 /// HepMC::GenEvent::particle_iterator
456 /// is used to iterate over all particles in the event.
457 class particle_iterator :
458 public std::iterator<std::forward_iterator_tag,HepMC::GenParticle*,ptrdiff_t>{
459 // Iterates over all vertices in this event
460 public:
461 /// iterate over particles
462 particle_iterator( const std::map<int,HepMC::GenParticle*>::iterator& i )
463 : m_map_iterator( i ) {}
464 particle_iterator() {}
465 /// copy constructor
466 particle_iterator( const particle_iterator& i ) { *this = i; }
467 virtual ~particle_iterator() {}
468 /// make a copy
469 particle_iterator& operator=( const particle_iterator& i ) {
470 m_map_iterator = i.m_map_iterator;
471 return *this;
472 }
473 /// const particle iterator
474 operator particle_const_iterator() const
475 { return particle_const_iterator(m_map_iterator); }
476 /// return pointer to GenParticle
477 GenParticle* operator*(void) const
478 { return m_map_iterator->second; }
479 /// Pre-fix increment
480 particle_iterator& operator++(void)
481 { ++m_map_iterator; return *this; }
482 /// Post-fix increment
483 particle_iterator operator++(int)
484 { particle_iterator out(*this); ++(*this); return out; }
485 /// equality
486 bool operator==( const particle_iterator& a ) const
487 { return m_map_iterator == a.m_map_iterator; }
488 /// inequality
489 bool operator!=( const particle_iterator& a ) const
490 { return !(m_map_iterator == a.m_map_iterator); }
491 protected:
492 /// iterator for GenParticle map
493 std::map<int,HepMC::GenParticle*>::iterator m_map_iterator;
494 };
495 friend class particle_iterator;
496 /// begin particle iteration
497 particle_iterator particles_begin()
498 { return GenEvent::particle_iterator(
499 m_particle_barcodes.begin() ); }
500 /// end particle iteration
501 particle_iterator particles_end()
502 { return GenEvent::particle_iterator(
503 m_particle_barcodes.end() ); }
504
505 ////////////////////////////////////////////////
506 protected:
507 //
508 // Following methods intended for use by GenParticle/Vertex classes:
509 // In general there is no reason they should be used elsewhere.
510 /// set the barcode - intended for use by GenParticle
511 bool set_barcode( GenParticle* p, int suggested_barcode =false );
512 /// set the barcode - intended for use by GenVertex
513 bool set_barcode( GenVertex* v, int suggested_barcode =false );
514 /// intended for use by GenParticle
515 void remove_barcode( GenParticle* p );
516 /// intended for use by GenVertex
517 void remove_barcode( GenVertex* v );
518
519 void delete_all_vertices(); //!<delete all vertices owned by this event
520
521 private: // methods
522 /// internal method used when converting momentum units
523 bool use_momentum_unit( Units::MomentumUnit );
524 bool use_momentum_unit( std::string& );
525 /// internal method used when converting length units
526 bool use_length_unit( Units::LengthUnit );
527 bool use_length_unit( std::string& );
528
529 private: // data members
530 int m_signal_process_id;
531 int m_event_number;
532 int m_mpi; // number of multi paricle interactions
533 double m_event_scale;// energy scale, see hep-ph/0109068
534 double m_alphaQCD; // QCD coupling, see hep-ph/0109068
535 double m_alphaQED; // QED coupling, see hep-ph/0109068
536 GenVertex* m_signal_process_vertex;
537 GenParticle* m_beam_particle_1;
538 GenParticle* m_beam_particle_2;
539 WeightContainer m_weights; // weights for this event first weight
540 // is used by default for hit and miss
541 std::vector<long> m_random_states; // container of rndm num
542 // generator states
543
544 std::map< int,HepMC::GenVertex*,std::greater<int> > m_vertex_barcodes;
545 std::map< int,HepMC::GenParticle*,std::less<int> > m_particle_barcodes;
546 HeavyIon* m_heavy_ion; // undefined by default
547 PdfInfo* m_pdf_info; // undefined by default
548 Units::MomentumUnit m_momentum_unit; // default value set by configure switch
549 Units::LengthUnit m_position_unit; // default value set by configure switch
550
551 //static unsigned int s_counter;
552 };
553
554
555 ///////////////////////////
556 // INLINE Free Functions //
557 ///////////////////////////
558
559 // Implemented in terms of GenEvent::use_...
560 inline GenEvent& convert_units(GenEvent & evt, Units::MomentumUnit m, Units::LengthUnit l)
561 {
562 evt.use_units(m, l);
563 return evt;
564 }
565
566 ///////////////////////////
567 // INLINE Access Methods //
568 ///////////////////////////
569
570 /// The integer ID that uniquely specifies this signal
571 /// process, i.e. MSUB in Pythia. It is necessary to
572 /// package this with each event rather than with the run
573 /// because many processes may be generated within one run.
574 inline int GenEvent::signal_process_id() const
575 { return m_signal_process_id; }
576
577 inline int GenEvent::event_number() const { return m_event_number; }
578
579 /// Returns the number of multi parton interactions in the event.
580 /// This number is -1 if it is not set.
581 inline int GenEvent::mpi() const { return m_mpi; }
582
583 inline double GenEvent::event_scale() const { return m_event_scale; }
584
585 inline double GenEvent::alphaQCD() const { return m_alphaQCD; }
586
587 inline double GenEvent::alphaQED() const { return m_alphaQED; }
588
589 inline GenVertex* GenEvent::signal_process_vertex() const {
590 /// returns a (mutable) pointer to the signal process vertex
591 return m_signal_process_vertex;
592 }
593
594 inline WeightContainer& GenEvent::weights() { return m_weights; }
595
596 inline const WeightContainer& GenEvent::weights() const
597 { return m_weights; }
598
599 inline HeavyIon const * GenEvent::heavy_ion() const
600 { return m_heavy_ion; }
601
602 inline HeavyIon* GenEvent::heavy_ion()
603 { return m_heavy_ion; }
604
605 inline PdfInfo const * GenEvent::pdf_info() const
606 { return m_pdf_info; }
607
608 inline PdfInfo* GenEvent::pdf_info()
609 { return m_pdf_info; }
610
611 /// Vector of integers which specify the random number
612 /// generator's state for this event. It is left to the
613 /// generator to make use of this. We envision a vector of
614 /// RndmStatesTags to be included with a run class which
615 /// would specify the meaning of the random_states.
616 inline const std::vector<long>& GenEvent::random_states() const
617 { return m_random_states; }
618
619 inline void GenEvent::set_signal_process_id( int id )
620 { m_signal_process_id = id; }
621
622 inline void GenEvent::set_event_number( int eventno )
623 { m_event_number = eventno; }
624
625 /// Use this to set the number of multi parton interactions in each event.
626 inline void GenEvent::set_mpi( int nmpi )
627 { m_mpi = nmpi; }
628
629
630 inline void GenEvent::set_event_scale( double sc ) { m_event_scale = sc; }
631
632 inline void GenEvent::set_alphaQCD( double a ) { m_alphaQCD = a; }
633
634 inline void GenEvent::set_alphaQED( double a ) { m_alphaQED = a; }
635
636 inline void GenEvent::set_signal_process_vertex( GenVertex* vtx ) {
637 m_signal_process_vertex = vtx;
638 if ( m_signal_process_vertex ) add_vertex( m_signal_process_vertex );
639 }
640
641 inline void GenEvent::set_heavy_ion( const HeavyIon& ion )
642 { m_heavy_ion = new HeavyIon(ion); }
643
644 inline void GenEvent::set_pdf_info( const PdfInfo& p )
645 { m_pdf_info = new PdfInfo(p); }
646
647 inline void GenEvent::set_random_states( const std::vector<long>&
648 randomstates )
649 { m_random_states = randomstates; }
650
651 inline void GenEvent::remove_barcode( HepMC::GenParticle* p )
652 { m_particle_barcodes.erase( p->barcode() ); }
653
654 inline void GenEvent::remove_barcode( GenVertex* v )
655 { m_vertex_barcodes.erase( v->barcode() ); }
656
657 /// Each vertex or particle has a barcode, which is just an integer which
658 /// uniquely identifies it inside the event (i.e. there is a one to one
659 /// mapping between particle memory addresses and particle barcodes... and
660 /// the same applied for vertices).
661 ///
662 /// The value of a barcode has NO MEANING and NO ORDER!
663 /// For the user's convenience, when an event is read in via an IO_method
664 /// from an indexed list (like the HEPEVT common block), then the index will
665 /// become the barcode for that particle.
666 ///
667 /// Particle barcodes are always positive integers.
668 /// The barcodes are chosen and set automatically when a vertex or particle
669 /// comes under the ownership of an event (i.e. it is contained in an event).
670 inline GenParticle* GenEvent::barcode_to_particle( int barCode ) const
671 {
672 std::map<int,HepMC::GenParticle*>::const_iterator i
673 = m_particle_barcodes.find(barCode);
674 return ( i != m_particle_barcodes.end() ) ? (*i).second : 0;
675 }
676
677 /// Each vertex or particle has a barcode, which is just an integer which
678 /// uniquely identifies it inside the event (i.e. there is a one to one
679 /// mapping between particle memory addresses and particle barcodes... and
680 /// the same applied for vertices).
681 ///
682 /// The value of a barcode has NO MEANING and NO ORDER!
683 /// For the user's convenience, when an event is read in via an IO_method
684 /// from an indexed list (like the HEPEVT common block), then the index will
685 /// become the barcode for that particle.
686 ///
687 /// Vertex barcodes are always negative integers.
688 /// The barcodes are chosen and set automatically when a vertex or particle
689 /// comes under the ownership of an event (i.e. it is contained in an event).
690 inline GenVertex* GenEvent::barcode_to_vertex( int barCode ) const
691 {
692 std::map<int,GenVertex*,std::greater<int> >::const_iterator i
693 = m_vertex_barcodes.find(barCode);
694 return ( i != m_vertex_barcodes.end() ) ? (*i).second : 0;
695 }
696
697 inline int GenEvent::particles_size() const {
698 return (int)m_particle_barcodes.size();
699 }
700 inline bool GenEvent::particles_empty() const {
701 return (bool)m_particle_barcodes.empty();
702 }
703 inline int GenEvent::vertices_size() const {
704 return (int)m_vertex_barcodes.size();
705 }
706 inline bool GenEvent::vertices_empty() const {
707 return (bool)m_vertex_barcodes.empty();
708 }
709
710 // beam particles
711 inline std::pair<HepMC::GenParticle*,HepMC::GenParticle*> GenEvent::beam_particles() const {
712 return std::pair<GenParticle*,GenParticle*> (m_beam_particle_1, m_beam_particle_2);
713 }
714
715 // units
716 inline Units::MomentumUnit GenEvent::momentum_unit() const {
717 return m_momentum_unit;
718 }
719 inline Units::LengthUnit GenEvent::length_unit() const {
720 return m_position_unit;
721 }
722
723 inline void GenEvent::use_units( Units::MomentumUnit new_m, Units::LengthUnit new_l ) {
724 use_momentum_unit( new_m );
725 use_length_unit( new_l );
726 }
727
728 inline void GenEvent::use_units( std::string& new_m, std::string& new_l ) {
729 use_momentum_unit( new_m );
730 use_length_unit( new_l );
731 }
732
733} // HepMC
734
735#endif // HEPMC_GEN_EVENT_H
736
737//--------------------------------------------------------------------------
738
739
Note: See TracBrowser for help on using the repository browser.