1 //--------------------------------------------------------------------------
2 #ifndef HEPMC_IO_HERWIG_H
3 #define HEPMC_IO_HERWIG_H
5 //////////////////////////////////////////////////////////////////////////
6 // Matt.Dobbs@Cern.CH, October 2002, 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).
10 // IO class for reading the (non-standard) HEPEVT common block from
11 // the Herwig monte carlo program.
13 // - The HERWIG HEPEVT common block is non-standard, primarily because it
14 // contains some color flow information. When you call IO_HERWIG, the
15 // HEPEVT common block is transformed to the standard. THIS CHANGES THE
16 // CONTENT of HEPEVT!.
17 // - The HERWIG HEPEVT common block has some EXTRA non-physical ENTRIES
18 // (such as CMS frame, HARD subprocess, and CONE).
19 // These are removed by IO_HERWIG. Thus the HepMC event will APPEAR
20 // to have fewer particles in it that herwig did.
21 // There is a switch m_no_gaps_in_barcodes. For
22 // true - then the extra particles are removed from HEPEVT, with
23 // the result that the HepMC barcodes will be sequential, with
25 // false - the barcodes will correspond directly to the HEPEVT index, but
26 // there will be gaps ... ie some barcodes will be unassigned.
27 // this switch requested by I Hinchliffe, October 31, 2002
28 // - some of the Herwig GLUON SPLITTING products are not properly documented
29 // in hepevt. I was unable to repair this in a simple and robust way.
30 // Therefore some of the gluon splitting products will be orphans
31 // in the HepMC output.
32 // - Herwig uses HEPEVT_Wrapper::set_max_number_entries(4000);
33 // HEPEVT_Wrapper::set_sizeof_real(8);
34 // which are the defaults for HEPEVT_Wrapper.
35 //////////////////////////////////////////////////////////////////////////
40 #include "HepMC/IO_BaseClass.h"
41 #include "HepMC/HEPEVT_Wrapper.h"
49 //! IO_HERWIG is used to get Herwig information
53 /// IO class for reading the HEPEVT common block from
54 /// the Herwig monte carlo program.
56 class IO_HERWIG : public IO_BaseClass {
60 /// get the next event
61 bool fill_next_event( GenEvent* );
63 void print( std::ostream& ostr = std::cout ) const;
64 /// this information is dubious
65 double interfaces_to_version_number() const {return 6.400;}
67 // see comments below for these switches.
69 bool print_inconsistency_errors() const;
70 /// decide whether or not to print inconsistency errors
71 void set_print_inconsistency_errors( bool b = true );
73 /// ask how to deal with extra non-physical pseudo particles
74 bool no_gaps_in_barcodes() const
75 { return m_no_gaps_in_barcodes; }
76 /// The HERWIG HEPEVT common block has some EXTRA non-physical ENTRIES
77 /// (such as CMS frame, HARD subprocess, and CONE).
78 /// These are removed by IO_HERWIG. Thus the HepMC event will APPEAR
79 /// to have fewer particles in it that herwig did.
80 /// There is a switch m_no_gaps_in_barcodes. For
81 /// true - then the extra particles are removed from HEPEVT, with
82 /// the result that the HepMC barcodes will be sequential, with
84 /// false - the barcodes will correspond directly to the HEPEVT index, but
85 /// there will be gaps ... ie some barcodes will be unassigned.
86 /// this switch requested by I Hinchliffe, October 31, 2002
87 void set_no_gaps_in_barcodes( bool a )
88 { m_no_gaps_in_barcodes=a; }
90 protected: // for internal use only
92 bool trust_both_mothers_and_daughters() const;
94 bool trust_mothers_before_daughters() const;
95 /// define mother daughter trust rules
96 void set_trust_mothers_before_daughters( bool b = true );
97 /// define mother daughter trust rules
98 void set_trust_both_mothers_and_daughters( bool b = false );
101 GenParticle* build_particle( int index );
102 /// make a production vertex
103 void build_production_vertex(
104 int i,std::vector<GenParticle*>& hepevt_particle, GenEvent* evt );
105 /// make a decay vertex
106 void build_end_vertex(
107 int i, std::vector<GenParticle*>& hepevt_particle, GenEvent* evt );
108 /// find this particle in the map
110 const std::map<GenParticle*,int>& m, GenParticle* p) const;
112 /// make the HERWIG HEPEVT common block look like the standard
113 void repair_hepevt() const;
114 /// deal with artifacts of repairing HEPEVT
115 void remove_gaps_in_hepevt() const;
116 /// zero out a HEPEVT pseudo particle
117 void zero_hepevt_entry( int i ) const;
118 /// translate particle ID
119 int translate_herwig_to_pdg_id( int i ) const;
121 private: // following are not implemented for Herwig
122 virtual void write_event( const GenEvent* ){}
124 private: // use of copy constructor is not allowed
125 IO_HERWIG( const IO_HERWIG& ) : IO_BaseClass() {}
127 private: // data members
128 bool m_trust_mothers_before_daughters;
129 bool m_trust_both_mothers_and_daughters;
130 bool m_print_inconsistency_errors;
131 bool m_no_gaps_in_barcodes;
132 std::vector<int> m_herwig_to_pdg_id;
133 std::set<int> m_no_antiparticles;
136 ////////////////////////////
137 // INLINES access methods //
138 ////////////////////////////
139 inline bool IO_HERWIG::trust_both_mothers_and_daughters() const
140 { return m_trust_both_mothers_and_daughters; }
142 inline bool IO_HERWIG::trust_mothers_before_daughters() const
143 { return m_trust_mothers_before_daughters; }
145 inline bool IO_HERWIG::print_inconsistency_errors() const
146 { return m_print_inconsistency_errors; }
148 inline void IO_HERWIG::set_trust_both_mothers_and_daughters( bool b )
149 { m_trust_both_mothers_and_daughters = b; }
151 inline void IO_HERWIG::set_trust_mothers_before_daughters( bool b )
152 { m_trust_mothers_before_daughters = b; }
154 inline void IO_HERWIG::set_print_inconsistency_errors( bool b )
155 { m_print_inconsistency_errors = b; }
159 #endif // HEPMC_IO_HERWIG_H
160 //--------------------------------------------------------------------------