ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : Witold Przygoda (przygoda@psja1.if.uj.edu.pl)
//*-- Revised : Martin Jurkovic <martin.jurkovic@ph.tum.de> 2010
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRichPadTab
//
//  These class contains definition of array of pads.
//
//
//////////////////////////////////////////////////////////////////////////////


#include "hades.h"
#include "hparamlist.h"
#include "hrichpad.h"
#include "hrichpadcorner.h"
#include "hrichpadtab.h"
#include "hspectrometer.h"

#include <iostream>

using namespace std;

ClassImp(HRichPadTab)

HRichPadTab::HRichPadTab()
   : TObject()
{
   clear();
   fPadsArray = NULL;
   dummyInitialisation();
}

HRichPadTab::~HRichPadTab()
{
   deletePads();
}

void
HRichPadTab::clear()
{
   fActivePadsNr         = 0;
   fPadsLongestRow       = 0;
   fMiddlePad            = 0;
   fPadsLongestRowMiddle = 0.;
}

void
HRichPadTab::deletePads()
{
   if (NULL != fPadsArray) {
      fPadsArray->Delete();
      delete fPadsArray;
      fPadsArray = NULL;
   }
   clear();
}

Bool_t
HRichPadTab::getParams(HParamList* l)
{
   if (NULL == l) return kFALSE;
   if (!l->fill("fPadParams", &fPadParams)) return kFALSE;

   if (kFALSE == initialisePads()) return kFALSE;
   return calculatePadParameters();
}

void
HRichPadTab::printParams()
{
   cout << "HRichPadTab" << endl;
   cout << "==========================================" << endl;
   cout << "fPadParams              " << endl;
   for (Int_t i = 0; i < fPadParams.GetSize(); i += 11) {
      cout << "  ";
      for (Int_t j = 0; j < 11; ++j) {
         cout << fPadParams[i+j] << " ";
      }
      cout << endl;
   }
   cout << endl;
}

void
HRichPadTab::printParamsFull()
{
   HRichPad*       pPad    = NULL;

   if (fPadsArray->GetSize() <  getActivePadsNr()) {
      Error("printParams", "Inconsistency in number of pads");
      return;
   }

   cout << "HRichPadTab" << endl;
   cout << "==========================================" << endl;
   cout << "  fActivePadsNr.......... " << fActivePadsNr         << endl;
   cout << "  fPadsLongestRow........ " << fPadsLongestRow       << endl;
   cout << "  fMiddlePad............. " << fMiddlePad            << endl;
   cout << "  fPadsLongestRowMiddle.. " << fPadsLongestRowMiddle << endl;
   cout << "==========================================" << endl;
   cout << "fPadParams              " << endl;
   for (Int_t i = 0; i < fPadsArray->GetSize(); ++i) {
      pPad = static_cast<HRichPad*>(fPadsArray->At(i));
      if (kTRUE == pPad->getPadActive()) {
         cout << "  " << (pPad->getPadX() * 100 + pPad->getPadY()) << " ";
         cout << pPad->getTheta()   << " ";
         cout << pPad->getPhi(0)    << " ";
         cout << pPad->getPadFlag() << " ";
         cout << pPad->getXmin()    << " ";
         cout << pPad->getYmin()    << " ";
         cout << pPad->getXmax()    << " ";
         cout << pPad->getYmax()    << " ";
         if (4 != pPad->getCornersNr()) {
            Error("printParams", "Inconsistency in number of pad corners");
            continue;
         }
         for (Int_t j = 0; j < 4; ++j) {
            cout << pPad->getCorner(j)->getX() << " ";
            cout << pPad->getCorner(j)->getY() << " ";
            cout << pPad->getCorner(j)->getAreaFlag() << " ";
         }
         cout << "\\" << endl;
      }
   }
   cout << endl;
}

void
HRichPadTab::putParams(HParamList* l)
{
   if (NULL == l) return;
   l->add("fPadParams", fPadParams);
}

Int_t
HRichPadTab::createPads()
{
   deletePads();
   fPadsArray = new TClonesArray("HRichPad", (RICH_MAX_COLS * RICH_MAX_ROWS));
   return (fPadsArray) ? (RICH_MAX_COLS * RICH_MAX_ROWS) : 0;
}

Bool_t
HRichPadTab::dummyInitialisation()
{
// this is dummy initialisation of all pads structure

   UInt_t ret = 0;

   if ((RICH_MAX_COLS * RICH_MAX_ROWS) != (ret = createPads())) {
      Error("dummyInitialisation", "Pointer to fPadsArray is NULL or has wrong size (%i instead of %i).",
            ret, (RICH_MAX_COLS * RICH_MAX_ROWS));
      return kFALSE;
   }

   for (UInt_t i = 0; i < (RICH_MAX_COLS * RICH_MAX_ROWS); ++i) {
      HRichPad *pad = new HRichPad;
      if (NULL == pad) {
         Error("dummyInitialisation", "Pointer to a new pad is NULL");
         return kFALSE;
      }
      pad->setPadNr(i);
      pad->CalcNrtoXY(RICH_MAX_COLS);
      pad->setPadActive(kFALSE);
      pad->setPadFlag(0);
      pad->setAmplitFraction(0.);
      for (Int_t j = 0; j < 6; ++j) {
         pad->setPhi(j, 0.0);
      }
      pad->setTheta(0.0);
      setPad(pad, i);
      delete pad;
   }

   return kTRUE;
}

Bool_t
HRichPadTab::initialisePads()
{
// fPadParams: array with size (numberOfPads * 11) in sector 1
//               11 numbers for each pad:
//                 1:    pad_pos_id = colNumber*100 + rowNumber
//                 2:    theta
//                 3:    phi (in sector 1)
//                 4..11 x and y of the 4 pad corners
//               theta and the pad corners are identical in each sector
//               for phi the sector rotation (relative to sector 1) must be added
//-------------------------------------------------------------------------------

   UInt_t address = 0;

   for (Int_t i = 0; i < fPadParams.GetSize() / 11; ++i) {
      address = static_cast<UInt_t>(fPadParams[11*i+0]);
      HRichPad* pad = getPad(static_cast<UInt_t>(address / 100), address % 100);
      if (NULL == pad) {
         Error("initialisePads", "Pointer to the pad is NULL");
         return kFALSE;
      }
      pad->setPadActive(1);
      fActivePadsNr++;
      pad->setTheta(fPadParams[11*i+1]);
      for (Int_t j = 0; j < 6; ++j) {
         pad->setPhi(j, 60 * j + fPadParams[11*i+2]);
         if (pad->getPhi(j) > 360) {
            pad->setPhi(j, pad->getPhi(j) - 360);
         }
      }
      for (Int_t j = 0; j < 4; ++j) {
         HRichPadCorner* padcorner = new HRichPadCorner;
         padcorner->setX(fPadParams[11*i+3+2*j]);
         padcorner->setY(fPadParams[11*i+4+2*j]);
         padcorner->setCornerNr(j);
         pad->addCorner(padcorner);
      }
   } // eof reading data

   return kTRUE;
}

void
HRichPadTab::setPad(HRichPad* pPad, UInt_t col, UInt_t row)
{
   setPad(pPad, calcAddr(col, row));
}

void
HRichPadTab::setPad(HRichPad* pPad, UInt_t padNr)
{
   HRichPad* pNewPad = NULL;

   pNewPad = static_cast<HRichPad*>(getSlot(padNr));
   pNewPad = new(pNewPad) HRichPad;
   *pNewPad = *pPad;
}

HRichPad*
HRichPadTab::getPad(UInt_t col, UInt_t row)
{
   if (col >= RICH_MAX_COLS)
      return NULL;

   if (row >= RICH_MAX_ROWS)
      return NULL;

   return getPad(calcAddr(col, row));
}

HRichPad*
HRichPadTab::getPad(Float_t Xpos, Float_t Ypos)
{

   UInt_t i        = 0;
   UInt_t j        = 0;
   UInt_t nPadAddr = 0;
   UInt_t nHit     = 0;

   if (Xpos < fPadsLongestRowMiddle) {
      for (nPadAddr = fPadsLongestRow * RICH_MAX_COLS;
           nPadAddr < fMiddlePad;
           nPadAddr++) {
         if (getPad(nPadAddr)->getPadActive() == kTRUE) {
            if (!getPad(nPadAddr)->isOutX(Xpos)) {
               nHit = 1;
               break;
            }
         }
      }
   } else {
      for (nPadAddr = fMiddlePad;
           nPadAddr < fPadsLongestRow * RICH_MAX_COLS + RICH_MAX_COLS;
           nPadAddr++) {
         if (getPad(nPadAddr)->getPadActive() == kTRUE) {
            if (!getPad(nPadAddr)->isOutX(Xpos)) {
               nHit = 1;
               break;
            }
         }
      }
   }

   if (nHit == 0) {
      return NULL;
   }

   nHit = 0;
   i = nPadAddr % RICH_MAX_COLS;
   for (j = 0; j < RICH_MAX_ROWS; j++) {
      if (NULL == getPad(i, j)) {
         Error("getPad", "Pad not found");
         continue;
      }
      if (getPad(i, j)->getPadActive() == kTRUE) {
         if (!getPad(i, j)->isOut(Xpos, Ypos)) {
            nHit = 1;
            break;
         }
      }
   }

   if (nHit == 0) {
      return NULL;
   }

   return getPad(i, j);
}

Bool_t
HRichPadTab::isOut(UInt_t X, UInt_t Y)
{
   if (X >= RICH_MAX_COLS) return kTRUE;
   if (Y >= RICH_MAX_ROWS) return kTRUE;
   return kFALSE;
}

TObject*&
HRichPadTab::getSlot(Int_t nIndx)
{
   return (fPadsArray->operator[](nIndx));
}

Bool_t
HRichPadTab::calculatePadParameters()
{
// This function calculate for each pad:
//   - sets minimum and maximum (in x and y) for given pad
//   - pad flag (if analytical formula can be used during digitisation)
//   - flag area
// and finally calls the calculation of pad centres

   Bool_t activated            = kFALSE;
   Bool_t analyticDigitisation = kFALSE;

   Int_t rowLen = 0;
   Int_t rowMax = 0;
   Int_t left   = -1;
   Int_t right  = -1;

   Float_t xcor = 0.;
   Float_t ycor = 0.;
   Float_t xmin = 0.;
   Float_t ymin = 0.;
   Float_t xmax = 0.;
   Float_t ymax = 0.;
   Float_t min  = 0.;
   Float_t max  = 0.;

   HRichPad*        pPad    = NULL;
   HRichPadCorner*  pCorner = NULL;

   Float_t x1, x2, y1, y2, a, b;
   Int_t n1, n2, area0, area1;

// Loop over all pads
   for (Int_t i = 0; i < (RICH_MAX_COLS * RICH_MAX_ROWS); ++i) {

      analyticDigitisation = kTRUE;
      pPad = getPad(i);

      // Loop over pad corners and sets minimum and maximum (in x and y) for given pad...
      for (Int_t j = 0; j < pPad->getCornersNr(); ++j) {
         pCorner = pPad->getCorner(j);
         xcor = pCorner->getX();
         ycor = pCorner->getY();
         if (j == 0) {
            xmin = xmax = xcor;
            ymin = ymax = ycor;
         }
         if (xcor < xmin) xmin = xcor;
         if (xcor > xmax) xmax = xcor;
         if (ycor < ymin) ymin = ycor;
         if (ycor > ymax) ymax = ycor;
      }

      pPad->setXmin(xmin);
      pPad->setYmin(ymin);
      pPad->setXmax(xmax);
      pPad->setYmax(ymax);


      // ...and checks if analytical formula can be used during digitisation
      if (pPad->getCornersNr() != 4) {
         analyticDigitisation = kFALSE;
      } else {
         for (Int_t j = 0; j < pPad->getCornersNr(); ++j) {
            pPad->getCorner(j)->getXY(&x1, &y1);
            if (j + 1 < pPad->getCornersNr()) {
               pPad->getCorner(j + 1)->getXY(&x2, &y2);
            } else {
               pPad->getCorner(0)->getXY(&x2, &y2);
            }
            if (x1 != x2 && y1 != y2) {
               analyticDigitisation = kFALSE;
            }
         }
      }

      if (kTRUE == analyticDigitisation) {
         pPad->setPadFlag(1);
      } else {
         pPad->setPadFlag(2);
      }


// Calculation of flag area
      for (Int_t j = 0; j < pPad->getCornersNr(); ++j) {
         pPad->getCorner(j)->getXY(&x1, &y1);
         n1 = pPad->getCorner(j)->getCornerNr();
         if (j + 1 < pPad->getCornersNr()) {
            pPad->getCorner(j + 1)->getXY(&x2, &y2);
            n2 = pPad->getCorner(j + 1)->getCornerNr();
         } else {
            pPad->getCorner(0)->getXY(&x2, &y2);
            n2 = pPad->getCorner(0)->getCornerNr();
         }

         area0 = 0;
         area1 = 0;
         if (x1 == x2) {
            for (Int_t k = 0; k < pPad->getCornersNr(); ++k) {
               if (pPad->getCorner(k)->getCornerNr() != n1 &&
                   pPad->getCorner(k)->getCornerNr() != n2) {
                  if (pPad->getCorner(k)->getX() > x1) area1++;
                  if (pPad->getCorner(k)->getX() < x1) area0++;
               }
            }
            if (area1 + 2 == pPad->getCornersNr()) {
               pPad->getCorner(j)->setAreaFlag(1);
            } else if (area0 + 2 == pPad->getCornersNr()) {
               pPad->getCorner(j)->setAreaFlag(0);
            } else {
               Error("calculatePadParameters", "Inconsistency in pads corners coordinates!");
               return kFALSE;;
            }
         } else if (y1 == y2) {
            for (Int_t k = 0; k < pPad->getCornersNr(); k++) {
               if (pPad->getCorner(k)->getCornerNr() != n1 &&
                   pPad->getCorner(k)->getCornerNr() != n2) {
                  if (pPad->getCorner(k)->getY() > y1) area1++;
                  if (pPad->getCorner(k)->getY() < y1) area0++;
               }
            }
            if (area1 + 2 == pPad->getCornersNr()) {
               pPad->getCorner(j)->setAreaFlag(1);
            } else if (area0 + 2 == pPad->getCornersNr()) {
               pPad->getCorner(j)->setAreaFlag(0);
            } else {
               Error("calculatePadParameters", "Inconsistency in pads corners coordinates!");
               return kFALSE;
            }
         } else {
            a = (y2 - y1) / (x2 - x1);
            b = (x2 * y1 - x1 * y2) / (x2 - x1);

            for (Int_t k = 0; k < pPad->getCornersNr(); ++k) {
               if (pPad->getCorner(k)->getCornerNr() != n1 &&
                   pPad->getCorner(k)->getCornerNr() != n2) {
                  if (pPad->getCorner(k)->getY() > a * pPad->getCorner(k)->getX() + b) area1++;
                  if (pPad->getCorner(k)->getY() < a * pPad->getCorner(k)->getX() + b) area0++;
               }
            }
            if (area1 + 2 == pPad->getCornersNr()) {
               pPad->getCorner(j)->setAreaFlag(1);
            } else if (area0 + 2 == pPad->getCornersNr()) {
               pPad->getCorner(j)->setAreaFlag(0);
            } else {
               Error("calculatePadParameters", "Inconsistency in pads corners coordinates!");
               return kFALSE;
            }
         }
      } // end of loop over all corners

      pPad->calcPadCenter();

   } // eof loop over all pads


   for (UInt_t j = 0; j < RICH_MAX_ROWS; ++j) {
      rowLen = 0;
      for (UInt_t i = 0; i < RICH_MAX_COLS; ++i) {
         if (getPad(i, j)->getPadActive()) {
            rowLen++;
         }
      }
      if (rowLen > rowMax) {
         rowMax = rowLen;
         fPadsLongestRow = j;
      }
   }

   for (Int_t i = 0; i < RICH_MAX_COLS; ++i) {
      if (getPad(i, fPadsLongestRow)->getPadActive()) {
         if (left < 0) {
            left = getPad(i, fPadsLongestRow)->getPadNr();
         }
         if (right < getPad(i, fPadsLongestRow)->getPadNr()) {
            right = getPad(i, fPadsLongestRow)->getPadNr();
         }
      }
   }

   fMiddlePad = left + (right - left) / 2 + 1;

   for (Int_t i = 0; i < RICH_MAX_COLS; ++i) {
      if (getPad(i, fPadsLongestRow)->getPadActive()) {
         if (activated == kFALSE) {
            min = getPad(i, fPadsLongestRow)->getXmin();
            max = getPad(i, fPadsLongestRow)->getXmax();
            activated = kTRUE;
         }
         if (min > getPad(i, fPadsLongestRow)->getXmin()) {
            min = getPad(i, fPadsLongestRow)->getXmin();
         }
         if (max < getPad(i, fPadsLongestRow)->getXmax()) {
            max = getPad(i, fPadsLongestRow)->getXmax();
         }
      }
   }

   fPadsLongestRowMiddle = (min + max) / 2.;

   return kTRUE;
}
 hrichpadtab.cc:1
 hrichpadtab.cc:2
 hrichpadtab.cc:3
 hrichpadtab.cc:4
 hrichpadtab.cc:5
 hrichpadtab.cc:6
 hrichpadtab.cc:7
 hrichpadtab.cc:8
 hrichpadtab.cc:9
 hrichpadtab.cc:10
 hrichpadtab.cc:11
 hrichpadtab.cc:12
 hrichpadtab.cc:13
 hrichpadtab.cc:14
 hrichpadtab.cc:15
 hrichpadtab.cc:16
 hrichpadtab.cc:17
 hrichpadtab.cc:18
 hrichpadtab.cc:19
 hrichpadtab.cc:20
 hrichpadtab.cc:21
 hrichpadtab.cc:22
 hrichpadtab.cc:23
 hrichpadtab.cc:24
 hrichpadtab.cc:25
 hrichpadtab.cc:26
 hrichpadtab.cc:27
 hrichpadtab.cc:28
 hrichpadtab.cc:29
 hrichpadtab.cc:30
 hrichpadtab.cc:31
 hrichpadtab.cc:32
 hrichpadtab.cc:33
 hrichpadtab.cc:34
 hrichpadtab.cc:35
 hrichpadtab.cc:36
 hrichpadtab.cc:37
 hrichpadtab.cc:38
 hrichpadtab.cc:39
 hrichpadtab.cc:40
 hrichpadtab.cc:41
 hrichpadtab.cc:42
 hrichpadtab.cc:43
 hrichpadtab.cc:44
 hrichpadtab.cc:45
 hrichpadtab.cc:46
 hrichpadtab.cc:47
 hrichpadtab.cc:48
 hrichpadtab.cc:49
 hrichpadtab.cc:50
 hrichpadtab.cc:51
 hrichpadtab.cc:52
 hrichpadtab.cc:53
 hrichpadtab.cc:54
 hrichpadtab.cc:55
 hrichpadtab.cc:56
 hrichpadtab.cc:57
 hrichpadtab.cc:58
 hrichpadtab.cc:59
 hrichpadtab.cc:60
 hrichpadtab.cc:61
 hrichpadtab.cc:62
 hrichpadtab.cc:63
 hrichpadtab.cc:64
 hrichpadtab.cc:65
 hrichpadtab.cc:66
 hrichpadtab.cc:67
 hrichpadtab.cc:68
 hrichpadtab.cc:69
 hrichpadtab.cc:70
 hrichpadtab.cc:71
 hrichpadtab.cc:72
 hrichpadtab.cc:73
 hrichpadtab.cc:74
 hrichpadtab.cc:75
 hrichpadtab.cc:76
 hrichpadtab.cc:77
 hrichpadtab.cc:78
 hrichpadtab.cc:79
 hrichpadtab.cc:80
 hrichpadtab.cc:81
 hrichpadtab.cc:82
 hrichpadtab.cc:83
 hrichpadtab.cc:84
 hrichpadtab.cc:85
 hrichpadtab.cc:86
 hrichpadtab.cc:87
 hrichpadtab.cc:88
 hrichpadtab.cc:89
 hrichpadtab.cc:90
 hrichpadtab.cc:91
 hrichpadtab.cc:92
 hrichpadtab.cc:93
 hrichpadtab.cc:94
 hrichpadtab.cc:95
 hrichpadtab.cc:96
 hrichpadtab.cc:97
 hrichpadtab.cc:98
 hrichpadtab.cc:99
 hrichpadtab.cc:100
 hrichpadtab.cc:101
 hrichpadtab.cc:102
 hrichpadtab.cc:103
 hrichpadtab.cc:104
 hrichpadtab.cc:105
 hrichpadtab.cc:106
 hrichpadtab.cc:107
 hrichpadtab.cc:108
 hrichpadtab.cc:109
 hrichpadtab.cc:110
 hrichpadtab.cc:111
 hrichpadtab.cc:112
 hrichpadtab.cc:113
 hrichpadtab.cc:114
 hrichpadtab.cc:115
 hrichpadtab.cc:116
 hrichpadtab.cc:117
 hrichpadtab.cc:118
 hrichpadtab.cc:119
 hrichpadtab.cc:120
 hrichpadtab.cc:121
 hrichpadtab.cc:122
 hrichpadtab.cc:123
 hrichpadtab.cc:124
 hrichpadtab.cc:125
 hrichpadtab.cc:126
 hrichpadtab.cc:127
 hrichpadtab.cc:128
 hrichpadtab.cc:129
 hrichpadtab.cc:130
 hrichpadtab.cc:131
 hrichpadtab.cc:132
 hrichpadtab.cc:133
 hrichpadtab.cc:134
 hrichpadtab.cc:135
 hrichpadtab.cc:136
 hrichpadtab.cc:137
 hrichpadtab.cc:138
 hrichpadtab.cc:139
 hrichpadtab.cc:140
 hrichpadtab.cc:141
 hrichpadtab.cc:142
 hrichpadtab.cc:143
 hrichpadtab.cc:144
 hrichpadtab.cc:145
 hrichpadtab.cc:146
 hrichpadtab.cc:147
 hrichpadtab.cc:148
 hrichpadtab.cc:149
 hrichpadtab.cc:150
 hrichpadtab.cc:151
 hrichpadtab.cc:152
 hrichpadtab.cc:153
 hrichpadtab.cc:154
 hrichpadtab.cc:155
 hrichpadtab.cc:156
 hrichpadtab.cc:157
 hrichpadtab.cc:158
 hrichpadtab.cc:159
 hrichpadtab.cc:160
 hrichpadtab.cc:161
 hrichpadtab.cc:162
 hrichpadtab.cc:163
 hrichpadtab.cc:164
 hrichpadtab.cc:165
 hrichpadtab.cc:166
 hrichpadtab.cc:167
 hrichpadtab.cc:168
 hrichpadtab.cc:169
 hrichpadtab.cc:170
 hrichpadtab.cc:171
 hrichpadtab.cc:172
 hrichpadtab.cc:173
 hrichpadtab.cc:174
 hrichpadtab.cc:175
 hrichpadtab.cc:176
 hrichpadtab.cc:177
 hrichpadtab.cc:178
 hrichpadtab.cc:179
 hrichpadtab.cc:180
 hrichpadtab.cc:181
 hrichpadtab.cc:182
 hrichpadtab.cc:183
 hrichpadtab.cc:184
 hrichpadtab.cc:185
 hrichpadtab.cc:186
 hrichpadtab.cc:187
 hrichpadtab.cc:188
 hrichpadtab.cc:189
 hrichpadtab.cc:190
 hrichpadtab.cc:191
 hrichpadtab.cc:192
 hrichpadtab.cc:193
 hrichpadtab.cc:194
 hrichpadtab.cc:195
 hrichpadtab.cc:196
 hrichpadtab.cc:197
 hrichpadtab.cc:198
 hrichpadtab.cc:199
 hrichpadtab.cc:200
 hrichpadtab.cc:201
 hrichpadtab.cc:202
 hrichpadtab.cc:203
 hrichpadtab.cc:204
 hrichpadtab.cc:205
 hrichpadtab.cc:206
 hrichpadtab.cc:207
 hrichpadtab.cc:208
 hrichpadtab.cc:209
 hrichpadtab.cc:210
 hrichpadtab.cc:211
 hrichpadtab.cc:212
 hrichpadtab.cc:213
 hrichpadtab.cc:214
 hrichpadtab.cc:215
 hrichpadtab.cc:216
 hrichpadtab.cc:217
 hrichpadtab.cc:218
 hrichpadtab.cc:219
 hrichpadtab.cc:220
 hrichpadtab.cc:221
 hrichpadtab.cc:222
 hrichpadtab.cc:223
 hrichpadtab.cc:224
 hrichpadtab.cc:225
 hrichpadtab.cc:226
 hrichpadtab.cc:227
 hrichpadtab.cc:228
 hrichpadtab.cc:229
 hrichpadtab.cc:230
 hrichpadtab.cc:231
 hrichpadtab.cc:232
 hrichpadtab.cc:233
 hrichpadtab.cc:234
 hrichpadtab.cc:235
 hrichpadtab.cc:236
 hrichpadtab.cc:237
 hrichpadtab.cc:238
 hrichpadtab.cc:239
 hrichpadtab.cc:240
 hrichpadtab.cc:241
 hrichpadtab.cc:242
 hrichpadtab.cc:243
 hrichpadtab.cc:244
 hrichpadtab.cc:245
 hrichpadtab.cc:246
 hrichpadtab.cc:247
 hrichpadtab.cc:248
 hrichpadtab.cc:249
 hrichpadtab.cc:250
 hrichpadtab.cc:251
 hrichpadtab.cc:252
 hrichpadtab.cc:253
 hrichpadtab.cc:254
 hrichpadtab.cc:255
 hrichpadtab.cc:256
 hrichpadtab.cc:257
 hrichpadtab.cc:258
 hrichpadtab.cc:259
 hrichpadtab.cc:260
 hrichpadtab.cc:261
 hrichpadtab.cc:262
 hrichpadtab.cc:263
 hrichpadtab.cc:264
 hrichpadtab.cc:265
 hrichpadtab.cc:266
 hrichpadtab.cc:267
 hrichpadtab.cc:268
 hrichpadtab.cc:269
 hrichpadtab.cc:270
 hrichpadtab.cc:271
 hrichpadtab.cc:272
 hrichpadtab.cc:273
 hrichpadtab.cc:274
 hrichpadtab.cc:275
 hrichpadtab.cc:276
 hrichpadtab.cc:277
 hrichpadtab.cc:278
 hrichpadtab.cc:279
 hrichpadtab.cc:280
 hrichpadtab.cc:281
 hrichpadtab.cc:282
 hrichpadtab.cc:283
 hrichpadtab.cc:284
 hrichpadtab.cc:285
 hrichpadtab.cc:286
 hrichpadtab.cc:287
 hrichpadtab.cc:288
 hrichpadtab.cc:289
 hrichpadtab.cc:290
 hrichpadtab.cc:291
 hrichpadtab.cc:292
 hrichpadtab.cc:293
 hrichpadtab.cc:294
 hrichpadtab.cc:295
 hrichpadtab.cc:296
 hrichpadtab.cc:297
 hrichpadtab.cc:298
 hrichpadtab.cc:299
 hrichpadtab.cc:300
 hrichpadtab.cc:301
 hrichpadtab.cc:302
 hrichpadtab.cc:303
 hrichpadtab.cc:304
 hrichpadtab.cc:305
 hrichpadtab.cc:306
 hrichpadtab.cc:307
 hrichpadtab.cc:308
 hrichpadtab.cc:309
 hrichpadtab.cc:310
 hrichpadtab.cc:311
 hrichpadtab.cc:312
 hrichpadtab.cc:313
 hrichpadtab.cc:314
 hrichpadtab.cc:315
 hrichpadtab.cc:316
 hrichpadtab.cc:317
 hrichpadtab.cc:318
 hrichpadtab.cc:319
 hrichpadtab.cc:320
 hrichpadtab.cc:321
 hrichpadtab.cc:322
 hrichpadtab.cc:323
 hrichpadtab.cc:324
 hrichpadtab.cc:325
 hrichpadtab.cc:326
 hrichpadtab.cc:327
 hrichpadtab.cc:328
 hrichpadtab.cc:329
 hrichpadtab.cc:330
 hrichpadtab.cc:331
 hrichpadtab.cc:332
 hrichpadtab.cc:333
 hrichpadtab.cc:334
 hrichpadtab.cc:335
 hrichpadtab.cc:336
 hrichpadtab.cc:337
 hrichpadtab.cc:338
 hrichpadtab.cc:339
 hrichpadtab.cc:340
 hrichpadtab.cc:341
 hrichpadtab.cc:342
 hrichpadtab.cc:343
 hrichpadtab.cc:344
 hrichpadtab.cc:345
 hrichpadtab.cc:346
 hrichpadtab.cc:347
 hrichpadtab.cc:348
 hrichpadtab.cc:349
 hrichpadtab.cc:350
 hrichpadtab.cc:351
 hrichpadtab.cc:352
 hrichpadtab.cc:353
 hrichpadtab.cc:354
 hrichpadtab.cc:355
 hrichpadtab.cc:356
 hrichpadtab.cc:357
 hrichpadtab.cc:358
 hrichpadtab.cc:359
 hrichpadtab.cc:360
 hrichpadtab.cc:361
 hrichpadtab.cc:362
 hrichpadtab.cc:363
 hrichpadtab.cc:364
 hrichpadtab.cc:365
 hrichpadtab.cc:366
 hrichpadtab.cc:367
 hrichpadtab.cc:368
 hrichpadtab.cc:369
 hrichpadtab.cc:370
 hrichpadtab.cc:371
 hrichpadtab.cc:372
 hrichpadtab.cc:373
 hrichpadtab.cc:374
 hrichpadtab.cc:375
 hrichpadtab.cc:376
 hrichpadtab.cc:377
 hrichpadtab.cc:378
 hrichpadtab.cc:379
 hrichpadtab.cc:380
 hrichpadtab.cc:381
 hrichpadtab.cc:382
 hrichpadtab.cc:383
 hrichpadtab.cc:384
 hrichpadtab.cc:385
 hrichpadtab.cc:386
 hrichpadtab.cc:387
 hrichpadtab.cc:388
 hrichpadtab.cc:389
 hrichpadtab.cc:390
 hrichpadtab.cc:391
 hrichpadtab.cc:392
 hrichpadtab.cc:393
 hrichpadtab.cc:394
 hrichpadtab.cc:395
 hrichpadtab.cc:396
 hrichpadtab.cc:397
 hrichpadtab.cc:398
 hrichpadtab.cc:399
 hrichpadtab.cc:400
 hrichpadtab.cc:401
 hrichpadtab.cc:402
 hrichpadtab.cc:403
 hrichpadtab.cc:404
 hrichpadtab.cc:405
 hrichpadtab.cc:406
 hrichpadtab.cc:407
 hrichpadtab.cc:408
 hrichpadtab.cc:409
 hrichpadtab.cc:410
 hrichpadtab.cc:411
 hrichpadtab.cc:412
 hrichpadtab.cc:413
 hrichpadtab.cc:414
 hrichpadtab.cc:415
 hrichpadtab.cc:416
 hrichpadtab.cc:417
 hrichpadtab.cc:418
 hrichpadtab.cc:419
 hrichpadtab.cc:420
 hrichpadtab.cc:421
 hrichpadtab.cc:422
 hrichpadtab.cc:423
 hrichpadtab.cc:424
 hrichpadtab.cc:425
 hrichpadtab.cc:426
 hrichpadtab.cc:427
 hrichpadtab.cc:428
 hrichpadtab.cc:429
 hrichpadtab.cc:430
 hrichpadtab.cc:431
 hrichpadtab.cc:432
 hrichpadtab.cc:433
 hrichpadtab.cc:434
 hrichpadtab.cc:435
 hrichpadtab.cc:436
 hrichpadtab.cc:437
 hrichpadtab.cc:438
 hrichpadtab.cc:439
 hrichpadtab.cc:440
 hrichpadtab.cc:441
 hrichpadtab.cc:442
 hrichpadtab.cc:443
 hrichpadtab.cc:444
 hrichpadtab.cc:445
 hrichpadtab.cc:446
 hrichpadtab.cc:447
 hrichpadtab.cc:448
 hrichpadtab.cc:449
 hrichpadtab.cc:450
 hrichpadtab.cc:451
 hrichpadtab.cc:452
 hrichpadtab.cc:453
 hrichpadtab.cc:454
 hrichpadtab.cc:455
 hrichpadtab.cc:456
 hrichpadtab.cc:457
 hrichpadtab.cc:458
 hrichpadtab.cc:459
 hrichpadtab.cc:460
 hrichpadtab.cc:461
 hrichpadtab.cc:462
 hrichpadtab.cc:463
 hrichpadtab.cc:464
 hrichpadtab.cc:465
 hrichpadtab.cc:466
 hrichpadtab.cc:467
 hrichpadtab.cc:468
 hrichpadtab.cc:469
 hrichpadtab.cc:470
 hrichpadtab.cc:471
 hrichpadtab.cc:472
 hrichpadtab.cc:473
 hrichpadtab.cc:474
 hrichpadtab.cc:475
 hrichpadtab.cc:476
 hrichpadtab.cc:477
 hrichpadtab.cc:478
 hrichpadtab.cc:479
 hrichpadtab.cc:480
 hrichpadtab.cc:481
 hrichpadtab.cc:482
 hrichpadtab.cc:483
 hrichpadtab.cc:484
 hrichpadtab.cc:485
 hrichpadtab.cc:486
 hrichpadtab.cc:487
 hrichpadtab.cc:488
 hrichpadtab.cc:489
 hrichpadtab.cc:490
 hrichpadtab.cc:491
 hrichpadtab.cc:492
 hrichpadtab.cc:493
 hrichpadtab.cc:494
 hrichpadtab.cc:495
 hrichpadtab.cc:496
 hrichpadtab.cc:497
 hrichpadtab.cc:498
 hrichpadtab.cc:499
 hrichpadtab.cc:500
 hrichpadtab.cc:501
 hrichpadtab.cc:502
 hrichpadtab.cc:503
 hrichpadtab.cc:504
 hrichpadtab.cc:505
 hrichpadtab.cc:506
 hrichpadtab.cc:507
 hrichpadtab.cc:508
 hrichpadtab.cc:509
 hrichpadtab.cc:510
 hrichpadtab.cc:511
 hrichpadtab.cc:512
 hrichpadtab.cc:513
 hrichpadtab.cc:514
 hrichpadtab.cc:515
 hrichpadtab.cc:516
 hrichpadtab.cc:517
 hrichpadtab.cc:518
 hrichpadtab.cc:519
 hrichpadtab.cc:520
 hrichpadtab.cc:521
 hrichpadtab.cc:522
 hrichpadtab.cc:523
 hrichpadtab.cc:524
 hrichpadtab.cc:525
 hrichpadtab.cc:526
 hrichpadtab.cc:527
 hrichpadtab.cc:528
 hrichpadtab.cc:529
 hrichpadtab.cc:530