Ignore:
Timestamp:
08/18/04 10:12:10 (20 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars/mbadpixels
Files:
2 edited

Legend:

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

    r4658 r4678  
    4242#include "MBadPixelsPix.h"
    4343
     44#include "MGeomCam.h"
     45#include "MGeomPix.h"
     46
    4447ClassImp(MBadPixelsCam);
    4548
     
    163166{
    164167    fArray->ForEach(TObject, Clear)();
     168}
     169
     170// --------------------------------------------------------------------------
     171//
     172// Calculate the number of pixels with the given type-flags.
     173//
     174// The second argument aidx is the area index (see MGeomCam, MGeomPix)
     175// The default (or any value less than 0) means: all
     176//
     177// Returns -1 if the geometry doesn't match.
     178//
     179Short_t MBadPixelsCam::GetNumUnsuitable(MBadPixelsPix::UnsuitableType_t type, const MGeomCam *geom, Int_t aidx) const
     180{
     181    const UInt_t n = GetSize();
     182
     183    if (aidx>=0 && geom->GetNumPixels()!=n)
     184    {
     185        *fLog << err << GetDescriptor() << "ERROR - Geometry (" << geom->ClassName() << ") size mismatch!" << endl;
     186        return -1;
     187    }
     188
     189    Short_t rc = 0;
     190    for (UInt_t i=0; i<n; i++)
     191    {
     192        if (aidx>=0 && (*geom)[i].GetAidx()!=aidx)
     193            continue;
     194
     195        if ((*this)[i].IsUnsuitable(type))
     196            rc++;
     197    }
     198    return rc;
     199}
     200
     201// --------------------------------------------------------------------------
     202//
     203// Calculate the number of pixels which are - under no circumstances -
     204// interpolatable, called isolated. This means that a pixel (its own status
     205// doesn't matter) has less than two reliable neighbor pixels.
     206//
     207// The second argument aidx is the area index (see MGeomCam, MGeomPix)
     208// The default (or any value less than 0) means: all
     209//
     210// Returns -1 if the geometry doesn't match.
     211//
     212Short_t MBadPixelsCam::GetNumIsolated(MBadPixelsPix::UnsuitableType_t type, const MGeomCam &geom, Int_t aidx) const
     213{
     214    const Int_t n = geom.GetNumPixels();
     215
     216    if (n!=GetSize())
     217    {
     218        *fLog << err << GetDescriptor() << "ERROR - Geometry (" << geom.ClassName() << ") size mismatch!" << endl;
     219        return -1;
     220    }
     221
     222    Short_t rc = 0;
     223    for (int i=0; i<n; i++)
     224    {
     225        const MGeomPix &pix = geom[i];
     226        if (aidx>=0 && pix.GetAidx()!=aidx)
     227            continue;
     228
     229        const Int_t n2 = pix.GetNumNeighbors();
     230
     231        Int_t cnt=0;
     232        for (int j=0; j<n2; j++)
     233        {
     234            const Int_t id2 = pix.GetNeighbor(j);
     235            if (!(*this)[id2].IsUnsuitable(type))
     236                cnt++;
     237        }
     238
     239        if (cnt<2)
     240            rc++;
     241    }
     242    return rc;
     243}
     244
     245// --------------------------------------------------------------------------
     246//
     247// This is a helper function which calculates the size of a single cluster
     248// by iterative calling.
     249//
     250// If a pixel matches the criterias the counter is increased by 1 and
     251// the function is called for all its neighbors. If
     252//
     253// The second argument aidx is the area index (see MGeomCam, MGeomPix)
     254// The default (or any value less than 0) means: all
     255//
     256// Returns -1 if the geometry doesn't match.
     257//
     258Short_t MBadPixelsCam::GetNumMaxCluster(MBadPixelsPix::UnsuitableType_t type, TObjArray &list, Int_t idx, Int_t aidx) const
     259{
     260    const MGeomPix *pix = (MGeomPix*)list[idx];
     261    if (!pix)
     262        return 0;
     263
     264    if (!(*this)[idx].IsUnsuitable(type))
     265        return 0;
     266
     267    if (aidx>=0 && pix->GetAidx()!=aidx)
     268        return 1;
     269
     270    list.RemoveAt(idx);
     271
     272    Short_t cnt = 1;
     273    const Int_t n = pix->GetNumNeighbors();
     274    for (int i=0; i<n; i++)
     275        cnt += GetNumMaxCluster(type, list, pix->GetNeighbor(i), aidx);
     276
     277    return cnt;
     278}
     279
     280// --------------------------------------------------------------------------
     281//
     282// Returns the size of the biggest cluster with the given USuitableType
     283// type and the given area index.
     284//
     285// The second argument aidx is the area index (see MGeomCam, MGeomPix)
     286// The default (or any value less than 0) means: all
     287//
     288// Returns -1 if the geometry doesn't match.
     289//
     290Short_t MBadPixelsCam::GetNumMaxCluster(MBadPixelsPix::UnsuitableType_t type, const MGeomCam &geom, Int_t aidx) const
     291{
     292    const Int_t n = geom.GetNumPixels();
     293
     294    if (n!=GetSize())
     295    {
     296        *fLog << err << GetDescriptor() << "ERROR - Geometry (" << geom.ClassName() << ") size mismatch!" << endl;
     297        return -1;
     298    }
     299
     300    TObjArray list(n);
     301    for (int i=0; i<n; i++)
     302        list.AddAt(&geom[i], i);
     303
     304    Short_t max = 0;
     305    for (int i=0; i<n; i++)
     306        max = TMath::Max(GetNumMaxCluster(type, list, i, aidx), max);
     307
     308    return max;
    165309}
    166310
  • trunk/MagicSoft/Mars/mbadpixels/MBadPixelsCam.h

    r3734 r4678  
    22#define MARS_MBadPixelsCam
    33
    4 #ifndef MARS_MParContainer
    5 #include "MParContainer.h"
     4#ifndef MARS_MBadPixelsPix
     5#include "MBadPixelsPix.h"
    66#endif
    77#ifndef MARS_MCamEvent
     
    1010
    1111class TClonesArray;
    12 class MBadPixelsPix;
    1312
    1413class MBadPixelsCam : public MParContainer, public MCamEvent
     
    1615private:
    1716    TClonesArray *fArray; //->
     17
     18    Short_t GetNumMaxCluster(MBadPixelsPix::UnsuitableType_t type, TObjArray &list, Int_t idx, Int_t aidx) const;
    1819
    1920public:
     
    3435    void Merge(const MBadPixelsCam &cam);
    3536
     37    Short_t GetNumUnsuitable(MBadPixelsPix::UnsuitableType_t type, const MGeomCam *geom, Int_t aidx=-1) const;
     38    Short_t GetNumUnsuitable(MBadPixelsPix::UnsuitableType_t type) const { return GetNumUnsuitable(type, 0); }
     39    Short_t GetNumIsolated(MBadPixelsPix::UnsuitableType_t type, const MGeomCam &geom, Int_t aidx=-1) const;
     40    Short_t GetNumIsolated(const MGeomCam &geom, Int_t aidx=-1) const { return GetNumIsolated(MBadPixelsPix::kUnsuitableRun, geom, aidx); }
     41    Short_t GetNumMaxCluster(MBadPixelsPix::UnsuitableType_t type, const MGeomCam &geom, Int_t aidx=-1) const;
     42    Short_t GetNumMaxCluster(const MGeomCam &geom, Int_t aidx=-1) { return GetNumMaxCluster(MBadPixelsPix::kUnsuitableRun, geom, aidx); }
     43
    3644    void   AsciiRead(ifstream &fin, UInt_t run);
    3745    void   AsciiRead(ifstream &fin) { AsciiRead(fin, 0); }
Note: See TracChangeset for help on using the changeset viewer.