source: trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCam.cc@ 3529

Last change on this file since 3529 was 3511, checked in by gaug, 22 years ago
*** empty log message ***
File size: 41.1 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!
19! Author(s): Markus Gaug 11/2003 <mailto:markus@ifae.es>
20!
21! Copyright: MAGIC Software Development, 2000-2004
22!
23!
24\* ======================================================================== */
25
26/////////////////////////////////////////////////////////////////////////////
27//
28// MCalibrationChargeCam
29//
30// Hold the whole Calibration results of the camera:
31//
32// 1) MCalibrationChargeCam initializes a TClonesArray whose elements are
33// pointers to MCalibrationChargePix Containers
34// 2) It initializes a pointer to an MCalibrationBlindPix container
35// 3) It initializes a pointer to an MCalibrationPINDiode container
36//
37//
38// The calculated values (types of GetPixelContent) are:
39//
40// --------------------------------------------------------------------------
41//
42// The types are as follows:
43//
44// Fitted values:
45// ==============
46//
47// 0: Fitted Charge
48// 1: Error of fitted Charge
49// 2: Sigma of fitted Charge
50// 3: Error of Sigma of fitted Charge
51//
52// Useful variables derived from the fit results:
53// =============================================
54//
55// 4: Returned probability of Gauss fit to Charge distribution
56// 5: Reduced Sigma of fitted Charge --> sqrt(sigma_Q^2 - PedRMS^2)
57// 6: Error Reduced Sigma of fitted Charge
58// 7: Reduced Sigma per Charge
59// 8: Error of Reduced Sigma per Charge
60//
61// Results of the different calibration methods:
62// =============================================
63//
64// 9: Number of Photo-electrons obtained with the F-Factor method
65// 10: Error on Number of Photo-electrons obtained with the F-Factor method
66// 11: Mean conversion factor obtained with the F-Factor method
67// 12: Error on the mean conversion factor obtained with the F-Factor method
68// 13: Overall F-Factor of the readout obtained with the F-Factor method
69// 14: Error on Overall F-Factor of the readout obtained with the F-Factor method
70// 15: Number of Photons inside Plexiglass obtained with the Blind Pixel method
71// 16: Error on Number of Photons inside Plexiglass obtained with the Blind Pixel method
72// 17: Mean conversion factor obtained with the Blind Pixel method
73// 18: Error on the mean conversion factor obtained with the Blind Pixel method
74// 19: Overall F-Factor of the readout obtained with the Blind Pixel method
75// 20: Error on Overall F-Factor of the readout obtained with the Blind Pixel method
76// 21: Number of Photons outside Plexiglass obtained with the PIN Diode method
77// 22: Error on Number of Photons outside Plexiglass obtained with the PIN Diode method
78// 23: Mean conversion factor obtained with the PIN Diode method
79// 24: Error on the mean conversion factor obtained with the PIN Diode method
80// 25: Overall F-Factor of the readout obtained with the PIN Diode method
81// 26: Error on Overall F-Factor of the readout obtained with the PIN Diode method
82//
83// Localized defects:
84// ==================
85//
86// 27: Excluded Pixels
87// 28: Pixels where the fit did not succeed --> results obtained only from the histograms
88// 29: Number of probable pickup events in the Hi Gain
89// 30: Number of probable pickup events in the Lo Gain
90//
91// Other classifications of pixels:
92// ================================
93//
94// 31: Pixels with saturated Hi-Gain
95//
96// Classification of validity of the calibrations:
97// ===============================================
98//
99// 32: Pixels with valid calibration by the F-Factor-Method
100// 33: Pixels with valid calibration by the Blind Pixel-Method
101// 34: Pixels with valid calibration by the PIN Diode-Method
102//
103// Used Pedestals:
104// ===============
105//
106// 35: Mean Pedestal over the entire range of signal extraction
107// 36: Error on the Mean Pedestal over the entire range of signal extraction
108// 37: Pedestal RMS over the entire range of signal extraction
109// 38: Error on the Pedestal RMS over the entire range of signal extraction
110//
111// Calculated absolute arrival times (very low precision!):
112// ========================================================
113//
114// 39: Absolute Arrival time of the signal
115// 40: RMS of the Absolute Arrival time of the signal
116//
117/////////////////////////////////////////////////////////////////////////////
118#include "MCalibrationChargeCam.h"
119
120#include <TH2.h>
121#include <TCanvas.h>
122#include <TClonesArray.h>
123
124#include "MLog.h"
125#include "MLogManip.h"
126
127#include "MGeomCam.h"
128#include "MGeomPix.h"
129
130#include "MBadPixelsCam.h"
131#include "MBadPixelsPix.h"
132
133#include "MCalibrationChargePix.h"
134#include "MCalibrationChargeBlindPix.h"
135#include "MCalibrationChargePINDiode.h"
136
137ClassImp(MCalibrationChargeCam);
138
139using namespace std;
140
141const Float_t MCalibrationChargeCam::gkAverageQE = 0.18;
142const Float_t MCalibrationChargeCam::gkAverageQEErr = 0.02;
143const Float_t MCalibrationChargeCam::fgConvFFactorRelErrLimit = 0.35;
144const Float_t MCalibrationChargeCam::fgPheFFactorRelErrLimit = 5.;
145// --------------------------------------------------------------------------
146//
147// Default constructor.
148//
149// Creates a TClonesArray of MCalibrationPix containers, initialized to 1 entry
150// Later, a call to MCalibrationChargeCam::InitSize(Int_t size) has to be performed
151//
152// Creates an MCalibrationBlindPix container
153//
154MCalibrationChargeCam::MCalibrationChargeCam(const char *name, const char *title)
155 : fOffsets(NULL),
156 fSlopes(NULL),
157 fOffvsSlope(NULL)
158{
159 fName = name ? name : "MCalibrationChargeCam";
160 fTitle = title ? title : "Storage container for the Calibration Information in the camera";
161
162 fPixels = new TClonesArray("MCalibrationChargePix",1);
163 fAverageInnerPix = new MCalibrationChargePix("AverageInnerPix","Container of the fit results of the camera average inner pixels");
164 fAverageOuterPix = new MCalibrationChargePix("AverageOuterPix","Container of the fit results of the camera average outer pixels");
165 fAverageInnerBadPix = new MBadPixelsPix("AverageInnerBadPix","Bad Pixel Container of the camera average inner pixels");
166 fAverageOuterBadPix = new MBadPixelsPix("AverageOuterBadPix","Bad Pixel Container of the camera average outer pixels");
167
168 Clear();
169
170 SetAverageQE();
171 SetConvFFactorRelErrLimit();
172 SetPheFFactorRelErrLimit();
173}
174
175// --------------------------------------------------------------------------
176//
177// Delete the TClonesArray of MCalibrationPix containers
178// Delete the MCalibrationPINDiode and the MCalibrationBlindPix
179//
180// Delete the histograms if they exist
181//
182MCalibrationChargeCam::~MCalibrationChargeCam()
183{
184
185 //
186 // delete fPixels should delete all Objects stored inside
187 //
188 delete fPixels;
189 delete fAverageInnerPix;
190 delete fAverageOuterPix;
191
192 delete fAverageInnerBadPix;
193 delete fAverageOuterBadPix;
194
195 if (fOffsets)
196 delete fOffsets;
197 if (fSlopes)
198 delete fSlopes;
199 if (fOffvsSlope)
200 delete fOffvsSlope;
201
202}
203
204// -------------------------------------------------------------------
205//
206// This function simply allocates memory via the ROOT command:
207// (TObject**) TStorage::ReAlloc(fCont, newSize * sizeof(TObject*),
208// fSize * sizeof(TObject*));
209// newSize corresponds to size in our case
210// fSize is the old size (in most cases: 1)
211//
212void MCalibrationChargeCam::InitSize(const UInt_t i)
213{
214
215 fPixels->ExpandCreate(i);
216
217}
218
219// --------------------------------------------------------------------------
220//
221// This function returns the current size of the TClonesArray
222// independently if the MCalibrationPix is filled with values or not.
223//
224// It is the size of the array fPixels.
225//
226Int_t MCalibrationChargeCam::GetSize() const
227{
228 return fPixels->GetEntriesFast();
229}
230
231
232// --------------------------------------------------------------------------
233//
234// Get i-th pixel (pixel number)
235//
236MCalibrationChargePix &MCalibrationChargeCam::operator[](UInt_t i)
237{
238 return *static_cast<MCalibrationChargePix*>(fPixels->UncheckedAt(i));
239}
240
241// --------------------------------------------------------------------------
242//
243// Get i-th pixel (pixel number)
244//
245const MCalibrationChargePix &MCalibrationChargeCam::operator[](UInt_t i) const
246{
247 return *static_cast<MCalibrationChargePix*>(fPixels->UncheckedAt(i));
248}
249
250
251// --------------------------------------
252//
253void MCalibrationChargeCam::Clear(Option_t *o)
254{
255
256 fPixels->ForEach(TObject, Clear)();
257 fAverageInnerPix->Clear();
258 fAverageOuterPix->Clear();
259
260 fAverageInnerBadPix->Clear();
261 fAverageOuterBadPix->Clear();
262
263 fNumExcludedPixels = 0;
264 fMeanFluxPhesInnerPixel = 0.;
265 fMeanFluxPhesInnerPixelVar = 0.;
266 fMeanFluxPhesOuterPixel = 0.;
267 fMeanFluxPhesOuterPixelVar = 0.;
268
269 CLRBIT(fFlags,kBlindPixelMethodValid);
270 CLRBIT(fFlags,kFFactorMethodValid);
271 CLRBIT(fFlags,kPINDiodeMethodValid);
272
273 return;
274}
275
276void MCalibrationChargeCam::SetFFactorMethodValid(const Bool_t b)
277{
278 b ? SETBIT(fFlags, kFFactorMethodValid) : CLRBIT(fFlags, kFFactorMethodValid);
279}
280
281void MCalibrationChargeCam::SetBlindPixelMethodValid(const Bool_t b)
282{
283 b ? SETBIT(fFlags, kBlindPixelMethodValid) : CLRBIT(fFlags, kBlindPixelMethodValid);
284}
285
286void MCalibrationChargeCam::SetPINDiodeMethodValid(const Bool_t b)
287{
288 b ? SETBIT(fFlags, kPINDiodeMethodValid) : CLRBIT(fFlags, kPINDiodeMethodValid);
289}
290
291Float_t MCalibrationChargeCam::GetMeanFluxPhesInnerPixelErr() const
292{
293 if (fMeanFluxPhesInnerPixelVar <= 0.)
294 return -1.;
295 return TMath::Sqrt(fMeanFluxPhesInnerPixelVar);
296}
297
298Float_t MCalibrationChargeCam::GetMeanFluxPhesOuterPixelErr() const
299{
300 if (fMeanFluxPhesOuterPixelVar <= 0.)
301 return -1.;
302 return TMath::Sqrt(fMeanFluxPhesOuterPixelVar);
303}
304
305Float_t MCalibrationChargeCam::GetMeanFluxPhotonsInnerPixelErr() const
306{
307 if (fMeanFluxPhotonsInnerPixelVar <= 0.)
308 return -1.;
309 return TMath::Sqrt(fMeanFluxPhotonsInnerPixelVar);
310}
311
312Float_t MCalibrationChargeCam::GetMeanFluxPhotonsOuterPixelErr() const
313{
314 if (fMeanFluxPhotonsOuterPixelVar <= 0.)
315 return -1.;
316 return TMath::Sqrt(fMeanFluxPhotonsOuterPixelVar);
317}
318
319Bool_t MCalibrationChargeCam::IsBlindPixelMethodValid() const
320{
321 return TESTBIT(fFlags,kBlindPixelMethodValid);
322}
323
324Bool_t MCalibrationChargeCam::IsPINDiodeMethodValid() const
325{
326 return TESTBIT(fFlags,kPINDiodeMethodValid);
327}
328
329
330// --------------------------------------------------------------------------
331//
332// Print first the well fitted pixels
333// and then the ones which are not FitValid
334//
335void MCalibrationChargeCam::Print(Option_t *o) const
336{
337
338 *fLog << all << GetDescriptor() << ":" << endl;
339 int id = 0;
340
341 *fLog << all << "Calibrated pixels:" << endl;
342 *fLog << all << endl;
343
344 TIter Next(fPixels);
345 MCalibrationChargePix *pix;
346 while ((pix=(MCalibrationChargePix*)Next()))
347 {
348
349 if (!pix->IsExcluded())
350 {
351
352 *fLog << all << "Pix " << pix->GetPixId()
353 << ": Ped. Rms: " << pix->GetPedRms() << " +- " << pix->GetPedRmsErr()
354 << " Mean signal: " << pix->GetMeanCharge() << " +- " << pix->GetSigmaCharge()
355 << " Reduced Sigma: " << pix->GetRSigmaCharge()
356 << " Nr Phe's: " << pix->GetPheFFactorMethod()
357 << " Saturated? :" << pix->IsHiGainSaturation()
358 << endl;
359 id++;
360 }
361 }
362
363 *fLog << all << id << " pixels" << endl;
364 id = 0;
365
366
367 *fLog << all << endl;
368 *fLog << all << "Excluded pixels:" << endl;
369 *fLog << all << endl;
370
371 id = 0;
372
373 TIter Next4(fPixels);
374 while ((pix=(MCalibrationChargePix*)Next4()))
375 {
376 if (pix->IsExcluded())
377 {
378 *fLog << all << pix->GetPixId() << endl;
379 id++;
380 }
381 }
382 *fLog << all << id << " Excluded pixels " << endl;
383 *fLog << endl;
384
385 *fLog << all << "Average Inner Pix:"
386 << " Ped. Rms: " << fAverageInnerPix->GetPedRms() << " +- " << fAverageInnerPix->GetPedRmsErr()
387 << " Mean signal: " << fAverageInnerPix->GetMeanCharge() << " +- " << fAverageInnerPix->GetMeanChargeErr()
388 << " Sigma signal: " << fAverageInnerPix->GetSigmaCharge() << " +- "<< fAverageInnerPix->GetSigmaChargeErr()
389 << " Reduced Sigma: " << fAverageInnerPix->GetRSigmaCharge()
390 << " Nr Phe's: " << fAverageInnerPix->GetPheFFactorMethod()
391 << endl;
392 *fLog << all << "Average Outer Pix:"
393 << " Ped. Rms: " << fAverageOuterPix->GetPedRms() << " +- " << fAverageOuterPix->GetPedRmsErr()
394 << " Mean signal: " << fAverageOuterPix->GetMeanCharge() << " +- " << fAverageOuterPix->GetMeanChargeErr()
395 << " Sigma signal: " << fAverageOuterPix->GetSigmaCharge() << " +- "<< fAverageOuterPix->GetSigmaChargeErr()
396 << " Reduced Sigma: " << fAverageOuterPix->GetRSigmaCharge()
397 << " Nr Phe's: " << fAverageOuterPix->GetPheFFactorMethod()
398 << endl;
399
400}
401
402
403// --------------------------------------------------------------------------
404//
405// The types are as follows:
406//
407// Fitted values:
408// ==============
409//
410// 0: Fitted Charge
411// 1: Error of fitted Charge
412// 2: Sigma of fitted Charge
413// 3: Error of Sigma of fitted Charge
414//
415// Useful variables derived from the fit results:
416// =============================================
417//
418// 4: Returned probability of Gauss fit to Charge distribution
419// 5: Reduced Sigma of fitted Charge --> sqrt(sigma_Q^2 - PedRMS^2)
420// 6: Error Reduced Sigma of fitted Charge
421// 7: Reduced Sigma per Charge
422// 8: Error of Reduced Sigma per Charge
423//
424// Results of the different calibration methods:
425// =============================================
426//
427// 9: Number of Photo-electrons obtained with the F-Factor method
428// 10: Error on Number of Photo-electrons obtained with the F-Factor method
429// 11: Mean conversion factor obtained with the F-Factor method
430// 12: Error on the mean conversion factor obtained with the F-Factor method
431// 13: Overall F-Factor of the readout obtained with the F-Factor method
432// 14: Error on Overall F-Factor of the readout obtained with the F-Factor method
433// 15: Number of Photons inside Plexiglass obtained with the Blind Pixel method
434// 16: Error on Number of Photons inside Plexiglass obtained with the Blind Pixel method
435// 17: Mean conversion factor obtained with the Blind Pixel method
436// 18: Error on the mean conversion factor obtained with the Blind Pixel method
437// 19: Overall F-Factor of the readout obtained with the Blind Pixel method
438// 20: Error on Overall F-Factor of the readout obtained with the Blind Pixel method
439// 21: Number of Photons outside Plexiglass obtained with the PIN Diode method
440// 22: Error on Number of Photons outside Plexiglass obtained with the PIN Diode method
441// 23: Mean conversion factor obtained with the PIN Diode method
442// 24: Error on the mean conversion factor obtained with the PIN Diode method
443// 25: Overall F-Factor of the readout obtained with the PIN Diode method
444// 26: Error on Overall F-Factor of the readout obtained with the PIN Diode method
445//
446// Localized defects:
447// ==================
448//
449// 27: Excluded Pixels
450// 28: Pixels where the fit did not succeed --> results obtained only from the histograms
451// 29: Number of probable pickup events in the Hi Gain
452// 30: Number of probable pickup events in the Lo Gain
453//
454// Other classifications of pixels:
455// ================================
456//
457// 31: Pixels with saturated Hi-Gain
458//
459// Classification of validity of the calibrations:
460// ===============================================
461//
462// 32: Pixels with valid calibration by the F-Factor-Method
463// 33: Pixels with valid calibration by the Blind Pixel-Method
464// 34: Pixels with valid calibration by the PIN Diode-Method
465//
466// Used Pedestals:
467// ===============
468//
469// 35: Mean Pedestal over the entire range of signal extraction
470// 36: Error on the Mean Pedestal over the entire range of signal extraction
471// 37: Pedestal RMS over the entire range of signal extraction
472// 38: Error on the Pedestal RMS over the entire range of signal extraction
473//
474// Calculated absolute arrival times (very low precision!):
475// ========================================================
476//
477// 39: Absolute Arrival time of the signal
478// 40: RMS of the Absolute Arrival time of the signal
479//
480Bool_t MCalibrationChargeCam::GetPixelContent(Double_t &val, Int_t idx, const MGeomCam &cam, Int_t type) const
481{
482
483 if (idx > GetSize())
484 return kFALSE;
485
486 Float_t area = cam[idx].GetA();
487
488 if (area == 0)
489 return kFALSE;
490
491 switch (type)
492 {
493 case 0:
494 if ((*this)[idx].IsExcluded())
495 return kFALSE;
496 val = (*this)[idx].GetMeanCharge();
497 break;
498 case 1:
499 if ((*this)[idx].IsExcluded())
500 return kFALSE;
501 val = (*this)[idx].GetMeanChargeErr();
502 break;
503 case 2:
504 if ((*this)[idx].IsExcluded())
505 return kFALSE;
506 val = (*this)[idx].GetSigmaCharge();
507 break;
508 case 3:
509 if ((*this)[idx].IsExcluded())
510 return kFALSE;
511 val = (*this)[idx].GetSigmaChargeErr();
512 break;
513 case 4:
514 if ((*this)[idx].IsExcluded())
515 return kFALSE;
516 val = (*this)[idx].GetChargeProb();
517 break;
518 case 5:
519 if ((*this)[idx].IsExcluded())
520 return kFALSE;
521 if ((*this)[idx].GetRSigmaCharge() == -1.)
522 return kFALSE;
523 val = (*this)[idx].GetRSigmaCharge();
524 break;
525 case 6:
526 if ((*this)[idx].IsExcluded())
527 return kFALSE;
528 if ((*this)[idx].GetRSigmaCharge() == -1.)
529 return kFALSE;
530 val = (*this)[idx].GetRSigmaChargeErr();
531 break;
532 case 7:
533 if ((*this)[idx].IsExcluded())
534 return kFALSE;
535 if ((*this)[idx].GetRSigmaCharge() == -1.)
536 return kFALSE;
537 if ((*this)[idx].GetMeanCharge() == 0.)
538 return kFALSE;
539 val = (*this)[idx].GetRSigmaCharge() / (*this)[idx].GetMeanCharge();
540 break;
541 case 8:
542 if ((*this)[idx].IsExcluded())
543 return kFALSE;
544 if ((*this)[idx].GetRSigmaCharge() <= 0.)
545 return kFALSE;
546 if ((*this)[idx].GetMeanCharge() <= 0.)
547 return kFALSE;
548 if ((*this)[idx].GetRSigmaChargeErr() <= 0.)
549 return kFALSE;
550 if ((*this)[idx].GetMeanChargeErr() <= 0.)
551 return kFALSE;
552 // relative error RsigmaCharge square
553 val = (*this)[idx].GetRSigmaChargeErr()* (*this)[idx].GetRSigmaChargeErr()
554 / ((*this)[idx].GetRSigmaCharge() * (*this)[idx].GetRSigmaCharge() );
555 // relative error Charge square
556 val += (*this)[idx].GetMeanChargeErr() * (*this)[idx].GetMeanChargeErr()
557 / ((*this)[idx].GetMeanCharge() * (*this)[idx].GetMeanCharge() );
558 // calculate relative error out of squares
559 val = TMath::Sqrt(val) ;
560 // multiply with value to get absolute error
561 val *= (*this)[idx].GetRSigmaCharge() / (*this)[idx].GetMeanCharge();
562 break;
563 case 9:
564 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsFFactorMethodValid())
565 return kFALSE;
566 val = (*this)[idx].GetPheFFactorMethod();
567 break;
568 case 10:
569 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsFFactorMethodValid())
570 return kFALSE;
571 val = (*this)[idx].GetPheFFactorMethodErr();
572 break;
573 case 11:
574 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsFFactorMethodValid())
575 return kFALSE;
576 val = (*this)[idx].GetMeanConversionFFactorMethod();
577 break;
578 case 12:
579 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsFFactorMethodValid())
580 return kFALSE;
581 val = (*this)[idx].GetConversionFFactorMethodErr();
582 break;
583 case 13:
584 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsFFactorMethodValid())
585 return kFALSE;
586 val = (*this)[idx].GetTotalFFactorFFactorMethod();
587 break;
588 case 14:
589 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsFFactorMethodValid())
590 return kFALSE;
591 val = (*this)[idx].GetTotalFFactorFFactorMethodErr();
592 break;
593 case 15:
594 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsBlindPixelMethodValid())
595 return kFALSE;
596 // val = fBlindPixel->GetMeanFluxInsidePlexiglass()*area;
597 val = 1.;
598 break;
599 case 16:
600 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsBlindPixelMethodValid())
601 return kFALSE;
602 // val = fBlindPixel->GetMeanFluxErrInsidePlexiglass()*area;
603 val = 1.;
604 break;
605 case 17:
606 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsBlindPixelMethodValid())
607 return kFALSE;
608 val = (*this)[idx].GetMeanConversionBlindPixelMethod();
609 break;
610 case 18:
611 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsBlindPixelMethodValid())
612 return kFALSE;
613 val = (*this)[idx].GetConversionBlindPixelMethodErr();
614 break;
615 case 19:
616 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsBlindPixelMethodValid())
617 return kFALSE;
618 val = (*this)[idx].GetTotalFFactorBlindPixelMethod();
619 break;
620 case 20:
621 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsBlindPixelMethodValid())
622 return kFALSE;
623 val = (*this)[idx].GetTotalFFactorBlindPixelMethodErr();
624 break;
625 case 21:
626 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsPINDiodeMethodValid())
627 return kFALSE;
628 // val = fPINDiode->GetMeanFluxOutsidePlexiglass()*area;
629 val = 1.;
630 break;
631 case 22:
632 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsPINDiodeMethodValid())
633 return kFALSE;
634 // val = fPINDiode->GetMeanFluxErrOutsidePlexiglass()*area;
635 val = 1.;
636 break;
637 case 23:
638 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsPINDiodeMethodValid())
639 return kFALSE;
640 val = (*this)[idx].GetMeanConversionPINDiodeMethod();
641 break;
642 case 24:
643 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsPINDiodeMethodValid())
644 return kFALSE;
645 val = (*this)[idx].GetConversionPINDiodeMethodErr();
646 break;
647 case 25:
648 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsPINDiodeMethodValid())
649 return kFALSE;
650 val = (*this)[idx].GetTotalFFactorPINDiodeMethod();
651 break;
652 case 26:
653 if ((*this)[idx].IsExcluded() || !(*this)[idx].IsPINDiodeMethodValid())
654 return kFALSE;
655 val = (*this)[idx].GetTotalFFactorPINDiodeMethodErr();
656 break;
657 case 27:
658 if ((*this)[idx].IsExcluded())
659 val = 1.;
660 else
661 return kFALSE;
662 break;
663 case 28:
664 if ((*this)[idx].IsExcluded())
665 return kFALSE;
666 if (!(*this)[idx].IsFitted())
667 val = 1;
668 else
669 return kFALSE;
670 break;
671 case 29:
672 if ((*this)[idx].IsExcluded())
673 return kFALSE;
674 val = (*this)[idx].GetHiGainNumPickup();
675 break;
676 case 30:
677 if ((*this)[idx].IsExcluded())
678 return kFALSE;
679 val = (*this)[idx].GetLoGainNumPickup();
680 break;
681 case 31:
682 if ((*this)[idx].IsExcluded())
683 return kFALSE;
684 val = (*this)[idx].IsHiGainSaturation();
685 break;
686 case 32:
687 if ((*this)[idx].IsExcluded())
688 return kFALSE;
689 if ((*this)[idx].IsFFactorMethodValid())
690 val = 1;
691 else
692 return kFALSE;
693 break;
694 case 33:
695 if ((*this)[idx].IsExcluded())
696 return kFALSE;
697 if ((*this)[idx].IsBlindPixelMethodValid())
698 val = 1;
699 else
700 return kFALSE;
701 break;
702 case 34:
703 if ((*this)[idx].IsExcluded())
704 return kFALSE;
705 if ((*this)[idx].IsPINDiodeMethodValid())
706 val = 1;
707 else
708 return kFALSE;
709 break;
710 case 35:
711 if ((*this)[idx].IsExcluded())
712 return kFALSE;
713 val = (*this)[idx].GetPed();
714 break;
715 case 36:
716 if ((*this)[idx].IsExcluded())
717 return kFALSE;
718 val = (*this)[idx].GetPedErr();
719 break;
720 case 37:
721 if ((*this)[idx].IsExcluded())
722 return kFALSE;
723 val = (*this)[idx].GetPedRms();
724 break;
725 case 38:
726 if ((*this)[idx].IsExcluded())
727 return kFALSE;
728 val = (*this)[idx].GetPedErr()/2.;
729 break;
730 case 39:
731 if ((*this)[idx].IsExcluded())
732 return kFALSE;
733 val = (*this)[idx].GetAbsTimeMean();
734 break;
735 case 40:
736 if ((*this)[idx].IsExcluded())
737 return kFALSE;
738 val = (*this)[idx].GetAbsTimeRms();
739 break;
740 default:
741 return kFALSE;
742 }
743
744 return val!=-1.;
745
746}
747
748// --------------------------------------------------------------------------
749//
750// What MHCamera needs in order to draw an individual pixel in the camera
751//
752void MCalibrationChargeCam::DrawPixelContent(Int_t idx) const
753{
754 if (idx == -1)
755 fAverageInnerPix->DrawClone();
756 if (idx == -2)
757 fAverageOuterPix->DrawClone();
758
759 (*this)[idx].DrawClone();
760}
761
762//
763// Calculate the weighted mean of the phe's of all inner and outer pixels, respectively.
764// Bad pixels are excluded from the calculation. Two loops are performed to exclude pixels
765// which are fPheFFactorRelLimit sigmas from the mean.
766//
767Bool_t MCalibrationChargeCam::CalcMeanFluxPhotonsFFactorMethod(const MGeomCam &geom, MBadPixelsCam &bad)
768{
769
770 const Float_t avQERelVar = fAverageQEVar / (fAverageQE * fAverageQE );
771
772 Float_t sumweightsinner = 0.;
773 Float_t sumphesinner = 0.;
774 Float_t sumweightsouter = 0.;
775 Float_t sumphesouter = 0.;
776 Int_t validinner = 0;
777 Int_t validouter = 0;
778
779 TIter Next(fPixels);
780 MCalibrationChargePix *pix;
781 while ((pix=(MCalibrationChargePix*)Next()))
782 {
783
784 if (!pix->IsFFactorMethodValid())
785 continue;
786
787 const Int_t idx = pix->GetPixId();
788
789 if(!bad[idx].IsCalibrationResultOK())
790 continue;
791
792 const Float_t nphe = pix->GetPheFFactorMethod();
793 const Float_t npheerr = pix->GetPheFFactorMethodErr();
794 const Float_t ratio = geom.GetPixRatio(idx);
795
796 if (npheerr > 0.)
797 {
798 const Float_t weight = nphe*nphe/npheerr/npheerr;
799 //
800 // first the inner pixels:
801 //
802 if (ratio == 1.)
803 {
804 sumweightsinner += weight;
805 sumphesinner += weight*nphe;
806 validinner++;
807 }
808 else
809 {
810 //
811 // now the outers
812 //
813 sumweightsouter += weight;
814 sumphesouter += weight*nphe;
815 validouter++;
816 }
817 } /* if npheerr != 0 */
818 } /* while ((pix=(MCalibrationChargePix*)Next())) */
819
820 if (sumweightsinner <= 0. || sumphesinner <= 0.)
821 {
822 *fLog << warn << " Mean number of phe's from inner pixels cannot be calculated: "
823 << " Sum of weights: " << sumweightsinner
824 << " Sum of weighted phes: " << sumphesinner << endl;
825 return kFALSE;
826 }
827 else
828 {
829 fMeanFluxPhesInnerPixel = sumphesinner/sumweightsinner;
830 fMeanFluxPhesInnerPixelVar = (1./sumweightsinner)*fMeanFluxPhesInnerPixel*fMeanFluxPhesInnerPixel;
831 }
832
833 if (sumweightsouter <= 0. || sumphesouter <= 0.)
834 {
835 *fLog << warn << " Mean number of phe's from outer pixels cannot be calculated: "
836 << " Sum of weights or sum of weighted phes is 0. " << endl;
837 }
838 else
839 {
840 fMeanFluxPhesOuterPixel = sumphesouter/sumweightsouter;
841 fMeanFluxPhesOuterPixelVar = (1./sumweightsouter)*fMeanFluxPhesOuterPixel*fMeanFluxPhesOuterPixel;
842 }
843
844 Float_t meanFluxPhotonsRelVar = fMeanFluxPhesInnerPixelVar
845 / (fMeanFluxPhesInnerPixel * fMeanFluxPhesInnerPixel);
846
847 fMeanFluxPhotonsInnerPixel = fMeanFluxPhesInnerPixel/fAverageQE;
848 fMeanFluxPhotonsInnerPixelVar = (meanFluxPhotonsRelVar + avQERelVar)
849 * fMeanFluxPhotonsInnerPixel * fMeanFluxPhotonsInnerPixel;
850
851 fMeanFluxPhotonsOuterPixel = 4. *fMeanFluxPhotonsInnerPixel;
852 fMeanFluxPhotonsOuterPixelVar = 16.*fMeanFluxPhotonsInnerPixelVar;
853
854 *fLog << inf << " Mean number of photo-electrons from inner pixels (F-Factor Method): "
855 << fMeanFluxPhesInnerPixel << " +- " << GetMeanFluxPhesInnerPixelErr() << endl;
856
857 *fLog << inf << " Mean number of photons from inner pixels (F-Factor Method): "
858 << fMeanFluxPhotonsInnerPixel << " +- " << GetMeanFluxPhotonsInnerPixelErr() << endl;
859
860 //
861 // Here starts the second loop discarting pixels out of the range:
862 //
863 const Float_t innervar = (Float_t)validinner*fPheFFactorRelVarLimit*fMeanFluxPhesInnerPixelVar;
864 const Float_t outervar = (Float_t)validouter*fPheFFactorRelVarLimit*fMeanFluxPhesOuterPixelVar;
865
866 Float_t innererr;
867 Float_t outererr;
868
869 if (innervar > 0.)
870 innererr = TMath::Sqrt(innervar);
871 else
872 {
873 *fLog << warn << GetDescriptor() << ": Variance of mean number of photo-electrons for inner pixels "
874 << " is smaller than 0. " << endl;
875 SetFFactorMethodValid(kFALSE);
876 return kFALSE;
877 }
878
879 if (outervar > 0.)
880 outererr = TMath::Sqrt(outervar);
881 else
882 {
883 *fLog << warn << GetDescriptor() << ": Variance of mean number of photo-electrons for outer pixels "
884 << " is smaller than 0. " << endl;
885 SetFFactorMethodValid(kFALSE);
886 return kFALSE;
887 }
888
889 const Float_t lowerpheinnerlimit = fMeanFluxPhesInnerPixel - innererr;
890 const Float_t upperpheinnerlimit = fMeanFluxPhesInnerPixel + innererr;
891
892 const Float_t lowerpheouterlimit = fMeanFluxPhesOuterPixel - outererr;
893 const Float_t upperpheouterlimit = fMeanFluxPhesOuterPixel + outererr;
894
895 sumweightsinner = 0.;
896 sumphesinner = 0.;
897 sumweightsouter = 0.;
898 sumphesouter = 0.;
899
900 TIter Next2(fPixels);
901 MCalibrationChargePix *pix2;
902 while ((pix2=(MCalibrationChargePix*)Next2()))
903 {
904
905 if (!pix2->IsFFactorMethodValid())
906 continue;
907
908 const Int_t idx = pix2->GetPixId();
909
910 if(!bad[idx].IsCalibrationResultOK())
911 continue;
912
913 const Float_t nphe = pix2->GetPheFFactorMethod();
914 const Float_t npheerr = pix2->GetPheFFactorMethodErr();
915 const Float_t ratio = geom.GetPixRatio(idx);
916
917 if (npheerr > 0.)
918 {
919 const Float_t weight = nphe*nphe/npheerr/npheerr;
920 //
921 // first the inner pixels:
922 //
923 if (ratio == 1.)
924 {
925
926 if (nphe < lowerpheinnerlimit || nphe > upperpheinnerlimit)
927 {
928 bad[idx].SetUnsuitable(MBadPixelsPix::kUnreliableRun);
929 continue;
930 }
931
932 sumweightsinner += weight;
933 sumphesinner += weight*nphe;
934 }
935 else
936 {
937 //
938 // now the outers
939 //
940 if (nphe < lowerpheouterlimit || nphe > upperpheouterlimit)
941 {
942 bad[idx].SetUnsuitable(MBadPixelsPix::kUnreliableRun);
943 continue;
944 }
945
946 sumweightsouter += weight;
947 sumphesouter += weight*nphe;
948 }
949 } /* if npheerr != 0 */
950 } /* while ((pix2=(MCalibrationChargePix*)Next2())) */
951
952 if (sumweightsinner <= 0. || sumphesinner <= 0.)
953 {
954 *fLog << warn << " Mean number of phe's from inner pixels cannot be calculated: "
955 << " Sum of weights: " << sumweightsinner
956 << " Sum of weighted phes: " << sumphesinner << endl;
957 return kFALSE;
958 }
959 else
960 {
961 fMeanFluxPhesInnerPixel = sumphesinner/sumweightsinner;
962 fMeanFluxPhesInnerPixelVar = (1./sumweightsinner)*fMeanFluxPhesInnerPixel*fMeanFluxPhesInnerPixel;
963
964 }
965
966 if (sumweightsouter <= 0. || sumphesouter <= 0.)
967 {
968 *fLog << warn << " Mean number of phe's from outer pixels cannot be calculated: "
969 << " Sum of weights or sum of weighted phes is 0. " << endl;
970 }
971 else
972 {
973 fMeanFluxPhesOuterPixel = sumphesouter/sumweightsouter;
974 fMeanFluxPhesOuterPixelVar = (1./sumweightsouter)*fMeanFluxPhesOuterPixel*fMeanFluxPhesOuterPixel;
975 }
976
977 meanFluxPhotonsRelVar = fMeanFluxPhesInnerPixelVar
978 / (fMeanFluxPhesInnerPixel * fMeanFluxPhesInnerPixel);
979
980 fMeanFluxPhotonsInnerPixel = fMeanFluxPhesInnerPixel/fAverageQE;
981 fMeanFluxPhotonsInnerPixelVar = (meanFluxPhotonsRelVar + avQERelVar)
982 * fMeanFluxPhotonsInnerPixel * fMeanFluxPhotonsInnerPixel;
983
984 fMeanFluxPhotonsOuterPixel = 4. *fMeanFluxPhotonsInnerPixel;
985 fMeanFluxPhotonsOuterPixelVar = 16.*fMeanFluxPhotonsInnerPixelVar;
986
987 *fLog << inf << " Mean number of photo-electrons from inner pixels (F-Factor Method): "
988 << fMeanFluxPhesInnerPixel << " +- " << GetMeanFluxPhesInnerPixelErr() << endl;
989
990 *fLog << inf << " Mean number of photons from inner pixels (F-Factor Method): "
991 << fMeanFluxPhotonsInnerPixel << " +- " << GetMeanFluxPhotonsInnerPixelErr() << endl;
992
993 return kTRUE;
994}
995
996void MCalibrationChargeCam::ApplyFFactorCalibration(const MGeomCam &geom, const MBadPixelsCam &bad)
997{
998
999 const Float_t meanphotRelVar = fMeanFluxPhotonsInnerPixelVar
1000 /( fMeanFluxPhotonsInnerPixel * fMeanFluxPhotonsInnerPixel );
1001
1002 TIter Next(fPixels);
1003 MCalibrationChargePix *pix;
1004 while ((pix=(MCalibrationChargePix*)Next()))
1005 {
1006
1007 const Int_t idx = pix->GetPixId();
1008
1009 if (!(bad[idx].IsCalibrationResultOK()))
1010 {
1011 pix->SetFFactorMethodValid(kFALSE);
1012 continue;
1013 }
1014
1015 if (!(pix->IsFFactorMethodValid()))
1016 continue;
1017
1018 const Float_t ratio = geom.GetPixRatio(idx);
1019 //
1020 // Calculate the conversion factor between PHOTONS and FADC counts
1021 //
1022 // Nphot = Nphe / avQE
1023 // conv = Nphot / FADC counts
1024 //
1025 Float_t conv;
1026
1027 if (ratio == 1.)
1028 conv = fMeanFluxPhotonsInnerPixel / pix->GetMeanCharge();
1029 else
1030 conv = fMeanFluxPhotonsOuterPixel / pix->GetMeanCharge();
1031
1032 if (conv <= 0.)
1033 {
1034 pix->SetFFactorMethodValid(kFALSE);
1035 continue;
1036 }
1037
1038 const Float_t chargeRelVar = pix->GetMeanChargeErr() * pix->GetMeanChargeErr()
1039 / ( pix->GetMeanCharge() * pix->GetMeanCharge());
1040 const Float_t rsigmaChargeRelVar = pix->GetRSigmaChargeErr() * pix->GetRSigmaChargeErr()
1041 / (pix->GetRSigmaCharge() * pix->GetRSigmaCharge()) ;
1042
1043 const Float_t convrelvar = meanphotRelVar + chargeRelVar;
1044
1045 if (convrelvar > fConvFFactorRelVarLimit)
1046 {
1047 *fLog << warn << GetDescriptor() << ": Conversion Factor F-Factor Method Rel. Variance: "
1048 << convrelvar << " above limit of: " << fConvFFactorRelVarLimit
1049 << " in pixel: " << idx << endl;
1050 pix->SetFFactorMethodValid(kFALSE);
1051 continue;
1052 }
1053
1054 //
1055 // Calculate the Total F-Factor of the camera (in photons)
1056 //
1057 const Float_t totalFFactor = (pix->GetRSigmaCharge()/pix->GetMeanCharge())
1058 *TMath::Sqrt(fMeanFluxPhotonsInnerPixel);
1059
1060 //
1061 // Calculate the error of the Total F-Factor of the camera ( in photons )
1062 //
1063 const Float_t totalFFactorVar = rsigmaChargeRelVar + chargeRelVar + meanphotRelVar;
1064
1065 if (convrelvar > 0. && conv > 0.)
1066 pix->SetConversionFFactorMethod(conv,
1067 TMath::Sqrt(convrelvar)*conv,
1068 totalFFactor*TMath::Sqrt(conv));
1069
1070 pix->SetTotalFFactorFFactorMethod( totalFFactor );
1071
1072 if (totalFFactorVar > 0.)
1073 pix->SetTotalFFactorFFactorMethodErr(TMath::Sqrt(totalFFactorVar));
1074
1075 pix->SetFFactorMethodValid();
1076 }
1077}
1078
1079
1080
1081void MCalibrationChargeCam::ApplyBlindPixelCalibration(const MGeomCam &geom, const MBadPixelsCam &bad, const MCalibrationChargeBlindPix &blindpix)
1082{
1083
1084 Float_t flux = blindpix.GetMeanFluxInsidePlexiglass();
1085 Float_t fluxerr = blindpix.GetMeanFluxErrInsidePlexiglass();
1086
1087 TIter Next(fPixels);
1088 MCalibrationChargePix *pix;
1089 while ((pix=(MCalibrationChargePix*)Next()))
1090 {
1091
1092 const Int_t idx = pix->GetPixId();
1093
1094 if (!(bad[idx].IsCalibrationResultOK()))
1095 {
1096 pix->SetBlindPixelMethodValid(kFALSE);
1097 continue;
1098 }
1099
1100 const Float_t charge = pix->GetMeanCharge();
1101 const Float_t area = geom[idx].GetA();
1102 const Float_t chargeerr = pix->GetMeanChargeErr();
1103
1104 const Float_t nphot = flux * area;
1105 const Float_t nphoterr = fluxerr * area;
1106 const Float_t conversion = nphot/charge;
1107 Float_t conversionerr;
1108
1109 conversionerr = nphoterr/charge
1110 * nphoterr/charge ;
1111 conversionerr += chargeerr/charge
1112 * chargeerr/charge
1113 * conversion*conversion;
1114 conversionerr = TMath::Sqrt(conversionerr);
1115
1116 const Float_t conversionsigma = 0.;
1117
1118 pix->SetConversionBlindPixelMethod(conversion, conversionerr, conversionsigma);
1119
1120 if (conversionerr/conversion < 0.1)
1121 pix->SetBlindPixelMethodValid();
1122 }
1123}
1124
1125void MCalibrationChargeCam::ApplyPINDiodeCalibration(const MGeomCam &geom, const MBadPixelsCam &bad, const MCalibrationChargePINDiode &pindiode)
1126{
1127
1128 Float_t flux = pindiode.GetMeanFluxOutsidePlexiglass();
1129 Float_t fluxerr = pindiode.GetMeanFluxErrOutsidePlexiglass();
1130
1131 TIter Next(fPixels);
1132 MCalibrationChargePix *pix;
1133 while ((pix=(MCalibrationChargePix*)Next()))
1134 {
1135
1136 const Int_t idx = pix->GetPixId();
1137
1138 if (!(bad[idx].IsCalibrationResultOK()))
1139 {
1140 pix->SetPINDiodeMethodValid(kFALSE);
1141 continue;
1142 }
1143
1144 const Float_t charge = pix->GetMeanCharge();
1145 const Float_t area = geom[idx].GetA();
1146 const Float_t chargeerr = pix->GetMeanChargeErr();
1147
1148 const Float_t nphot = flux * area;
1149 const Float_t nphoterr = fluxerr * area;
1150 const Float_t conversion = nphot/charge;
1151
1152 Float_t conversionerr;
1153
1154 conversionerr = nphoterr/charge
1155 * nphoterr/charge ;
1156 conversionerr += chargeerr/charge
1157 * chargeerr/charge
1158 * conversion*conversion;
1159 if (conversionerr > 0.)
1160 conversionerr = TMath::Sqrt(conversionerr);
1161
1162 const Float_t conversionsigma = 0.;
1163
1164 pix->SetConversionPINDiodeMethod(conversion, conversionerr, conversionsigma);
1165
1166 if (conversionerr/conversion < 0.1)
1167 pix->SetPINDiodeMethodValid();
1168
1169 }
1170}
1171
1172
1173Bool_t MCalibrationChargeCam::GetConversionFactorBlindPixel(Int_t ipx, Float_t &mean, Float_t &err, Float_t &sigma)
1174{
1175
1176 mean = (*this)[ipx].GetMeanConversionBlindPixelMethod();
1177 err = (*this)[ipx].GetConversionBlindPixelMethodErr();
1178 sigma = (*this)[ipx].GetSigmaConversionBlindPixelMethod();
1179
1180 return kTRUE;
1181}
1182
1183
1184Bool_t MCalibrationChargeCam::GetConversionFactorFFactor(Int_t ipx, Float_t &mean, Float_t &err, Float_t &sigma)
1185{
1186
1187 Float_t conv = (*this)[ipx].GetMeanConversionFFactorMethod();
1188
1189 if (conv < 0.)
1190 return kFALSE;
1191
1192 mean = conv;
1193 err = (*this)[ipx].GetConversionFFactorMethodErr();
1194 sigma = (*this)[ipx].GetSigmaConversionFFactorMethod();
1195
1196 return kTRUE;
1197}
1198
1199
1200//-----------------------------------------------------------------------------------
1201//
1202// Calculates the conversion factor between the integral of FADCs slices
1203// (as defined in the signal extractor MExtractSignal.cc)
1204// and the number of photons reaching the plexiglass for one Inner Pixel
1205//
1206Bool_t MCalibrationChargeCam::GetConversionFactorPINDiode(Int_t ipx, Float_t &mean, Float_t &err, Float_t &sigma)
1207{
1208
1209 mean = (*this)[ipx].GetMeanConversionPINDiodeMethod();
1210 err = (*this)[ipx].GetConversionPINDiodeMethodErr();
1211 sigma = (*this)[ipx].GetSigmaConversionPINDiodeMethod();
1212
1213 return kFALSE;
1214
1215}
1216
1217//-----------------------------------------------------------------------------------
1218//
1219// Calculates the best combination of the three used methods possible
1220// between the integral of FADCs slices
1221// (as defined in the signal extractor MExtractSignal.cc)
1222// and the number of photons reaching one Inner Pixel.
1223// The procedure is not yet defined.
1224//
1225Bool_t MCalibrationChargeCam::GetConversionFactorCombined(Int_t ipx, Float_t &mean, Float_t &err, Float_t &sigma)
1226{
1227 return kFALSE;
1228
1229}
1230
1231/*
1232void MCalibrationChargeCam::DrawHiLoFits()
1233{
1234
1235 if (!fOffsets)
1236 fOffsets = new TH1D("pp","Offsets of the HiGain LoGain Fit",100,-600.,400.);
1237 if (!fSlopes)
1238 fSlopes = new TH1D("mm","Slopes of the HiGain LoGain Fit",100,-2.,2.);
1239 if (!fOffvsSlope)
1240 fOffvsSlope = new TH2D("aa","Slopes vs Offsets of the HiGain LoGain Fit",100,-600.,400.,100,-2.,2.);
1241
1242 TIter Next(fPixels);
1243 MCalibrationPix *pix;
1244 MHCalibrationPixel *hist;
1245 while ((pix=(MCalibrationPix*)Next()))
1246 {
1247 hist = pix->GetHist();
1248 hist->FitHiGainvsLoGain();
1249 fOffsets->Fill(hist->GetOffset(),1.);
1250 fSlopes->Fill(hist->GetSlope(),1.);
1251 fOffvsSlope->Fill(hist->GetOffset(),hist->GetSlope(),1.);
1252 }
1253
1254 TCanvas *c1 = new TCanvas();
1255
1256 c1->Divide(1,3);
1257 c1->cd(1);
1258 fOffsets->Draw();
1259 gPad->Modified();
1260 gPad->Update();
1261
1262 c1->cd(2);
1263 fSlopes->Draw();
1264 gPad->Modified();
1265 gPad->Update();
1266
1267 c1->cd(3);
1268 fOffvsSlope->Draw("col1");
1269 gPad->Modified();
1270 gPad->Update();
1271}
1272
1273*/
Note: See TracBrowser for help on using the repository browser.