Monarch  v3.8.2
Project 8 Data File Format Library
Monarch2TimeCheck.cc
Go to the documentation of this file.
1 /*
2  * MonarchTimeCheck.cpp
3  *
4  * Created on: May 16, 2013
5  * Author: nsoblath
6  */
7 
8 #include "M2Monarch.hh"
9 
10 #include "application.hh"
11 #include "logger.hh"
12 
13 #include <fstream>
14 using std::ofstream;
15 
16 using namespace monarch2;
17 
18 LOGGER( mlog, "Monarch2TimeCheck" );
19 
20 int main( const int argc, const char** argv )
21 {
22  scarab::main_app theMain( false );
23 
24  std::string tInputFilename, tOutputFilename;
25 
26  theMain.add_option( "InputFilename", tInputFilename, "Input egg file" )->required();
27  theMain.add_option( "OutputFilename", tOutputFilename, "Output text file" )->required();
28 
29  CLI11_PARSE( theMain, argc, argv );
30 
31  ofstream tOutput( tOutputFilename );
32  if( tOutput.is_open() == false )
33  {
34  LERROR( mlog, "could not open output file!" );
35  return RETURN_ERROR;
36  }
37 
38  std::shared_ptr< const Monarch2 > tReadTest( Monarch2::OpenForReading( tInputFilename ) );
39  tReadTest->ReadHeader();
40 
41  const M2Header* tReadHeader = tReadTest->GetHeader();
42  LINFO( mlog, *tReadHeader );
43 
44  TimeType tRecordSize = (TimeType)tReadHeader->GetRecordSize();
45  TimeType tBinWidthNS = (TimeType)(1000. / tReadHeader->GetAcquisitionRate()); // in ns
46 
47  const M2RecordBytes* tReadRecord;
48  if( tReadHeader->GetAcquisitionMode() == 1 /* the FormatMode is ignored for single-channel data */ )
49  {
50  tReadRecord = tReadTest->GetRecordSeparateOne();
51  }
52  else if( tReadHeader->GetAcquisitionMode() == 2 && tReadHeader->GetFormatMode() == sFormatMultiSeparate )
53  {
54  tReadRecord = tReadTest->GetRecordSeparateOne();
55  }
56  else if( tReadHeader->GetAcquisitionMode() == 2 && tReadHeader->GetFormatMode() == sFormatMultiInterleaved )
57  {
58  tReadRecord = tReadTest->GetRecordInterleaved();
59  }
60  else
61  {
62  LERROR( mlog, "Unable to read a header with acquisition mode <" << tReadHeader->GetAcquisitionMode() << "> and format mode <" << tReadHeader->GetFormatMode() << ">" );
63  return -1;
64  }
65 
66  unsigned long long tRecordCount = 0;
67  unsigned long long tAcquisitionCount = 0;
68 
69  TimeType tNSTimeInRunClock = 0;
70  TimeType tNSTimeInRunBins = 0;
71  TimeType tNSTimeInRunBinsCorr = 0; // corrected to the Clock time when there's a new acquisition
72 
73  // read first record
74  if (! tReadTest->ReadRecord())
75  {
76  LERROR( mlog, "No records in the file" );
77  return RETURN_ERROR;
78  }
79  tRecordCount = 1;
80  tAcquisitionCount = 1;
81  tNSTimeInRunClock = tReadRecord->fTime;
82  tNSTimeInRunBinsCorr = tNSTimeInRunClock;
83  tNSTimeInRunBins = tNSTimeInRunClock;
84 
85  tOutput << tRecordCount << '\t' << tNSTimeInRunClock << '\t' << tNSTimeInRunBins << '\t' << tNSTimeInRunBinsCorr << '\n';
86 
87  while( tReadTest->ReadRecord() != false )
88  {
89  tRecordCount = tRecordCount + 1;
90 
91  tNSTimeInRunClock = tReadRecord->fTime;
92 
93  if( tReadRecord->fAcquisitionId == tAcquisitionCount )
94  {
95  tAcquisitionCount = tAcquisitionCount + 1;
96  tNSTimeInRunBinsCorr = tNSTimeInRunClock;
97  }
98  else
99  {
100  tNSTimeInRunBinsCorr += tRecordSize * tBinWidthNS;
101  }
102  tNSTimeInRunBins += tRecordSize * tBinWidthNS;
103 
104  tOutput << tRecordCount << '\t' << tNSTimeInRunClock << '\t' << tNSTimeInRunBins << '\t' << tNSTimeInRunBinsCorr << '\n';
105 
106  //cout << " record " << tRecordCount << ": time offset: " << tReadRecord->fTime << " ns" << endl;
107  }
108  LINFO( mlog, "record count <" << tRecordCount << ">" );
109  LINFO( mlog, "acquisition count <" << tAcquisitionCount << ">" );
110 
111  tReadTest->Close();
112 
113  tOutput.close();
114 
115  return RETURN_SUCCESS;
116 }
117 
118 
unsigned int GetRecordSize() const
Definition: M2Header.cc:226
TimeType fTime
Definition: M2Record.hh:14
static scarab::logger mlog("Monarch2TimeCheck")
FormatModeType GetFormatMode() const
Definition: M2Header.cc:175
static const FormatModeType sFormatMultiSeparate
Definition: M2Types.hh:53
AcquisitionIdType fAcquisitionId
Definition: M2Record.hh:12
int main(const int argc, const char **argv)
static const FormatModeType sFormatMultiInterleaved
Definition: M2Types.hh:54
double GetAcquisitionRate() const
Definition: M2Header.cc:206
static const Monarch2 * OpenForReading(const std::string &filename)
Definition: M2Monarch.cc:62
AcquisitionModeType GetAcquisitionMode() const
Definition: M2Header.cc:196
uint64_t TimeType
Definition: M2Types.hh:59