source: trunk/Mars/mraw/MRawFitsRead.cc@ 20020

Last change on this file since 20020 was 19948, checked in by tbretz, 5 years ago
That was a mistake as NPIX is 1440 or 61.
File size: 7.6 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 07/2011 <mailto:thomas.bretz@epfl.ch>
19!
20! Copyright: MAGIC Software Development, 2000-2011
21!
22!
23\* ======================================================================== */
24
25//////////////////////////////////////////////////////////////////////////////
26//
27// MRawFitsRead
28//
29// This tasks reads the fits data file in the form used by FACT.
30//
31// Input Containers:
32// -/-
33//
34// Output Containers:
35// MRawRunHeader, MRawEvtHeader, MRawEvtData, MRawEvtTime
36//
37//////////////////////////////////////////////////////////////////////////////
38#include "MRawFitsRead.h"
39
40#include <fstream>
41
42#include <TClass.h>
43
44#include "MLog.h"
45#include "MLogManip.h"
46
47#include "factfits.h"
48#include "MTime.h"
49
50#include "MArrayB.h"
51#include "MArrayS.h"
52
53#include "MParList.h"
54
55#include "MRawRunHeader.h"
56#include "MRawEvtHeader.h"
57#include "MRawEvtData.h"
58#include "MRawBoardsFACT.h"
59
60ClassImp(MRawFitsRead);
61
62using namespace std;
63
64// --------------------------------------------------------------------------
65//
66// Default constructor. It tries to open the given file.
67//
68MRawFitsRead::MRawFitsRead(const char *fname, const char *name, const char *title)
69 : MRawFileRead(fname, name, title), fRawBoards(0)
70{
71}
72
73const fits *MRawFitsRead::GetFitsFile() const
74{
75 return static_cast<const fits*>(GetStream());
76}
77
78Int_t MRawFitsRead::PreProcess(MParList *pList)
79{
80 fRawBoards = (MRawBoardsFACT*)pList->FindCreateObj("MRawBoardsFACT");
81 if (!fRawBoards)
82 return kFALSE;
83
84 return MRawFileRead::PreProcess(pList);
85}
86
87Bool_t MRawFitsRead::LoadMap(const char *name)
88{
89 fPixelMap.resize(1440);
90
91 if (!name)
92 return kTRUE;
93
94 ifstream fin(name);
95
96 int l = 0;
97
98 string buf;
99 while (getline(fin, buf, '\n'))
100 {
101 if (l>1439)
102 break;
103
104 const TString bf = TString(buf.c_str()).Strip(TString::kBoth);
105 if (bf[0]=='#')
106 continue;
107
108 stringstream str(bf.Data());
109
110 int index, cbpx;
111
112 str >> index;
113 str >> cbpx;
114
115 const int c = cbpx/1000;
116 const int b = (cbpx/100)%10;
117 const int p = (cbpx/10)%10;
118 const int x = cbpx%10;
119
120 const int hw = x+p*9+b*36+c*360;
121 if (hw>1439)
122 break;
123
124 fPixelMap[hw] = index;
125 l++;
126 }
127
128 if (l!=1440)
129 {
130 gLog << err << "ERROR - Problems reading " << name << endl;
131 fPixelMap.resize(0);
132 return kFALSE;
133 }
134
135 return kTRUE;
136}
137
138Bool_t MRawFitsRead::IsFits(const char *name)
139{
140 return factfits(name).good();
141}
142
143istream *MRawFitsRead::OpenFile(const char *filename)
144{
145 return new factfits(filename);
146}
147
148Bool_t MRawFitsRead::ReadRunHeader(istream &stream)
149{
150 factfits &fin = static_cast<factfits&>(stream);
151
152 if (fin.GetStr("TELESCOP")!="FACT")
153 {
154 gLog << err << "Not a valid FACT FITS file (key TELESCOP not 'FACT')." << endl;
155 return kFALSE;
156 }
157
158 fIsMc = fin.HasKey("ISMC");
159
160 const string type = fin.GetStr("RUNTYPE");
161
162 fRawRunHeader->SetValidMagicNumber();
163 fRawRunHeader->SetNumEvents(fin.GetNumRows());//GetUInt("NAXIS2"));
164 fRawRunHeader->InitPixels(fin.GetUInt("NPIX"));
165 fRawRunHeader->SetObservation(type=="4294967295"?"":fin.GetStr("RUNTYPE"), "FACT");
166 fRawRunHeader->SetRunInfo(0, fin.GetUInt("NIGHT"), fin.GetUInt("RUNID"));
167
168 const UShort_t *mmap = fPixelMap.size()==0 || fIsMc ? nullptr : fPixelMap.data();
169 if (fin.GetStr("CAMERA")!="MGeomCamFAMOUS")
170 fRawRunHeader->InitFact(fin.GetUInt("NPIX")/9, 9, fin.GetUInt("NROI"), mmap);
171 else
172 fRawRunHeader->InitFact(1, fin.GetUInt("NPIX"), fin.GetUInt("NROI"), mmap);
173
174 fRawRunHeader->SetFormat(0xf172, fIsMc ? 0 : fin.GetUInt("BLDVER"));
175 fRawRunHeader->SetRunType(fIsMc ? 0x0100/*mc*/ : 0/*data*/);
176
177 if (!fIsMc)
178 {
179 const string runstart = fin.GetStr("DATE-OBS");
180 const string runstop = fin.GetStr("DATE-END");
181
182 fRawRunHeader->SetRunTime(MTime(runstart.c_str()), MTime(runstop.c_str()));
183 }
184
185 for (int i=0; i<1000; i++)
186 {
187 const string clnamed = Form("CLNAME%d", i);
188 if (!fin.HasKey(clnamed))
189 break;
190
191 const string cltyped = Form("CLTYPE%d", i);
192 const string clname = fin.GetStr(clnamed);
193 const string cltype = fin.HasKey(cltyped) ? fin.GetStr(cltyped) : clname;
194
195 MParContainer *par = (MParContainer*)fParList->FindCreateObj(cltype.c_str(), clname.c_str());
196 if (par && !par->SetupFits(fin))
197 {
198 *fLog << err << "ERROR - Setting up " << par->GetDescriptor() << " failed." << endl;
199 return kFALSE;
200 }
201 }
202
203 return
204 fin.HasKey("NPIX") && fin.HasKey("RUNID") &&
205 fin.HasKey("NROI") && fin.HasKey("NIGHT");
206}
207
208Bool_t MRawFitsRead::InitReadData(istream &stream)
209{
210 factfits &fin = static_cast<factfits&>(stream);
211
212 MArrayB **data = reinterpret_cast<MArrayB**>(fRawEvtData1->DataMember("fHiGainFadcSamples"));
213 MArrayS **cell = reinterpret_cast<MArrayS**>(fRawEvtData1->DataMember("fStartCells"));
214 UInt_t *evtnum = reinterpret_cast<UInt_t*> (fRawEvtHeader->DataMember("fDAQEvtNumber"));
215
216 // The 'wrong' cast is intentional because we read only two bytes from the file
217 UShort_t *trg = reinterpret_cast<UShort_t*>(fRawEvtHeader->DataMember("fTrigPattern"));
218
219 if (!data || !cell || !evtnum || !trg)
220 return kFALSE;
221
222 fRawEvtData1->ResetPixels();
223 fRawEvtData2->ResetPixels(0, 0);
224 fRawEvtData1->InitStartCells();
225
226 if (!fin.SetRefAddress("EventNum", *evtnum))
227 return kFALSE;
228
229 if (!fin.SetRefAddress("TriggerType", *trg))
230 return kFALSE;
231
232 if (!fIsMc)
233 {
234 if (!fin.SetRefAddress("NumBoards", fNumBoards))
235 return kFALSE;
236
237 fPCTime.resize(2);
238 if (!fin.SetVecAddress("UnixTimeUTC", fPCTime))
239 if (!fin.SetVecAddress("PCTime", fPCTime))
240 return kFALSE;
241
242 if (!fin.SetPtrAddress("BoardTime", fRawBoards->fFadTime, 40))
243 return kFALSE;
244 }
245
246 if (!fin.SetPtrAddress("Data", reinterpret_cast<int16_t*>((*data)->GetArray()),
247 (*data)->GetSize()/2))
248 return kFALSE;
249
250 if (!fin.SetPtrAddress("StartCellData", (uint16_t*)(*cell)->GetArray(), (*cell)->GetSize()))
251 return kFALSE;
252
253 fRawEvtData1->SetIndices(fRawRunHeader->GetPixAssignment());
254
255 return kTRUE;
256}
257
258Bool_t MRawFitsRead::ReadEvent(istream &stream)
259{
260 if (!static_cast<factfits&>(stream).GetNextRow())
261 return kFALSE;
262
263 if (!fIsMc)
264 {
265 // Skip incomplete events
266 //if (fNumBoards!=40)
267 // return kCONTINUE;
268 // FIXME: These events never got skipped as kCONTINUE is treated as kTRUE when converted to
269 // boolean. Only the time stamp gets messed up
270
271 fRawEvtTime->SetUnixTime(fPCTime[0], fPCTime[1]);
272 }
273
274 fRawEvtData1->SetReadyToSave();
275 fRawEvtData2->SetReadyToSave();
276
277 return kTRUE;
278}
279
280void MRawFitsRead::SkipEvent(istream &fin)
281{
282 static_cast<factfits&>(fin).SkipNextRow();
283}
Note: See TracBrowser for help on using the repository browser.