Ignore:
Timestamp:
09/16/05 11:58:09 (19 years ago)
Author:
tbretz
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mbadpixels/MBadPixelsTreat.cc

    r7349 r7353  
    6969#include <TObjString.h>
    7070
    71 #include "MArrayD.h" // Used instead of TArrayD because operator[] has no range check
     71//#include "MArrayD.h" // Used instead of TArrayD because operator[] has no range check
    7272
    7373#include "MLog.h"
     
    218218
    219219    //
    220     // Create arrays (FIXME: Check if its possible to create it only once)
     220    // Loop over all pixels
    221221    //
    222     MArrayD nphot(entries);
    223     MArrayD perr(entries);
     222    for (UShort_t i=0; i<entries; i++)
     223    {
     224        //
     225        // Check whether pixel with idx i is blind
     226        //
     227        if (!IsPixelBad(i))
     228            continue;
     229
     230        //
     231        // Get the corresponding geometry and pedestal
     232        //
     233        MSignalPix     &pix  = (*fEvt)[i];
     234        const MGeomPix &gpix = (*fGeomCam)[i];
     235
     236        // Do Not-Use-Central-Pixel
     237        const Bool_t nucp = !TESTBIT(fFlags, kUseCentralPixel);
     238
     239        Int_t num = nucp ? 0 : 1;
     240
     241        Double_t nphot  = nucp ? 0 : pix.GetNumPhotons();
     242        Double_t perr   = nucp ? 0 : Pow2(pix.GetErrorPhot());
     243
     244        //
     245        // The values are rescaled to the small pixels area for the right comparison
     246        //
     247        const Double_t ratio = fGeomCam->GetPixRatio(i);
     248
     249        nphot *= ratio;
     250        perr  *= ratio;
     251
     252        //
     253        // Loop over all its neighbors
     254        //
     255        const Int_t n = gpix.GetNumNeighbors();
     256        for (int j=0; j<n; j++)
     257        {
     258            const UShort_t nidx = gpix.GetNeighbor(j);
     259
     260            //
     261            // Do not use blind neighbors
     262            //
     263            if (IsPixelBad(nidx))
     264                continue;
     265
     266            //
     267            // Get the geometry for the neighbor
     268            //
     269            const Double_t nratio = fGeomCam->GetPixRatio(nidx);
     270
     271            //
     272            //The error is calculated as the quadratic sum of the errors
     273            //
     274            const MSignalPix &evtpix = (*fEvt)[nidx];
     275
     276            nphot += nratio*evtpix.GetNumPhotons();
     277            perr  += nratio*Pow2(evtpix.GetErrorPhot());
     278
     279            num++;
     280        }
     281
     282        // Check if there are enough neighbors to calculate the mean
     283        // If not, unmap the pixel. The maximum number of blind neighbors
     284        // should be 2
     285        if (num<fNumMinNeighbors)
     286        {
     287            pix.SetPixelUnmapped();
     288            continue;
     289        }
     290
     291        //
     292        // Now the mean is calculated and the values rescaled back
     293        // to the pixel area
     294        //
     295        nphot /= num*ratio;
     296        perr   = TMath::Sqrt(perr/(num*ratio));
    224297 
     298        pix.Set(nphot, perr);
     299    }
     300}
     301
     302// --------------------------------------------------------------------------
     303//
     304void MBadPixelsTreat::InterpolatePedestals(MPedPhotCam &pedphot) const
     305{
     306    const Int_t entries = pedphot.GetSize();
     307
    225308    //
    226309    // Loop over all pixels
     
    237320        // Get the corresponding geometry and pedestal
    238321        //
    239         MSignalPix     &pix  = (*fEvt)[i];
    240         const MGeomPix &gpix = (*fGeomCam)[i];
     322        const MGeomPix    &gpix = (*fGeomCam)[i];
     323        const MPedPhotPix &ppix = pedphot[i];
    241324
    242325        // Do Not-Use-Central-Pixel
     
    245328        Int_t num = nucp ? 0 : 1;
    246329
    247         nphot[i]  = nucp ? 0 : pix.GetNumPhotons();
    248         perr[i]   = nucp ? 0 : Pow2(pix.GetErrorPhot());
    249 
    250         //
    251         // The values are rescaled to the small pixels area for the right comparison
     330        Double_t ped = nucp ? 0 : ppix.GetMean();
     331        Double_t rms = nucp ? 0 : Pow2(ppix.GetRms());
     332
     333        //
     334        // The values are rescaled to the small pixels area for the right comparison
    252335        //
    253336        const Double_t ratio = fGeomCam->GetPixRatio(i);
    254337
    255         nphot[i] *= ratio;
    256         perr[i] *= ratio;
     338        ped *= ratio;
     339        rms *= ratio;
    257340
    258341        //
     
    273356            // Get the geometry for the neighbor
    274357            //
    275             const Double_t nratio = fGeomCam->GetPixRatio(nidx);
    276 
    277             //
    278             //The error is calculated as the quadratic sum of the errors
    279             //
    280             const MSignalPix &evtpix = (*fEvt)[nidx];
    281 
    282             nphot[i] += nratio*evtpix.GetNumPhotons();
    283             perr[i]  += nratio*Pow2(evtpix.GetErrorPhot());
    284 
    285             num++;
    286         }
    287 
    288         // Check if there are enough neighbors to calculate the mean
    289         // If not, unmap the pixel. The maximum number of blind neighbors
    290         // should be 2
    291         if (num<fNumMinNeighbors)
    292         {
    293             pix.SetPixelUnmapped();
    294             continue;
    295         }
    296 
    297         //
    298         // Now the mean is calculated and the values rescaled back
    299         // to the pixel area
    300         //
    301         nphot[i] /= (num*ratio);
    302         perr[i]   = TMath::Sqrt(perr[i]/(num*ratio));
    303  
    304         pix.Set(nphot[i], perr[i]);
    305     }
    306 }
    307 
    308 // --------------------------------------------------------------------------
    309 //
    310 void MBadPixelsTreat::InterpolatePedestals(MPedPhotCam &pedphot) const
    311 {
    312     const Int_t entries = pedphot.GetSize();
    313 
    314     // Create arrays (FIXME: Check if its possible to create it only once)
    315     MArrayD ped(entries);
    316     MArrayD rms(entries);
    317 
    318     //
    319     // Loop over all pixels
    320     //
    321     for (UShort_t i=0; i<entries; i++)
    322     {
    323         //
    324         // Check whether pixel with idx i is blind
    325         //
    326         if (!IsPixelBad(i))
    327             continue;
    328 
    329         //
    330         // Get the corresponding geometry and pedestal
    331         //
    332         const MGeomPix    &gpix = (*fGeomCam)[i];
    333         const MPedPhotPix &ppix = pedphot[i];
    334 
    335         // Do Not-Use-Central-Pixel
    336         const Bool_t nucp = !TESTBIT(fFlags, kUseCentralPixel);
    337 
    338         Int_t num = nucp ? 0 : 1;
    339 
    340         ped[i] = nucp ? 0 : ppix.GetMean();
    341         rms[i] = nucp ? 0 : Pow2(ppix.GetRms());
    342 
    343         //
    344         // The values are rescaled to the small pixels area for the right comparison
    345         //
    346         const Double_t ratio = fGeomCam->GetPixRatio(i);
    347 
    348         ped[i] *= ratio;
    349         rms[i] *= ratio;
    350 
    351         //
    352         // Loop over all its neighbors
    353         //
    354         const Int_t n = gpix.GetNumNeighbors();
    355         for (int j=0; j<n; j++)
    356         {
    357             const UShort_t nidx = gpix.GetNeighbor(j);
    358 
    359             //
    360             // Do not use blind neighbors
    361             //
    362             if (IsPixelBad(nidx))
    363                 continue;
    364 
    365             //
    366             // Get the geometry for the neighbor
    367             //
    368358            const Double_t    nratio = fGeomCam->GetPixRatio(nidx);
    369359            const MPedPhotPix &nppix = pedphot[nidx];
     
    372362            //The error is calculated as the quadratic sum of the errors
    373363            //
    374             ped[i] += nratio*nppix.GetMean();
    375             rms[i] += nratio*Pow2(nppix.GetRms());
     364            ped += nratio*nppix.GetMean();
     365            rms += nratio*Pow2(nppix.GetRms());
    376366
    377367            num++;
     
    381371        // If not, unmap the pixel. The minimum number of good neighbors
    382372        // should be fNumMinNeighbors
    383         if (num < fNumMinNeighbors)
    384         {
    385             MSignalPix *pix =fEvt->GetPixById(i);
    386             if (!pix)
    387                 pix = fEvt->AddPixel(i, 0, 0);
    388             pix->SetPixelUnmapped();
     373        if (num<fNumMinNeighbors)
     374        {
     375            (*fEvt)[i].SetPixelUnmapped();
    389376            continue;
    390377        }
     
    394381        // to the pixel area
    395382        //
    396         ped[i] /=  (num*ratio);
    397         rms[i]  = TMath::Sqrt(rms[i]/(num*ratio));
    398 
    399         pedphot[i].Set(ped[i], rms[i]);
     383        ped /= num*ratio;
     384        rms  = TMath::Sqrt(rms/(num*ratio));
     385
     386        pedphot[i].Set(ped, rms);
    400387    }
    401388    pedphot.SetReadyToSave();
     
    436423        const MGeomPix &gpix = (*fGeomCam)[i];
    437424
    438         MArrayD time(gpix.GetNumNeighbors());
     425        const UInt_t n2 = gpix.GetNumNeighbors();
     426
     427        Double_t time[n2];
    439428
    440429        Int_t n0 = 0;
    441         for (unsigned int j=0; j<time.GetSize(); j++)
    442         {
    443             const Int_t nn = gpix.GetNeighbor(j);
    444 
    445             const Double_t t = (*fEvt)[nn].GetArrivalTime();
    446             if (t>=0 && !IsPixelBad(nn))
     430        for (unsigned int j=0; j<n2; j++)
     431        {
     432            const Double_t t = (*fEvt)[j].GetArrivalTime();
     433            if (t>=0)
    447434                time[n0++] = t;
    448435        }
Note: See TracChangeset for help on using the changeset viewer.