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 | !
|
---|
19 | ! Author(s): Markus Gaug 02/2004 <mailto:markus@ifae.es>
|
---|
20 | !
|
---|
21 | ! Copyright: MAGIC Software Development, 2000-2004
|
---|
22 | !
|
---|
23 | !
|
---|
24 | \* ======================================================================== */
|
---|
25 |
|
---|
26 | /////////////////////////////////////////////////////////////////////////////
|
---|
27 | //
|
---|
28 | // MHCalibrationChargeCam
|
---|
29 | //
|
---|
30 | // Contains a list of MHCalibrationPix
|
---|
31 | // plus the MHCalibrationBlindPix
|
---|
32 | // and the MHCalibrationPINDiode
|
---|
33 | /////////////////////////////////////////////////////////////////////////////
|
---|
34 | #include "MHCalibrationChargeCam.h"
|
---|
35 |
|
---|
36 | #include "MLog.h"
|
---|
37 | #include "MLogManip.h"
|
---|
38 |
|
---|
39 | #include "MParList.h"
|
---|
40 |
|
---|
41 | #include "MHCalibrationChargeHiGainPix.h"
|
---|
42 | #include "MHCalibrationChargeLoGainPix.h"
|
---|
43 |
|
---|
44 | #include "MCalibrationChargeCam.h"
|
---|
45 | #include "MCalibrationChargePix.h"
|
---|
46 |
|
---|
47 | #include "MRawEvtData.h"
|
---|
48 | #include "MRawEvtPixelIter.h"
|
---|
49 |
|
---|
50 | #include "MExtractedSignalCam.h"
|
---|
51 | #include "MExtractedSignalPix.h"
|
---|
52 |
|
---|
53 | ClassImp(MHCalibrationChargeCam);
|
---|
54 |
|
---|
55 | using namespace std;
|
---|
56 |
|
---|
57 | const Float_t MHCalibrationChargeCam::fgNumHiGainSaturationLimit = 0.01;
|
---|
58 | const Float_t MHCalibrationChargeCam::fgNumLoGainSaturationLimit = 0.01;
|
---|
59 | //
|
---|
60 | //
|
---|
61 | //
|
---|
62 | MHCalibrationChargeCam::MHCalibrationChargeCam(const char *name, const char *title)
|
---|
63 | {
|
---|
64 | fName = name ? name : "MHCalibrationChargeCam";
|
---|
65 | fTitle = title ? title : "";
|
---|
66 |
|
---|
67 | fHiGainArray = new TObjArray;
|
---|
68 | fHiGainArray->SetOwner();
|
---|
69 |
|
---|
70 | fLoGainArray = new TObjArray;
|
---|
71 | fLoGainArray->SetOwner();
|
---|
72 |
|
---|
73 | SetNumHiGainSaturationLimit();
|
---|
74 | SetNumLoGainSaturationLimit();
|
---|
75 | }
|
---|
76 |
|
---|
77 | // --------------------------------------------------------------------------
|
---|
78 | //
|
---|
79 | // Delete the TClonesArray of MHCalibrationChargePix containers
|
---|
80 | // Delete the MHCalibrationPINDiode and the MHCalibrationBlindPix
|
---|
81 | //
|
---|
82 | // Delete the histograms if they exist
|
---|
83 | //
|
---|
84 | MHCalibrationChargeCam::~MHCalibrationChargeCam()
|
---|
85 | {
|
---|
86 | delete fHiGainArray;
|
---|
87 | delete fLoGainArray;
|
---|
88 | }
|
---|
89 |
|
---|
90 | // --------------------------------------------------------------------------
|
---|
91 | //
|
---|
92 | // Get i-th pixel (pixel number)
|
---|
93 | //
|
---|
94 | MHCalibrationChargeHiGainPix &MHCalibrationChargeCam::operator[](UInt_t i)
|
---|
95 | {
|
---|
96 | return *static_cast<MHCalibrationChargeHiGainPix*>(fHiGainArray->UncheckedAt(i));
|
---|
97 | }
|
---|
98 |
|
---|
99 | // --------------------------------------------------------------------------
|
---|
100 | //
|
---|
101 | // Get i-th pixel (pixel number)
|
---|
102 | //
|
---|
103 | const MHCalibrationChargeHiGainPix &MHCalibrationChargeCam::operator[](UInt_t i) const
|
---|
104 | {
|
---|
105 | return *static_cast<MHCalibrationChargeHiGainPix*>(fHiGainArray->UncheckedAt(i));
|
---|
106 | }
|
---|
107 |
|
---|
108 | // --------------------------------------------------------------------------
|
---|
109 | //
|
---|
110 | // Get i-th pixel (pixel number)
|
---|
111 | //
|
---|
112 | MHCalibrationChargeLoGainPix &MHCalibrationChargeCam::operator()(UInt_t i)
|
---|
113 | {
|
---|
114 | return *static_cast<MHCalibrationChargeLoGainPix*>(fLoGainArray->UncheckedAt(i));
|
---|
115 | }
|
---|
116 |
|
---|
117 | // --------------------------------------------------------------------------
|
---|
118 | //
|
---|
119 | // Get i-th pixel (pixel number)
|
---|
120 | //
|
---|
121 | const MHCalibrationChargeLoGainPix &MHCalibrationChargeCam::operator()(UInt_t i) const
|
---|
122 | {
|
---|
123 | return *static_cast<MHCalibrationChargeLoGainPix*>(fLoGainArray->UncheckedAt(i));
|
---|
124 | }
|
---|
125 |
|
---|
126 | // --------------------------------------------------------------------------
|
---|
127 | //
|
---|
128 | // Our own clone function is necessary since root 3.01/06 or Mars 0.4
|
---|
129 | // I don't know the reason
|
---|
130 | //
|
---|
131 | TObject *MHCalibrationChargeCam::Clone(const char *) const
|
---|
132 | {
|
---|
133 | const Int_t nhi = fHiGainArray->GetSize();
|
---|
134 | const Int_t nlo = fLoGainArray->GetSize();
|
---|
135 |
|
---|
136 | //
|
---|
137 | // FIXME, this might be done faster and more elegant, by direct copy.
|
---|
138 | //
|
---|
139 | MHCalibrationChargeCam *cam = new MHCalibrationChargeCam;
|
---|
140 |
|
---|
141 | cam->fHiGainArray->Expand(nhi);
|
---|
142 | cam->fLoGainArray->Expand(nlo);
|
---|
143 |
|
---|
144 | for (int i=0; i<nhi; i++)
|
---|
145 | {
|
---|
146 | delete (*cam->fHiGainArray)[i];
|
---|
147 | (*cam->fHiGainArray)[i] = (*fHiGainArray)[i]->Clone();
|
---|
148 | }
|
---|
149 | for (int i=0; i<nlo; i++)
|
---|
150 | {
|
---|
151 | delete (*cam->fLoGainArray)[i];
|
---|
152 | (*cam->fLoGainArray)[i] = (*fLoGainArray)[i]->Clone();
|
---|
153 | }
|
---|
154 | return cam;
|
---|
155 | }
|
---|
156 |
|
---|
157 | // --------------------------------------------------------------------------
|
---|
158 | //
|
---|
159 | // To setup the object we get the number of pixels from a MGeomCam object
|
---|
160 | // in the Parameter list.
|
---|
161 | //
|
---|
162 | Bool_t MHCalibrationChargeCam::SetupFill(const MParList *pList)
|
---|
163 | {
|
---|
164 |
|
---|
165 | fHiGainArray->Delete();
|
---|
166 | fLoGainArray->Delete();
|
---|
167 | return kTRUE;
|
---|
168 |
|
---|
169 | }
|
---|
170 |
|
---|
171 | Bool_t MHCalibrationChargeCam::ReInit(MParList *pList)
|
---|
172 | {
|
---|
173 |
|
---|
174 | fCam = (MCalibrationChargeCam*)pList->FindCreateObj("MCalibrationChargeCam");
|
---|
175 | if (!fCam)
|
---|
176 | {
|
---|
177 | gLog << err << GetDescriptor() << ": ERROR: Could not find MCalibrationChargeCam ... aborting " << endl;
|
---|
178 | return kFALSE;
|
---|
179 | }
|
---|
180 |
|
---|
181 | fRawEvt = (MRawEvtData*)pList->FindObject("MRawEvtData");
|
---|
182 | if (!fRawEvt)
|
---|
183 | {
|
---|
184 | gLog << err << dbginf << "MRawEvtData not found... aborting." << endl;
|
---|
185 | return kFALSE;
|
---|
186 | }
|
---|
187 |
|
---|
188 | MExtractedSignalCam *signal = (MExtractedSignalCam*)pList->FindObject("MExtractedSignalCam");
|
---|
189 | if (!signal)
|
---|
190 | {
|
---|
191 | gLog << err << "No argument in MExtractedSignalCam::ReInit... abort." << endl;
|
---|
192 | return kFALSE;
|
---|
193 | }
|
---|
194 |
|
---|
195 | const Int_t n = signal->GetSize();
|
---|
196 |
|
---|
197 | fHiGainArray->Expand(n);
|
---|
198 |
|
---|
199 | for (Int_t i=0; i<n; i++)
|
---|
200 | {
|
---|
201 | (*fHiGainArray)[i] = new MHCalibrationChargeHiGainPix;
|
---|
202 | (*this)[i].Init();
|
---|
203 | (*this)[i].ChangeHistId(i);
|
---|
204 |
|
---|
205 | }
|
---|
206 |
|
---|
207 | fLoGainArray->Expand(n);
|
---|
208 |
|
---|
209 | for (Int_t i=0; i<n; i++)
|
---|
210 | {
|
---|
211 | (*fLoGainArray)[i] = new MHCalibrationChargeLoGainPix;
|
---|
212 | (*this)(i).Init();
|
---|
213 | (*this)(i).ChangeHistId(i);
|
---|
214 | }
|
---|
215 |
|
---|
216 | return kTRUE;
|
---|
217 | }
|
---|
218 |
|
---|
219 |
|
---|
220 | // --------------------------------------------------------------------------
|
---|
221 | Bool_t MHCalibrationChargeCam::Fill(const MParContainer *par, const Stat_t w)
|
---|
222 | {
|
---|
223 |
|
---|
224 | MExtractedSignalCam *signal = (MExtractedSignalCam*)par;
|
---|
225 | if (!signal)
|
---|
226 | {
|
---|
227 | gLog << err << "No argument in MExtractedSignalCam::Fill... abort." << endl;
|
---|
228 | return kFALSE;
|
---|
229 | }
|
---|
230 |
|
---|
231 | const Int_t n = signal->GetSize();
|
---|
232 |
|
---|
233 | if (fHiGainArray->GetEntries() != n)
|
---|
234 | {
|
---|
235 | gLog << err << "ERROR - Size mismatch... abort." << endl;
|
---|
236 | return kFALSE;
|
---|
237 | }
|
---|
238 |
|
---|
239 | if (fLoGainArray->GetEntries() != n)
|
---|
240 | {
|
---|
241 | gLog << err << "ERROR - Size mismatch... abort." << endl;
|
---|
242 | return kFALSE;
|
---|
243 | }
|
---|
244 |
|
---|
245 | for (int i=0; i<n; i++)
|
---|
246 | {
|
---|
247 | const MExtractedSignalPix &pix = (*signal)[i];
|
---|
248 |
|
---|
249 | const Float_t sumhi = pix.GetExtractedSignalHiGain();
|
---|
250 | const Float_t sumlo = pix.GetExtractedSignalLoGain();
|
---|
251 |
|
---|
252 | (*this)[i].FillHistAndArray(sumhi);
|
---|
253 | (*this)(i).FillHistAndArray(sumlo);
|
---|
254 |
|
---|
255 | (*this)[i].SetSaturated((Int_t)pix.GetNumHiGainSaturated());
|
---|
256 | (*this)(i).SetSaturated((Int_t)pix.GetNumLoGainSaturated());
|
---|
257 | }
|
---|
258 |
|
---|
259 | MRawEvtPixelIter pixel(fRawEvt);
|
---|
260 |
|
---|
261 | while (pixel.Next())
|
---|
262 | {
|
---|
263 |
|
---|
264 | const UInt_t pixid = pixel.GetPixelId();
|
---|
265 |
|
---|
266 | const Float_t timehi = (Float_t)pixel.GetIdxMaxHiGainSample();
|
---|
267 | const Float_t timelo = (Float_t)pixel.GetIdxMaxLoGainSample();
|
---|
268 |
|
---|
269 | (*this)[pixid].FillAbsTime(timehi);
|
---|
270 | (*this)(pixid).FillAbsTime(timelo);
|
---|
271 |
|
---|
272 | }
|
---|
273 |
|
---|
274 | return kTRUE;
|
---|
275 | }
|
---|
276 |
|
---|
277 | // --------------------------------------------------------------------------
|
---|
278 | //
|
---|
279 | // 1) Return if the charge distribution is already succesfully fitted
|
---|
280 | // or if the histogram is empty
|
---|
281 | // 2) Fit the histograms with a Gaussian
|
---|
282 | // 3) In case of failure set the bit kFitted to false and take histogram means and RMS
|
---|
283 | // 4) Check for pickup noise
|
---|
284 | // 5) Check the fourier spectrum
|
---|
285 | // 5) Retrieve the results and store them in this class
|
---|
286 | //
|
---|
287 | Bool_t MHCalibrationChargeCam::Finalize()
|
---|
288 | {
|
---|
289 |
|
---|
290 | for (int i=0; i<fHiGainArray->GetSize(); i++)
|
---|
291 | {
|
---|
292 |
|
---|
293 | MHCalibrationChargeHiGainPix &pixhi = (*this)[i];
|
---|
294 | MCalibrationChargePix &pix = (*fCam)[i];
|
---|
295 |
|
---|
296 | if (pixhi.IsEmpty())
|
---|
297 | continue;
|
---|
298 |
|
---|
299 | if (pixhi.GetSaturated() > fNumHiGainSaturationLimit*pixhi.GetHGausHist()->GetEntries())
|
---|
300 | {
|
---|
301 | pix.SetHiGainSaturation();
|
---|
302 | continue;
|
---|
303 | }
|
---|
304 |
|
---|
305 | //
|
---|
306 | // 2) Fit the Hi Gain histograms with a Gaussian
|
---|
307 | //
|
---|
308 | if (pixhi.FitGaus())
|
---|
309 | pix.SetHiGainFitted();
|
---|
310 | //
|
---|
311 | // 3) In case of failure set the bit kFitted to false and take histogram means and RMS
|
---|
312 | //
|
---|
313 | else if (pixhi.RepeatFit())
|
---|
314 | pix.SetHiGainFitted();
|
---|
315 | else
|
---|
316 | pixhi.BypassFit();
|
---|
317 |
|
---|
318 | //
|
---|
319 | // 4) Check for pickup
|
---|
320 | //
|
---|
321 | pixhi.CountPickup();
|
---|
322 |
|
---|
323 | //
|
---|
324 | // 5) Check for oscillations
|
---|
325 | //
|
---|
326 | pixhi.CreateFourierSpectrum();
|
---|
327 |
|
---|
328 | //
|
---|
329 | // 6) Retrieve the results and store them in this class
|
---|
330 | //
|
---|
331 | pix.SetHiGainMeanCharge( pixhi.GetMean() );
|
---|
332 | pix.SetHiGainMeanChargeErr( pixhi.GetMeanErr() );
|
---|
333 | pix.SetHiGainSigmaCharge( pixhi.GetSigma() );
|
---|
334 | pix.SetHiGainSigmaChargeErr( pixhi.GetSigmaErr() );
|
---|
335 | pix.SetHiGainChargeProb ( pixhi.GetProb() );
|
---|
336 |
|
---|
337 | pix.SetAbsTimeMean ( pixhi.GetAbsTimeMean());
|
---|
338 | pix.SetAbsTimeRms ( pixhi.GetAbsTimeRms() );
|
---|
339 |
|
---|
340 | pix.SetHiGainOscillating ( !pixhi.IsFourierSpectrumOK() );
|
---|
341 | pix.SetHiGainNumPickup ( pixhi.GetPickup() );
|
---|
342 | }
|
---|
343 |
|
---|
344 | for (int i=0; i<fLoGainArray->GetSize(); i++)
|
---|
345 | {
|
---|
346 |
|
---|
347 | MHCalibrationChargeLoGainPix &pixlo = (*this)(i);
|
---|
348 | MCalibrationChargePix &pix = (*fCam)[i];
|
---|
349 |
|
---|
350 | if (pixlo.IsEmpty())
|
---|
351 | continue;
|
---|
352 |
|
---|
353 | if (pixlo.GetSaturated() > fNumHiGainSaturationLimit*pixlo.GetHGausHist()->GetEntries())
|
---|
354 | {
|
---|
355 | pix.SetLoGainSaturation();
|
---|
356 | continue;
|
---|
357 | }
|
---|
358 | //
|
---|
359 | // 2) Fit the Lo Gain histograms with a Gaussian
|
---|
360 | //
|
---|
361 | if (pixlo.FitGaus())
|
---|
362 | pix.SetLoGainFitted();
|
---|
363 | //
|
---|
364 | // 3) In case of failure set the bit kFitted to false and take histogram means and RMS
|
---|
365 | //
|
---|
366 | else if (pixlo.RepeatFit())
|
---|
367 | pix.SetLoGainFitted();
|
---|
368 | else
|
---|
369 | pixlo.BypassFit();
|
---|
370 |
|
---|
371 | //
|
---|
372 | // 4) Check for pickup
|
---|
373 | //
|
---|
374 | pixlo.CountPickup();
|
---|
375 |
|
---|
376 | //
|
---|
377 | // 5) Check for oscillations
|
---|
378 | //
|
---|
379 | pixlo.CreateFourierSpectrum();
|
---|
380 |
|
---|
381 | //
|
---|
382 | // 6) Retrieve the results and store them in this class
|
---|
383 | //
|
---|
384 | pix.SetLoGainMeanCharge( pixlo.GetMean() );
|
---|
385 | pix.SetLoGainMeanChargeErr( pixlo.GetMeanErr() );
|
---|
386 | pix.SetLoGainSigmaCharge( pixlo.GetSigma() );
|
---|
387 | pix.SetLoGainSigmaChargeErr( pixlo.GetSigmaErr() );
|
---|
388 | pix.SetLoGainChargeProb ( pixlo.GetProb() );
|
---|
389 |
|
---|
390 | if (pix.IsHiGainSaturation())
|
---|
391 | {
|
---|
392 | pix.SetAbsTimeMean ( pixlo.GetAbsTimeMean());
|
---|
393 | pix.SetAbsTimeRms ( pixlo.GetAbsTimeRms() );
|
---|
394 | }
|
---|
395 |
|
---|
396 | pix.SetLoGainOscillating ( !pixlo.IsFourierSpectrumOK() );
|
---|
397 | pix.SetLoGainNumPickup ( pixlo.GetPickup() );
|
---|
398 |
|
---|
399 | }
|
---|
400 |
|
---|
401 | return kTRUE;
|
---|
402 | }
|
---|
403 |
|
---|
404 | Bool_t MHCalibrationChargeCam::GetPixelContent(Double_t &val, Int_t idx, const MGeomCam &cam, Int_t type) const
|
---|
405 | {
|
---|
406 | return kTRUE;
|
---|
407 | }
|
---|
408 |
|
---|
409 | // --------------------------------------------------------------------------
|
---|
410 | //
|
---|
411 | // What MHCamera needs in order to draw an individual pixel in the camera
|
---|
412 | //
|
---|
413 | void MHCalibrationChargeCam::DrawPixelContent(Int_t idx) const
|
---|
414 | {
|
---|
415 | (*this)[idx].DrawClone();
|
---|
416 | }
|
---|
417 |
|
---|