source: branches/Mars_MC/mraw/MRawFitsRead.cc@ 17689

Last change on this file since 17689 was 17162, checked in by Jens Buss, 11 years ago
included if condition for Monte Carlo data, some header keys will be ignored
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 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 "fits.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
73Int_t MRawFitsRead::PreProcess(MParList *pList)
74{
75 fRawBoards = (MRawBoardsFACT*)pList->FindCreateObj("MRawBoardsFACT");
76 if (!fRawBoards)
77 return kFALSE;
78
79 return MRawFileRead::PreProcess(pList);
80}
81
82Bool_t MRawFitsRead::LoadMap(const char *name)
83{
84 fPixelMap.resize(1440);
85
86 if (!name)
87 return kTRUE;
88
89 ifstream fin(name);
90
91 int l = 0;
92
93 string buf;
94 while (getline(fin, buf, '\n'))
95 {
96 if (l>1439)
97 break;
98
99 const TString bf = TString(buf.c_str()).Strip(TString::kBoth);
100 if (bf[0]=='#')
101 continue;
102
103 stringstream str(bf.Data());
104
105 int index, cbpx;
106
107 str >> index;
108 str >> cbpx;
109
110 const int c = cbpx/1000;
111 const int b = (cbpx/100)%10;
112 const int p = (cbpx/10)%10;
113 const int x = cbpx%10;
114
115 const int hw = x+p*9+b*36+c*360;
116 if (hw>1439)
117 break;
118
119 fPixelMap[hw] = index;
120 l++;
121 }
122
123 if (l!=1440)
124 {
125 gLog << err << "ERROR - Problems reading " << name << endl;
126 fPixelMap.resize(0);
127 return kFALSE;
128 }
129
130 return kTRUE;
131}
132
133Bool_t MRawFitsRead::IsFits(const char *name)
134{
135 return fits(name).good();
136}
137
138istream *MRawFitsRead::OpenFile(const char *filename)
139{
140 return new fits(filename);
141}
142
143Bool_t MRawFitsRead::ReadRunHeader(istream &stream)
144{
145 fits &fin = static_cast<fits&>(stream);
146
147 if (fin.GetStr("TELESCOP")!="FACT")
148 {
149 gLog << err << "Not a valid FACT FITS file (key TELESCOP not 'FACT')." << endl;
150 return kFALSE;
151 }
152
153 const string type = fin.GetStr("RUNTYPE");
154
155 fRawRunHeader->SetValidMagicNumber();
156 fRawRunHeader->SetNumEvents(fin.GetUInt("NAXIS2"));
157 fRawRunHeader->InitPixels(fin.GetUInt("NPIX"));
158 fRawRunHeader->SetObservation(type=="4294967295"?"":fin.GetStr("RUNTYPE"), "FACT");
159 fRawRunHeader->SetRunInfo(0, fin.GetUInt("NIGHT"), fin.GetUInt("RUNID"));
160 fRawRunHeader->InitFact(fin.GetUInt("NPIX")/9, 9, fin.GetUInt("NROI"), fPixelMap.size()==0?0:fPixelMap.data());
161 if (!fin.HasKey("ISMC")){
162 fRawRunHeader->SetFormat(0xf172, fin.GetUInt("BLDVER"));
163 }
164 fRawRunHeader->SetRunType(0/*data*/);
165
166 if (!fin.HasKey("ISMC")){
167 const string runstart = fin.GetStr("DATE-OBS");
168 const string runstop = fin.GetStr("DATE-END");
169
170 fRawRunHeader->SetRunTime(MTime(runstart.c_str()), MTime(runstop.c_str()));
171 }
172
173 if (!fin.HasKey("ISMC"))
174 return
175 fin.HasKey("NPIX") && fin.HasKey("RUNID") &&
176 fin.HasKey("NROI") && fin.HasKey("BLDVER") &&
177 fin.HasKey("NIGHT");
178 else
179 return
180 fin.HasKey("NPIX") && fin.HasKey("RUNID") &&
181 fin.HasKey("NROI") && fin.HasKey("NIGHT");
182}
183
184Bool_t MRawFitsRead::InitReadData(istream &stream)
185{
186 fits &fin = static_cast<fits&>(stream);
187
188 MArrayB **data = reinterpret_cast<MArrayB**>(fRawEvtData1->DataMember("fHiGainFadcSamples"));
189 MArrayS **cell = reinterpret_cast<MArrayS**>(fRawEvtData1->DataMember("fStartCells"));
190 UInt_t *evtnum = reinterpret_cast<UInt_t*> (fRawEvtHeader->DataMember("fDAQEvtNumber"));
191 UShort_t *trg = reinterpret_cast<UShort_t*>(fRawEvtHeader->DataMember("fTrigPattern"));
192
193 if (!data || !cell || !evtnum || !trg)
194 return kFALSE;
195
196 fRawEvtData1->ResetPixels();
197 fRawEvtData2->ResetPixels(0, 0);
198 fRawEvtData1->InitStartCells();
199
200 if (!fin.SetRefAddress("EventNum", *evtnum))
201 return kFALSE;
202
203 if (!fin.SetRefAddress("TriggerType", *trg))
204 return kFALSE;
205
206 if (!fin.HasKey("ISMC")){
207 fPCTime.resize(2);
208 if (!fin.SetVecAddress("UnixTimeUTC", fPCTime))
209 if (!fin.SetVecAddress("PCTime", fPCTime))
210 return kFALSE;
211
212 if (!fin.SetPtrAddress("BoardTime", fRawBoards->fFadTime, 40))
213 return kFALSE;
214 }
215 else
216 fIsMc = kTRUE;
217
218
219 if (!fin.SetPtrAddress("Data", (int16_t*)(*data)->GetArray(), (*data)->GetSize()/2))
220 return kFALSE;
221
222 if (!fin.SetPtrAddress("StartCellData", (uint16_t*)(*cell)->GetArray(), (*cell)->GetSize()))
223 return kFALSE;
224
225 fRawEvtData1->SetIndices(fRawRunHeader->GetPixAssignment());
226
227 return kTRUE;
228}
229
230Bool_t MRawFitsRead::ReadEvent(istream &stream)
231{
232 if (!static_cast<fits&>(stream).GetNextRow())
233 return kFALSE;
234
235 if (!fIsMc)
236 fRawEvtTime->SetUnixTime(fPCTime[0], fPCTime[1]);
237
238 // FIXME: Correctly sort the pixels here!
239
240 fRawEvtData1->SetReadyToSave();
241 fRawEvtData2->SetReadyToSave();
242
243 return kTRUE;
244}
245
246void MRawFitsRead::SkipEvent(istream &fin)
247{
248 static_cast<fits&>(fin).SkipNextRow();
249}
Note: See TracBrowser for help on using the repository browser.