00001 #ifndef FILEREADOUTFORMAT_DAQTOOSTREAM_H
00002 #define FILEREADOUTFORMAT_DAQTOOSTREAM_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <ostream>
00013 #include <string>
00014
00015 #include "DaqReadoutFormat/DaqBuffer.h"
00016 #include "FileReadoutFormat/FileTraits.h"
00017 #include "FileReadoutFormat/MetadataStrings.h"
00018
00019 namespace DybDaq {
00020 class CalibrationParametersRecord;
00021 class DataSeparatorRecord;
00022 class EventReadout;
00023 class FileBuffer;
00024 class FileEndRecord;
00025 class FileNameStrings;
00026 class FileStartRecord;
00027 class MetadataStrings;
00028 class RunParametersRecord;
00029 }
00030
00031 namespace DybDaq {
00032
00033 class DaqToOStream {
00034
00035 public:
00036
00040 virtual ~DaqToOStream();
00041
00045 bool openSequence(const std::string& fileBase,
00046 const FileStartRecord& record);
00047
00051 const FileStartRecord* openSequence(const std::string& fileBase,
00052 const FileTraits::FileDateTime& dateTime,
00053 const unsigned int dataBlockLimit,
00054 const unsigned int megabyteLimit);
00055
00059 bool open(const FileStartRecord& record);
00060
00064 const FileStartRecord* openNext(const FileTraits::FileDateTime& dateTime);
00065
00069 bool saveFileNameStrings(const FileNameStrings& record);
00070
00074 const FileNameStrings* saveFileNameStrings(const std::string& application,
00075 const std::string& fileBase = "");
00076
00080 bool saveMetadataStrings(const MetadataStrings& record);
00081
00085 const MetadataStrings* saveMetadataStrings(const MetadataStrings::MetadataStringPtrList& metadataStrings);
00086
00090 bool saveRunParametersRecord(const RunParametersRecord& record);
00091
00095 const RunParametersRecord* saveRunParametersRecord(const unsigned int runNumber,
00096 const bool recordEnabled,
00097 const unsigned int triggerType,
00098 const unsigned int detectorMask);
00099
00103 bool saveCalibrationParametersRecord(const CalibrationParametersRecord& record);
00104
00108 const CalibrationParametersRecord* saveCalibrationParametersRecord(const unsigned int detector,
00109 const unsigned int adNumber,
00110 const unsigned int sourceA,
00111 const unsigned int zPositionA,
00112 const unsigned int sourceB,
00113 const unsigned int zPositionB,
00114 const unsigned int sourceC,
00115 const unsigned int zPositionC,
00116 const unsigned int led1,
00117 const unsigned int led2,
00118 const unsigned int led1Voltage,
00119 const unsigned int led2Voltage,
00120 const unsigned int duration,
00121 const unsigned int ledFrequency,
00122 const unsigned int ledPulseSeparation,
00123 const unsigned int ltbMode,
00124 const unsigned int motorPower,
00125 const unsigned int cameraPower,
00126 const unsigned int ledFlashing);
00127
00131 bool saveDataSeparatorRecord(const DataSeparatorRecord& record);
00132
00136 const DataSeparatorRecord* saveEvent(const EventReadout& event);
00137
00141 bool close(const FileEndRecord& record) ;
00142
00146 const FileEndRecord* close(const FileTraits::FileDateTime& dateTime);
00147
00151 const FileEndRecord* close(const FileTraits::FileDateTime& dateTime,
00152 const unsigned int blockCountBeforeFile,
00153 const unsigned long payloadLengthBeforeFile,
00154 const unsigned int status);
00155
00156 protected:
00157
00161 DaqToOStream(const FileTraits& traits);
00162
00166 const FileStartRecord* openElement(const unsigned int fileNumber,
00167 const FileTraits::FileDateTime& dateTime,
00168 const unsigned int dataBlockLimit,
00169 const unsigned int megabyteLimit);
00170
00174 virtual std::ostream* openStream() = 0;
00175
00179 virtual void prepareNext() = 0;
00180
00184 virtual void closeStream(std::ostream& stream) = 0;
00185
00189 void splitStream();
00190
00194 void eventSaved(unsigned int bytesSaved);
00195
00199 const std::string& getFileBase() const;
00200
00204 unsigned int getFileBlockCount() const;
00205
00209 unsigned int getFileCount() const;
00210
00214 unsigned int getLastRecord() const;
00215
00219 bool hasFileBase() const;
00220
00224 bool hasOStream() const;
00225
00229 void saveBuffer(const FileBuffer& daqBuffer);
00230
00231 private:
00232
00236 DaqToOStream();
00237
00241 DaqToOStream(DaqToOStream& rhs);
00242
00246 DaqToOStream& operator=(DaqToOStream& rhs);
00247
00251 void setFileBase(const std::string& fileBase);
00252
00256 const FileTraits* m_traits;
00257
00261 std::ostream* m_ostream;
00262
00266 DaqBuffer::OutputBufferList* m_buffers;
00267
00271 std::string* m_fileBase;
00272
00276 unsigned long m_filePayloadLength;
00277
00281 unsigned long m_payloadLengthTotal;
00282
00286 unsigned int m_lastRecord;
00287
00291 unsigned int m_dataBlockLimit;
00292
00296 unsigned int m_megabyteLimit;
00297
00301 unsigned int m_fileCount;
00302
00306 unsigned int m_sequenceBlockCount;
00307
00311 unsigned int m_fileBlockCount;
00312
00316 unsigned int m_blockCountTotal;
00317 };
00318
00319 }
00320
00321 #endif // FILEREADOUTFORMAT_DAQTOOSTREAM_H