ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : Witold Przygoda (przygoda@psja1.if.uj.edu.pl)
//*-- Revised : Martin Jurkovic <martin.jurkovic@ph.tum.de> 2010
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRichPadClean
//
//  This class cleans pad plane provided by HRichAnalysis. This class
//  isn't any task but it is called for each event from
//  the HRichAnalysis::execute() function.
//
//////////////////////////////////////////////////////////////////////////////


#include "hades.h"
#include "hevent.h"
#include "hmatrixcategory.h"
#include "hrichanalysispar.h"
#include "hrichdetector.h"
#include "hrichdirclus.h"
#include "hrichgeometrypar.h"
#include "hrichpadclean.h"
#include "hspectrometer.h"
#include "richdef.h"

#include <iomanip>
#include <iostream>
#include <stdlib.h>

using namespace std;

ClassImp(HRichPadClean)

//----------------------------------------------------------------------------
HRichPadClean::HRichPadClean()
{
   iCount       = 0;
   minX         = 200;
   maxX         = 200;
   minY         = 0;
   maxY         = 0;
   deltaPhi     = 0;
   fRichClusCat = NULL;
   iTempCluster.Set(100);
}
//============================================================================

//----------------------------------------------------------------------------
HRichPadClean::~HRichPadClean()
{

}
//============================================================================

//----------------------------------------------------------------------------
HRichPadClean::HRichPadClean(const HRichPadClean& source) :TObject(source)
{
   iCount = source.iCount;
   iTempCluster = source.iTempCluster;
}
//============================================================================

//----------------------------------------------------------------------------
HRichPadClean&
HRichPadClean::operator=(const HRichPadClean& source)
{
   if (this != &source) {
      iCount = source.iCount;
      iTempCluster = source.iTempCluster;
   }
   return *this;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichPadClean::init()
{
   fRichClusCat = gHades->getCurrentEvent()->getCategory(catRichDirClus);
   if (NULL == fRichClusCat) {
      fRichClusCat = gHades->getSetup()->getDetector("Rich")->buildCategory(catRichDirClus);
      if (NULL == fRichClusCat) {
         Error("init", "Category catRichDirClus could not be created");
         return kFALSE;
      } else
         gHades->getCurrentEvent()->addCategory(catRichDirClus, fRichClusCat, "Rich");
   }
   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichPadClean::Execute(HRichAnalysis *giveMe)
{
// Cleaning algorithm works in two steps:
//   1. First the charged particle clusters are identified and cleaned.
//      Cleaning is triggered by any pad, which charge is higher than
//      the value set in HRichAnalysisPar::iCleanHighPulseUpperThreshold.
//      If such a pad is found, all "continuously" surrounding area is
//      cleaned as well. The limit for "continuous" is defined by the
//      parameter HRichAnalysisPar::iCleanHighPulseBorder.
//      Threshold is reduced for sector 3 (reduced high voltage/gain).
//      Wolfgang Koenig April 2013
//   2. Afterwards all stand alone pads with charge below certain threshold
//      defined in HRichAnalysisPar::iCleanAlonePadLowerThreshold are cleaned.
//      Condition for stand alone pad is defined by
//      HRichAnalysisPar::iCleanAlonePadBorder.

   if (giveMe->iPadFiredNr > 2) {
      // what is the reason for this check???? MJ
      Int_t iReducedNr = 0;
      HRichAnalysisPar *analParams = giveMe->getAnalysisPar();
      Float_t corFac =  analParams->fAmpCorrFac[giveMe->GetActiveSector()];

      if (analParams->isActiveCleanHighPulse) {
	 iReducedNr += CleanHighPulse(giveMe, analParams->iCleanHighPulseBorder,
		       Int_t(analParams->iCleanHighPulseUpperThreshold * corFac + 0.5F));
      }

      if (analParams->isActiveCleanAlonePad)
         iReducedNr += CleanAlonePad(giveMe, analParams->iCleanAlonePadBorder,
                       Int_t(analParams->iCleanAlonePadLowerThreshold*(0.5F + corFac*0.5F) + 0.5F));
     // use only 1/half of the effect of the sector specific corFac (Mix of electronic noise and HV driven detector gain)
      return (iReducedNr);
   } else
      return giveMe->iPadFiredNr; //either 0, 1 or 2
}

//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichPadClean::CleanHighPulse(HRichAnalysis* showMe,
                              Int_t          border,
                              Int_t          upperThr)
{
//
// This method deletes all the pads above upper threshold (upperThr)
// and the cluster connected to each pad.
//

   if (0 == border) {
      Error("CleanAlonePad", "Argument \'border\' in function CleanAlonePad must be larger than 0!");
      return -1;
   }

#ifdef HRICH_DEBUGMODE
   cout << "RICH DEBUG MODE: DeletePulse cleans the following pads: \n";
#endif

   const Int_t maxRows = showMe->GetPadsYNr();
   const Int_t maxCols = showMe->GetPadsXNr();
   Int_t iCountBefore  = 0;
   Int_t nCleaned      = 0;
   Int_t offset        = 0;
   Int_t rightBorder   = 0;
   HRichDirClus* clus  = NULL;
   HLocation loc;

   Int_t old_row = 0;
   Int_t old_col = 0;

   iCount = 0;

   for (Int_t row = 0; row < maxRows; ++row) {
      offset      = row * maxCols;
      rightBorder = showMe->pRightBorder[row];
      for (Int_t col = showMe->pLeftBorder[row]; col <= rightBorder; ++col) {
         if (showMe->GetPad(col + offset)->getAmplitude() > upperThr) {
            chargeTot = 0; // fix MJ
            minX = 200;
            maxX = 0;
            minY = 200;
            maxY = 0;
            deltaPhi = 0;
            iCountBefore = iCount;
            old_row = row;
            old_col = col;
            DeletePulse(showMe, border, col, row);
            if (old_row != row || old_col != col)
               Error("CleanHighPulse", "Numbers changed: old = [%d,%d], new = old = [%d,%d]", old_row, old_col, row, col);
            if ((iCount - iCountBefore) > 0 && nCleaned < 100) {
               iTempCluster[nCleaned++] = iCount - iCountBefore;

               // Store the cluster and its parameters to the HRichDirClus category
               clus = NULL;
               loc.set(1, 0);
               clus = static_cast<HRichDirClus*>(static_cast<HMatrixCategory*>(fRichClusCat)->getNewSlot(loc));

               if (NULL == clus)
                  Error("CleanHighPulse", "Error no slot free in HRichDirClus !!!!!!!!!!!  ");
               else {
                  clus = new(clus) HRichDirClus;
                  clus->setSector(showMe->GetActiveSector());
                  clus->setX((Int_t)(maxX + minX) / 2);
                  clus->setY((Int_t)(maxY + minY) / 2);
                  clus->setXYDim(TMath::Abs(minX - maxX),
                                 TMath::Abs(minY - maxY));
                  clus->setTotalCharge(chargeTot);
                  clus->setNrPad(iCount - iCountBefore);
                  clus->setPhiDiff(calculateDPhi(showMe, minX, minY, maxX, maxY));
                  Float_t theta = -1;
                  if (NULL != ((HRichGeometryPar*)showMe->getGeometryPar())->getPadsPar()->
                      getPad(((UInt_t)(maxX + minX) / 2), ((UInt_t)(maxY + minY) / 2))) {
                     theta = ((HRichGeometryPar*)showMe->getGeometryPar())->getPadsPar()->
                             getPad(((UInt_t)(maxX + minX) / 2), ((UInt_t)(maxY + minY) / 2))->getTheta();
                  }
                  clus->setTheta(theta);
               }
            }
         }
      }
   }

   showMe->iClusterCleanedNr = nCleaned;
   showMe->iClustersCleaned.Set(nCleaned);

   for (Int_t i = 0; i < nCleaned; i++)
      showMe->iClustersCleaned[i] = iTempCluster[i];

#ifdef HRICH_DEBUGMODE
   if (!iCount) cout << "None. \n" << "RICH DEBUG MODE: Total number "
                        << "of pads cleaned by CleanHighPulse = 0\n";
   else cout << "\nRICH DEBUG MODE: Total number of pads cleaned "
                << "by CleanHighPulse = " << iCount << "\n";
#endif

   return iCount;
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichPadClean::CleanAlonePad(HRichAnalysis *showMe,
                             Int_t          border,
                             Int_t          lowerThr)
{
// This method deletes all single pad under threshold (lowerThr).
// A single pad is defined as pad whose first fired neighbour
// has at least a distance of "border" from the pad


   const Int_t     maxCols      = showMe->GetPadsXNr();
   const Int_t     maxRows      = showMe->GetPadsYNr();
   Int_t           leftBorder;
   Int_t           rightBorder;
   Int_t           offset;
   HRichPadSignal* pad          = NULL;

   iCount = 0;

   if (0 == border) {
      Error("CleanAlonePad", "Argument \'border\' in function CleanAlonePad must be larger than 0!");
      return -1;
   }

#ifdef HRICH_DEBUGMODE
   cout << "RICH DEBUG MODE: CleanAlonePad cleans the following pads: \n";
#endif


   for (Int_t row = 0; row < maxRows; ++row) {
      leftBorder  = showMe->pLeftBorder[row];
      rightBorder = showMe->pRightBorder[row];
      pad = showMe->GetPad(leftBorder + row * maxCols);
      for (Int_t col = leftBorder; col <= rightBorder; ++col) {
         if (pad->getAmplitude() > 0) {
            for (Int_t k = row - border; k <= row + border; ++k) {
               offset = k * maxCols;
               for (Int_t l = col - border; l <= col + border; ++l)
                  if (!(l == col && k == row))
                     if (!showMe->IsOut(l, k))
                        if (showMe->GetPad(l + offset)->getAmplitude() > 0)
                           goto nextPad;
            }

            if (pad->getAmplitude() < lowerThr) {
               pad->setAmplitude(0);
               pad->setIsCleanedSingle(kTRUE);
               iCount++;

#ifdef HRICH_DEBUGMODE
               cout << " (" << colStart + border << "," << rowStart + border << ")... ";
#endif

            }
         }
nextPad:
         ++pad;
      }
   }

#ifdef HRICH_DEBUGMODE
   if (0 == iCount) cout << "None. \n";
   else cout << "\nRICH DEBUG MODE: Total number of pads cleaned by "
                "CleanAlonePad = " << iCount << "\n";
#endif

   return iCount;
}
//============================================================================

//----------------------------------------------------------------------------
void
HRichPadClean::DeletePulse(HRichAnalysis* showYou,
                           Int_t          border,
                           Int_t          col,
                           Int_t          row)
{
// This method deletes a given pad and all the neighbours within
// a distance of "border"

   const Int_t maxCols = showYou->GetPadsXNr();
   Int_t       offset;

   chargeTot += showYou->GetPad(col + maxCols * row)->getAmplitude();

#ifdef HRICH_DEBUGMODE
   cout << " charge  " << showYou->GetPad(col + maxCols * row)->getAmplitude()
        << "  chargeTot  " << chargeTot << endl;
#endif

   showYou->GetPad(col + maxCols * row)->setAmplitude(0);
   showYou->GetPad(col + maxCols * row)->setIsCleanedHigh(kTRUE);


#ifdef HRICH_DEBUGMODE
   cout << ((HRichGeometryPar*)showYou->getGeometryPar())->getPadsPar()->getPad(col, row)
        << "  first pad  with the second method" << endl;
   cout << "  ==================== it is assignment time!========= " << endl;
   cout << " minX " <<   minX    << " maxY  " <<   maxY    << "  col  " << col << " minY  "
        <<   minY   << " row   " <<   row     << " maxY  " << maxY << endl;
#endif

   minX = minX >= col ? col : minX;
   minY = minY >= row ? row : minY;
   maxX = maxX <= col ? col : maxX;
   maxY = maxY <= row ? row : maxY;

#ifdef HRICH_DEBUGMODE
   cout << "  the harder you try the dumber you look " << endl;
   cout << " minX " << minX << " maxX " << maxX << "  col  " << col
        << " minY " << minY << " row  " << row  << " maxY  " << maxY << endl;
#endif

   iCount++;

#ifdef HRICH_DEBUGMODE
   cout << " (" << colStart + border << "," << rowStart + border << ")... ";
#endif

   for (Int_t i = row - border; i <= row + border; ++i) {
      offset = maxCols * i;
      for (Int_t j = col - border; j <= col + border; ++j)
         if (!showYou->IsOut(j, i))
            if (!(i == row && j == col))
               if (showYou->GetPad(j + offset)->getAmplitude() > 0)
                  DeletePulse(showYou, border, j, i);
   }

   return;
}
//============================================================================

//----------------------------------------------------------------------------
Float_t
HRichPadClean::calculateDPhi(HRichAnalysis *showMe,
                             Int_t          xmin,
                             Int_t          ymin,
                             Int_t          xmax,
                             Int_t          ymax)
{
   Float_t phi1 = -1;
   Float_t phi2 = -1;

#ifdef HRICH_DEBUGMODE
   cout << " xmin " << xmin << " ymin   " << ymin << " xmax  " << xmax << "   ymax " << ymax << endl;
#endif

   Int_t maxCols = showMe->GetPadsXNr();

#ifdef HRICH_DEBUGMODE
   cout << ((HRichGeometryPar*)showMe->getGeometryPar())->getPadsPar()->getPad(xmin, ymin) << "  first pad  " << endl;
   cout << ((HRichGeometryPar*)showMe->getGeometryPar())->getPadsPar()->getPad(xmin + maxCols * ymin) << "  first pad  " << endl;
   cout << ((HRichGeometryPar*)showMe->getGeometryPar())->getPadsPar()->getPad(xmax + maxCols * ymax) << "  second pad  " << endl;
   cout << showMe->GetPad(xmin + maxCols * ymin) << " first pad, second method  " << endl;
#endif

   if (showMe->GetPad(xmin + maxCols * ymin))
      phi1 = ((HRichGeometryPar*)showMe->getGeometryPar())->getPadsPar()->getPad(xmin + maxCols * ymin)->getPhi(showMe->GetActiveSector());
   if (showMe->GetPad(xmax + maxCols * ymax))
      phi2 = ((HRichGeometryPar*)showMe->getGeometryPar())->getPadsPar()->getPad(xmax + maxCols * ymax)->getPhi(showMe->GetActiveSector());


#ifdef HRICH_DEBUGMODE
   cout << "  delta Phi " << TMath::Abs(phi1 - phi2) << endl;
#endif


   if (-1 == phi1 && -1 == phi2)
      return -1;

   return TMath::Abs(phi1 - phi2);
}
//============================================================================

 hrichpadclean.cc:1
 hrichpadclean.cc:2
 hrichpadclean.cc:3
 hrichpadclean.cc:4
 hrichpadclean.cc:5
 hrichpadclean.cc:6
 hrichpadclean.cc:7
 hrichpadclean.cc:8
 hrichpadclean.cc:9
 hrichpadclean.cc:10
 hrichpadclean.cc:11
 hrichpadclean.cc:12
 hrichpadclean.cc:13
 hrichpadclean.cc:14
 hrichpadclean.cc:15
 hrichpadclean.cc:16
 hrichpadclean.cc:17
 hrichpadclean.cc:18
 hrichpadclean.cc:19
 hrichpadclean.cc:20
 hrichpadclean.cc:21
 hrichpadclean.cc:22
 hrichpadclean.cc:23
 hrichpadclean.cc:24
 hrichpadclean.cc:25
 hrichpadclean.cc:26
 hrichpadclean.cc:27
 hrichpadclean.cc:28
 hrichpadclean.cc:29
 hrichpadclean.cc:30
 hrichpadclean.cc:31
 hrichpadclean.cc:32
 hrichpadclean.cc:33
 hrichpadclean.cc:34
 hrichpadclean.cc:35
 hrichpadclean.cc:36
 hrichpadclean.cc:37
 hrichpadclean.cc:38
 hrichpadclean.cc:39
 hrichpadclean.cc:40
 hrichpadclean.cc:41
 hrichpadclean.cc:42
 hrichpadclean.cc:43
 hrichpadclean.cc:44
 hrichpadclean.cc:45
 hrichpadclean.cc:46
 hrichpadclean.cc:47
 hrichpadclean.cc:48
 hrichpadclean.cc:49
 hrichpadclean.cc:50
 hrichpadclean.cc:51
 hrichpadclean.cc:52
 hrichpadclean.cc:53
 hrichpadclean.cc:54
 hrichpadclean.cc:55
 hrichpadclean.cc:56
 hrichpadclean.cc:57
 hrichpadclean.cc:58
 hrichpadclean.cc:59
 hrichpadclean.cc:60
 hrichpadclean.cc:61
 hrichpadclean.cc:62
 hrichpadclean.cc:63
 hrichpadclean.cc:64
 hrichpadclean.cc:65
 hrichpadclean.cc:66
 hrichpadclean.cc:67
 hrichpadclean.cc:68
 hrichpadclean.cc:69
 hrichpadclean.cc:70
 hrichpadclean.cc:71
 hrichpadclean.cc:72
 hrichpadclean.cc:73
 hrichpadclean.cc:74
 hrichpadclean.cc:75
 hrichpadclean.cc:76
 hrichpadclean.cc:77
 hrichpadclean.cc:78
 hrichpadclean.cc:79
 hrichpadclean.cc:80
 hrichpadclean.cc:81
 hrichpadclean.cc:82
 hrichpadclean.cc:83
 hrichpadclean.cc:84
 hrichpadclean.cc:85
 hrichpadclean.cc:86
 hrichpadclean.cc:87
 hrichpadclean.cc:88
 hrichpadclean.cc:89
 hrichpadclean.cc:90
 hrichpadclean.cc:91
 hrichpadclean.cc:92
 hrichpadclean.cc:93
 hrichpadclean.cc:94
 hrichpadclean.cc:95
 hrichpadclean.cc:96
 hrichpadclean.cc:97
 hrichpadclean.cc:98
 hrichpadclean.cc:99
 hrichpadclean.cc:100
 hrichpadclean.cc:101
 hrichpadclean.cc:102
 hrichpadclean.cc:103
 hrichpadclean.cc:104
 hrichpadclean.cc:105
 hrichpadclean.cc:106
 hrichpadclean.cc:107
 hrichpadclean.cc:108
 hrichpadclean.cc:109
 hrichpadclean.cc:110
 hrichpadclean.cc:111
 hrichpadclean.cc:112
 hrichpadclean.cc:113
 hrichpadclean.cc:114
 hrichpadclean.cc:115
 hrichpadclean.cc:116
 hrichpadclean.cc:117
 hrichpadclean.cc:118
 hrichpadclean.cc:119
 hrichpadclean.cc:120
 hrichpadclean.cc:121
 hrichpadclean.cc:122
 hrichpadclean.cc:123
 hrichpadclean.cc:124
 hrichpadclean.cc:125
 hrichpadclean.cc:126
 hrichpadclean.cc:127
 hrichpadclean.cc:128
 hrichpadclean.cc:129
 hrichpadclean.cc:130
 hrichpadclean.cc:131
 hrichpadclean.cc:132
 hrichpadclean.cc:133
 hrichpadclean.cc:134
 hrichpadclean.cc:135
 hrichpadclean.cc:136
 hrichpadclean.cc:137
 hrichpadclean.cc:138
 hrichpadclean.cc:139
 hrichpadclean.cc:140
 hrichpadclean.cc:141
 hrichpadclean.cc:142
 hrichpadclean.cc:143
 hrichpadclean.cc:144
 hrichpadclean.cc:145
 hrichpadclean.cc:146
 hrichpadclean.cc:147
 hrichpadclean.cc:148
 hrichpadclean.cc:149
 hrichpadclean.cc:150
 hrichpadclean.cc:151
 hrichpadclean.cc:152
 hrichpadclean.cc:153
 hrichpadclean.cc:154
 hrichpadclean.cc:155
 hrichpadclean.cc:156
 hrichpadclean.cc:157
 hrichpadclean.cc:158
 hrichpadclean.cc:159
 hrichpadclean.cc:160
 hrichpadclean.cc:161
 hrichpadclean.cc:162
 hrichpadclean.cc:163
 hrichpadclean.cc:164
 hrichpadclean.cc:165
 hrichpadclean.cc:166
 hrichpadclean.cc:167
 hrichpadclean.cc:168
 hrichpadclean.cc:169
 hrichpadclean.cc:170
 hrichpadclean.cc:171
 hrichpadclean.cc:172
 hrichpadclean.cc:173
 hrichpadclean.cc:174
 hrichpadclean.cc:175
 hrichpadclean.cc:176
 hrichpadclean.cc:177
 hrichpadclean.cc:178
 hrichpadclean.cc:179
 hrichpadclean.cc:180
 hrichpadclean.cc:181
 hrichpadclean.cc:182
 hrichpadclean.cc:183
 hrichpadclean.cc:184
 hrichpadclean.cc:185
 hrichpadclean.cc:186
 hrichpadclean.cc:187
 hrichpadclean.cc:188
 hrichpadclean.cc:189
 hrichpadclean.cc:190
 hrichpadclean.cc:191
 hrichpadclean.cc:192
 hrichpadclean.cc:193
 hrichpadclean.cc:194
 hrichpadclean.cc:195
 hrichpadclean.cc:196
 hrichpadclean.cc:197
 hrichpadclean.cc:198
 hrichpadclean.cc:199
 hrichpadclean.cc:200
 hrichpadclean.cc:201
 hrichpadclean.cc:202
 hrichpadclean.cc:203
 hrichpadclean.cc:204
 hrichpadclean.cc:205
 hrichpadclean.cc:206
 hrichpadclean.cc:207
 hrichpadclean.cc:208
 hrichpadclean.cc:209
 hrichpadclean.cc:210
 hrichpadclean.cc:211
 hrichpadclean.cc:212
 hrichpadclean.cc:213
 hrichpadclean.cc:214
 hrichpadclean.cc:215
 hrichpadclean.cc:216
 hrichpadclean.cc:217
 hrichpadclean.cc:218
 hrichpadclean.cc:219
 hrichpadclean.cc:220
 hrichpadclean.cc:221
 hrichpadclean.cc:222
 hrichpadclean.cc:223
 hrichpadclean.cc:224
 hrichpadclean.cc:225
 hrichpadclean.cc:226
 hrichpadclean.cc:227
 hrichpadclean.cc:228
 hrichpadclean.cc:229
 hrichpadclean.cc:230
 hrichpadclean.cc:231
 hrichpadclean.cc:232
 hrichpadclean.cc:233
 hrichpadclean.cc:234
 hrichpadclean.cc:235
 hrichpadclean.cc:236
 hrichpadclean.cc:237
 hrichpadclean.cc:238
 hrichpadclean.cc:239
 hrichpadclean.cc:240
 hrichpadclean.cc:241
 hrichpadclean.cc:242
 hrichpadclean.cc:243
 hrichpadclean.cc:244
 hrichpadclean.cc:245
 hrichpadclean.cc:246
 hrichpadclean.cc:247
 hrichpadclean.cc:248
 hrichpadclean.cc:249
 hrichpadclean.cc:250
 hrichpadclean.cc:251
 hrichpadclean.cc:252
 hrichpadclean.cc:253
 hrichpadclean.cc:254
 hrichpadclean.cc:255
 hrichpadclean.cc:256
 hrichpadclean.cc:257
 hrichpadclean.cc:258
 hrichpadclean.cc:259
 hrichpadclean.cc:260
 hrichpadclean.cc:261
 hrichpadclean.cc:262
 hrichpadclean.cc:263
 hrichpadclean.cc:264
 hrichpadclean.cc:265
 hrichpadclean.cc:266
 hrichpadclean.cc:267
 hrichpadclean.cc:268
 hrichpadclean.cc:269
 hrichpadclean.cc:270
 hrichpadclean.cc:271
 hrichpadclean.cc:272
 hrichpadclean.cc:273
 hrichpadclean.cc:274
 hrichpadclean.cc:275
 hrichpadclean.cc:276
 hrichpadclean.cc:277
 hrichpadclean.cc:278
 hrichpadclean.cc:279
 hrichpadclean.cc:280
 hrichpadclean.cc:281
 hrichpadclean.cc:282
 hrichpadclean.cc:283
 hrichpadclean.cc:284
 hrichpadclean.cc:285
 hrichpadclean.cc:286
 hrichpadclean.cc:287
 hrichpadclean.cc:288
 hrichpadclean.cc:289
 hrichpadclean.cc:290
 hrichpadclean.cc:291
 hrichpadclean.cc:292
 hrichpadclean.cc:293
 hrichpadclean.cc:294
 hrichpadclean.cc:295
 hrichpadclean.cc:296
 hrichpadclean.cc:297
 hrichpadclean.cc:298
 hrichpadclean.cc:299
 hrichpadclean.cc:300
 hrichpadclean.cc:301
 hrichpadclean.cc:302
 hrichpadclean.cc:303
 hrichpadclean.cc:304
 hrichpadclean.cc:305
 hrichpadclean.cc:306
 hrichpadclean.cc:307
 hrichpadclean.cc:308
 hrichpadclean.cc:309
 hrichpadclean.cc:310
 hrichpadclean.cc:311
 hrichpadclean.cc:312
 hrichpadclean.cc:313
 hrichpadclean.cc:314
 hrichpadclean.cc:315
 hrichpadclean.cc:316
 hrichpadclean.cc:317
 hrichpadclean.cc:318
 hrichpadclean.cc:319
 hrichpadclean.cc:320
 hrichpadclean.cc:321
 hrichpadclean.cc:322
 hrichpadclean.cc:323
 hrichpadclean.cc:324
 hrichpadclean.cc:325
 hrichpadclean.cc:326
 hrichpadclean.cc:327
 hrichpadclean.cc:328
 hrichpadclean.cc:329
 hrichpadclean.cc:330
 hrichpadclean.cc:331
 hrichpadclean.cc:332
 hrichpadclean.cc:333
 hrichpadclean.cc:334
 hrichpadclean.cc:335
 hrichpadclean.cc:336
 hrichpadclean.cc:337
 hrichpadclean.cc:338
 hrichpadclean.cc:339
 hrichpadclean.cc:340
 hrichpadclean.cc:341
 hrichpadclean.cc:342
 hrichpadclean.cc:343
 hrichpadclean.cc:344
 hrichpadclean.cc:345
 hrichpadclean.cc:346
 hrichpadclean.cc:347
 hrichpadclean.cc:348
 hrichpadclean.cc:349
 hrichpadclean.cc:350
 hrichpadclean.cc:351
 hrichpadclean.cc:352
 hrichpadclean.cc:353
 hrichpadclean.cc:354
 hrichpadclean.cc:355
 hrichpadclean.cc:356
 hrichpadclean.cc:357
 hrichpadclean.cc:358
 hrichpadclean.cc:359
 hrichpadclean.cc:360
 hrichpadclean.cc:361
 hrichpadclean.cc:362
 hrichpadclean.cc:363
 hrichpadclean.cc:364
 hrichpadclean.cc:365
 hrichpadclean.cc:366
 hrichpadclean.cc:367
 hrichpadclean.cc:368
 hrichpadclean.cc:369
 hrichpadclean.cc:370
 hrichpadclean.cc:371
 hrichpadclean.cc:372
 hrichpadclean.cc:373
 hrichpadclean.cc:374
 hrichpadclean.cc:375
 hrichpadclean.cc:376
 hrichpadclean.cc:377
 hrichpadclean.cc:378
 hrichpadclean.cc:379
 hrichpadclean.cc:380
 hrichpadclean.cc:381
 hrichpadclean.cc:382
 hrichpadclean.cc:383
 hrichpadclean.cc:384
 hrichpadclean.cc:385
 hrichpadclean.cc:386
 hrichpadclean.cc:387
 hrichpadclean.cc:388
 hrichpadclean.cc:389
 hrichpadclean.cc:390
 hrichpadclean.cc:391
 hrichpadclean.cc:392
 hrichpadclean.cc:393
 hrichpadclean.cc:394
 hrichpadclean.cc:395
 hrichpadclean.cc:396
 hrichpadclean.cc:397
 hrichpadclean.cc:398
 hrichpadclean.cc:399
 hrichpadclean.cc:400
 hrichpadclean.cc:401
 hrichpadclean.cc:402
 hrichpadclean.cc:403
 hrichpadclean.cc:404
 hrichpadclean.cc:405
 hrichpadclean.cc:406
 hrichpadclean.cc:407
 hrichpadclean.cc:408
 hrichpadclean.cc:409
 hrichpadclean.cc:410
 hrichpadclean.cc:411
 hrichpadclean.cc:412