15#include "HepMC3/Version.h"
30 m_buffer_size(256*1024)
34 HEPMC3_ERROR(
"WriterAscii: could not open output file: " << filename)
36 const std::string header =
"HepMC::Version " +
version() +
"\nHepMC::Asciiv3-START_EVENT_LISTING\n";
37 m_file.write(header.data(), header.length());
58 m_buffer_size(256*1024)
61 const std::string header =
"HepMC::Version " +
version() +
"\nHepMC::Asciiv3-START_EVENT_LISTING\n";
62 m_stream->write(header.data(), header.length());
77 m_shared_stream(s_stream),
78 m_stream(s_stream.get()),
82 m_buffer_size(256*1024)
85 const std::string header =
"HepMC::Version " +
version() +
"\nHepMC::Asciiv3-START_EVENT_LISTING\n";
86 m_stream->write(header.data(), header.length());
108 auto float_printf_specifier_option =
m_options.find(
"float_printf_specifier");
109 std::string letter=(float_printf_specifier_option !=
m_options.end())?float_printf_specifier_option->second.substr(0,2):
"e";
110 if (letter !=
"e" && letter !=
"E" && letter !=
"G" && letter !=
"g" && letter !=
"f" && letter !=
"F" ) letter =
"e";
132 "different GenRunInfo objects from - only the "
133 "first such object will be serialized.")
139 std::string especifier =
"E " + std::to_string(evt.
event_number()) +
" "
140 + std::to_string(evt.
vertices().size()) +
" "
141 + std::to_string(evt.
particles().size());
170 for (
auto vt2: vt1.second ) {
172 bool status = vt2.second->to_string(st);
175 HEPMC3_WARNING(
"WriterAscii::write_event: problem serializing attribute: " << vt1.first)
191 std::map<int, bool> alreadywritten;
192 for (ConstGenParticlePtr p: evt.
particles()) {
194 ConstGenVertexPtr v = p->production_vertex();
195 int parent_object = 0;
200 if ( v->particles_in().size() > 1 || !v->data().is_zero() ) parent_object = v->id();
203 else if ( v->particles_in().size() == 1 ) parent_object = v->particles_in().front()->id();
204 else if ( v->particles_in().size() == 0 )
HEPMC3_DEBUG(30,
"WriterAscii::write_event - found a vertex without incoming particles: " << v->id());
206 if (alreadywritten.count(v->id()) == 0 && parent_object < 0)
212 alreadywritten.clear();
224 }
catch (
const std::bad_alloc& e) {
227 HEPMC3_WARNING(
"WriterAscii::allocate_buffer:" << e.what() <<
" buffer size too large. Dividing by 2. New size: " <<
m_buffer_size)
232 HEPMC3_ERROR(
"WriterAscii::allocate_buffer: could not allocate buffer!")
241 ret.reserve(s.length()*2);
242 for ( std::string::const_iterator it = s.begin(); it != s.end(); ++it ) {
260 std::vector<int> pids;
261 pids.reserve(v->particles_in().size());
262 for (ConstGenParticlePtr p: v->particles_in()) pids.push_back(p->id());
264 std::sort(pids.begin(), pids.end());
265 for (
auto p: pids) vlist.append( std::to_string(p).append(
",") );
266 if ( pids.size() ) vlist.pop_back();
302 const std::vector<std::string> names =
run_info()->weight_names();
304 if ( !names.empty() ) {
305 std::string out = names[0];
306 for (
int i = 1, N = names.size(); i < N; ++i )
307 out +=
"\n" + names[i];
314 for (
int i = 0, N =
run_info()->tools().size(); i < N; ++i) {
315 std::string out =
"T " +
run_info()->tools()[i].name +
"\n"
316 +
run_info()->tools()[i].version +
"\n"
317 +
run_info()->tools()[i].description;
323 for (
auto att:
run_info()->attributes() ) {
325 if ( !att.second->to_string(st) ) {
326 HEPMC3_WARNING(
"WriterAscii::write_run_info: problem serializing attribute: " << att.first)
342 m_cursor += sprintf(
m_cursor,
m_particle_printf_specifier.c_str(), p->id(), second_field, p->pid(), p->momentum().px(), p->momentum().py(), p->momentum().pz(), p->momentum().e(), p->generated_mass(), p->status());
350 strncpy(
m_cursor, str.data(), str.length());
357 m_stream->write(str.data(), str.length());
363 std::ofstream* ofs =
dynamic_cast<std::ofstream*
>(
m_stream);
364 if (ofs && !ofs->is_open())
return;
366 const std::string footer(
"HepMC::Asciiv3-END_EVENT_LISTING\n\n");
368 if (ofs) ofs->close();
373 if (prec < 2 || prec > 24)
return;
383 if (size < 1024)
return;
#define HEPMC3_WARNING(MESSAGE)
Macro for printing HEPMC3_HEPMC3_WARNING messages.
#define HEPMC3_DEBUG(LEVEL, MESSAGE)
Macro for printing debug messages with appropriate debug level.
#define HEPMC3_ERROR(MESSAGE)
Macro for printing error messages.
Definition of class GenEvent.
Definition of class GenParticle.
Definition of class GenVertex.
Definition of class Units.
Definition of class WriterAscii.
double t() const
Time component of position/displacement.
bool is_zero() const
Check if the length of this vertex is zero.
double x() const
x-component of position/displacement
double y() const
y-component of position/displacement
double z() const
z-component of position/displacement
Stores event-related information.
int event_number() const
Get event number.
std::shared_ptr< GenRunInfo > run_info() const
Get a pointer to the the GenRunInfo object.
const std::vector< ConstGenVertexPtr > & vertices() const
Get list of vertices (const)
const Units::MomentumUnit & momentum_unit() const
Get momentum unit.
const Units::LengthUnit & length_unit() const
Get length unit.
const FourVector & event_pos() const
Vertex representing the overall event position.
std::map< std::string, std::map< int, std::shared_ptr< Attribute > > > attributes() const
Get a copy of the list of attributes.
const std::vector< double > & weights() const
Get event weight values as a vector.
const std::vector< ConstGenParticlePtr > & particles() const
Get list of particles (const)
static std::string name(MomentumUnit u)
Get name of momentum unit.
void set_buffer_size(const size_t &size)
Set buffer size (in bytes)
void set_precision(const int &prec)
Set output precision.
std::string escape(const std::string &s) const
Escape '\' and ' ' characters in string.
void allocate_buffer()
Attempts to allocate buffer of the chosen size.
char * m_cursor
Cursor inside stream buffer.
bool failed() override
Return status of the stream.
char * m_buffer
Stream buffer.
std::string m_float_printf_specifier
the specifier of printf used for floats
~WriterAscii()
Destructor.
void close() override
Close file stream.
int precision() const
Return output precision.
void write_particle(ConstGenParticlePtr p, int second_field)
Write particle.
int m_precision
Output precision.
std::string m_vertex_short_printf_specifier
the specifier of printf used for zero vertices
std::ofstream m_file
Output file.
void write_string(const std::string &str)
Inline function for writing strings.
unsigned long m_buffer_size
Buffer size.
std::string m_particle_printf_specifier
the specifier of printf used for floats
void write_event(const GenEvent &evt) override
Write event to file.
void write_vertex(ConstGenVertexPtr v)
Write vertex.
WriterAscii(const std::string &filename, std::shared_ptr< GenRunInfo > run=std::shared_ptr< GenRunInfo >())
Constructor.
std::string m_vertex_long_printf_specifier
the specifier of printf used for vertices
void flush()
Inline function flushing buffer to output stream when close to buffer capacity.
void write_run_info()
Write the GenRunInfo object to file.
void forced_flush()
Inline function forcing flush to the output stream.
std::ostream * m_stream
Output stream.
std::shared_ptr< GenRunInfo > run_info() const
Get the global GenRunInfo object.
std::map< std::string, std::string > m_options
options
void set_run_info(std::shared_ptr< GenRunInfo > run)
Set the global GenRunInfo object.
std::string version()
Get the HepMC library version string.