]>
Commit | Line | Data |
---|---|---|
0ca57c2f | 1 | //-------------------------------------------------------------------------- |
2 | #ifndef HEPMC_IO_GENEVENT_H | |
3 | #define HEPMC_IO_GENEVENT_H | |
4 | ||
5 | ////////////////////////////////////////////////////////////////////////// | |
6 | // garren@fnal.gov, July 2007 | |
7 | // with input from Gavin Salam, salam@lpthe.jussieu.fr | |
8 | // | |
9 | // event input/output in ascii format for machine reading | |
10 | // This class persists all information found in a GenEvent | |
11 | ////////////////////////////////////////////////////////////////////////// | |
12 | ||
13 | #include <fstream> | |
14 | #include <string> | |
15 | #include <map> | |
16 | #include <vector> | |
17 | #include "HepMC/IO_BaseClass.h" | |
18 | #include "HepMC/IO_Exception.h" | |
19 | #include "HepMC/Units.h" | |
20 | ||
21 | namespace HepMC { | |
22 | ||
23 | class GenEvent; | |
24 | class GenVertex; | |
25 | class GenParticle; | |
26 | class HeavyIon; | |
27 | class PdfInfo; | |
28 | ||
29 | //! IO_GenEvent also deals with HeavyIon and PdfInfo | |
30 | ||
31 | /// | |
32 | /// \class IO_GenEvent | |
33 | /// event input/output in ascii format for machine reading | |
34 | /// extended format contains HeavyIon and PdfInfo classes | |
35 | /// | |
36 | /// Strategy for reading or writing events using iostreams | |
37 | /// When instantiating with a file name, the mode of file to be created | |
38 | /// must be specified. Options are: | |
39 | /// std::ios::in open file for input | |
40 | /// std::ios::out open file for output | |
41 | /// std::ios::trunc erase old file when opening (i.e. ios::out|ios::trunc | |
42 | /// removes oldfile, and creates a new one for output ) | |
43 | /// std::ios::app append output to end of file | |
44 | /// for the purposes of this class, simultaneous input and output mode | |
45 | /// ( std::ios::in | std::ios::out ) is not allowed. | |
46 | /// | |
47 | /// Event listings are preceded by the key: | |
48 | /// "HepMC::IO_GenEvent-START_EVENT_LISTING\n" | |
49 | /// and terminated by the key: | |
50 | /// "HepMC::IO_GenEvent-END_EVENT_LISTING\n" | |
51 | /// GenParticle Data tables are preceded by the key: | |
52 | /// "HepMC::IO_GenEvent-START_PARTICLE_DATA\n" | |
53 | /// and terminated by the key: | |
54 | /// "HepMC::IO_GenEvent-END_PARTICLE_DATA\n" | |
55 | /// Comments are allowed. They need not be preceded by anything, though if | |
56 | /// a comment is written using write_comment( const string ) then it will be | |
57 | /// preceded by "HepMC::IO_GenEvent-COMMENT\n" | |
58 | /// Each event, vertex, particle, particle data, heavy ion, or pdf info line | |
59 | /// is preceded by "E ","V ","P ","D ","H ","F " respectively. | |
60 | /// Comments may appear anywhere in the file -- so long as they do not contain | |
61 | /// any of the start/stop keys. | |
62 | /// | |
63 | class IO_GenEvent : public IO_BaseClass { | |
64 | public: | |
65 | /// constructor requiring a file name and std::ios mode | |
66 | IO_GenEvent( const std::string& filename="IO_GenEvent.dat", | |
67 | std::ios::openmode mode=std::ios::out ); | |
68 | /// constructor requiring an input stream | |
69 | IO_GenEvent( std::istream & ); | |
70 | /// constructor requiring an output stream | |
71 | IO_GenEvent( std::ostream & ); | |
72 | virtual ~IO_GenEvent(); | |
73 | ||
74 | /// write this event | |
75 | void write_event( const GenEvent* evt ); | |
76 | /// get the next event | |
77 | bool fill_next_event( GenEvent* evt ); | |
78 | /// insert a comment directly into the output file --- normally you | |
79 | /// only want to do this at the beginning or end of the file. All | |
80 | /// comments are preceded with "HepMC::IO_GenEvent-COMMENT\n" | |
81 | void write_comment( const std::string comment ); | |
82 | ||
83 | int rdstate() const; //!< check the state of the IO stream | |
84 | void clear(); //!< clear the IO stream | |
85 | ||
86 | /// write to ostr | |
87 | void print( std::ostream& ostr = std::cout ) const; | |
88 | ||
89 | /// needed when reading a file without units if those units are | |
90 | /// different than the declared default units | |
91 | /// (e.g., the default units are MeV, but the file was written with GeV) | |
92 | /// This method is not necessary if the units are written in the file | |
93 | void use_input_units( Units::MomentumUnit, Units::LengthUnit ); | |
94 | ||
95 | /// set output precision | |
96 | /// The default precision is 16. | |
97 | void precision( int ); | |
98 | ||
99 | /// integer (enum) associated with read error | |
100 | int error_type() const; | |
101 | /// the read error message string | |
102 | const std::string & error_message() const; | |
103 | ||
104 | private: // use of copy constructor is not allowed | |
105 | IO_GenEvent( const IO_GenEvent& ) : IO_BaseClass() {} | |
106 | ||
107 | private: // data members | |
108 | std::ios::openmode m_mode; | |
109 | std::fstream m_file; | |
110 | std::ostream * m_ostr; | |
111 | std::istream * m_istr; | |
112 | std::ios * m_iostr; | |
113 | bool m_have_file; | |
114 | IO_Exception::ErrorType m_error_type; | |
115 | std::string m_error_message; | |
116 | ||
117 | }; | |
118 | ||
119 | ////////////// | |
120 | // Inlines // | |
121 | ////////////// | |
122 | ||
123 | inline int IO_GenEvent::rdstate() const { | |
124 | int state; | |
125 | if( m_istr ) { | |
126 | state = (int)m_istr->rdstate(); | |
127 | } else { | |
128 | state = (int)m_ostr->rdstate(); | |
129 | } | |
130 | return state; | |
131 | } | |
132 | ||
133 | inline void IO_GenEvent::clear() { | |
134 | if( m_istr ) { | |
135 | m_istr->clear(); | |
136 | } else { | |
137 | m_ostr->clear(); | |
138 | } | |
139 | } | |
140 | ||
141 | inline int IO_GenEvent::error_type() const { | |
142 | return m_error_type; | |
143 | } | |
144 | ||
145 | inline const std::string & IO_GenEvent::error_message() const { | |
146 | return m_error_message; | |
147 | } | |
148 | ||
149 | } // HepMC | |
150 | ||
151 | #endif // HEPMC_IO_GENEVENT_H | |
152 | //-------------------------------------------------------------------------- |