File indexing completed on 2026-09-27 09:20:25
0001
0002
0003
0004
0005
0006
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
0025
0026 class BinaryFileWriter : public FileWriter
0027 {
0028 public:
0029
0030
0031
0032
0033
0034
0035
0036
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
0043
0044 ~BinaryFileWriter();
0045
0046
0047
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;
0066 std::ofstream m_fileStream;
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 }
0113
0114 #endif