ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : Witold Przygoda (przygoda@psja1.if.uj.edu.pl)
//*-- Revised : Martin Jurkovic <martin.jurkovic@ph.tum.de> 2010
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRichAnalysis
//
//
//////////////////////////////////////////////////////////////////////////////


#include "hades.h"
#include "hcategory.h"
#include "hdebug.h"
#include "hevent.h"
#include "heventheader.h"
#include "hiterator.h"
#include "hlinearcategory.h"
#include "hparset.h"
#include "hrichanalysis.h"
#include "hrichanalysispar.h"
#include "hrichcal.h"
#include "hrichdetector.h"
#include "hrichgeometrypar.h"
#include "hrichhitheader.h"
#include "hrichpadclean.h"
#include "hrichpadlabel.h"
#include "hrichringfind.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "richdef.h"

#include <iomanip>
#include <iostream>

using namespace std;

ClassImp(HRichAnalysis)

//----------------------------------------------------------------------------
HRichAnalysis::HRichAnalysis() : HReconstructor()
{

   clear();

   pPadClean = new HRichPadClean;
   pPadLabel = new HRichPadLabel;
   pRingFind = new HRichRingFind;

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

//----------------------------------------------------------------------------
HRichAnalysis::HRichAnalysis(const Text_t* name, const Text_t* title, Bool_t kSkip)
   : HReconstructor(name, title)
{
   clear();

   pPadClean = new HRichPadClean;
   pPadLabel = new HRichPadLabel;
   pRingFind = new HRichRingFind;
   kSkipEvtIfNoRing = kSkip;
}
//============================================================================

//----------------------------------------------------------------------------
HRichAnalysis::~HRichAnalysis()
{
   if (NULL != pPadClean) {
      delete pPadClean;
      pPadClean = NULL;
   }
   if (NULL != pPadLabel) {
      delete pPadLabel;
      pPadLabel = NULL;
   }
   if (NULL != pRingFind) {
      delete pRingFind;
      pRingFind = NULL;
   }
   if (NULL != pLabelArea) {
      delete [] pLabelArea;
      pLabelArea = NULL;
   }
   if (NULL != pPads) {
      for (Int_t i = 0; i < 6; i++)
         if (pPads[i]) delete [] pPads[i];
      delete [] pPads;
      pPads = NULL;
   }
   if (NULL != pLeftBorder) {
      delete [] pLeftBorder;
      pLeftBorder = NULL;
   }
   if (NULL != pRightBorder) {
      delete [] pRightBorder;
      pRightBorder = NULL;
   }
   if (NULL != fIter) {
      delete fIter;
      fIter = NULL;
   }
   if (NULL != fIterHitHeader) {
      delete fIterHitHeader;
      fIterHitHeader = NULL;
   }
}
//============================================================================

//----------------------------------------------------------------------------
void HRichAnalysis::clear()
{

   pLabelArea     = NULL;
   pRings         = NULL;
   pPads          = NULL;
   pSectorPads    = NULL;
   fIter          = NULL;
   fIterHitHeader = NULL;
   pLeftBorder    = NULL;
   pRightBorder   = NULL;
   m_pCalCat      = NULL;
   m_pHitCat      = NULL;
   m_pHitHdrCat   = NULL;
   fpAnalysisPar  = NULL;
   fpGeomPar      = NULL;
   hithdrLoop     = NULL;

   for (Int_t i = 0; i < 6; ++i)
      fPadFired[i] = 0;

   iClustersCleaned.Reset();

   allPairNrTot      = 0;
   iActiveSector     = 0;
   iClusterCleanedNr = 0;
   iFakeLocalMax4    = 0;
   iFakeLocalMax8    = 0;
   iFakePad          = 0;
   iLabelNr          = 0;
   iPadCleanedNr     = 0;
   iPadFiredNr       = 0;
   iRingNr           = 0;
   iRingNrTot        = 0;
   sectorPairNrTot   = 0;

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

//----------------------------------------------------------------------------
void
HRichAnalysis::Reset()
{
   iClustersCleaned.Reset();

   iClusterCleanedNr = 0;
   iFakeLocalMax4    = 0;
   iFakeLocalMax8    = 0;
   iFakePad          = 0;
   iLabelNr          = 0;
   iPadCleanedNr     = 0;
   iPadFiredNr       = 0;
   iRingNr           = 0;

   if (pLabelArea) {
      delete [] pLabelArea;
      pLabelArea = NULL;
   }
}
//============================================================================
/*
//----------------------------------------------------------------------------
HRichAnalysis::HRichAnalysis(const HRichAnalysis& source)
{

   Error("HRichAnalysis", "HRichAnalysis object can not be initialized with values of another object!\nUse instead default constructor");

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

//----------------------------------------------------------------------------
HRichAnalysis&
HRichAnalysis::operator=(const HRichAnalysis& source)
{
   if (this != &source) {
      Error("operator=", "HRichAnalysis object can not be assigned!");
   }
   return *this;
}
//============================================================================
*/
//----------------------------------------------------------------------------
Bool_t
HRichAnalysis::init()
{
// Allocate input/output categories, initialize iterators and parameter containers

   HRichDetector*    pRichDet     = NULL;
   HRuntimeDb*       rtdb         = NULL;
   HRichAnalysisPar* pAnalysisPar = NULL;
   HRichGeometryPar* pGeomPar     = NULL;

   pRichDet = static_cast<HRichDetector*>(gHades->getSetup()
                                          ->getDetector("Rich"));
   if (NULL == pRichDet) {
      Error("init", "Pointer to HRichDetector is NULL");
      return kFALSE;
   }

   m_pCalCat = gHades->getCurrentEvent()->getCategory(catRichCal);
   if (NULL == m_pCalCat) {
      m_pCalCat = pRichDet->buildCategory(catRichCal);
      if (NULL == m_pCalCat) {
         Error("init", "Pointer to HRichCal category is NULL");
         return kFALSE;
      } else
         gHades->getCurrentEvent()
         ->addCategory(catRichCal, m_pCalCat, "Rich");
   }
   fIter = static_cast<HIterator*>(m_pCalCat->MakeIterator());
   if (NULL == fIter) {
      Error("init", "Pointer to HRichCalSim iterator is NULL");
      return kFALSE;
   }

   m_pHitCat = gHades->getCurrentEvent()->getCategory(catRichHit);
   if (NULL == m_pHitCat) {
      m_pHitCat = pRichDet->buildCategory(catRichHit);
      if (NULL == m_pHitCat) {
         Error("init", "Pointer to HRichHit category is NULL");
         return kFALSE;
      } else gHades->getCurrentEvent()
         ->addCategory(catRichHit, m_pHitCat, "Rich");
   }

   m_pHitHdrCat = gHades->getCurrentEvent()->getCategory(catRichHitHdr);
   if (NULL == m_pHitHdrCat) {
      m_pHitHdrCat = pRichDet->buildCategory(catRichHitHdr);
      if (NULL == m_pHitHdrCat) {
         Error("init", "Pointer to HRichHitHdr category is NULL");
         return kFALSE;
      } else gHades->getCurrentEvent()
         ->addCategory(catRichHitHdr, m_pHitHdrCat, "Rich");
   }
   fIterHitHeader = static_cast<HIterator*>(m_pHitHdrCat->MakeIterator("native"));
   if (NULL == fIterHitHeader) {
      Error("init", "Pointer to HRichHitHdr iterator is NULL");
      return kFALSE;
   }


   rtdb = gHades->getRuntimeDb();
   pAnalysisPar = static_cast<HRichAnalysisPar*>(rtdb->
                                                 getContainer("RichAnalysisParameters"));
   if (NULL == pAnalysisPar) {
      Error("init", "Pointer to HRichAnalysisPar parameters is NULL");
      return kFALSE;
   }
   setAnalysisPar(pAnalysisPar);

   pGeomPar = static_cast<HRichGeometryPar*>(rtdb->
                                             getContainer("RichGeometryParameters"));
   if (NULL == pGeomPar) {
      Error("init", "Pointer to RichGeometryParameters parameters is NULL");
      return kFALSE;
   }
   setGeometryPar(pGeomPar);

   if (kFALSE == initParameters()) {
      Error("init", "Parameters not initialized");
      return kFALSE;
   }

   if (kFALSE == pPadClean->init()) {
      Error("init", "HRichPadClean did not initialize");
      return kFALSE;
   }

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

//----------------------------------------------------------------------------
Bool_t
HRichAnalysis::reinit()
{
   UInt_t i, j, k, m, n;
   Int_t iMatrixSurface = 0;
   Int_t iPartSurface   = 0;
   Int_t iMaskSize      = 0;
   Int_t iMaskSizeSquared = 0;

   if (kFALSE == initParameters()) {
      Error("reinit", "Parameters not initialized");
      return kFALSE;
   }

   pRingFind->init(this);


   iPadActive.Set(maxCols * maxRows);
   for (i = 0; i < (UInt_t)maxCols * maxRows; ++i)
      if (((HRichGeometryPar*)fpGeomPar)->getPadsPar()->getPad(i)->getPadActive() > 0)
         iPadActive[i] = 1;
      else
         iPadActive[i] = 0;


   iMaskSize        = ((HRichAnalysisPar*)fpAnalysisPar)->iRingMaskSize;
   iMaskSizeSquared = iMaskSize * iMaskSize;
   for (k = 0; k < (UInt_t)iMaskSizeSquared; ++k)
      if (1 == ((HRichAnalysisPar*)fpAnalysisPar)->iRingMask[k])
         iMatrixSurface++;


   for (j = 0; j < (UInt_t)maxRows; j++)
      for (i = 0; i < (UInt_t)maxCols; i++) {
         iPartSurface = 0;
         for (k = 0; k < (UInt_t)iMaskSizeSquared; k++) {
            m = (k % iMaskSize) - iMaskSize / 2;
            n = (k / iMaskSize) - iMaskSize / 2;
            if (!IsOut(i, j, m, n))
               if (1 == ((HRichAnalysisPar*)fpAnalysisPar)->iRingMask[k])
                  iPartSurface++;
         }

         ((HRichGeometryPar*)fpGeomPar)->getPadsPar()->
         getPad(i, j)->setAmplitFraction((Float_t)iPartSurface / (Float_t)iMatrixSurface);
      }

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

//----------------------------------------------------------------------------
Bool_t
HRichAnalysis::initParameters()
{
// allocate non event by event classes

   HRichGeometryPar *pGeomPar = getGeometryPar();

   iRingNrTot = 0;
   allPairNrTot = 0;
   sectorPairNrTot = 0;
   maxFiredTotalPads  = 3000; // upper limit of number of fired pads

   maxCols = pGeomPar->getColumns();
   maxRows = pGeomPar->getRows();

   if (pLeftBorder)
      delete [] pLeftBorder;
   pLeftBorder = new Short_t[maxRows];

   if (pRightBorder)
      delete [] pRightBorder;
   pRightBorder = new Short_t[maxRows];

   for (Int_t row = 0; row < maxRows; ++row) {
      Int_t col = 0;
      Int_t padOffset = row * maxCols;
      while (!pGeomPar->getPadsPar()->getPad(col + padOffset)->getPadActive() && col < maxCols)
         ++col;
      if (col == maxCols) {
         maxRows = row;
         break;
      }
      pLeftBorder[row] = col;
      while (pGeomPar->getPadsPar()->getPad(col + padOffset)->getPadActive() && col < maxCols)
         ++col;
      pRightBorder[row] = col - 1;
   }
   maxPads = maxRows * maxCols;

   // now creating pads array
   pPads = new HRichPadSignal * [6];
   for (Int_t j = 0; j < 6; ++j) {
      pSectorPads = pPads[j] = new HRichPadSignal[maxPads];
      for (Int_t i = 0; i < maxPads; pSectorPads[i++].clear());
   }
   pSectorPads = pPads[iActiveSector];

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

//----------------------------------------------------------------------------
Bool_t
HRichAnalysis::finalize()
{
   return kTRUE;
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichAnalysis::execute()
{

   HRichCal* pCal      = NULL;
   Bool_t skipSector[] = {0, 0, 0, 0, 0, 0};
   Int_t iRingNrTotEvt = 0;
   Int_t fPadFiredTot  = 0;
   Int_t lastRingNr    = 0;
   Int_t ampl          = -1;
   Int_t sector        = -1;
   Int_t padnr         = -1;
   const Int_t eventNr = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();
   Int_t j;

   secWithCurrent = -1;
   Reset();

   for (sector = 0; sector < 6; ++sector) {
      if (fPadFired[sector] > 0) {
         fPadFired[sector] = 0;
         HRichPadSignal* pSecPads = pPads[sector];
         for (j = 0; j < maxPads; pSecPads[j++].clear());
      }
   }

   fIter->Reset();
   while (NULL != (pCal = (HRichCal *)fIter->Next())) {
      if ((ampl = (Int_t)pCal->getCharge()) > 0) {
         sector = pCal->getSector();
         fPadFired[sector]++;
         padnr = pCal->getCol() + pCal->getRow() * maxCols;
	 if(padnr >= maxPads) {
	     Warning("execute()","pPads out of range ! signal will be skipped.");
	     continue;
	 }
	 pPads[sector][padnr].setAmplitude(ampl);
      }
      // remember that columns are x and rows are y
   }

   for (sector = 6; sector--; fPadFiredTot += fPadFired[sector]) {
      if (fPadFiredTot > maxFiredTotalPads) {
         Warning("execute", "Analysis of event %d skipped: too many pads fired %i/%i",
                 eventNr, fPadFiredTot, maxFiredTotalPads);
         fIter->Reset();
         while (NULL != (pCal = static_cast<HRichCal*>(fIter->Next()))) {
            pCal->setIsCleanedSector(kTRUE);
         }
         return 0;
      }
      if (fPadFired[sector] >= fpAnalysisPar->maxFiredSectorPads) {
         Warning("execute", "Event %d: too many fired pads in sector %i. %i/%i",
                 eventNr, sector, fPadFired[sector], fpAnalysisPar->maxFiredSectorPads);
         fIter->Reset();
         while (NULL != (pCal = static_cast<HRichCal*>(fIter->Next()))) {
            if (pCal->getSector() == sector)
               pCal->setIsCleanedSector(kTRUE);
         }
         skipSector[sector] = kTRUE;
      }
   }


   // **************************************************************

   // ------- loop over sectors --- begin ---

   lastRingNr = iRingNrTot;
   for (sector = 0; sector < 6; ++sector) {
      // Skip analysis for sector with too many fired pads
      if (kTRUE == skipSector[sector])
         continue;

      if (((HRichGeometryPar*)fpGeomPar)->getSectorActive(sector) > 0) {
         Reset();
         SetActiveSector(sector);
         iPadFiredNr = fPadFired[sector];

         // for each sector:
         //   - cleaning
         //   - labeling
         //   - ring finding
         // procedure are executed

         iPadCleanedNr = pPadClean->Execute(this);
         iLabelNr      = pPadLabel->Execute(this);

         if (0 == ((HRichAnalysisPar*)fpAnalysisPar)->isActiveLabelPads) {
            iLabelNr = 1;
            pLabelArea = new HRichLabel[1];
            pLabelArea[0].iLeftX = 0;
            pLabelArea[0].iRightX = maxCols;
            pLabelArea[0].iLowerY = 0;
            pLabelArea[0].iUpperY = maxRows;
            pLabelArea[0].iLabeledPadsNr = maxPads;
            pLabelArea[0].iFiredPadsNr = iPadFiredNr;
         }

         iRingNr = pRingFind->Execute(this);
         iRingNrTot    += iRingNr;
         iRingNrTotEvt += iRingNr;

         if (iRingNr > 1) {
            ++sectorPairNrTot;
         }

         // Found rings are stored in the hit container
         updateHeaders(sector, eventNr);
         updateHits(sector);
      }
   }

   // update information about cleaned pads
   fIter->Reset();
   while (NULL != (pCal = (HRichCal *)fIter->Next())) {
      sector = pCal->getSector();
      padnr  = pCal->getCol() + pCal->getRow() * maxCols;
      if(padnr >= maxPads) {  // warning already above
	  continue;
      }
      pCal->setIsCleanedSingle(pPads[sector][padnr].getIsCleanedSingle());
      pCal->setIsCleanedHigh(pPads[sector][padnr].getIsCleanedHigh());
   }

   // ------- loop over sectors --- end ---
   if (iRingNrTot > lastRingNr + 1) {
      ++allPairNrTot;
   }

   // modification to skip event which does not contain any ring
   if (kSkipEvtIfNoRing && iRingNrTotEvt == 0)
      return kSkipEvent;
   return 0;
}
//============================================================================

//----------------------------------------------------------------------------
void
HRichAnalysis::updateHits(Int_t nSec)
{

   HRichHit* hit = NULL;
   HLocation loc;

   for (Int_t i = 0; i < iRingNr; i++) {
      loc.set(1, nSec);

      hit = (HRichHit*)m_pHitCat->getNewSlot(loc);

      if (NULL != hit) {
         hit = new(hit) HRichHit;

         *hit = pRings[i];
         hit->setEventNr(gHades->getCurrentEvent()->getHeader()->getEventSeqNumber());
         hit->setSector(nSec);
         if (hit->fX > 1000.)
            Info("updateHits", "fX : %f, %i fY : %f, %i",
                 hit->fX, hit->iRingX, hit->fY, hit->iRingY);

//calculate ring center in theta, phi by averaging over next neighbours
         HRichPad* pad = ((HRichGeometryPar*)fpGeomPar)->getPadsPar()->
	     getPad((UInt_t)hit->iRingX, (UInt_t)hit->iRingY);
         hit->fPhi   = pad->getPhi(nSec);
         hit->fTheta = pad->getTheta();

	 Float_t delta = hit->fPadX - float(hit->iRingX);
	 if(delta > 0.01F) {
           HRichPad* pad1 = ((HRichGeometryPar*)fpGeomPar)->getPadsPar()->
	       getPad((UInt_t)hit->iRingX+1, (UInt_t)hit->iRingY);
	   hit->fPhi += (pad1->getPhi(nSec) - hit->fPhi)*delta;
	 } else if(delta < -0.01F){
           HRichPad* pad1 = ((HRichGeometryPar*)fpGeomPar)->getPadsPar()->
	       getPad((UInt_t)hit->iRingX-1, (UInt_t)hit->iRingY);
	   hit->fPhi -= (pad1->getPhi(nSec) - hit->fPhi)*delta;
	 }
         delta = hit->fPadY - float(hit->iRingY);
	 if(delta > 0.01F) {
           HRichPad* pad1 = ((HRichGeometryPar*)fpGeomPar)->getPadsPar()->
	       getPad((UInt_t)hit->iRingX, (UInt_t)hit->iRingY+1);
	   hit->fTheta += (pad1->getTheta() - hit->fTheta)*delta;
	 } else if(delta < -0.01F){
           HRichPad* pad1 = ((HRichGeometryPar*)fpGeomPar)->getPadsPar()->
	       getPad((UInt_t)hit->iRingX, (UInt_t)hit->iRingY-1);
	   hit->fTheta -= (pad1->getTheta() - hit->fTheta)*delta;
	 }
      }
   }
}
//============================================================================

//----------------------------------------------------------------------------
void
HRichAnalysis::updateHeaders(const Int_t nSec,
                             const Int_t nEvNr)
{
   HRichHitHeader* hithdr = NULL;
   HLocation       loc;

   fIterHitHeader->Reset();
   hithdrLoop = NULL;

   while (NULL != (hithdrLoop = (HRichHitHeader *)fIterHitHeader->Next())) {
      secWithCurrent = hithdrLoop->getSector();
      if (nSec == secWithCurrent) {
         hithdr = hithdrLoop;
         break;
      }
   }

   if (hithdr == NULL) {
      loc.set(1, nSec);
      hithdr = (HRichHitHeader*)(m_pHitHdrCat)->getNewSlot(loc);
      if (NULL != hithdr)
         hithdr = new(hithdr) HRichHitHeader;
   }

   if (NULL != hithdr) {
      hithdr->setSector(nSec);
      hithdr->setEventNr(nEvNr);
      hithdr->setExecutedAnalysis(1);
      hithdr->iPadFiredNr = iPadFiredNr;
      hithdr->iPadCleanedNr = iPadCleanedNr;
      hithdr->iClusterCleanedNr = iClusterCleanedNr;
      hithdr->iClustersCleaned = iClustersCleaned;
      hithdr->iRingNr = iRingNr;
      hithdr->iFakePad = iFakePad;
      hithdr->iFakeLocalMax4 = iFakeLocalMax4;
      hithdr->iFakeLocalMax8 = iFakeLocalMax8;
   } else {
      Warning("updateHeaders", "No Header Object could be created");
   }
}

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

//----------------------------------------------------------------------------
void
HRichAnalysis::SetActiveSector(Int_t sectornr)
{
   if (sectornr == iActiveSector)
      return;
   if (sectornr > 5 || sectornr < 0) {
      Error("SetActiveSector", "Sector number %d out of range (0..5)!", sectornr);
      return;
   } else if (0 == ((HRichGeometryPar*)fpGeomPar)->getSectorActive(sectornr)) {
      Error("SetActiveSector", "Sector number %d is not present (and cannot be active)!", sectornr);
      return;
   } else {
      iActiveSector = sectornr;
      pSectorPads = pPads[sectornr];
   }
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichAnalysis::SetNextSector()
{
   Int_t i = iActiveSector;
   while (i < 6) {
      i++;
      if (((HRichGeometryPar*)fpGeomPar)->getSectorActive(i) > 0) {
         pSectorPads = pPads[i];
         return (iActiveSector = i);
      }
   }
   Error("SetNextSector", "No more sectors (last sector %d)", iActiveSector);
   return iActiveSector;
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichAnalysis::IsOut(Int_t nowPad, Int_t dx, Int_t dy)
{
   if (nowPad <= 0)
      return 1;
   Int_t x = nowPad % maxCols;
   Int_t y = nowPad / maxCols;

   if ((x + dx) >= 0 && (x + dx) < maxCols &&
       (y + dy) >= 0 && (y + dy) < maxRows &&
       iPadActive[nowPad+dx + maxCols*dy]) {
      return 0;
   } else {
      return 1;
   }
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichAnalysis::IsOut(Int_t x, Int_t y, Int_t dx, Int_t dy)
{
   if ((x + dx) >= 0 && (x + dx) < maxCols &&
       (y + dy) >= 0 && (y + dy) < maxRows &&
       iPadActive[x + dx + maxCols *(y + dy)]) {
      return 0;
   } else {
      return 1;
   }
}
//============================================================================

//----------------------------------------------------------------------------
void
HRichAnalysis::Streamer(TBuffer &R__b)
{
// Stream an object of class HRichAnalysis.

   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion();
      if (R__v) { }
      R__b >> iPadFiredNr;
      R__b >> iPadCleanedNr;
      R__b >> iRingNr;
      R__b >> pRings;
      R__b >> iClusterCleanedNr;
      iClustersCleaned.Streamer(R__b);
      R__b >> iFakePad;
      R__b >> iFakeLocalMax4;
      R__b >> iFakeLocalMax8;
   } else {
      R__b.WriteVersion(HRichAnalysis::IsA());
      R__b << iPadFiredNr;
      R__b << iPadCleanedNr;
      R__b << iRingNr;
      R__b << pRings;
      R__b << iClusterCleanedNr;
      iClustersCleaned.Streamer(R__b);
      R__b << iFakePad;
      R__b << iFakeLocalMax4;
      R__b << iFakeLocalMax8;
   }
}
//============================================================================
 hrichanalysis.cc:1
 hrichanalysis.cc:2
 hrichanalysis.cc:3
 hrichanalysis.cc:4
 hrichanalysis.cc:5
 hrichanalysis.cc:6
 hrichanalysis.cc:7
 hrichanalysis.cc:8
 hrichanalysis.cc:9
 hrichanalysis.cc:10
 hrichanalysis.cc:11
 hrichanalysis.cc:12
 hrichanalysis.cc:13
 hrichanalysis.cc:14
 hrichanalysis.cc:15
 hrichanalysis.cc:16
 hrichanalysis.cc:17
 hrichanalysis.cc:18
 hrichanalysis.cc:19
 hrichanalysis.cc:20
 hrichanalysis.cc:21
 hrichanalysis.cc:22
 hrichanalysis.cc:23
 hrichanalysis.cc:24
 hrichanalysis.cc:25
 hrichanalysis.cc:26
 hrichanalysis.cc:27
 hrichanalysis.cc:28
 hrichanalysis.cc:29
 hrichanalysis.cc:30
 hrichanalysis.cc:31
 hrichanalysis.cc:32
 hrichanalysis.cc:33
 hrichanalysis.cc:34
 hrichanalysis.cc:35
 hrichanalysis.cc:36
 hrichanalysis.cc:37
 hrichanalysis.cc:38
 hrichanalysis.cc:39
 hrichanalysis.cc:40
 hrichanalysis.cc:41
 hrichanalysis.cc:42
 hrichanalysis.cc:43
 hrichanalysis.cc:44
 hrichanalysis.cc:45
 hrichanalysis.cc:46
 hrichanalysis.cc:47
 hrichanalysis.cc:48
 hrichanalysis.cc:49
 hrichanalysis.cc:50
 hrichanalysis.cc:51
 hrichanalysis.cc:52
 hrichanalysis.cc:53
 hrichanalysis.cc:54
 hrichanalysis.cc:55
 hrichanalysis.cc:56
 hrichanalysis.cc:57
 hrichanalysis.cc:58
 hrichanalysis.cc:59
 hrichanalysis.cc:60
 hrichanalysis.cc:61
 hrichanalysis.cc:62
 hrichanalysis.cc:63
 hrichanalysis.cc:64
 hrichanalysis.cc:65
 hrichanalysis.cc:66
 hrichanalysis.cc:67
 hrichanalysis.cc:68
 hrichanalysis.cc:69
 hrichanalysis.cc:70
 hrichanalysis.cc:71
 hrichanalysis.cc:72
 hrichanalysis.cc:73
 hrichanalysis.cc:74
 hrichanalysis.cc:75
 hrichanalysis.cc:76
 hrichanalysis.cc:77
 hrichanalysis.cc:78
 hrichanalysis.cc:79
 hrichanalysis.cc:80
 hrichanalysis.cc:81
 hrichanalysis.cc:82
 hrichanalysis.cc:83
 hrichanalysis.cc:84
 hrichanalysis.cc:85
 hrichanalysis.cc:86
 hrichanalysis.cc:87
 hrichanalysis.cc:88
 hrichanalysis.cc:89
 hrichanalysis.cc:90
 hrichanalysis.cc:91
 hrichanalysis.cc:92
 hrichanalysis.cc:93
 hrichanalysis.cc:94
 hrichanalysis.cc:95
 hrichanalysis.cc:96
 hrichanalysis.cc:97
 hrichanalysis.cc:98
 hrichanalysis.cc:99
 hrichanalysis.cc:100
 hrichanalysis.cc:101
 hrichanalysis.cc:102
 hrichanalysis.cc:103
 hrichanalysis.cc:104
 hrichanalysis.cc:105
 hrichanalysis.cc:106
 hrichanalysis.cc:107
 hrichanalysis.cc:108
 hrichanalysis.cc:109
 hrichanalysis.cc:110
 hrichanalysis.cc:111
 hrichanalysis.cc:112
 hrichanalysis.cc:113
 hrichanalysis.cc:114
 hrichanalysis.cc:115
 hrichanalysis.cc:116
 hrichanalysis.cc:117
 hrichanalysis.cc:118
 hrichanalysis.cc:119
 hrichanalysis.cc:120
 hrichanalysis.cc:121
 hrichanalysis.cc:122
 hrichanalysis.cc:123
 hrichanalysis.cc:124
 hrichanalysis.cc:125
 hrichanalysis.cc:126
 hrichanalysis.cc:127
 hrichanalysis.cc:128
 hrichanalysis.cc:129
 hrichanalysis.cc:130
 hrichanalysis.cc:131
 hrichanalysis.cc:132
 hrichanalysis.cc:133
 hrichanalysis.cc:134
 hrichanalysis.cc:135
 hrichanalysis.cc:136
 hrichanalysis.cc:137
 hrichanalysis.cc:138
 hrichanalysis.cc:139
 hrichanalysis.cc:140
 hrichanalysis.cc:141
 hrichanalysis.cc:142
 hrichanalysis.cc:143
 hrichanalysis.cc:144
 hrichanalysis.cc:145
 hrichanalysis.cc:146
 hrichanalysis.cc:147
 hrichanalysis.cc:148
 hrichanalysis.cc:149
 hrichanalysis.cc:150
 hrichanalysis.cc:151
 hrichanalysis.cc:152
 hrichanalysis.cc:153
 hrichanalysis.cc:154
 hrichanalysis.cc:155
 hrichanalysis.cc:156
 hrichanalysis.cc:157
 hrichanalysis.cc:158
 hrichanalysis.cc:159
 hrichanalysis.cc:160
 hrichanalysis.cc:161
 hrichanalysis.cc:162
 hrichanalysis.cc:163
 hrichanalysis.cc:164
 hrichanalysis.cc:165
 hrichanalysis.cc:166
 hrichanalysis.cc:167
 hrichanalysis.cc:168
 hrichanalysis.cc:169
 hrichanalysis.cc:170
 hrichanalysis.cc:171
 hrichanalysis.cc:172
 hrichanalysis.cc:173
 hrichanalysis.cc:174
 hrichanalysis.cc:175
 hrichanalysis.cc:176
 hrichanalysis.cc:177
 hrichanalysis.cc:178
 hrichanalysis.cc:179
 hrichanalysis.cc:180
 hrichanalysis.cc:181
 hrichanalysis.cc:182
 hrichanalysis.cc:183
 hrichanalysis.cc:184
 hrichanalysis.cc:185
 hrichanalysis.cc:186
 hrichanalysis.cc:187
 hrichanalysis.cc:188
 hrichanalysis.cc:189
 hrichanalysis.cc:190
 hrichanalysis.cc:191
 hrichanalysis.cc:192
 hrichanalysis.cc:193
 hrichanalysis.cc:194
 hrichanalysis.cc:195
 hrichanalysis.cc:196
 hrichanalysis.cc:197
 hrichanalysis.cc:198
 hrichanalysis.cc:199
 hrichanalysis.cc:200
 hrichanalysis.cc:201
 hrichanalysis.cc:202
 hrichanalysis.cc:203
 hrichanalysis.cc:204
 hrichanalysis.cc:205
 hrichanalysis.cc:206
 hrichanalysis.cc:207
 hrichanalysis.cc:208
 hrichanalysis.cc:209
 hrichanalysis.cc:210
 hrichanalysis.cc:211
 hrichanalysis.cc:212
 hrichanalysis.cc:213
 hrichanalysis.cc:214
 hrichanalysis.cc:215
 hrichanalysis.cc:216
 hrichanalysis.cc:217
 hrichanalysis.cc:218
 hrichanalysis.cc:219
 hrichanalysis.cc:220
 hrichanalysis.cc:221
 hrichanalysis.cc:222
 hrichanalysis.cc:223
 hrichanalysis.cc:224
 hrichanalysis.cc:225
 hrichanalysis.cc:226
 hrichanalysis.cc:227
 hrichanalysis.cc:228
 hrichanalysis.cc:229
 hrichanalysis.cc:230
 hrichanalysis.cc:231
 hrichanalysis.cc:232
 hrichanalysis.cc:233
 hrichanalysis.cc:234
 hrichanalysis.cc:235
 hrichanalysis.cc:236
 hrichanalysis.cc:237
 hrichanalysis.cc:238
 hrichanalysis.cc:239
 hrichanalysis.cc:240
 hrichanalysis.cc:241
 hrichanalysis.cc:242
 hrichanalysis.cc:243
 hrichanalysis.cc:244
 hrichanalysis.cc:245
 hrichanalysis.cc:246
 hrichanalysis.cc:247
 hrichanalysis.cc:248
 hrichanalysis.cc:249
 hrichanalysis.cc:250
 hrichanalysis.cc:251
 hrichanalysis.cc:252
 hrichanalysis.cc:253
 hrichanalysis.cc:254
 hrichanalysis.cc:255
 hrichanalysis.cc:256
 hrichanalysis.cc:257
 hrichanalysis.cc:258
 hrichanalysis.cc:259
 hrichanalysis.cc:260
 hrichanalysis.cc:261
 hrichanalysis.cc:262
 hrichanalysis.cc:263
 hrichanalysis.cc:264
 hrichanalysis.cc:265
 hrichanalysis.cc:266
 hrichanalysis.cc:267
 hrichanalysis.cc:268
 hrichanalysis.cc:269
 hrichanalysis.cc:270
 hrichanalysis.cc:271
 hrichanalysis.cc:272
 hrichanalysis.cc:273
 hrichanalysis.cc:274
 hrichanalysis.cc:275
 hrichanalysis.cc:276
 hrichanalysis.cc:277
 hrichanalysis.cc:278
 hrichanalysis.cc:279
 hrichanalysis.cc:280
 hrichanalysis.cc:281
 hrichanalysis.cc:282
 hrichanalysis.cc:283
 hrichanalysis.cc:284
 hrichanalysis.cc:285
 hrichanalysis.cc:286
 hrichanalysis.cc:287
 hrichanalysis.cc:288
 hrichanalysis.cc:289
 hrichanalysis.cc:290
 hrichanalysis.cc:291
 hrichanalysis.cc:292
 hrichanalysis.cc:293
 hrichanalysis.cc:294
 hrichanalysis.cc:295
 hrichanalysis.cc:296
 hrichanalysis.cc:297
 hrichanalysis.cc:298
 hrichanalysis.cc:299
 hrichanalysis.cc:300
 hrichanalysis.cc:301
 hrichanalysis.cc:302
 hrichanalysis.cc:303
 hrichanalysis.cc:304
 hrichanalysis.cc:305
 hrichanalysis.cc:306
 hrichanalysis.cc:307
 hrichanalysis.cc:308
 hrichanalysis.cc:309
 hrichanalysis.cc:310
 hrichanalysis.cc:311
 hrichanalysis.cc:312
 hrichanalysis.cc:313
 hrichanalysis.cc:314
 hrichanalysis.cc:315
 hrichanalysis.cc:316
 hrichanalysis.cc:317
 hrichanalysis.cc:318
 hrichanalysis.cc:319
 hrichanalysis.cc:320
 hrichanalysis.cc:321
 hrichanalysis.cc:322
 hrichanalysis.cc:323
 hrichanalysis.cc:324
 hrichanalysis.cc:325
 hrichanalysis.cc:326
 hrichanalysis.cc:327
 hrichanalysis.cc:328
 hrichanalysis.cc:329
 hrichanalysis.cc:330
 hrichanalysis.cc:331
 hrichanalysis.cc:332
 hrichanalysis.cc:333
 hrichanalysis.cc:334
 hrichanalysis.cc:335
 hrichanalysis.cc:336
 hrichanalysis.cc:337
 hrichanalysis.cc:338
 hrichanalysis.cc:339
 hrichanalysis.cc:340
 hrichanalysis.cc:341
 hrichanalysis.cc:342
 hrichanalysis.cc:343
 hrichanalysis.cc:344
 hrichanalysis.cc:345
 hrichanalysis.cc:346
 hrichanalysis.cc:347
 hrichanalysis.cc:348
 hrichanalysis.cc:349
 hrichanalysis.cc:350
 hrichanalysis.cc:351
 hrichanalysis.cc:352
 hrichanalysis.cc:353
 hrichanalysis.cc:354
 hrichanalysis.cc:355
 hrichanalysis.cc:356
 hrichanalysis.cc:357
 hrichanalysis.cc:358
 hrichanalysis.cc:359
 hrichanalysis.cc:360
 hrichanalysis.cc:361
 hrichanalysis.cc:362
 hrichanalysis.cc:363
 hrichanalysis.cc:364
 hrichanalysis.cc:365
 hrichanalysis.cc:366
 hrichanalysis.cc:367
 hrichanalysis.cc:368
 hrichanalysis.cc:369
 hrichanalysis.cc:370
 hrichanalysis.cc:371
 hrichanalysis.cc:372
 hrichanalysis.cc:373
 hrichanalysis.cc:374
 hrichanalysis.cc:375
 hrichanalysis.cc:376
 hrichanalysis.cc:377
 hrichanalysis.cc:378
 hrichanalysis.cc:379
 hrichanalysis.cc:380
 hrichanalysis.cc:381
 hrichanalysis.cc:382
 hrichanalysis.cc:383
 hrichanalysis.cc:384
 hrichanalysis.cc:385
 hrichanalysis.cc:386
 hrichanalysis.cc:387
 hrichanalysis.cc:388
 hrichanalysis.cc:389
 hrichanalysis.cc:390
 hrichanalysis.cc:391
 hrichanalysis.cc:392
 hrichanalysis.cc:393
 hrichanalysis.cc:394
 hrichanalysis.cc:395
 hrichanalysis.cc:396
 hrichanalysis.cc:397
 hrichanalysis.cc:398
 hrichanalysis.cc:399
 hrichanalysis.cc:400
 hrichanalysis.cc:401
 hrichanalysis.cc:402
 hrichanalysis.cc:403
 hrichanalysis.cc:404
 hrichanalysis.cc:405
 hrichanalysis.cc:406
 hrichanalysis.cc:407
 hrichanalysis.cc:408
 hrichanalysis.cc:409
 hrichanalysis.cc:410
 hrichanalysis.cc:411
 hrichanalysis.cc:412
 hrichanalysis.cc:413
 hrichanalysis.cc:414
 hrichanalysis.cc:415
 hrichanalysis.cc:416
 hrichanalysis.cc:417
 hrichanalysis.cc:418
 hrichanalysis.cc:419
 hrichanalysis.cc:420
 hrichanalysis.cc:421
 hrichanalysis.cc:422
 hrichanalysis.cc:423
 hrichanalysis.cc:424
 hrichanalysis.cc:425
 hrichanalysis.cc:426
 hrichanalysis.cc:427
 hrichanalysis.cc:428
 hrichanalysis.cc:429
 hrichanalysis.cc:430
 hrichanalysis.cc:431
 hrichanalysis.cc:432
 hrichanalysis.cc:433
 hrichanalysis.cc:434
 hrichanalysis.cc:435
 hrichanalysis.cc:436
 hrichanalysis.cc:437
 hrichanalysis.cc:438
 hrichanalysis.cc:439
 hrichanalysis.cc:440
 hrichanalysis.cc:441
 hrichanalysis.cc:442
 hrichanalysis.cc:443
 hrichanalysis.cc:444
 hrichanalysis.cc:445
 hrichanalysis.cc:446
 hrichanalysis.cc:447
 hrichanalysis.cc:448
 hrichanalysis.cc:449
 hrichanalysis.cc:450
 hrichanalysis.cc:451
 hrichanalysis.cc:452
 hrichanalysis.cc:453
 hrichanalysis.cc:454
 hrichanalysis.cc:455
 hrichanalysis.cc:456
 hrichanalysis.cc:457
 hrichanalysis.cc:458
 hrichanalysis.cc:459
 hrichanalysis.cc:460
 hrichanalysis.cc:461
 hrichanalysis.cc:462
 hrichanalysis.cc:463
 hrichanalysis.cc:464
 hrichanalysis.cc:465
 hrichanalysis.cc:466
 hrichanalysis.cc:467
 hrichanalysis.cc:468
 hrichanalysis.cc:469
 hrichanalysis.cc:470
 hrichanalysis.cc:471
 hrichanalysis.cc:472
 hrichanalysis.cc:473
 hrichanalysis.cc:474
 hrichanalysis.cc:475
 hrichanalysis.cc:476
 hrichanalysis.cc:477
 hrichanalysis.cc:478
 hrichanalysis.cc:479
 hrichanalysis.cc:480
 hrichanalysis.cc:481
 hrichanalysis.cc:482
 hrichanalysis.cc:483
 hrichanalysis.cc:484
 hrichanalysis.cc:485
 hrichanalysis.cc:486
 hrichanalysis.cc:487
 hrichanalysis.cc:488
 hrichanalysis.cc:489
 hrichanalysis.cc:490
 hrichanalysis.cc:491
 hrichanalysis.cc:492
 hrichanalysis.cc:493
 hrichanalysis.cc:494
 hrichanalysis.cc:495
 hrichanalysis.cc:496
 hrichanalysis.cc:497
 hrichanalysis.cc:498
 hrichanalysis.cc:499
 hrichanalysis.cc:500
 hrichanalysis.cc:501
 hrichanalysis.cc:502
 hrichanalysis.cc:503
 hrichanalysis.cc:504
 hrichanalysis.cc:505
 hrichanalysis.cc:506
 hrichanalysis.cc:507
 hrichanalysis.cc:508
 hrichanalysis.cc:509
 hrichanalysis.cc:510
 hrichanalysis.cc:511
 hrichanalysis.cc:512
 hrichanalysis.cc:513
 hrichanalysis.cc:514
 hrichanalysis.cc:515
 hrichanalysis.cc:516
 hrichanalysis.cc:517
 hrichanalysis.cc:518
 hrichanalysis.cc:519
 hrichanalysis.cc:520
 hrichanalysis.cc:521
 hrichanalysis.cc:522
 hrichanalysis.cc:523
 hrichanalysis.cc:524
 hrichanalysis.cc:525
 hrichanalysis.cc:526
 hrichanalysis.cc:527
 hrichanalysis.cc:528
 hrichanalysis.cc:529
 hrichanalysis.cc:530
 hrichanalysis.cc:531
 hrichanalysis.cc:532
 hrichanalysis.cc:533
 hrichanalysis.cc:534
 hrichanalysis.cc:535
 hrichanalysis.cc:536
 hrichanalysis.cc:537
 hrichanalysis.cc:538
 hrichanalysis.cc:539
 hrichanalysis.cc:540
 hrichanalysis.cc:541
 hrichanalysis.cc:542
 hrichanalysis.cc:543
 hrichanalysis.cc:544
 hrichanalysis.cc:545
 hrichanalysis.cc:546
 hrichanalysis.cc:547
 hrichanalysis.cc:548
 hrichanalysis.cc:549
 hrichanalysis.cc:550
 hrichanalysis.cc:551
 hrichanalysis.cc:552
 hrichanalysis.cc:553
 hrichanalysis.cc:554
 hrichanalysis.cc:555
 hrichanalysis.cc:556
 hrichanalysis.cc:557
 hrichanalysis.cc:558
 hrichanalysis.cc:559
 hrichanalysis.cc:560
 hrichanalysis.cc:561
 hrichanalysis.cc:562
 hrichanalysis.cc:563
 hrichanalysis.cc:564
 hrichanalysis.cc:565
 hrichanalysis.cc:566
 hrichanalysis.cc:567
 hrichanalysis.cc:568
 hrichanalysis.cc:569
 hrichanalysis.cc:570
 hrichanalysis.cc:571
 hrichanalysis.cc:572
 hrichanalysis.cc:573
 hrichanalysis.cc:574
 hrichanalysis.cc:575
 hrichanalysis.cc:576
 hrichanalysis.cc:577
 hrichanalysis.cc:578
 hrichanalysis.cc:579
 hrichanalysis.cc:580
 hrichanalysis.cc:581
 hrichanalysis.cc:582
 hrichanalysis.cc:583
 hrichanalysis.cc:584
 hrichanalysis.cc:585
 hrichanalysis.cc:586
 hrichanalysis.cc:587
 hrichanalysis.cc:588
 hrichanalysis.cc:589
 hrichanalysis.cc:590
 hrichanalysis.cc:591
 hrichanalysis.cc:592
 hrichanalysis.cc:593
 hrichanalysis.cc:594
 hrichanalysis.cc:595
 hrichanalysis.cc:596
 hrichanalysis.cc:597
 hrichanalysis.cc:598
 hrichanalysis.cc:599
 hrichanalysis.cc:600
 hrichanalysis.cc:601
 hrichanalysis.cc:602
 hrichanalysis.cc:603
 hrichanalysis.cc:604
 hrichanalysis.cc:605
 hrichanalysis.cc:606
 hrichanalysis.cc:607
 hrichanalysis.cc:608
 hrichanalysis.cc:609
 hrichanalysis.cc:610
 hrichanalysis.cc:611
 hrichanalysis.cc:612
 hrichanalysis.cc:613
 hrichanalysis.cc:614
 hrichanalysis.cc:615
 hrichanalysis.cc:616
 hrichanalysis.cc:617
 hrichanalysis.cc:618
 hrichanalysis.cc:619
 hrichanalysis.cc:620
 hrichanalysis.cc:621
 hrichanalysis.cc:622
 hrichanalysis.cc:623
 hrichanalysis.cc:624
 hrichanalysis.cc:625
 hrichanalysis.cc:626
 hrichanalysis.cc:627
 hrichanalysis.cc:628
 hrichanalysis.cc:629
 hrichanalysis.cc:630
 hrichanalysis.cc:631
 hrichanalysis.cc:632
 hrichanalysis.cc:633
 hrichanalysis.cc:634
 hrichanalysis.cc:635
 hrichanalysis.cc:636
 hrichanalysis.cc:637
 hrichanalysis.cc:638
 hrichanalysis.cc:639
 hrichanalysis.cc:640
 hrichanalysis.cc:641
 hrichanalysis.cc:642
 hrichanalysis.cc:643
 hrichanalysis.cc:644
 hrichanalysis.cc:645
 hrichanalysis.cc:646
 hrichanalysis.cc:647
 hrichanalysis.cc:648
 hrichanalysis.cc:649
 hrichanalysis.cc:650
 hrichanalysis.cc:651
 hrichanalysis.cc:652
 hrichanalysis.cc:653
 hrichanalysis.cc:654
 hrichanalysis.cc:655
 hrichanalysis.cc:656
 hrichanalysis.cc:657
 hrichanalysis.cc:658
 hrichanalysis.cc:659
 hrichanalysis.cc:660
 hrichanalysis.cc:661
 hrichanalysis.cc:662
 hrichanalysis.cc:663
 hrichanalysis.cc:664
 hrichanalysis.cc:665
 hrichanalysis.cc:666
 hrichanalysis.cc:667
 hrichanalysis.cc:668
 hrichanalysis.cc:669
 hrichanalysis.cc:670
 hrichanalysis.cc:671
 hrichanalysis.cc:672
 hrichanalysis.cc:673
 hrichanalysis.cc:674
 hrichanalysis.cc:675
 hrichanalysis.cc:676
 hrichanalysis.cc:677
 hrichanalysis.cc:678
 hrichanalysis.cc:679
 hrichanalysis.cc:680
 hrichanalysis.cc:681
 hrichanalysis.cc:682
 hrichanalysis.cc:683
 hrichanalysis.cc:684
 hrichanalysis.cc:685
 hrichanalysis.cc:686
 hrichanalysis.cc:687
 hrichanalysis.cc:688
 hrichanalysis.cc:689
 hrichanalysis.cc:690
 hrichanalysis.cc:691
 hrichanalysis.cc:692
 hrichanalysis.cc:693
 hrichanalysis.cc:694
 hrichanalysis.cc:695
 hrichanalysis.cc:696
 hrichanalysis.cc:697
 hrichanalysis.cc:698
 hrichanalysis.cc:699
 hrichanalysis.cc:700
 hrichanalysis.cc:701
 hrichanalysis.cc:702
 hrichanalysis.cc:703
 hrichanalysis.cc:704
 hrichanalysis.cc:705
 hrichanalysis.cc:706
 hrichanalysis.cc:707
 hrichanalysis.cc:708
 hrichanalysis.cc:709
 hrichanalysis.cc:710
 hrichanalysis.cc:711
 hrichanalysis.cc:712
 hrichanalysis.cc:713
 hrichanalysis.cc:714
 hrichanalysis.cc:715
 hrichanalysis.cc:716
 hrichanalysis.cc:717
 hrichanalysis.cc:718
 hrichanalysis.cc:719
 hrichanalysis.cc:720
 hrichanalysis.cc:721
 hrichanalysis.cc:722
 hrichanalysis.cc:723
 hrichanalysis.cc:724
 hrichanalysis.cc:725
 hrichanalysis.cc:726
 hrichanalysis.cc:727
 hrichanalysis.cc:728
 hrichanalysis.cc:729
 hrichanalysis.cc:730
 hrichanalysis.cc:731
 hrichanalysis.cc:732
 hrichanalysis.cc:733
 hrichanalysis.cc:734
 hrichanalysis.cc:735
 hrichanalysis.cc:736
 hrichanalysis.cc:737