6 #include "EVENT/LCIO.h"
12 #include <sio/exception.h>
14 #include <sio/compression/zlib.h>
23 struct stat fileinfo ;
25 if ( ::stat( sioFilename.c_str(), &fileinfo ) == 0 ) {
28 +
" \n open it in append or new mode !\n"
32 open( filename, EVENT::LCIO::WRITE_NEW ) ;
41 _raMgr = std::make_shared<SIO::LCIORandomAccessMgr>() ;
43 case EVENT::LCIO::WRITE_NEW :
46 case EVENT::LCIO::WRITE_APPEND :
48 SIO_DEBUG(
"SIOWriter::open: Opening in write append mode" );
50 istr.open( sioFilename, std::ios::binary ) ;
52 if( not istr.is_open() ) {
55 SIO_DEBUG(
"SIOWriter::open: Opening in write append mode 1" );
56 bool hasRandomAccess =
_raMgr->initAppend( istr ) ;
58 SIO_DEBUG(
"SIOWriter::open: Opening in write append mode 2" );
59 if( hasRandomAccess ) {
60 _stream.
open( sioFilename.c_str() , std::ios::binary | std::ios::out | std::ios::in ) ;
72 _stream.
open( sioFilename.c_str() , std::ios::binary | std::ios::out | std::ios::ate ) ;
74 SIO_DEBUG(
"SIOWriter::open: Opening in write append mode ... OK" );
78 SIO_THROW( sio::error_code::not_open,
"[SIOWriter::open()] Couldn't open file: '" + sioFilename +
"'" ) ;
94 sio::buffer rawBuffer( buflen ) ;
96 sio::record_info recinfo {} ;
100 sio::zlib_compression compressor {} ;
104 sio::buffer compBuffer( rawBuffer.size() ) ;
106 sio::api::compress_record( recinfo, rawBuffer, compBuffer, compressor ) ;
111 throw IO::IOException(
"[MT::LCWriter::writeRunHeader] stream not opened") ;
113 sio::api::write_record(
_stream, rawBuffer.span(0, recinfo._header_length), compBuffer.span(), recinfo ) ;
126 throw IO::IOException(
"[MT::LCWriter::writeRunHeader] stream not opened") ;
128 sio::api::write_record(
_stream, rawBuffer.span(), recinfo ) ;
149 sio::buffer hdrRawBuffer( buflen ) ;
150 sio::buffer evtRawBuffer( buflen ) ;
152 sio::record_info rechdrinfo {} ;
155 sio::record_info recinfo {} ;
161 sio::zlib_compression compressor {} ;
163 sio::buffer hdrCompBuffer( hdrRawBuffer.size() ) ;
164 sio::buffer evtCompBuffer( evtRawBuffer.size() ) ;
166 sio::api::compress_record( rechdrinfo, hdrRawBuffer, hdrCompBuffer, compressor ) ;
167 sio::api::compress_record( recinfo, evtRawBuffer, evtCompBuffer, compressor ) ;
174 sio::api::write_record(
_stream, hdrRawBuffer.span(0, rechdrinfo._header_length), hdrCompBuffer.span(), rechdrinfo ) ;
175 sio::api::write_record(
_stream, evtRawBuffer.span(0, recinfo._header_length), evtCompBuffer.span(), recinfo ) ;
189 sio::api::write_record(
_stream, hdrRawBuffer.span(), rechdrinfo ) ;
190 sio::api::write_record(
_stream, evtRawBuffer.span(), recinfo ) ;
std::shared_ptr< SIO::LCIORandomAccessMgr > _raMgr
The random access manager for event/run random access in the file.
static constexpr int RandomAccessSize
void close()
Closes the output file/stream.
Helper struct that stores run and event positions in the file.
virtual int getRunNumber() const =0
Return the run number off this event.
void open(const std::string &filename)
Opens a file for writing.
static void writeRecord(sio::buffer &outbuf, EVENT::LCEvent *event, const SIOHandlerMgr &handlerMgr, sio::record_info &rec_info, sio::options_type opts=0)
Write an event record.
void writeEvent(EVENT::LCEvent *evt)
Writes the given event to file.
IOException used for reading/writing errors.
std::mutex _mutex
Synchronization mutex.
static constexpr const char * FileExtension
The lcio file extension name.
std::atomic< unsigned int > _maxBufferSize
The compression level.
The main event interface.
std::atomic< int > _compressionLevel
The compression level.
void setCompressionLevel(int level)
Set the compression level - needs to be called before open() otherwise call will have no effect...
Holds instances of all types of SIOObjectHandlers.
virtual int getEventNumber() const =0
Returns this event's number .
pair< int, string > level
void writeRunHeader(EVENT::LCRunHeader *hdr)
Writes the given run header to file.
std::ofstream _stream
The output file stream.
static std::string getSIOFileName(const std::string &filename)