Line data Source code
1 : //--------------------------------------------------------------------------
2 : #ifndef HEPMC_IO_HEPEVT_H
3 : #define HEPMC_IO_HEPEVT_H
4 :
5 : //////////////////////////////////////////////////////////////////////////
6 : // Matt.Dobbs@Cern.CH, January 2000, 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 : // HEPEVT IO class
11 : //////////////////////////////////////////////////////////////////////////
12 : //
13 : // Important note: This class uses HepMC::HEPEVT_Wrapper which is an
14 : // interface to the fortran77 HEPEVT common block.
15 : // The precision and number of entries in the F77 common
16 : // block can be specified. See HepMC/HEPEVT_Wrapper.h.
17 : // You will very likely have to specify these values for your
18 : // application.
19 : //
20 : //
21 :
22 : #include <map>
23 : #include <vector>
24 : #include "HepMC/IO_BaseClass.h"
25 : #include "HepMC/HEPEVT_Wrapper.h"
26 :
27 : namespace HepMC {
28 :
29 : class GenEvent;
30 : class GenVertex;
31 : class GenParticle;
32 :
33 : //! HEPEVT IO class
34 :
35 : ///
36 : /// \class IO_HEPEVT
37 : /// IO class for reading the standard HEPEVT common block.
38 : ///
39 : class IO_HEPEVT : public IO_BaseClass {
40 : public:
41 : IO_HEPEVT();
42 : virtual ~IO_HEPEVT();
43 : bool fill_next_event( GenEvent* );
44 : void write_event( const GenEvent* );
45 : void print( std::ostream& ostr = std::cout ) const;
46 :
47 : // see comments below for these switches.
48 : /// default is false
49 : bool trust_both_mothers_and_daughters() const;
50 : /// default is true
51 : bool trust_mothers_before_daughters() const;
52 : /// default is true
53 : bool print_inconsistency_errors() const;
54 : /// default is true
55 : bool trust_beam_particles() const;
56 : /// define mother daughter trust rules
57 : void set_trust_mothers_before_daughters( bool b = true );
58 : /// define mother daughter trust rules
59 : void set_trust_both_mothers_and_daughters( bool b = false );
60 : /// Since HEPEVT has bi-directional pointers, it is possible that
61 : /// the mother/daughter pointers are inconsistent (though physically
62 : /// speaking this should never happen). In practise it happens often.
63 : /// When a conflict occurs (i.e. when mother/daughter pointers are in
64 : /// disagreement, where an empty (0) pointer is not considered a
65 : /// disagreement) an error is printed. These errors can be turned off
66 : /// with: myio_hepevt.set_print_inconsistency_errors(0);
67 : /// but it is STRONGLY recommended that you print the HEPEVT
68 : /// common and understand the inconsistency BEFORE you turn off the
69 : /// errors. The messages are there for a reason [remember, there is
70 : /// no message printed when the information is missing, ... only when
71 : /// is it inconsistent. User beware.]
72 : /// You can inspect the HEPEVT common block for inconsistencies with
73 : /// HEPEVT_Wrapper::check_hepevt_consistency()
74 : ///
75 : /// There is a switch controlling whether the mother pointers or
76 : /// the daughters are to be trusted.
77 : /// For example, in Pythia the mother information is always correctly
78 : /// included, but the daughter information is often left unfilled: in
79 : /// this case we want to trust the mother pointers and not necessarily
80 : /// the daughters. [THIS IS THE DEFAULT]. Unfortunately the reverse
81 : /// happens for the stdhep(2001) translation of Isajet, so we need
82 : /// an option to toggle the choices.
83 : void set_print_inconsistency_errors( bool b = true );
84 : /// declare whether or not beam particles exist
85 : void set_trust_beam_particles( bool b = true );
86 :
87 : protected: // for internal use only
88 : /// create a GenParticle
89 : GenParticle* build_particle( int index );
90 : /// create a production vertex
91 : void build_production_vertex(
92 : int i,std::vector<HepMC::GenParticle*>& hepevt_particle, GenEvent* evt );
93 : /// create an end vertex
94 : void build_end_vertex(
95 : int i, std::vector<HepMC::GenParticle*>& hepevt_particle, GenEvent* evt );
96 : /// find this particle in the particle map
97 : int find_in_map(
98 : const std::map<HepMC::GenParticle*,int>& m, GenParticle* p) const;
99 :
100 : private: // use of copy constructor is not allowed
101 : IO_HEPEVT( const IO_HEPEVT& ) : IO_BaseClass() {}
102 :
103 : private: // data members
104 :
105 : bool m_trust_mothers_before_daughters;
106 : bool m_trust_both_mothers_and_daughters;
107 : bool m_print_inconsistency_errors;
108 : bool m_trust_beam_particles;
109 : };
110 :
111 : ////////////////////////////
112 : // INLINES access methods //
113 : ////////////////////////////
114 : inline bool IO_HEPEVT::trust_both_mothers_and_daughters() const
115 : { return m_trust_both_mothers_and_daughters; }
116 :
117 : inline bool IO_HEPEVT::trust_mothers_before_daughters() const
118 : { return m_trust_mothers_before_daughters; }
119 :
120 : inline bool IO_HEPEVT::print_inconsistency_errors() const
121 : { return m_print_inconsistency_errors; }
122 :
123 : inline void IO_HEPEVT::set_trust_both_mothers_and_daughters( bool b )
124 : { m_trust_both_mothers_and_daughters = b; }
125 :
126 : inline void IO_HEPEVT::set_trust_mothers_before_daughters( bool b )
127 : { m_trust_mothers_before_daughters = b; }
128 :
129 : inline void IO_HEPEVT::set_print_inconsistency_errors( bool b )
130 : { m_print_inconsistency_errors = b; }
131 :
132 : inline bool IO_HEPEVT::trust_beam_particles() const
133 0 : { return m_trust_beam_particles; }
134 :
135 : inline void IO_HEPEVT::set_trust_beam_particles( bool b )
136 : { m_trust_beam_particles = b; }
137 :
138 : } // HepMC
139 :
140 : #endif // HEPMC_IO_HEPEVT_H
141 : //--------------------------------------------------------------------------
|