source: trunk/MagicSoft/Mars/mtemp/mifae/library/MLiveTimeCalc.cc@ 4405

Last change on this file since 4405 was 4405, checked in by jlopez, 20 years ago
*** empty log message ***
File size: 9.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! Author(s): Javier López , 7/2004 <mailto:jlopez@ifae.es>
18!
19! Copyright: MAGIC Software Development, 2000-2004
20!
21!
22\* ======================================================================== */
23
24/////////////////////////////////////////////////////////////////////////////
25//
26// MLiveTimeCalc
27//
28/////////////////////////////////////////////////////////////////////////////
29#include "MLiveTimeCalc.h"
30
31#include "MRawRunHeader.h"
32#include "MRawEvtHeader.h"
33#include "MLiveTime.h"
34
35#include "MLog.h"
36#include "MLogManip.h"
37
38#include "MParList.h"
39#include "MTaskList.h"
40
41ClassImp(MLiveTimeCalc)
42using namespace std;
43
44Bool_t Debug = kTRUE;
45Bool_t PrintNewRun = kTRUE;
46
47MLiveTimeCalc::MLiveTimeCalc(const char *name, const char *title) : kSecTomSec(1e3), kDayToSec(24.*60.*60.), fRunHeader(NULL), fEvtHeader(NULL), fPresentEventTime(NULL), fLiveTime(NULL)
48{
49
50 fName = name ? name : "MLiveTimeCalc";
51 fTitle = title ? title : "Task to compute the live time from real data.";
52
53 for (Int_t i=0; i<10; i++)
54 fNumberLostEvents[i] = 0;
55
56 fFirstEventMjd = 0.;
57 fPresentEventMjd = 0.;
58 fLastEventMjd = 0.;
59
60 fPresentEventNumber = 0;
61 fLastEventNumber = 0;
62
63 fPresentEventRunNumber = 0;
64 fLastEventRunNumber = 0;
65
66 fRealTimeBinSize = 0.;
67
68 fPrintNextEvent = kFALSE;
69}
70
71Int_t MLiveTimeCalc::PreProcess(MParList *pList)
72{
73
74 fEvtHeader = (MRawEvtHeader*)pList->FindObject(AddSerialNumber("MRawEvtHeader"));
75 if (!fEvtHeader)
76 {
77 *fLog << err << AddSerialNumber("MRawEvtHeader") << " not found ... aborting" << endl;
78 return kFALSE;
79 }
80
81 fRunHeader = (MRawRunHeader*)pList->FindObject(AddSerialNumber("MRawRunHeader"));
82 if (!fRunHeader)
83 {
84 *fLog << err << AddSerialNumber("MRawRunHeader") << " not found ... aborting" << endl;
85 return kFALSE;
86 }
87
88 fPresentEventTime = (MTime*)pList->FindObject(AddSerialNumber("MTime"));
89 if (!fPresentEventTime)
90 {
91 *fLog << err << AddSerialNumber("MTime") << " not found ... aborting" << endl;
92 return kFALSE;
93 }
94
95
96 fLiveTime = (MLiveTime*)pList->FindCreateObj(AddSerialNumber("MLiveTime"));
97 if (!fLiveTime)
98 {
99 *fLog << err << AddSerialNumber("MLiveTime") << " cannot be created ... aborting" << endl;
100 return kFALSE;
101 }
102
103 return kTRUE;
104}
105
106Int_t MLiveTimeCalc::Process()
107{
108
109 fPresentEventMjd = fPresentEventTime->GetMjd();
110 fLastEventMjd = fLastEventTime.GetMjd();
111 fPreaviusLastEventMjd = fPreaviusLastEventTime.GetMjd();
112
113 fPresentEventNumber = fEvtHeader->GetDAQEvtNumber();
114 fPresentEventRunNumber = fRunHeader->GetRunNumber();;
115
116 if (fPrintNextEvent && Debug)
117 {
118 *fLog << dbg << GetName() << ": Printing next event" << endl;
119 Print("all");
120 fLiveTime->Print("last");
121 *fLog << inf << endl;
122 fPrintNextEvent = kFALSE;
123 }
124
125 if (fFirstEventMjd == 0)
126 {
127 fFirstEventMjd = fPresentEventMjd;
128
129 fPreaviusLastEventTime = fLastEventTime;
130 fLastEventTime = *fPresentEventTime;
131
132 fPreaviusLastEventRunNumber = fLastEventRunNumber;
133 fLastEventRunNumber = fPresentEventRunNumber;
134
135 fPreaviusLastEventNumber = fLastEventNumber;
136 fLastEventNumber = fPresentEventNumber;
137 }
138 else
139 {
140 if (isTimeStampOk())
141 {
142 if (fRealTimeBinSize > 0 &&
143 (fPresentEventMjd - fFirstEventMjd)*kDayToSec > fRealTimeBinSize)
144 {
145
146 Double_t width = (fLastEventMjd - fFirstEventMjd)/2;
147 Double_t mean = fFirstEventMjd + width;
148
149 fLiveTime->SetRealTime(mean,width);
150 *fLog << inf << GetName() << ": New time bin" << endl;
151 Print("all");
152 *fLog << GetName() << ": First event time " << setprecision(10) << fFirstEventMjd << setprecision(5) << endl;
153 fLiveTime->Print("last");
154
155 fLiveTime->AddBin();
156 fFirstEventMjd = fPresentEventMjd;
157 }
158
159 if (fPresentEventRunNumber!=fLastEventRunNumber)
160 {
161 if (fLastEventRunNumber != 0 && PrintNewRun)
162 {
163 *fLog << dbg << GetName() << ": New run" << endl;
164 Print("all");
165 fLiveTime->Print("last");
166 *fLog << inf << endl;
167 }
168 fLastEventRunNumber = fPresentEventRunNumber;
169 }
170 else
171 fLiveTime->AddTime((fPresentEventMjd-fLastEventMjd)*kDayToSec);
172
173
174
175 fPreaviusLastEventTime = fLastEventTime;
176 fLastEventTime = *fPresentEventTime;
177
178 fPreaviusLastEventRunNumber = fLastEventRunNumber;
179 fLastEventRunNumber = fPresentEventRunNumber;
180
181 fPreaviusLastEventNumber = fLastEventNumber;
182 fLastEventNumber = fPresentEventNumber;
183
184 }
185 }
186
187 return kTRUE;
188}
189
190Int_t MLiveTimeCalc::PostProcess()
191{
192 Double_t width = (fLastEventMjd - fFirstEventMjd)/2;
193 Double_t mean = fFirstEventMjd + width;
194
195 fLiveTime->SetRealTime(mean,width);
196
197 *fLog << dbg << endl;
198 *fLog << dbg << GetName() << ": PostProcess" << endl;
199 fLiveTime->Print("all");
200 *fLog << inf << endl;
201
202 *fLog << GetName() << " execution statistics:" << endl;
203 *fLog << dec << setfill(' ');
204
205 ULong_t fTotalNumberLostEvents = 0;
206 for (Int_t i=0; i<6; i++)
207 fTotalNumberLostEvents += fNumberLostEvents[i];
208
209 *fLog << " " << setw(7) << fTotalNumberLostEvents << " (" << setw(3) ;
210 *fLog << (Int_t)(fTotalNumberLostEvents*100/GetNumExecutions()) ;
211 *fLog << "%) bad time stamp events" << endl;
212
213 *fLog << "\t\t(" << setw(3) << (Int_t)(fNumberLostEvents[0]*100/fTotalNumberLostEvents) ;
214 *fLog << "%) time stamp == 0" << endl;
215
216 *fLog << "\t\t(" << setw(3) << (Int_t)(fNumberLostEvents[1]*100/fTotalNumberLostEvents) ;
217 *fLog << "%) last time stamp == 0" << endl;
218
219 *fLog << "\t\t(" << setw(3) << (Int_t)(fNumberLostEvents[2]*100/fTotalNumberLostEvents) ;
220 *fLog << "%) time stamp in the past" << endl;
221
222 *fLog << "\t\t(" << setw(3) << (Int_t)(fNumberLostEvents[3]*100/fTotalNumberLostEvents) ;
223 *fLog << "%) time stamp == last one" << endl;
224
225 *fLog << "\t\t(" << setw(3) << (Int_t)(fNumberLostEvents[4]*100/fTotalNumberLostEvents) ;
226 *fLog << "%) time stamp just with integer part" << endl;
227
228 *fLog << "\t\t(" << setw(3) << (Int_t)(fNumberLostEvents[5]*100/fTotalNumberLostEvents) ;
229 *fLog << "%) run number < last one" << endl;
230
231 return kTRUE;
232}
233
234Bool_t MLiveTimeCalc::isTimeStampOk()
235{
236
237 Bool_t result = kTRUE;
238
239
240 if (fPresentEventMjd == 0)
241 {
242
243 if (Debug)
244 {
245 *fLog << err << GetName() << ": Present event time stamp equal to 0" << endl;
246 Print("all");
247 }
248
249 fNumberLostEvents[0]++;
250 result = kFALSE;
251 fPrintNextEvent = kTRUE;
252 }
253 else if (fLastEventMjd == 0)
254 {
255
256 if (Debug)
257 {
258 *fLog << err << GetName() << ": Last event time stamp equal to 0" << endl;
259 Print("all");
260 }
261
262 fNumberLostEvents[1]++;
263 result = kFALSE;
264 fPrintNextEvent = kTRUE;
265 }
266 else if (fPresentEventMjd-fLastEventMjd < 0)
267 {
268
269 if (Debug)
270 {
271 *fLog << err << GetName() << ": Present event with time stamp in the past" << endl;
272 Print("all");
273 }
274
275 fNumberLostEvents[2]++;
276 result = kFALSE;
277 fPrintNextEvent = kTRUE;
278 }
279 else if (fPresentEventMjd-fLastEventMjd == 0)
280 {
281
282 if (Debug)
283 {
284 *fLog << err << GetName() << ": Present event time stamp equal than last event" << endl;
285 Print("all");
286 }
287
288 fNumberLostEvents[3]++;
289 result = kFALSE;
290 fPrintNextEvent = kTRUE;
291 }
292 else if (fPresentEventNumber- fLastEventNumber<= 0 && fPresentEventRunNumber == fLastEventRunNumber)
293 {
294
295 if (Debug)
296 {
297 *fLog << warn << GetName() << ": Present event number equal or smaller than last event" << endl;
298 Print("all");
299 }
300
301 result = kTRUE;
302 fPrintNextEvent = kTRUE;
303 }
304 else if ((Int_t)fPresentEventMjd == fPresentEventMjd)
305 {
306
307 if (Debug)
308 {
309 *fLog << err << GetName() << ": Present event time stamp idetical to midnight" << endl;
310 Print("all");
311 }
312
313 fNumberLostEvents[4]++;
314 result = kFALSE;
315 fPrintNextEvent = kTRUE;
316 }
317 else if ((fPresentEventMjd-fLastEventMjd)*kDayToSec > 1.)
318 {
319
320 if (Debug)
321 {
322 *fLog << warn << GetName() << ": Time from last event bigger than 1 sec" << endl;
323 Print("all");
324 }
325
326 result = kTRUE;
327 fPrintNextEvent = kTRUE;
328 }
329 else if (fPresentEventRunNumber-fLastEventRunNumber < 0)
330 {
331
332 if (Debug)
333 {
334 *fLog << warn << GetName() << ": Present run number previuos than last one" << endl;
335 Print("all");
336 }
337
338 fNumberLostEvents[5]++;
339 result = kTRUE;
340 fPrintNextEvent = kTRUE;
341 }
342
343 return result;
344}
345
346void MLiveTimeCalc::Print(const Option_t *o) const
347{
348
349 *fLog << "Present event run number [" << fPresentEventRunNumber << "] event number [" << fPresentEventNumber << ']' << endl;
350 *fLog << "Last event run number [" << fLastEventRunNumber << "] event number [" << fLastEventNumber << ']' << endl;
351 *fLog << "Preavius last event run number [" << fPreaviusLastEventRunNumber << "] event number [" << fPreaviusLastEventNumber << ']' << endl;
352 *fLog << "Present, last and preavius to last event times:" << endl;
353 fPresentEventTime->Print();
354 fLastEventTime.Print();
355 fPreaviusLastEventTime.Print();
356}
Note: See TracBrowser for help on using the repository browser.