Ignore:
Timestamp:
06/11/04 20:02:08 (21 years ago)
Author:
aliu
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars/mtemp/mifae/library
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mtemp/mifae/library/MIslandCalc.cc

    r4218 r4286  
    44!   Author(s): Ester Aliu, 2/2004 <aliu@ifae.es>
    55!   
    6 !   Last Update: 5/2004
     6!   Last Update: 6/2004
    77!
    88\* ======================================================================== */
     
    124124Int_t MIslandCalc::Process()
    125125{
    126 
     126 
     127  if (fIslandAlgorithm == 1)
     128    Calc1();
     129 
     130  if (fIslandAlgorithm == 2)
     131    Calc2();
     132  return kTRUE; 
     133   
     134}
     135
     136
     137Int_t MIslandCalc::Calc1(){
     138 
     139 
     140  /////////////////////////////
     141  //
     142  //        ALGORITHM # 1
     143  // counts the number of algorithms as you can see in
     144  // the event display after doing the std image cleaning
     145  //
     146  /////////////////////////////
     147 
    127148  Float_t  noise;
    128149  Float_t  signal;
     
    333354  fIsl->SetReadyToSave();
    334355 
    335   return 1;
    336  
     356  return kTRUE; 
    337357}
    338358
    339359
     360Int_t MIslandCalc::Calc2(){
     361 
     362 
     363  /////////////////////////////
     364  //
     365  //        ALGORITHM # 2
     366  // counts the number of islands considering as the same
     367  // islands the ones separated for 2 or less pixels
     368  //
     369  /////////////////////////////
     370 
     371  Float_t  noise;
     372  Float_t  signal;
     373
     374  Int_t    npix = 577;
     375
     376  Int_t    sflag;
     377  Int_t    control;
     378 
     379  Int_t    nvect = 0;
     380  Int_t    fIslNum = 0;
     381 
     382  Int_t    vect[50][577];
     383
     384  Int_t    zeros[50];
     385 
     386  Int_t kk[577];
     387
     388  for(Int_t m = 0; m < 50 ; m++)
     389    for(Int_t n = 0; n < npix ; n++)
     390        vect[m][n] = 0;
     391   
     392  for(Int_t n = 0; n < 50 ; n++)
     393    zeros[n] = 0;
     394 
     395  for(Int_t n = 0; n < 577 ; n++)
     396    kk[n] = 0;
     397 
     398  MCerPhotPix *pix;
     399
     400  //1st loop over all pixels
     401  MCerPhotEvtIter Next0(fEvt, kFALSE);
     402 
     403  while ((pix=static_cast<MCerPhotPix*>(Next0())))
     404    {
     405      const Int_t idx = pix->GetPixId();
     406     
     407      const MGeomPix &gpix  = (*fCam)[idx];
     408      const Int_t    nnmax  = gpix.GetNumNeighbors();
     409
     410      if( fEvt->IsPixelUsed(idx))
     411        {
     412          kk[idx] = 1 ;
     413          for(Int_t j=0; j< nnmax; j++)
     414            {
     415              kk[gpix.GetNeighbor(j)] = 1;
     416            }
     417        }
     418     
     419    }
     420     
     421  //2nd loop over all pixels
     422  MCerPhotEvtIter Next(fEvt, kFALSE);
     423 
     424  while ((pix=static_cast<MCerPhotPix*>(Next())))
     425    {
     426      const Int_t idx = pix->GetPixId();
     427     
     428      const MGeomPix &gpix  = (*fCam)[idx];
     429      const Int_t    nnmax  = gpix.GetNumNeighbors();
     430     
     431      if ( kk[idx] > 0)
     432        {
     433          sflag = 0;
     434         
     435          for(Int_t j=0; j < nnmax ; j++)
     436            {
     437              const Int_t idx2 = gpix.GetNeighbor(j);
     438             
     439              if (idx2 < idx)
     440                {
     441                  for(Int_t k = 1; k <= nvect; k++)
     442                    {
     443                      if (vect[k][idx2] == 1)
     444                        {
     445                          sflag = 1;
     446                          vect[k][idx] = 1;
     447                        }
     448                    }
     449                }
     450            }
     451         
     452          if (sflag == 0)
     453            {
     454              nvect++;
     455              vect[nvect][idx] = 1;         
     456            }
     457         
     458        }
     459    }
     460 
     461  fIslNum = nvect;
     462 
     463 
     464  // Repeated Chain Corrections
     465 
     466  for(Int_t i = 1; i <= nvect; i++)
     467    {
     468      for(Int_t j = i+1; j <= nvect; j++)
     469        {
     470          control = 0;
     471          for(Int_t k = 0; k < npix; k++)
     472            {
     473             
     474              if (vect[i][k] == 1 && vect[j][k] == 1)
     475                {
     476                  control = 1;
     477                  break;
     478                }
     479            }
     480          if (control == 1)
     481            {
     482              for(Int_t k = 0; k < npix; k++)
     483                {
     484                  if(vect[j][k] == 1)
     485                    vect[i][k] = 1;
     486                  vect[j][k] = 0;
     487                  zeros[j] = 1;
     488                }       
     489              fIslNum = fIslNum-1;         
     490            }
     491         
     492        }
     493    }
     494 
     495 
     496  Int_t l = 1;
     497 
     498  for(Int_t i = 1;  i<= nvect ; i++)
     499    {
     500      if (zeros[i] == 0)
     501        {
     502          for(Int_t k = 0; k<npix; k++)
     503            {
     504              vect[l][k] = vect[i][k];
     505            }
     506          l++;
     507        }
     508    }
     509 
     510 
     511  //set the number of islands in one event
     512  fIsl->SetIslNum(fIslNum);
     513
     514  //examine each island...
     515  Int_t fPixNum[fIslNum];
     516  Float_t fSigToNoise[fIslNum];
     517  Float_t time[577];
     518  Float_t timeVariance[fIslNum];
     519 
     520  //reset the "sets" functions
     521  if (fIslNum <1)
     522    fIsl->SetIslNum(0);
     523
     524  for(Int_t i = 0; i<20 ;i++)
     525    {
     526      fIsl->SetPixNum(i,-1);
     527      fIsl->SetSigToNoise(i,-1);
     528      fIsl->SetTimeSpread(i,-1);
     529   
     530      for(Int_t idx = 0; idx<npix; idx++)
     531        {
     532          fIsl->SetIslId(idx, -1);
     533          fIsl->SetArrivalTime(i, idx, -1 );
     534        }
     535    }
     536 
     537   
     538   for(Int_t i = 1; i<=fIslNum ; i++)
     539    {
     540      Int_t n = 0;
     541      Int_t ncore = 0;
     542     
     543      Float_t MIN = 10000;
     544      Float_t MAX = 0;
     545
     546      signal = 0;
     547      noise = 0;
     548      fPixNum[i-1] = 0;
     549      timeVariance[i-1] = 0;
     550     
     551      for(Int_t idx=0 ; idx<npix ; idx++)
     552        {
     553         
     554          MCerPhotPix *pix = fEvt->GetPixById(idx);
     555          const MPedestalPix &ped  = (*fPed)[idx];
     556          const MArrivalTimePix &timepix = (*fTime)[idx];
     557
     558          if (pix == NULL) break;
     559           
     560          if (vect[i][idx] ==1 && fEvt->IsPixelUsed(idx)){
     561           
     562            fPixNum[i-1]++;
     563            signal += pix->GetNumPhotons() * (fCam->GetPixRatio(idx));
     564            noise += pow(ped.GetPedestalRms(),2);
     565           
     566            time[n] = timepix.IsLoGainUsed() ? timepix.GetArrivalTimeLoGain() : timepix.GetArrivalTimeHiGain();
     567           
     568           
     569            if (fEvt->IsPixelCore(idx)){
     570             
     571              if (time[n] > MAX)
     572                MAX = time[n];
     573              if (time[n] < MIN)
     574                MIN = time[n];
     575             
     576              ncore++;
     577            }
     578           
     579            fIsl->SetIslId(idx, i-1);
     580            fIsl->SetArrivalTime(i-1, idx, time[n]);
     581               
     582            n++;
     583          }
     584         
     585        }
     586
     587      // Float_t mean = timeVariance[i-1]/ncore;
     588           
     589      timeVariance[i-1] = 0;
     590     
     591      timeVariance[i-1] = (MAX - MIN)/ncore;
     592      timeVariance[i-1] = (MAX - MIN)/ncore;
     593
     594      fSigToNoise[i-1]= (Float_t)signal/(Float_t)sqrt(noise);
     595
     596      fIsl->SetPixNum(i-1,fPixNum[i-1]);
     597      fIsl->SetSigToNoise(i-1,fSigToNoise[i-1]);
     598      fIsl->SetTimeSpread(i-1, timeVariance[i-1]);
     599     
     600    }
     601 
     602  fIsl->SetReadyToSave();
     603 
     604  return 1; 
     605}
  • trunk/MagicSoft/Mars/mtemp/mifae/library/MIslandCalc.h

    r3976 r4286  
    3131 
    3232    TString           fIslName;     //    name of the 'MIslands' container
    33  
     33 
     34    Int_t  fIslandAlgorithm;
     35
    3436    Int_t PreProcess(MParList *plist);
    3537    Int_t Process();
     38    Int_t Calc1();                  // algorithm of counting islands #1
     39    Int_t Calc2();                  // algorithm of counting islands #2   
    3640           
    3741 public:
     
    3943    void SetOutputName(TString outname)   { fIslName = outname; }
    4044   
     45    void SetAlgorithm(Int_t m)   {fIslandAlgorithm = m;}
     46   
    4147    ClassDef(MIslandCalc, 0)        // task doing the image cleaning
    4248};
Note: See TracChangeset for help on using the changeset viewer.