Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-27 09:20:25

0001 /**
0002  *  @file   PandoraSDK/include/Persistency/BinaryFileWriter.h
0003  *
0004  *  @brief  Header file for the binary file writer class.
0005  *
0006  *  $Log: $
0007  */
0008 #ifndef PANDORA_BINARY_FILE_WRITER_H
0009 #define PANDORA_BINARY_FILE_WRITER_H 1
0010 
0011 #include "Pandora/Pandora.h"
0012 
0013 #include "Objects/CartesianVector.h"
0014 #include "Objects/TrackState.h"
0015 
0016 #include "Persistency/FileWriter.h"
0017 
0018 #include <fstream>
0019 
0020 namespace pandora
0021 {
0022 
0023 /**
0024  *  @brief  BinaryFileWriter class
0025  */
0026 class BinaryFileWriter : public FileWriter
0027 {
0028 public:
0029     /**
0030      *  @brief  Constructor
0031      *
0032      *  @param  algorithm the pandora instance to be used alongside the file writer
0033      *  @param  fileName the name of the output file
0034      *  @param  fileMode the mode for file writing
0035      *  @param  majorVersion the major version of the output file
0036      *  @param  minorVersion the minor version of the output file
0037      */
0038     BinaryFileWriter(const pandora::Pandora &pandora, const std::string &fileName, const FileMode fileMode = APPEND,
0039         const unsigned int majorVersion = 1, const unsigned int minorVersion = 0);
0040 
0041     /**
0042      *  @brief  Destructor
0043      */
0044     ~BinaryFileWriter();
0045 
0046     /**
0047      *  @brief  Write a variable to the file
0048      */
0049     template <typename T>
0050     StatusCode WriteVariable(const T &t);
0051 
0052 private:
0053     StatusCode WriteHeader(const ContainerId containerId);
0054     StatusCode WriteFooter();
0055     StatusCode WriteVersion();
0056     StatusCode WriteSubDetector(const SubDetector *const pSubDetector);
0057     StatusCode WriteLArTPC(const LArTPC *const pLArTPC);
0058     StatusCode WriteDetectorGap(const DetectorGap *const pDetectorGap);
0059     StatusCode WriteCaloHit(const CaloHit *const pCaloHit);
0060     StatusCode WriteTrack(const Track *const pTrack);
0061     StatusCode WriteMCParticle(const MCParticle *const pMCParticle);
0062     StatusCode WriteRelationship(const RelationshipId relationshipId, const void *address1, const void *address2, const float weight);
0063     StatusCode WriteEventInformation();
0064 
0065     std::ofstream::pos_type m_containerPosition; ///< Position of start of the current event/geometry container object in file
0066     std::ofstream m_fileStream;                  ///< The stream class to write to the file
0067 };
0068 
0069 //------------------------------------------------------------------------------------------------------------------------------------------
0070 
0071 template <typename T>
0072 inline StatusCode BinaryFileWriter::WriteVariable(const T &t)
0073 {
0074     m_fileStream.write(reinterpret_cast<const char *>(&t), sizeof(T));
0075 
0076     if (!m_fileStream.good())
0077         return STATUS_CODE_FAILURE;
0078 
0079     return STATUS_CODE_SUCCESS;
0080 }
0081 
0082 template <>
0083 inline StatusCode BinaryFileWriter::WriteVariable(const std::string &t)
0084 {
0085     const unsigned int stringSize(t.size());
0086     PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteVariable(stringSize));
0087     m_fileStream.write(reinterpret_cast<const char *>(t.c_str()), stringSize);
0088 
0089     if (!m_fileStream.good())
0090         return STATUS_CODE_FAILURE;
0091 
0092     return STATUS_CODE_SUCCESS;
0093 }
0094 
0095 template <>
0096 inline StatusCode BinaryFileWriter::WriteVariable(const CartesianVector &t)
0097 {
0098     PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteVariable(t.GetX()));
0099     PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteVariable(t.GetY()));
0100     PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteVariable(t.GetZ()));
0101     return STATUS_CODE_SUCCESS;
0102 }
0103 
0104 template <>
0105 inline StatusCode BinaryFileWriter::WriteVariable(const TrackState &t)
0106 {
0107     PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteVariable(t.GetPosition()));
0108     PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->WriteVariable(t.GetMomentum()));
0109     return STATUS_CODE_SUCCESS;
0110 }
0111 
0112 } // namespace pandora
0113 
0114 #endif // #ifndef PANDORA_BINARY_FILE_WRITER_H