Ignore:
Timestamp:
02/05/04 17:28:52 (21 years ago)
Author:
gaug
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mcalib/MCalibrationCalc.cc

    r3019 r3029  
    6868//                fits)
    6969//
     70//                Hi-Gain vs. Lo-Gain Calibration (very memory-intensive)
     71//                can be skipped with the command:
     72//                MalibrationCam::SkipHiLoGainCalibration()
     73//
    7074//  Input Containers:
    7175//   MRawEvtData
     
    116120const Int_t MCalibrationCalc::fBlindPixelId = 559;
    117121const Int_t MCalibrationCalc::fPINDiodeId   = 9999;
     122const Byte_t MCalibrationCalc::fgSaturationLimit = 254;
     123const Byte_t MCalibrationCalc::fgBlindPixelFirst = 3;
     124const Byte_t MCalibrationCalc::fgBlindPixelLast  = 12;
    118125
    119126// --------------------------------------------------------------------------
     
    144151    SETBIT(fFlags, kUseCosmicsRejection);
    145152    SETBIT(fFlags, kUseQualityChecks);
     153    SETBIT(fFlags, kHiLoGainCalibration);
    146154
    147155    CLRBIT(fFlags, kBlindPixelOverFlow);
     
    496504                }
    497505            }
    498         }
     506        }  /* if Use Times */
    499507     
    500508      switch(pixid)
     
    502510         
    503511        case fBlindPixelId:
    504          
    505           if (!blindpixel.FillCharge(sumhi))
    506             *fLog << warn <<
    507               "Overflow or Underflow occurred filling Blind Pixel sum = " << sumhi << endl;
    508          
    509           if (TESTBIT(fFlags,kUseTimes))
     512
     513          if (TESTBIT(fFlags,kUseBlindPixelFit))
    510514            {
    511               if (!blindpixel.FillTime(reltime))
     515         
     516              Float_t blindpixelsum = 0.;
     517              //
     518              // We need a dedicated signal extractor for the blind pixel
     519              //
     520              MPedestalPix &ped  = (*fPedestals)[pixid];
     521              if (!CalcSignalBlindPixel(pixel.GetHiGainSamples(), blindpixelsum, ped.GetPedestal()))
     522                return kFALSE;
     523             
     524              if (!blindpixel.FillCharge(blindpixelsum))
    512525                *fLog << warn <<
    513                   "Overflow or Underflow occurred filling Blind Pixel time = " << reltime << endl;
    514             }
    515          
    516           if (!TESTBIT(fFlags,kBlindPixelOverFlow))
    517             if (!blindpixel.FillRChargevsTime(sumhi,fEvents))
    518               {
     526                  "Overflow or Underflow occurred filling Blind Pixel sum = " << blindpixelsum << endl;
     527             
     528              if (TESTBIT(fFlags,kUseTimes))
     529                {
     530                  if (!blindpixel.FillTime(reltime))
     531                    *fLog << warn <<
     532                      "Overflow or Underflow occurred filling Blind Pixel time = " << reltime << endl;
     533                }
     534             
     535              if (!TESTBIT(fFlags,kBlindPixelOverFlow))
     536                if (!blindpixel.FillRChargevsTime(blindpixelsum,fEvents))
     537                  {
     538                    *fLog << warn <<
     539                      "Overflow or Underflow occurred filling Blind Pixel eventnr = " << fEvents << endl;
     540                    SETBIT(fFlags,kBlindPixelOverFlow);
     541                  }
     542            } /* if use blind pixel */
     543         
     544          break;
     545             
     546        case fPINDiodeId:
     547
     548          if (TESTBIT(fFlags,kUsePinDiodeFit))
     549            {
     550         
     551              if (!pindiode.FillCharge(sumhi))
    519552                *fLog << warn <<
    520                   "Overflow or Underflow occurred filling Blind Pixel eventnr = " << fEvents << endl;
    521                 SETBIT(fFlags,kBlindPixelOverFlow);
    522               }
     553                  "Overflow or Underflow occurred filling PINDiode: sum = " << sumhi << endl;
     554             
     555              if (TESTBIT(fFlags,kUseTimes))
     556                {
     557                  if (!pindiode.FillAbsTime(abstime))
     558                    *fLog << warn <<
     559                      "Overflow or Underflow occurred filling PINDiode abs. time = " << abstime << endl;
     560                  if (!pindiode.FillRelTime(reltime))
     561                    *fLog << warn <<
     562                      "Overflow or Underflow occurred filling PINDiode rel. time = " << reltime << endl;
     563                }
     564             
     565              if (!TESTBIT(fFlags,kPINDiodeOverFlow))
     566                if (!pindiode.FillRChargevsTime(sumhi,fEvents))
     567                  {
     568                    *fLog << warn
     569                          << "Overflow or Underflow occurred filling PINDiode: eventnr = "
     570                          << fEvents << endl;
     571                    SETBIT(fFlags,kPINDiodeOverFlow);
     572                  }
     573             
     574            } /* if use PIN Diode */
    523575         
    524576          break;
    525          
    526         case fPINDiodeId:
    527 
    528           if (!pindiode.FillCharge(sumhi))
    529             *fLog << warn <<
    530               "Overflow or Underflow occurred filling PINDiode: sum = " << sumhi << endl;
    531 
    532           if (TESTBIT(fFlags,kUseTimes))
    533             {
    534               if (!pindiode.FillAbsTime(abstime))
    535                 *fLog << warn <<
    536                   "Overflow or Underflow occurred filling PINDiode abs. time = " << abstime << endl;
    537               if (!pindiode.FillRelTime(reltime))
    538                 *fLog << warn <<
    539                   "Overflow or Underflow occurred filling PINDiode rel. time = " << reltime << endl;
    540             }
    541          
    542           if (!TESTBIT(fFlags,kPINDiodeOverFlow))
    543             if (!pindiode.FillRChargevsTime(sumhi,fEvents))
    544               {
    545                 *fLog << warn
    546                       << "Overflow or Underflow occurred filling PINDiode: eventnr = "
    547                       << fEvents << endl;
    548                 SETBIT(fFlags,kPINDiodeOverFlow);
    549               }
    550           break;
    551          
     577             
    552578        default:
    553          
    554           pix.FillChargesInGraph(sumhi,sumlo);
    555 
     579             
    556580          if (!TESTBIT(fFlags,kLoGainOverFlow))
    557581            if (!pix.FillRChargevsTimeLoGain(sumlo,fEvents))
     
    561585                      << fEvents << endl;
    562586                SETBIT(fFlags,kLoGainOverFlow);
     587                SkipHiLoGainCalibration();
    563588              }
    564589         
     
    570595                      << fEvents << endl;
    571596                SETBIT(fFlags,kHiGainOverFlow);
     597                SkipHiLoGainCalibration();
    572598              }
    573599
    574          
     600
     601          if (TESTBIT(fFlags,kHiLoGainCalibration))
     602            pix.FillChargesInGraph(sumhi,sumlo);
     603
    575604          if (sig.IsLoGainUsed())
    576605            {
     
    670699          // Set the corresponding values
    671700          //
    672           const Float_t nslices     = (Float_t)fSignals->GetNumUsedFADCSlices();
     701          const Float_t nslices     = (Float_t)(fgBlindPixelLast-fgBlindPixelFirst+1);
     702          const Float_t sqrslice    = TMath::Sqrt(nslices);
    673703          const ULong_t nentries    = fPedestals->GetTotalEntries();
    674704         
    675705          const Float_t peddiff     = (pedhist.GetChargeMean()-pedpix.GetPedestal())*nslices;
    676 
    677           const Float_t sqrslice    = TMath::Sqrt(nslices);
    678706
    679707          Float_t pederr  = pedhist.GetChargeMeanErr()*pedhist.GetChargeMeanErr();
     
    721749
    722750      //
    723       // get the pedestals
    724       //
    725       const Float_t ped    = (*fPedestals)[pixid].GetPedestal() * fNumHiGainSamples;
    726       const Float_t prms   = (*fPedestals)[pixid].GetPedestalRms() * fSqrtHiGainSamples;
    727 
    728       //
    729       // set them in the calibration camera
    730       //
    731       pix.SetPedestal(ped,prms);
    732 
    733 
    734       //
    735751      // Check if the pixel has been excluded from the fits
    736752      //
    737753      if (pix.IsExcluded())
    738754        continue;
     755
     756      //
     757      // get the pedestals
     758      //
     759      const Float_t ped    = (*fPedestals)[pixid].GetPedestal();
     760      const Float_t prms   = (*fPedestals)[pixid].GetPedestalRms();
     761
     762      //
     763      // set them in the calibration camera
     764      //
     765      pix.SetPedestal(ped,prms,(Float_t)fNumHiGainSamples,(Float_t)fNumLoGainSamples);
    739766
    740767      //
     
    793820}
    794821
     822Bool_t MCalibrationCalc::CalcSignalBlindPixel(Byte_t *ptr, Float_t &signal, const Float_t ped) const
     823{
     824
     825  Byte_t *start = ptr + fgBlindPixelFirst;
     826  Byte_t *end   = ptr + fgBlindPixelLast;
     827
     828  Byte_t sum = 0;
     829  Int_t  sat = 0;
     830 
     831  ptr = start;
     832
     833  while (ptr<end)
     834    {
     835      sum += *ptr;
     836     
     837      if (*ptr++ >= fgSaturationLimit)
     838            sat++;
     839    }
     840
     841  if (sat)
     842    {
     843      *fLog << err << "HI Gain Saturation occurred in the blind pixel! "
     844            << " Do not know yet how to treat this ... aborting " << endl;
     845      return kFALSE;
     846    }
     847
     848  signal = (Float_t)sum - ped*(Float_t)(fgBlindPixelLast-fgBlindPixelFirst+1);
     849
     850  return kTRUE;
     851}
Note: See TracChangeset for help on using the changeset viewer.