12 #include "HepMC3/Version.h" 28 m_buffer_size( 256*1024 )
32 ERROR(
"WriterAscii: could not open output file: "<<filename )
35 m_file <<
"HepMC::Asciiv3-START_EVENT_LISTING" << std::endl;
51 (*m_stream) <<
"HepMC::Version " <<
version() << std::endl;
52 (*m_stream) <<
"HepMC::Asciiv3-START_EVENT_LISTING" << std::endl;
77 WARNING(
"WriterAscii::write_event: GenEvents contain " 78 "different GenRunInfo objects from - only the " 79 "first such object will be serialized." )
121 for (
auto vt2: vt1.second ) {
124 bool status = vt2.second->to_string(st);
127 WARNING(
"WriterAscii::write_event: problem serializing attribute: "<<vt1.first )
131 sprintf(
m_cursor,
"A %i %s ",vt2.first,vt1.first.c_str());
142 std::map<ConstGenVertexPtr,bool> alreadywritten;
143 for(ConstGenParticlePtr p: evt.
particles() ) {
146 ConstGenVertexPtr v = p->production_vertex();
147 int parent_object = 0;
152 if ( v->particles_in().size() > 1 || !v->data().is_zero() ) parent_object = v->id();
155 else if ( v->particles_in().size() == 1 ) parent_object = v->particles_in()[0]->id();
157 if (alreadywritten.find(v)==alreadywritten.end()&&parent_object<0)
163 alreadywritten.clear();
175 }
catch (
const std::bad_alloc& e) {
178 WARNING(
"WriterAscii::allocate_buffer: buffer size too large. Dividing by 2. New size: " <<
m_buffer_size )
183 ERROR(
"WriterAscii::allocate_buffer: could not allocate buffer!" )
192 ret.reserve( s.length()*2 );
193 for ( string::const_iterator it = s.begin(); it != s.end(); ++it ) {
195 case '\\': ret +=
"\\\\";
break;
196 case '\n': ret +=
"\\|";
break;
208 bool printed_first =
false;
209 std::vector<int> pids;
210 for(ConstGenParticlePtr p: v->particles_in() ) pids.push_back(p->id());
212 std::sort(pids.begin(),pids.end());
213 for(
auto pid: pids ) {
215 if ( !printed_first ) {
217 printed_first =
true;
249 m_stream->write( m_buffer, length );
269 vector<string> names =
run_info()->weight_names();
271 if ( !names.empty() ) {
272 string out = names[0];
273 for (
int i = 1, N = names.size(); i < N; ++i )
274 out +=
"\n" + names[i];
281 for (
int i = 0, N =
run_info()->tools().size(); i < N; ++i ) {
282 string out =
"T " +
run_info()->tools()[i].name +
"\n" 283 +
run_info()->tools()[i].version +
"\n" 284 +
run_info()->tools()[i].description;
290 for (
auto att:
run_info()->attributes() ) {
292 if ( ! att.second->to_string(st) ) {
293 WARNING (
"WriterAscii::write_run_info: problem serializing attribute: "<< att.first )
297 sprintf(
m_cursor,
"A %s ", att.first.c_str());
336 strncpy(
m_cursor,str.data(),str.length());
344 m_stream->write( str.data(), str.length() );
350 std::ofstream* ofs =
dynamic_cast<std::ofstream*
>(
m_stream);
351 if (ofs && !ofs->is_open())
return;
353 (*m_stream) <<
"HepMC::Asciiv3-END_EVENT_LISTING" << endl << endl;
354 if (ofs) ofs->close();
int event_number() const
Get event number.
const Units::MomentumUnit & momentum_unit() const
Get momentum unit.
void write_string(const std::string &str)
Inline function for writing strings.
void forced_flush()
Inline function forcing flush to the output stream.
const Units::LengthUnit & length_unit() const
Get length unit.
int m_precision
Output precision.
std::ostream * m_stream
Output stream.
#define ERROR(MESSAGE)
Macro for printing error messages.
Definition of class GenParticle.
const std::vector< ConstGenVertexPtr > & vertices() const
Get list of vertices (const)
Definition of class GenVertex.
char * m_cursor
Cursor inside stream buffer.
Definition of class WriterAscii.
std::string version()
Get the HepMC library version string.
void allocate_buffer()
Attempts to allocate buffer of the chosen size.
shared_ptr< GenRunInfo > run_info() const
Get a pointer to the the GenRunInfo object.
static std::string name(MomentumUnit u)
Get name of momentum unit.
WriterAscii(const std::string &filename, shared_ptr< GenRunInfo > run=shared_ptr< GenRunInfo >())
Constructor.
bool is_zero() const
Check if the length of this vertex is zero.
void write_particle(ConstGenParticlePtr p, int second_field)
Write particle.
double x() const
x-component of position/displacement
const std::vector< double > & weights() const
Get event weight values as a vector.
const FourVector & event_pos() const
Vertex representing the overall event position.
unsigned long m_buffer_size
Buffer size.
shared_ptr< GenRunInfo > run_info() const
Get the global GenRunInfo object.
Stores event-related information.
std::map< string, std::map< int, shared_ptr< Attribute > > > attributes() const
Get a copy of the list of attributes.
char * m_buffer
Stream buffer.
void write_vertex(ConstGenVertexPtr v)
Write vertex.
double y() const
y-component of position/displacement
double t() const
Time component of position/displacement.
const std::vector< ConstGenParticlePtr > & particles() const
Get list of particles (const)
Definition of class Units.
void set_run_info(shared_ptr< GenRunInfo > run)
Set the global GenRunInfo object.
#define WARNING(MESSAGE)
Macro for printing warning messages.
~WriterAscii()
Destructor.
void close()
Close file stream.
void write_run_info()
Write the GenRunInfo object to file.
std::ofstream m_file
Output file.
Definition of class GenEvent.
void write_event(const GenEvent &evt)
Write event to file.
std::string escape(const std::string &s) const
Escape '\' and ' ' characters in string.
void flush()
Inline function flushing buffer to output stream when close to buffer capacity.
double z() const
z-component of position/displacement