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 | { 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 | //-------------------------------------------------------------------------- |
---|