]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/HepMC/IO_GenEvent.h
Adding include path to allow compilation of CleanGeom task
[u/mrichter/AliRoot.git] / TEvtGen / HepMC / IO_GenEvent.h
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 //--------------------------------------------------------------------------