ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : Laura Fabbietti <Laura.Fabbietti@ph.tum.de>
//*-- Revised : Martin Jurkovic <martin.jurkovic@ph.tum.de> 2010
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRichAnalysisSim
//
//  This class besides the Rich Analysis contains
//  the necessary functions to retrieve the parent track
//  number corresponding to each pad that belongs to
//  a Ring structure.
//  The Ring Finding algorithm is executed by the class
//  HRichRingFindSim. This class contains 2 different
//  algorithms to find a ring, once a ring is found
//  the track numbers of the particles that have hit
//  the pads belonging to the ring structure are memorized
//  in an array. (Int_t *iRingTrack).
//  Once all track numbers are collected,
//  3 tracks number are saved ( HRichHitSim:track1....)
//  for each Hit with the corresponding weights (cfr. updateHits).
//  (The weight
//  is the number of pads a photon or a Ip has fired.)
//  A flag for each of the three track numbers is saved too,
//  to be able to distinguish between a Chrenkov photon
//  and a direct hit.
//
//  use kSkip in the constructor to skip writing of
//  event if no ring was found
//
//////////////////////////////////////////////////////////////////////////////


#include "hades.h"
#include "hevent.h"
#include "heventheader.h"
#include "hiterator.h"
#include "hlinearcategory.h"
#include "hlocation.h"
#include "hmatrixcategory.h"
#include "hparcond.h"
#include "hparset.h"
#include "hrichanalysispar.h"
#include "hrichanalysissim.h"
#include "hrichcalsim.h"
#include "hrichdetector.h"
#include "hrichgeometrypar.h"
#include "hrichhitsim.h"
#include "hrichpadclean.h"
#include "hrichpadlabel.h"
#include "hrichringfindsim.h"
#include "hrichtrack.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "richdef.h"

#include <iomanip>
#include <iostream>

using namespace std;

ClassImp(HRichAnalysisSim)

//----------------------------------------------------------------------------
HRichAnalysisSim::HRichAnalysisSim(void)
{
   pRingFindSim   = new HRichRingFindSim;
   pRichCalSim    = NULL;
   fIterHitHeader = NULL;
   m_pTrackCat    = NULL;
   pRings         = NULL;

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

//----------------------------------------------------------------------------
HRichAnalysisSim::HRichAnalysisSim(const Text_t*  name,
                                   const Text_t*  title,
                                   Bool_t   kSkip)
   : HRichAnalysis(name, title, kSkip)
{
   pRingFindSim     = new HRichRingFindSim;
   pRichCalSim      = NULL;
   fIterHitHeader   = NULL;
   m_pTrackCat      = NULL;
   pRings           = NULL;
   kSkipEvtIfNoRing = kSkip;
}
//============================================================================

//----------------------------------------------------------------------------
HRichAnalysisSim::~HRichAnalysisSim(void)
{
   if (NULL != pRingFindSim) {
      delete pRingFindSim;
      pRingFindSim = NULL;
   }
   if (NULL != fIterHitHeader) {
      delete  fIterHitHeader;
      fIterHitHeader = NULL;
   }
}
//============================================================================

//----------------------------------------------------------------------------
Bool_t
HRichAnalysisSim::init()
{
// allocate input/output categories

   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->buildMatrixCat("HRichCalSim", 1);
      if (NULL == m_pCalCat) {
         Error("init", "Pointer to HRichCalSim 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->buildLinearCat("HRichHitSim");
      if (NULL == m_pHitCat) {
         Error("init", "Pointer to HRichHitSim 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;
   }

   m_pTrackCat = gHades->getCurrentEvent()->getCategory(catRichTrack);
   if (NULL == m_pTrackCat) {
      m_pTrackCat = pRichDet->buildLinearCat("HRichTrack", 1002);
      if (NULL == m_pTrackCat) {
         Error("init", "Pointer to HRichTrack category is NULL");
         return kFALSE;
      } else gHades->getCurrentEvent()
         ->addCategory(catRichTrack, m_pTrackCat , "Rich");
   }

   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 HRichAnalysisSim::reinit()
{

   UInt_t i, j, k, m, n;

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

   pRingFindSim->init(this);


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

   Int_t iMatrixSurface = 0, iPartSurface = 0;
   Int_t iMaskSize = getAnalysisPar()->iRingMaskSize;
   Int_t iMaskSizeSquared = iMaskSize * iMaskSize;
   for (k = 0; k < (UInt_t)iMaskSizeSquared; k++)
      if (getAnalysisPar()->iRingMask[k] == 1) 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 (getAnalysisPar()->iRingMask[k] == 1) iPartSurface++;
         }
         getGeometryPar()->getPadsPar()->
         getPad(i, j)->setAmplitFraction((Float_t)iPartSurface / (Float_t)iMatrixSurface);
      }


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

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

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

   maxCols = getGeometryPar()->getColumns();
   maxRows = getGeometryPar()->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 (!getGeometryPar()->getPadsPar()->getPad(col + padOffset)->getPadActive() && col < maxCols) ++col;
      if (col == maxCols) {
         maxRows = row;
         break;
      }
      pLeftBorder[row] = col;
      while (getGeometryPar()->getPadsPar()->getPad(col + padOffset)->getPadActive() && col < maxCols) ++col;
      pRightBorder[row] = col - 1;
   }
   maxPads = maxRows * maxCols;


   // now creating pads array

   Int_t i;
   Int_t j;
   if (pPads) {
      for (j = 0; j < 6; j++)
         if (pPads[j])
            delete [] pPads[j];
      delete [] pPads;
   }

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

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

//----------------------------------------------------------------------------
Int_t
HRichAnalysisSim::getPadsNTrack1(Int_t padx, Int_t pady, Int_t sec)
{
// This function returns for each pad the corresponding
// NTrack1 value (cfr. HRichCalSim, HRichDigitizer::execute).
// All track numbers are stored during digitization  in the
// catRichTrack Linear Category.
// NTrack1 is the index in the Track array corresponding to the
// first track for each pad.
//
// This function is called from HRichRingFindSim::CalcRingParamters.

   HLocation loc1;
   loc1.set(3, sec, pady, padx);

   pRichCalSim = (HRichCalSim*)((HMatrixCategory*)getCalCat())->getObject(loc1);
   if (NULL != pRichCalSim)
      return pRichCalSim->getTrackId(0);
   return 0;
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichAnalysisSim::getPadsNTrack2()
{
// This functions returns NTrack2, which is the index in
// the Track Array corresponding to the last track for each pad.
// Pad must be identified by calling getPadsNTrack1(...) first.

   if (NULL != pRichCalSim)
      return pRichCalSim->getTrackId(1);
   return 0;
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichAnalysisSim::getFlag(Int_t index)
{
// It is called from HRichRingFindSim::LookForTrack().
// This function returns the flag contained in the
// catRichTrack container at the position index.
// This flag is 0 for Chrenkov photons and 1 for IP.

   HRichTrack *trk = NULL;

   trk = (HRichTrack*)((HLinearCategory*)m_pTrackCat)->getObject(index);
   if (NULL != trk)
      return trk->getFlag();
   return  -1;
}
//============================================================================

//----------------------------------------------------------------------------
Int_t
HRichAnalysisSim::getTrack(Int_t index)
{
//  This function returns the track number contained in the
//  catRichTrack container at the position index.

   HRichTrack *trk = NULL;

   trk = ((HRichTrack*)((HLinearCategory*)m_pTrackCat)->getObject(index));
   if (NULL != trk)
      return trk->getTrack();
   return -10;

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

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

   HRichCal*  pCal           = NULL;;
   Int_t      iRingNrTotEvt  = 0;
   Int_t      fPadFiredTot   = 0;
   Int_t      sector         = -1;
   Int_t      padnr          = -1;
   Int_t      j;
   Int_t      ampl;

   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 = static_cast<HRichCal*>(fIter->Next()))) {
      if ((ampl = (Int_t)pCal->getCharge()) > 0) {
         fPadFired[pCal->getSector()]++;
	 padnr = pCal->getCol() + pCal->getRow() * maxCols;
	 if(padnr >= maxPads) {
	     Warning("execute()","pPads out of range ! signal will be skipped.");
		 continue;
	 }
         pPads[pCal->getSector()][padnr].setAmplitude(ampl);
      }
   }

   fPadFiredTot = 0;
   for (sector = 0; sector < 6; ++sector) {
      fPadFiredTot += fPadFired[sector];
      if (fPadFired[sector] >= fpAnalysisPar->maxFiredSectorPads) {
         Warning("execute", "To many fired pads in sector %i. %i/%i",
                 sector, fPadFired[sector], fpAnalysisPar->maxFiredSectorPads);
         fIter->Reset();
         while (NULL != (pCal = static_cast<HRichCal*>(fIter->Next()))) {
            if (pCal->getSector() == sector)
               pCal->setIsCleanedSector(kTRUE);
         }
         return 0;
      }
   }

   if (fPadFiredTot > maxFiredTotalPads) {
      Warning("execute", "Analysis of event skipped: too many pads fired %i/%i",
              fPadFiredTot, maxFiredTotalPads);
      fIter->Reset();
      while (NULL != (pCal = static_cast<HRichCal*>(fIter->Next()))) {
         pCal->setIsCleanedSector(kTRUE);
      }
      return 0;
   }

   // **************************************************************
   // ------- loop over sectors --- begin ---
   for (sector = 0; sector < 6; ++sector)
      if (getGeometryPar()->getSectorActive(sector) > 0) {

         Reset();
         SetActiveSector(sector);
         iPadFiredNr = fPadFired[sector];

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

         if (0 == getAnalysisPar()->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;
            pLabelArea[0].iSignature = 0;
         }

         iRingNr = pRingFindSim->Execute(this);
         iRingNrTot    += iRingNr;
         iRingNrTotEvt += iRingNr;
         updateHeaders(sector, gHades->getCurrentEvent()->getHeader()->getEventSeqNumber());
         updateHits(sector);
      }
   // ------- loop over sectors --- end ---

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

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

   return 0;

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

//----------------------------------------------------------------------------
void
HRichAnalysisSim::updateHits(Int_t nSec)
{
// Each Hit is stored, in addition to real data for simulated one
// the tracks number corresponding to each ring are stored too.
// Maximal 3 tracks are stored for each ring. The track numbers
// are sorted according to their weights.

   HRichHitSim *hit = NULL;
   HLocation    loc;

   for (Int_t i = 0; i < iRingNr; i++) {

      loc.set(1, nSec);

      hit = (HRichHitSim *)m_pHitCat->getNewSlot(loc, NULL);
      if (hit != NULL) {
         hit = new(hit) HRichHitSim;

         HRichHitSim & ring = pRings[i];

         *hit = ring;
         hit->setSector(nSec);

         HRichPad * pad = getGeometryPar()->getPadsPar()->
                          getPad((UInt_t)ring.getRingCenterX(), (UInt_t)ring.getRingCenterY());
         if (pad) {
            hit->setTheta(pad-> getTheta());
            hit->setPhi(pad->getPhi(nSec));
         } else {
            hit->fPhi = -10;
            hit->fTheta = -10;
         }

	 Int_t k = 0;
         while (ring.iRingTrack[k]) {

            if (hit->track1 == 0) {
               hit->track1 = ring.iRingTrack[k];
               hit->flag1 =  ring.iRingFlag[k];
               (hit->weigTrack1)++;
            } else {
               if (ring.iRingTrack[k] == hit->track1) {
                  (hit->weigTrack1)++;

               } else {
                  if (hit->track2 == 0) {
                     hit->track2 = ring.iRingTrack[k];
                     hit->flag2 =  ring.iRingFlag[k];
                     (hit->weigTrack2)++;
                  } else {
                     if (ring.iRingTrack[k] == hit->track2) {
                        (hit->weigTrack2)++;

                     } else {
                        if (hit->track3 == 0) {
                           hit->track3 = ring.iRingTrack[k];
                           hit->flag3 =  ring.iRingFlag[k];
                           (hit->weigTrack3)++;
                        } else (hit->weigTrack3)++;
                     }
                  }
               }
            }
            k++;

         }//end loop on track array

         sortTracks(hit);

      }

   }//end loop on rings

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

//----------------------------------------------------------------------------
void
HRichAnalysisSim::sortTracks(HRichHitSim *hit)
{
// Sorting tracks according to their weights
// Track with the highest weight is the first one

   Int_t tmp[3];
   tmp[0] = hit->track1;
   tmp[1] = hit->flag1;
   tmp[2] = hit->weigTrack1;

   if (hit->weigTrack1 < hit->weigTrack2) { // 2>1
      if (hit->weigTrack2 > hit->weigTrack3) { // 2 is the largest
         hit->track1     = hit->track2;
         hit->flag1      = hit->flag2;
         hit->weigTrack1 = hit->weigTrack2;
         if (tmp[2] < hit->weigTrack3) { // 2>3>1
            hit->track2     = hit->track3;
            hit->flag2      = hit->flag3;
            hit->weigTrack2 = hit->weigTrack3;
            hit->track3     = tmp[0];
            hit->flag3      = tmp[1];
            hit->weigTrack3 = tmp[2];
         } else { // 2>1>=3
            hit->track2     = tmp[0];
            hit->flag2      = tmp[1];
            hit->weigTrack2 = tmp[2];
         }
      } else { // 3>= 2; 2>1
         hit->track1     = hit->track3;
         hit->flag1      = hit->flag3;
         hit->weigTrack1 = hit->weigTrack3;
         hit->track3     = tmp[0];
         hit->flag3      = tmp[1];
         hit->weigTrack3 = tmp[2];
      }
   } else { // 1>=2
      if (hit->weigTrack1 < hit->weigTrack3) { // 3>1>=2
         hit->track1     = hit->track3;
         hit->flag1      = hit->flag3;
         hit->weigTrack1 = hit->weigTrack3;
         hit->track3     = hit->track2;
         hit->flag3      = hit->flag2;
         hit->weigTrack3 = hit->weigTrack2;
         hit->track2     = tmp[0];
         hit->flag2      = tmp[1];
         hit->weigTrack2 = tmp[2];
      } else { // 1>=2; 1>=3
         if (hit->weigTrack2 < hit->weigTrack3) { // 1>=3>2
            tmp[0] = hit->track2;
            tmp[1] = hit->flag2;
            tmp[2] = hit->weigTrack2;
            hit->track2     = hit->track3;
            hit->flag2      = hit->flag3;
            hit->weigTrack2 = hit->weigTrack3;
            hit->track3     = tmp[0];
            hit->flag3      = tmp[1];
            hit->weigTrack3 = tmp[2];
         }
      } // 1>=2>=3
   }


   if(hit->track2 < 0 && hit->track3 > 0 &&
      hit->weigTrack2 > 0 &&  hit->weigTrack2 == hit->weigTrack3) {
       // move track2 down in the list (if it is noise)
       // and if track has the same weight as track3 (a "good" one!)
       tmp[0] = hit->track2;
       tmp[1] = hit->flag2;
       tmp[2] = hit->weigTrack2;
       hit->track2     = hit->track3;
       hit->flag2      = hit->flag3;
       hit->weigTrack2 = hit->weigTrack3;
       hit->track3     = tmp[0];
       hit->flag3      = tmp[1];
       hit->weigTrack3 = tmp[2];
   }

   if(hit->track1 < 0 && hit->track2 > 0 &&
      hit->weigTrack2 > 0 &&  hit->weigTrack1 == hit->weigTrack2) {
       // move track1 down in the list (if it is noise)
       // and if track has the same weight as track2 (a "good" one!)
       tmp[0] = hit->track1;
       tmp[1] = hit->flag1;
       tmp[2] = hit->weigTrack1;
       hit->track1     = hit->track2;
       hit->flag1      = hit->flag2;
       hit->weigTrack1 = hit->weigTrack2;
       hit->track2     = tmp[0];
       hit->flag2      = tmp[1];
       hit->weigTrack2 = tmp[2];
   }




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