Monarch  v3.8.2
Project 8 Data File Format Library
M3Stream.hh
Go to the documentation of this file.
1 /*
2  * M3Stream.hh
3  *
4  * Created on: Dec 26, 2014
5  * Author: nsoblath
6  */
7 
8 #ifndef M3STREAM_HH_
9 #define M3STREAM_HH_
10 
11 #include "M3Header.hh"
12 #include "M3MemberVariable.hh"
13 #include "M3Record.hh"
14 #include "M3Types.hh"
15 
16 #include "H5Cpp.h"
17 
18 namespace monarch3
19 {
42  {
43  public:
44  enum Mode
45  {
47  kWrite
48  };
49 
50  private:
51  typedef void (M3Stream::*DoReadRecordFunc)( bool ) const;
52  typedef void (M3Stream::*DoWriteRecordFunc)( bool );
53 
54  public:
55  M3Stream( const M3StreamHeader& aHeader, HAS_GRP_IFC* aH5StreamParentLoc, uint32_t aAccessFormat = sSeparate );
56  virtual ~M3Stream();
57 
58  M3Stream( const M3Stream& ) = delete;
59  M3Stream& operator=( const M3Stream& ) = delete;
60 
62 
63  public:
65  void Initialize() const;
66 
67  void SetMutex( const mutex_ptr& aMutexPtr );
68 
69  //********************************
70  // methods for reading (all const)
71  //********************************
72 
73  public:
75  const M3Record* GetStreamRecord() const;
77  const M3Record* GetChannelRecord( unsigned aChannel ) const;
78 
80 
92  bool ReadRecord( int anOffset = 0, bool aIfNewAcqStartAtFirstRec = true ) const;
93 
95  void Close() const;
96 
97 
98  //*********************************
99  // methods for writing (none const)
100  //*********************************
101 
102  public:
104  M3Record* GetStreamRecord();
106  M3Record* GetChannelRecord( unsigned aChannel );
107 
109  bool WriteRecord( bool aIsNewAcquisition );
110 
112  void Close();
113 
114 
115  public:
116  bool GetIsInitialized() const { return fIsInitialized; }
117  bool GetRecordsAccessed() const { return fRecordsAccessed; }
118  unsigned GetDataTypeSize() const { return fDataTypeSize; }
119  unsigned GetSampleSize() const { return fSampleSize; }
120  unsigned GetStreamRecordNBytes() const { return fStrRecNBytes; }
121  unsigned GetStreamRecordSize() const { return fStrRecSize; }
122  unsigned GetChannelRecordNBytes() const { return fChanRecNBytes; }
123  unsigned GetChannelRecordSize() const { return fChanRecSize; }
124  unsigned GetNChannels() const { return fNChannels; }
125  unsigned GetNAcquisitions() const { return fNAcquisitions; }
126  AcquisitionIdType GetAcquisitionId() const { return fAcquisitionId; }
127  unsigned GetRecordCountInAcq() const { return fRecordCountInAcq; }
128  unsigned GetNRecordsInAcquisition() const { return fNRecordsInAcq; }
129  TimeType GetAcqFirstRecordTime() const { return fAcqFirstRecTime; }
130  RecordIdType GetAcqFirstRecordId() const { return fAcqFirstRecId; }
131  TimeType* GetAcqFirstRecTimes() const { return fAcqFirstRecTimes; }
132  RecordIdType* GetAcqFirstRecordIds() const { return fAcqFirstRecIds; }
133  unsigned GetRecordCountInFile() const { return fRecordCountInFile; }
134  unsigned GetNRecordsInFile() const { return fNRecordsInFile; }
135  unsigned GetFirstRecordInFile() const { return fFirstRecordInFile; }
136  bool GetIsInterleaved() const { return fDataInterleaved; }
137 
139  void SetAccessFormat( uint32_t aFormat ) const;
140  uint32_t GetAccessFormat() const { return fAccessFormat; }
141 
142  private:
143  void ReadRecordInterleavedToSeparate( bool aIsNewAcquisition ) const;
144  void ReadRecordAsIs( bool aIsNewAcquisition ) const;
145  mutable DoReadRecordFunc fDoReadRecord;
146 
147  void WriteRecordSeparateToInterleaved( bool aIsNewAcquisition );
148  void WriteRecordAsIs( bool aIsNewAcquisition );
149  mutable DoWriteRecordFunc fDoWriteRecord;
150 
151  mutable bool fIsInitialized;
152  mutable bool fRecordsAccessed;
153 
154  mutable unsigned fDataTypeSize;
155  mutable unsigned fSampleSize;
156 
157  mutable unsigned fStrRecNBytes;
158  mutable unsigned fStrRecSize;
159 
160  mutable unsigned fChanRecNBytes;
161  mutable unsigned fChanRecSize;
162  mutable uint64_t fChanRecLength; // ns
163 
165 
166  mutable unsigned fNChannels;
168 
169  mutable unsigned fNAcquisitions;
171 
172  mutable unsigned fRecordCountInAcq;
173  mutable unsigned fNRecordsInAcq;
174  mutable TimeType fAcqFirstRecTime; // used when reading with the stream record
175  mutable RecordIdType fAcqFirstRecId; // used when reading with the stream record
176  mutable TimeType* fAcqFirstRecTimes; // used when reading with the channel records
177  mutable RecordIdType* fAcqFirstRecIds; // used when reading with the channel records
178 
179  mutable bool fDataInterleaved;
180  mutable uint32_t fAccessFormat;
181 
182  mutable std::vector< std::pair< unsigned, unsigned > > fRecordIndex; // has an entry for every record: (acquisition ID, record ID)
183  mutable unsigned fRecordCountInFile;
184  mutable unsigned fNRecordsInFile;
185  mutable unsigned fFirstRecordInFile;
186 
187  private:
188  void BuildIndex() const; // for reading
189 
190  void FinalizeCurrentAcq(); // for writing
191  void FinalizeStream(); // for writing
192 
193  mutable char fAcqNameBuffer[ 10 ];
194 
195  mutable H5::Group* fH5StreamParentLoc;
196  mutable H5::Group* fH5AcqLoc;
197  mutable H5::DataSet* fH5CurrentAcqDataSet;
198 
199  mutable H5::DataSpace* fH5DataSpaceUser;
200 
201  mutable H5::DataType fDataTypeInFile;
202  mutable H5::DataType fDataTypeUser;
203 
204  enum { N_DATA_DIMS = 2 };
205  mutable hsize_t fStrDataDims[ N_DATA_DIMS ];
206  mutable hsize_t fStrMaxDataDims[ N_DATA_DIMS ];
207  mutable hsize_t fStrDataChunkDims[ N_DATA_DIMS ];
208  mutable hsize_t fDataDims1Rec[ N_DATA_DIMS ];
209  mutable hsize_t fDataOffset[ N_DATA_DIMS ];
210  mutable hsize_t fDataStride[ N_DATA_DIMS ];
211  mutable hsize_t fDataBlock[ N_DATA_DIMS ];
212 
214  };
215 
216  inline void M3Stream::SetMutex( const mutex_ptr& aMutexPtr )
217  {
218  fMutexPtr = aMutexPtr;
219  return;
220  }
221 
223  {
224  return &fStreamRecord;
225  }
226 
227 } /* namespace monarch */
228 
229 #endif /* MSTREAM_HH_ */
RecordIdType fAcqFirstRecId
Definition: M3Stream.hh:175
unsigned fDataTypeSize
Definition: M3Stream.hh:154
const M3Record * GetStreamRecord() const
Get the pointer to the stream record.
Definition: M3Stream.cc:299
DoWriteRecordFunc fDoWriteRecord
Definition: M3Stream.hh:149
static const uint32_t sSeparate
Definition: M3Constants.hh:51
unsigned GetNRecordsInFile() const
Definition: M3Stream.hh:134
RecordIdType * fAcqFirstRecIds
Definition: M3Stream.hh:177
RecordIdType GetAcqFirstRecordId() const
Definition: M3Stream.hh:130
unsigned fNChannels
Definition: M3Stream.hh:166
void SetMutex(const mutex_ptr &aMutexPtr)
Definition: M3Stream.hh:216
TimeType * fAcqFirstRecTimes
Definition: M3Stream.hh:176
unsigned fNRecordsInFile
Definition: M3Stream.hh:184
H5::Group * fH5StreamParentLoc
Definition: M3Stream.hh:195
unsigned GetSampleSize() const
Definition: M3Stream.hh:119
unsigned GetChannelRecordSize() const
Definition: M3Stream.hh:123
Contains the information that makes up a record.
Definition: M3Record.hh:35
uint32_t fAccessFormat
Definition: M3Stream.hh:180
unsigned GetNChannels() const
Definition: M3Stream.hh:124
DoReadRecordFunc fDoReadRecord
Definition: M3Stream.hh:145
AcquisitionIdType fAcquisitionId
Definition: M3Stream.hh:170
uint64_t fChanRecLength
Definition: M3Stream.hh:162
bool GetIsInitialized() const
Definition: M3Stream.hh:116
unsigned fNRecordsInAcq
Definition: M3Stream.hh:173
unsigned GetFirstRecordInFile() const
Definition: M3Stream.hh:135
RecordIdType * GetAcqFirstRecordIds() const
Definition: M3Stream.hh:132
unsigned fChanRecSize
Definition: M3Stream.hh:161
M3Record * fChannelRecords
Definition: M3Stream.hh:167
#define M3MEMBERVARIABLE
unsigned GetStreamRecordSize() const
Definition: M3Stream.hh:121
unsigned fSampleSize
Definition: M3Stream.hh:155
unsigned GetNAcquisitions() const
Definition: M3Stream.hh:125
Read/write access for a data stream.
Definition: M3Stream.hh:41
unsigned fChanRecNBytes
Definition: M3Stream.hh:160
TimeType fAcqFirstRecTime
Definition: M3Stream.hh:174
uint64_t RecordIdType
Definition: M3Types.hh:25
M3Record fStreamRecord
Definition: M3Stream.hh:164
unsigned fStrRecNBytes
Definition: M3Stream.hh:157
uint64_t TimeType
Definition: M3Types.hh:26
unsigned GetChannelRecordNBytes() const
Definition: M3Stream.hh:122
Single-stream header information.
Definition: M3Header.hh:33
unsigned GetStreamRecordNBytes() const
Definition: M3Stream.hh:120
unsigned GetNRecordsInAcquisition() const
Definition: M3Stream.hh:128
unsigned GetRecordCountInAcq() const
Definition: M3Stream.hh:127
unsigned GetRecordCountInFile() const
Definition: M3Stream.hh:133
H5::Group * fH5AcqLoc
Definition: M3Stream.hh:196
unsigned fRecordCountInFile
Definition: M3Stream.hh:183
unsigned fNAcquisitions
Definition: M3Stream.hh:169
bool GetIsInterleaved() const
Definition: M3Stream.hh:136
unsigned fRecordCountInAcq
Definition: M3Stream.hh:172
H5::DataType fDataTypeUser
Definition: M3Stream.hh:202
unsigned fFirstRecordInFile
Definition: M3Stream.hh:185
H5::DataSpace * fH5DataSpaceUser
Definition: M3Stream.hh:199
AcquisitionIdType GetAcquisitionId() const
Definition: M3Stream.hh:126
std::vector< std::pair< unsigned, unsigned > > fRecordIndex
Definition: M3Stream.hh:182
uint32_t GetAccessFormat() const
Definition: M3Stream.hh:140
unsigned fStrRecSize
Definition: M3Stream.hh:158
H5::DataType fDataTypeInFile
Definition: M3Stream.hh:201
bool GetRecordsAccessed() const
Definition: M3Stream.hh:117
#define M3_API
Definition: M3Constants.hh:21
mutex_ptr fMutexPtr
Definition: M3Stream.hh:213
uint64_t AcquisitionIdType
Definition: M3Types.hh:24
std::shared_ptr< std::mutex > mutex_ptr
Definition: M3Types.hh:28
H5::DataSet * fH5CurrentAcqDataSet
Definition: M3Stream.hh:197
TimeType * GetAcqFirstRecTimes() const
Definition: M3Stream.hh:131
TimeType GetAcqFirstRecordTime() const
Definition: M3Stream.hh:129
unsigned GetDataTypeSize() const
Definition: M3Stream.hh:118