HepMC3 event record library
WriterHEPEVT.cc
Go to the documentation of this file.
1// -*- C++ -*-
2//
3// This file is part of HepMC
4// Copyright (C) 2014-2019 The HepMC collaboration (see AUTHORS for details)
5//
6/**
7 * @file WriterHEPEVT.cc
8 * @brief Implementation of \b class WriterHEPEVT
9 *
10 */
11#include <sstream>
12#include <cstdio> // sprintf
13#include "HepMC3/WriterHEPEVT.h"
15#include "HepMC3/Print.h"
16namespace HepMC3
17{
18
19
20WriterHEPEVT::WriterHEPEVT(const std::string &filename): m_events_count(0),m_vertices_positions_present(true), m_file(filename), m_stream(&m_file)
21{
22 hepevtbuffer=(char*)(new struct HEPEVT());
24}
25
26WriterHEPEVT::WriterHEPEVT(std::ostream& stream): m_events_count(0),m_vertices_positions_present(true), m_file(), m_stream(&stream)
27{
28 hepevtbuffer=(char*)(new struct HEPEVT());
30}
31
32void WriterHEPEVT::write_hepevt_particle( int index, bool iflong )
33{
34 char buf[512];//Note: the format is fixed, so no reason for complicatied tratment
35 char* cursor=&(buf[0]);
36 cursor +=sprintf(cursor, "% 8i% 8i",HEPEVT_Wrapper::status(index), HEPEVT_Wrapper::id(index));
37 if (iflong)
38 {
39 cursor +=sprintf(cursor,"% 8i% 8i",HEPEVT_Wrapper::first_parent(index),HEPEVT_Wrapper::last_parent(index));
40 cursor +=sprintf(cursor,"% 8i% 8i",HEPEVT_Wrapper::first_child(index),HEPEVT_Wrapper::last_child(index));
41 cursor +=sprintf(cursor,"% 19.8E% 19.8E% 19.8E% 19.8E% 19.8E\n",HEPEVT_Wrapper::px(index),HEPEVT_Wrapper::py(index),HEPEVT_Wrapper::pz(index),HEPEVT_Wrapper::e(index),HEPEVT_Wrapper::m(index));
42 cursor +=sprintf(cursor, "%-48s% 19.8E% 19.8E% 19.8E% 19.8E\n"," ",HEPEVT_Wrapper::x(index),HEPEVT_Wrapper::y(index),HEPEVT_Wrapper::z(index),HEPEVT_Wrapper::t(index));
43 }
44 else
45 {
46 cursor +=sprintf(cursor, "% 8i% 8i",HEPEVT_Wrapper::first_child(index),HEPEVT_Wrapper::last_child(index));
47 cursor +=sprintf(cursor, "% 19.8E% 19.8E% 19.8E% 19.8E\n",HEPEVT_Wrapper::px(index),HEPEVT_Wrapper::py(index),HEPEVT_Wrapper::pz(index),HEPEVT_Wrapper::m(index));
48 }
49 unsigned long length = cursor - &(buf[0]);
50 m_stream->write( buf, length );
51}
52
54{
55 char buf[512];//Note: the format is fixed, so no reason for complicatied tratment
56 char* cursor=buf;
57 cursor +=sprintf(cursor,"E% 8i %8i\n",HEPEVT_Wrapper::event_number(),HEPEVT_Wrapper::number_entries());
58 unsigned long length = cursor - &(buf[0]);
59 m_stream->write( buf, length );
60}
61
70
72{
73 std::ofstream* ofs = dynamic_cast<std::ofstream*>(m_stream);
74 if (ofs && !ofs->is_open()) return;
75 if (ofs) ofs->close();
76}
77
79{
80 return (bool)m_file.rdstate();
81}
82
84
86
87} // namespace HepMC3
Definition of class HEPEVT_Wrapper.
Definition of static class Print.
Definition of class WriterHEPEVT.
Stores event-related information.
Definition GenEvent.h:42
static double pz(const int &index)
Get Z momentum.
static int last_child(const int &index)
Get index of last daughter.
static double py(const int &index)
Get Y momentum.
static double m(const int &index)
Get generated mass.
static bool GenEvent_to_HEPEVT(const GenEvent *evt)
Convert GenEvent to HEPEVT.
static bool fix_daughters()
Tries to fix list of daughters.
static void set_hepevt_address(char *c)
Set Fortran block address.
static double y(const int &index)
Get Y Production vertex.
static double t(const int &index)
Get production time.
static int last_parent(const int &index)
Get index of last mother.
static double e(const int &index)
Get Energy.
static double z(const int &index)
Get Z Production vertex.
static double x(const int &index)
Get X Production vertex.
static int first_child(const int &index)
Get index of 1st daughter.
static int event_number()
Get event number.
static int status(const int &index)
Get status code.
static double px(const int &index)
Get X momentum.
static int first_parent(const int &index)
Get index of 1st mother.
static int number_entries()
Get number of entries.
static int id(const int &index)
Get PDG particle id.
WriterHEPEVT(const std::string &filename)
Default constructor.
bool get_vertices_positions_present() const
get flag if vertex positions are available
void set_vertices_positions_present(bool iflong)
set flag if vertex positions are available
virtual void write_hepevt_event_header()
Write event header to file.
void close()
Close file stream.
int m_events_count
Events count. Needed to generate unique object name.
virtual void write_hepevt_particle(int index, bool iflong=true)
Write particle to file.
std::ofstream m_file
Output file.
bool failed()
Get stream error state flag.
void write_event(const GenEvent &evt)
Write event to file.
char * hepevtbuffer
Pointer to HEPEVT Fortran common block/C struct.
bool m_vertices_positions_present
true if vertex positions are available
std::ostream * m_stream
Output stream.
HepMC3 main namespace.
Definition ReaderGZ.h:28
Fortran common block HEPEVT.