source: trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.cc@ 7366

Last change on this file since 7366 was 7095, checked in by tbretz, 19 years ago
*** empty log message ***
File size: 9.4 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): Markus Gaug, 05/2004 <mailto:markus@ifae.es>
19!
20! Copyright: MAGIC Software Development, 2000-2004
21!
22!
23\* ======================================================================== */
24
25//////////////////////////////////////////////////////////////////////////////
26//
27// MExtractTimeAndCharge
28//
29// Base class for the signal extractors which extract the arrival time
30// and the signal at the same time. Uses the functions
31// FindTimeAndChargeHiGain() and FindTimeAndChargeLoGain() to extract the signal and
32// substract the pedestal value.
33//
34// The following figure gives and example of possible inheritance trees.
35// An extractor class can inherit from each of the following base classes:
36// - MExtractor
37// - MExtractTime
38// - MExtractTimeAndCharge
39//
40//Begin_Html
41/*
42<img src="images/ExtractorClasses.gif">
43*/
44//End_Html
45//
46// The following variables have to be set by the derived class and
47// do not have defaults:
48// - fNumHiGainSamples
49// - fNumLoGainSamples
50// - fSqrtHiGainSamples
51// - fSqrtLoGainSamples
52//
53// Input Containers:
54// MRawEvtData
55// MRawRunHeader
56// MPedestalCam
57//
58// Output Containers:
59// MArrivalTimeCam
60// MExtractedSignalCam
61//
62//////////////////////////////////////////////////////////////////////////////
63#include "MExtractTimeAndCharge.h"
64
65#include "MLog.h"
66#include "MLogManip.h"
67
68#include "MParList.h"
69
70#include "MRawEvtData.h"
71#include "MRawEvtPixelIter.h"
72#include "MRawRunHeader.h"
73
74#include "MPedestalCam.h"
75#include "MPedestalPix.h"
76
77#include "MArrivalTimeCam.h"
78#include "MArrivalTimePix.h"
79
80#include "MExtractedSignalCam.h"
81#include "MExtractedSignalPix.h"
82
83ClassImp(MExtractTimeAndCharge);
84
85using namespace std;
86
87const Float_t MExtractTimeAndCharge::fgLoGainStartShift = -3.5;
88const Byte_t MExtractTimeAndCharge::fgLoGainSwitch = 120;
89// --------------------------------------------------------------------------
90//
91// Default constructor.
92//
93// Sets:
94// - fLoGainFirstSave to 0
95// - fWindowSizeHiGain and fWindowSizeLoGain to 0
96// - fLoGainStartShift to fgLoGainStartShift+fgOffsetLoGain
97// - fLoGainSwitch to fgLoGainSwitch
98//
99MExtractTimeAndCharge::MExtractTimeAndCharge(const char *name, const char *title)
100 : fLoGainFirstSave(0), fWindowSizeHiGain(0), fWindowSizeLoGain(0)
101{
102 fName = name ? name : "MExtractTimeAndCharge";
103 fTitle = title ? title : "Base class for signal and time extractors";
104
105 SetLoGainStartShift();
106 SetLoGainSwitch();
107}
108
109// --------------------------------------------------------------------------
110//
111// The PreProcess searches for the following input containers:
112// - MRawEvtData
113// - MRawRunHeader
114// - MPedestalCam
115//
116// The following output containers are also searched and created if
117// they were not found:
118//
119// - MExtractedSignalCam
120// - MArrivalTimeCam
121//
122Int_t MExtractTimeAndCharge::PreProcess(MParList *pList)
123{
124
125 if (!MExtractTime::PreProcess(pList))
126 return kFALSE;
127
128 fSignals = (MExtractedSignalCam*)pList->FindCreateObj("MExtractedSignalCam",AddSerialNumber(fNameSignalCam));
129 if (!fSignals)
130 return kFALSE;
131
132 *fLog << flush << inf;
133 return kTRUE;
134}
135
136// --------------------------------------------------------------------------
137//
138// The ReInit calls:
139// - MExtractor::ReInit()
140//
141// Call:
142// - MArrivalTimeCam::SetUsedFADCSlices(fHiGainFirst, fHiGainLast, fNumHiGainSamples,
143// fLoGainFirst, fLoGainLast, fNumLoGainSamples);
144// - InitArrays();
145//
146Bool_t MExtractTimeAndCharge::ReInit(MParList *pList)
147{
148
149 if (!MExtractTime::ReInit(pList))
150 return kFALSE;
151
152 if (!InitArrays())
153 return kFALSE;
154
155 if (fSignals)
156 fSignals->SetUsedFADCSlices(fHiGainFirst, fHiGainLast+fHiLoLast, fNumHiGainSamples,
157 fLoGainFirst, fLoGainLast, fNumLoGainSamples);
158
159
160 return kTRUE;
161}
162
163// --------------------------------------------------------------------------
164//
165// Calculate the integral of the FADC time slices and store them as a new
166// pixel in the MArrivalTimeCam container.
167// Calculate the integral of the FADC time slices and store them as a new
168// pixel in the MExtractedSignalCam container.
169// The functions FindTimeAndChargeHiGain() and FindTimeAndChargeLoGain() are
170// supposed to extract the signal themselves.
171//
172Int_t MExtractTimeAndCharge::Process()
173{
174
175 MRawEvtPixelIter pixel(fRawEvt);
176
177 while (pixel.Next())
178 {
179 //
180 // Find signal in hi- and lo-gain
181 //
182 Float_t sumhi =0., deltasumhi =0; // Set hi-gain of MExtractedSignalPix valid
183 Float_t timehi=0., deltatimehi=0; // Set hi-gain of MArrivalTimePix valid
184 Byte_t sathi=0;
185
186 // Initialize fMaxBinContent for the case, it gets not set by the derived class
187 fMaxBinContent = fLoGainSwitch + 1;
188
189 const Int_t pixidx = pixel.GetPixelId();
190 const MPedestalPix &ped = (*fPedestals)[pixidx];
191 const Bool_t higainabflag = pixel.HasABFlag();
192
193 FindTimeAndChargeHiGain(pixel.GetHiGainSamples()+fHiGainFirst, pixel.GetLoGainSamples(),
194 sumhi, deltasumhi, timehi, deltatimehi,
195 sathi, ped, higainabflag);
196
197 // Make sure that in cases the time couldn't be correctly determined
198 // more meaningfull default values are assigned
199 if (timehi<0)
200 timehi = -1;
201 if (timehi>pixel.GetNumHiGainSamples())
202 timehi = pixel.GetNumHiGainSamples();
203
204 Float_t sumlo =0., deltasumlo =-1.; // invalidate logain of MExtractedSignalPix
205 Float_t timelo=0., deltatimelo=-1; // invalidate logain of MArrivalTimePix
206 Byte_t satlo=0;
207
208 //
209 // Adapt the low-gain extraction range from the obtained high-gain time
210 //
211 if (pixel.HasLoGain() && (fMaxBinContent > fLoGainSwitch) )
212 {
213 deltasumlo = 0; // make logain of MExtractedSignalPix valid
214 deltatimelo = 0; // make logain of MArrivalTimePix valid
215
216 fLoGainFirstSave = fLoGainFirst;
217
218 const Float_t pos = sathi==0 ? timehi : sathi;
219
220 if (pos>-fLoGainStartShift)
221 fLoGainFirst = (Byte_t)(pos + fLoGainStartShift);
222
223 if (fLoGainFirst<fLoGainFirstSave)
224 fLoGainFirst = fLoGainFirstSave;
225
226 if ( fLoGainFirst <= fLoGainLast-fWindowSizeLoGain)
227 {
228 const Bool_t logainabflag = (higainabflag + pixel.GetNumHiGainSamples()) & 0x1;
229 FindTimeAndChargeLoGain(pixel.GetLoGainSamples()+fLoGainFirst,
230 sumlo, deltasumlo, timelo, deltatimelo,
231 satlo, ped, logainabflag);
232 }
233 fLoGainFirst = fLoGainFirstSave;
234
235 // Make sure that in cases the time couldn't be correctly determined
236 // more meaningfull default values are assigned
237 if (timelo<0)
238 timelo = -1;
239 if (timelo>pixel.GetNumLoGainSamples())
240 timelo = pixel.GetNumLoGainSamples();
241 }
242
243 MExtractedSignalPix &pix = (*fSignals)[pixidx];
244 MArrivalTimePix &tix = (*fArrTime)[pixidx];
245 pix.SetExtractedSignal(sumhi, deltasumhi,sumlo, deltasumlo);
246 pix.SetGainSaturation(sathi, sathi, satlo);
247
248 tix.SetArrivalTime(timehi, deltatimehi, timelo-fOffsetLoGain, deltatimelo);
249 tix.SetGainSaturation(sathi, sathi, satlo);
250
251 } /* while (pixel.Next()) */
252
253 fArrTime->SetReadyToSave();
254 fSignals->SetReadyToSave();
255
256 return kTRUE;
257}
258
259// --------------------------------------------------------------------------
260//
261// In addition to the resources of the base-class MExtractor:
262// MJPedestal.MExtractor.LoGainStartShift: -2.8
263//
264Int_t MExtractTimeAndCharge::ReadEnv(const TEnv &env, TString prefix, Bool_t print)
265{
266
267 Bool_t rc = MExtractTime::ReadEnv(env, prefix, print);
268
269 if (rc)
270 SetLoGainStartShift();
271
272 if (IsEnvDefined(env, prefix, "LoGainStartShift", print))
273 {
274 fLoGainStartShift = GetEnvValue(env, prefix, "LoGainStartShift", fgLoGainStartShift);
275 SetLoGainStartShift(fLoGainStartShift);
276 rc = kTRUE;
277 }
278
279 if (IsEnvDefined(env, prefix, "LoGainSwitch", print))
280 {
281 fLoGainSwitch = GetEnvValue(env, prefix, "LoGainSwitch", fLoGainSwitch);
282 rc = kTRUE;
283 }
284
285 return rc;
286}
287
288void MExtractTimeAndCharge::Print(Option_t *o) const
289{
290 if (IsA()==Class())
291 *fLog << GetDescriptor() << ":" << endl;
292
293 *fLog << dec;
294 *fLog << " Taking " << fWindowSizeHiGain
295 << " HiGain samples from slice " << (Int_t)fHiGainFirst
296 << " to " << (Int_t)(fHiGainLast+fHiLoLast) << " incl" << endl;
297 *fLog << " Taking " << fWindowSizeLoGain
298 << " LoGain samples from slice " << (Int_t)fLoGainFirst
299 << " to " << (Int_t)fLoGainLast << " incl" << endl;
300
301 *fLog << " LoGainStartShift: " << fLoGainStartShift << endl;
302 *fLog << " LoGainSwitch: " << (Int_t)fLoGainSwitch << endl;
303 MExtractTime::Print(o);
304}
Note: See TracBrowser for help on using the repository browser.