source: trunk/MagicSoft/Mars/mraw/MRawFileRead.cc@ 3764

Last change on this file since 3764 was 3568, checked in by tbretz, 21 years ago
*** empty log message ***
File size: 6.5 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18! Author(s): Thomas Bretz 12/2000 <mailto:tbretz@astro.uni-wuerzburg.de>
19!
20! Copyright: MAGIC Software Development, 2000-2004
21!
22!
23\* ======================================================================== */
24
25//////////////////////////////////////////////////////////////////////////////
26// //
27// MRawFileRead //
28// //
29// This tasks reads the raw binary file like specified in the TDAS??? //
30// and writes the data in the corresponding containers which are //
31// either retrieved from the parameter list or created and added. //
32// //
33// Input Containers: //
34// -/- //
35// //
36// Output Containers: //
37// MRawRunHeader, MRawEvtHeader, MRawEvtData, MRawCrateArray, MRawEvtTime //
38// //
39//////////////////////////////////////////////////////////////////////////////
40#include "MRawFileRead.h"
41
42#include <errno.h>
43#include <fstream>
44
45#include "MLog.h"
46#include "MLogManip.h"
47
48#include "MTime.h"
49#include "MParList.h"
50#include "MRawRunHeader.h"
51#include "MRawEvtHeader.h"
52#include "MRawEvtData.h"
53#include "MRawCrateData.h"
54#include "MRawCrateArray.h"
55
56ClassImp(MRawFileRead);
57
58using namespace std;
59
60/* ----------- please don't delete and don't care about (Thomas) ------------
61#define kBUFSZ 64 //1024*1024*64
62#include <iomanip.h>
63class bifstream : public istream, public streambuf
64{
65private:
66 char fBuffer[kBUFSZ]; //!
67 FILE *fd;
68
69 int sync()
70 {
71 memset(fBuffer, 0, kBUFSZ);
72 return 0;
73 }
74 int underflow()
75 {
76 int sz=fread(fBuffer, kBUFSZ, 1, fd);
77 //int sz=fread(fBuffer, 1, kBUFSZ, fd);
78 setg(fBuffer, fBuffer, fBuffer+kBUFSZ);
79
80 return sz==1 ? *(unsigned char*)fBuffer : EOF;//EOF;
81 //return sz==kBUFSZ ? *(unsigned char*)fBuffer : EOF;//EOF;
82 }
83public:
84 bifstream(const char *name) : istream(this)
85 {
86 fd = fopen(name, "rb");
87 setbuf(fBuffer, kBUFSZ);
88 }
89};
90*/
91
92// --------------------------------------------------------------------------
93//
94// Default constructor. It tries to open the given file.
95//
96MRawFileRead::MRawFileRead(const char *fname, const char *name, const char *title)
97 : fFileName(fname), fIn(NULL)
98{
99 fName = name ? name : "MRawFileRead";
100 fTitle = title ? title : "Read task to read DAQ binary files";
101
102 fIn = new ifstream;
103}
104
105// --------------------------------------------------------------------------
106//
107// Destructor. Delete input stream.
108//
109MRawFileRead::~MRawFileRead()
110{
111 delete fIn;
112}
113
114// --------------------------------------------------------------------------
115//
116// The PreProcess of this task checks for the following containers in the
117// list:
118// MRawRunHeader <output> if not found it is created
119// MRawEvtHeader <output> if not found it is created
120// MRawEvtData <output> if not found it is created
121// MRawCrateArray <output> if not found it is created
122// MRawEvtTime <output> if not found it is created (MTime)
123//
124// If all containers are found or created the run header is read from the
125// binary file and printed. If the Magic-Number (file identification)
126// doesn't match we stop the eventloop.
127//
128// Now the EvtHeader and EvtData containers are initialized.
129//
130Int_t MRawFileRead::PreProcess(MParList *pList)
131{
132 //
133 // open the input stream
134 // first of all check if opening the file in the constructor was
135 // successfull
136 //
137 fIn->open(fFileName);
138 if (!(*fIn))
139 {
140 *fLog << err << "Cannot open file " << fFileName << ": ";
141 *fLog << strerror(errno) << endl;
142 return kFALSE;
143 }
144
145 if (!MRawRead::PreProcess(pList))
146 return kFALSE;
147
148 //
149 // Read RUN HEADER (see specification) from input stream
150 //
151 if (!fRawRunHeader->ReadEvt(*fIn))
152 return kFALSE;
153
154 if (!(*fIn))
155 {
156 *fLog << err << "Error: Accessing file '" << fFileName << "'" << endl;
157 return kFALSE;
158 }
159 //if (fRawRunHeader->GetMagicNumber()!=kMagicNumber)
160 // return kFALSE;
161
162 fRawRunHeader->Print();
163
164 *fRawEvtTime = fRawRunHeader->GetRunStart();
165
166 //
167 // Give the run header information to the 'sub-classes'
168 // Run header must be valid!
169 //
170 fRawEvtHeader->Init(fRawRunHeader, fRawEvtTime);
171 fRawEvtData ->Init(fRawRunHeader, fRawCrateArray);
172
173 return kTRUE;
174}
175
176// --------------------------------------------------------------------------
177//
178// The Process reads one event from the binary file:
179// - The event header is read
180// - the run header is read
181// - all crate information is read
182// - the raw data information of one event is read
183//
184Int_t MRawFileRead::Process()
185{
186 return ReadEvent(*fIn);
187}
188
189// --------------------------------------------------------------------------
190//
191// Close the file. Check whether the number of read events differs from
192// the number the file should containe (MRawRunHeader). Prints a warning
193// if it doesn't match.
194//
195Int_t MRawFileRead::PostProcess()
196{
197 fIn->close();
198
199 //
200 // Sanity check for the number of events
201 //
202 if (fRawRunHeader->GetNumEvents()==GetNumExecutions()-1 || GetNumExecutions()==0)
203 return kTRUE;
204
205 *fLog << warn << dec;
206 *fLog << "Warning - number of read events (" << GetNumExecutions()-1;
207 *fLog << ") doesn't match number in run header (";
208 *fLog << fRawRunHeader->GetNumEvents() << ")." << endl;
209
210 return kTRUE;
211}
Note: See TracBrowser for help on using the repository browser.