ROOT logo
#include "htofhitf.h"
#include "hades.h"
#include "htofraw.h"
#include "htofhit.h"
#include "htofhitsim.h"
#include "htofcalpar.h"
#include "hruntimedb.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hdebug.h"
#include "tofdef.h"
#include "hevent.h"
#include "heventheader.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hgeomvolume.h"
#include "hgeomcompositevolume.h"
#include "hgeomtransform.h"
#include "htofgeompar.h"
#include "hdetgeompar.h"
#include "hgeomvector.h"
#include "hspecgeompar.h"
#include "hstart2hit.h"
#include "hstartdef.h"
#include "TMath.h"


//*-- Author :
//*-- Modified : 4/2013 by O. Svoboda
//*-- Modified : 14/11/2004 by P. Tlusty -
//*   tof hit lab position now related to [0,0,0]
//*-- Modified : 23/10/2002 by M. Sanchez
//*-- Modified : 09/05/2002 by D. Zovinec
//*-- Modified : 14/03/2002 by D. Zovinec
//*-- Modified : 21/09/2001 by D. Zovinec
//*-- Modified : 24/04/2001 by M. Sanchez
//*-- Modified : 08/03/2001 by M. Sanchez
//*-- Modified : 27/03/2000 by I. Koenig
//*-- Modified : 17/03/2000 by R. Holzmann
//*-- Modified : 30/11/99 by M. Sanchez
//*-- Modified : 02/11/99 by D. Vasiliev
//*-- Modified : 15/06/98 by M. Sanchez


//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////////////////////
// HTofHitF Tof hit finder
//
// adapted from /u/halo/packages/abase/new by Manuel Sanchez (17/06/98)
//
// HTofHitF is the reconstructor class that iterates over RAW data
// and finds the TOF hits.
// The HIT is only created and filled if both left and right TDC time
// is available.
//
// Left (right) TDC time is used to find xpos and tof of hit (see HTofHit).
// Then HIT coordinates in the LAB, phi, theta and distance from the
// target are calculated by using HTofGeomPar.
//
// Left (right) ADC amplitude is used to find xposAdc and energy
// deposited in the rod . Additional information amplL and amplR
// is calculated (see HTofHit).
// The flagAdc have been added to distinguish levels of ADC info
// available:  no ADC         - flagAdc = 0
//             left ADC only  - flagAdc = -1
//             right ADC only - flagAdc = 1
//             both ADC's     - flagAdc = 2
// Important!!!: Note that if only one ADC is available (case flagAdc = -1 or 1)
// the xposAdc cannot be calculated. Also amplL (amplR) cannot be found
// when left (right) ADC has not provided the signal.
//
// Empirical dependence of tof on position along the rod included
// (see talk of P.Tlusty in Coll.Meeting XI at Smolenice, TOF detector performance.)
//
// Time walk correction is included in the tof reconstruction.
//
/////////////////////////////////////////////////////////////////////////

void HTofHitF::initParContainer(HSpectrometer *spec, HRuntimeDb *rtdb) {
  // Adds to the runtime database "rtdb" the containers needed by the Hit Finder
  //spec is used to get information of the spectrometer setup.
  fCalPar=(HTofCalPar *)rtdb->getContainer("TofCalPar");
  fTofGeometry=(HTofGeomPar *)rtdb->getContainer("TofGeomPar");
  fSpecGeometry = (HSpecGeomPar *)rtdb->getContainer("SpecGeomPar");
}

HTofHitF::HTofHitF(void) {
  fCalPar = NULL;
  fCalParSim = NULL;
  fRawCat = fHitCat = NULL;
  fRawCatTmp = fHitCatTmp = NULL;
  fStartHitCat = NULL;
  fTofSimulation = kFALSE;
  fLoc.set(3,0,0,0);
  iter = NULL;
  iterTmp = NULL;
}

HTofHitF::HTofHitF(const Text_t *name,const Text_t *title) : HReconstructor (name,title) {
  fCalPar = NULL;
  fCalParSim = NULL;
  fRawCat = fHitCat = NULL;
  fRawCatTmp = fHitCatTmp = NULL;
  fStartHitCat = NULL;
  fTofSimulation = kFALSE;
  fLoc.set(3,0,0,0);
  iter = NULL;
  iterTmp = NULL;
}

HTofHitF::~HTofHitF(void) {
  if(iter) delete iter;
}

HTofHit *HTofHitF::makeHit(TObject *address) {
  return new(address) HTofHit;
}

void HTofHitF::fillHit(HTofHit *hit, HTofRaw *raw) {
}

Bool_t HTofHitF::init(void) {
  // Initializes data levels and container parameters for operation of the
  //hit finder
  Bool_t r=kTRUE; // return value
  HSpectrometer *spec = gHades->getSetup();
  HRuntimeDb *rtdb = gHades->getRuntimeDb();
  HEvent *ev = gHades->getCurrentEvent(); // Event structure
  printf("initialization of Tof hit finder\n");

  if (spec && rtdb && ev) {
    HDetector *tof = spec->getDetector("Tof");

    if (tof) {
      // The real work starts here
      initParContainer(spec,rtdb);

      fRawCat = ev->getCategory(catTofRaw);
      if (!fRawCat) {
        fRawCat= tof->buildCategory(catTofRaw);
        if (!fRawCat) return kFALSE;
        else ev->addCategory(catTofRaw,fRawCat,"Tof");
      }
      iter=(HIterator*)fRawCat->MakeIterator("native");

      fHitCat = ev->getCategory(catTofHit);
      if (!fHitCat) {
        fHitCat = spec->getDetector("Tof")->buildCategory(catTofHit);
        if (!fHitCat) return kFALSE;
        else ev->addCategory(catTofHit,fHitCat,"Tof");
      }

    } else {
      Error("init","TOF setup is not defined");
      r = kFALSE; // Notify error to task manager
    }

    // Get Start Hit category. If StartHit is not defined
    // a Warning is displayed and fStartHitCat is set to 0
      fStartHitCat = ev->getCategory(catStart2Hit);
      if (!fStartHitCat) Warning("init","Start hit level not defined; setting start time to 0");
  } else {
    Error("init","Setup, RuntimeDb or event structure not found");
    r = kFALSE; // Notify error to task manager
  }
  return r;
}

Int_t HTofHitF::execute(void) {
    // Find the hits.
    //See also HReconstructor::execute
#if DEBUG_LEVEL>2
    gDebuger->enterFunc("HTofHitF::execute");
#endif

    //---------------------------------------------
    // read catTofRaw and create hits in catTofHit
    Bool_t sim=kFALSE;
    if      ( fTofSimulation) sim=kTRUE;
    else if (!fTofSimulation) sim=kFALSE;
    if( !( gHades->getEmbeddingMode()>0 && gHades->getEmbeddingDebug() == 1) ) fillHitCat(sim,kFALSE); // in sim or real or embeding allways fill here, only embedding+debug skipped
    //---------------------------------------------

    //---------------------------------------------
    // In embedding mode one has to
    // read catTofRawTmp and create hits in catTofHitTmp
    // in addition. Embedded Hits will be merged on hitlevel
    // later
    if(fTofSimulation&&gHades->getEmbeddingMode()>0){
	fillHitCat(kTRUE,kTRUE);
        mergeHitCats(sim,kTRUE);
    }
    //---------------------------------------------

#if DEBUG_LEVEL>2
    gDebuger->leaveFunc("HTofHitF::execute");
#endif
    return 0;
}

void HTofHitF::fillGeometry(HTofHit *hit) {
  // Fills in the LAB position parameters for the given HTofHit.
  //
  // This is done by transforming the point (x,0,0) in the ROD coordinate
  // system to the LAB coordinate system. Where x is the reconstructed
  // x position inside the hit.

  HGeomVector rLocal,r;
  Float_t d,phi,theta;
  Float_t rad2deg = 180./TMath::Pi();

  HModGeomPar *module=fTofGeometry->getModule(hit->getSector(),hit->getModule());
  HGeomTransform &trans = module->getLabTransform();
  HGeomVolume *rodVol=module->getRefVolume()->getComponent(hit->getCell());
  HGeomTransform &rodTrans=rodVol->getTransform();

  // Fill r with the hit coordinates in the ROD coordinate system
  // Since we do not have information about y,z coordinates of impact
  // y=0, z=0 is used. Note that (0,0,0) corresponds to the rod center.
  r.setX(hit->getXpos());
  r.setY(0.);
  r.setZ(0.);

  rLocal=rodTrans.transFrom(r);  // transform to module coordinate system
  r=trans.transFrom(rLocal);     // transform from module to LAB system


  HGeomVolume *tv=fSpecGeometry->getTarget(0);
  if (tv) r -= tv->getTransform().getTransVector();   // correct for target position

  // Fill output
  d = r.length();
  theta = (d>0.) ? (rad2deg * TMath::ACos(r.getZ() / d)) : 0.;
  phi = rad2deg * TMath::ATan2( r.getY(), r.getX());
  if (phi < 0.) phi += 360.;

  if (tv) r += tv->getTransform().getTransVector();   // correct for target position

  hit->setXYZLab(r.getX(), r.getY(), r.getZ());
  hit->setDistance( d );
  hit->setTheta(theta);
  hit->setPhi(phi);
}

void HTofHitF::fillHitCat(Bool_t sim,Bool_t embed)
{

    Float_t atofCorr = 0.000000276; // empirical correction of atof dependence on axpos

    HTofRaw *raw=NULL;
    HTofHit *hit=NULL;
    HStart2Hit *sH=NULL;

    Float_t atof;
    Float_t axpos;
    Float_t startTime=0.0;
    Float_t startTimeSmearing=0.0;
    Float_t subCl=0.0;      // raw left charge subtracted by left ADC pedestal
    Float_t subCr=0.0;      // raw right charge subtracted by right ADC pedestal
    Float_t slopeAdcL;   // left ADC slope
    Float_t slopeAdcR;  // right ADC slope
    Float_t xposAdc;
    Float_t depE;
    Float_t leftA;
    Float_t rightA;
    Float_t twalk,twalk_pos;
    Int_t flagadc;

    //--------------------------------------------------
    // start time extraction. For embedding some workd has to
    // be done
    startTime = 0.0;
    startTimeSmearing = 0.0;  // for simulation/embedding of sim tracks  pStartH->getResolution()
                              // startTime  = startTimeSmearing  for simulation
                              // startTime != startTimeSmearing  for embedding
                              // startTimeSmearing == -1000      for real data
    if (fStartHitCat && fStartHitCat->getEntries()>0) {
	if((sH = (HStart2Hit *) fStartHitCat->getObject(0)) != NULL){
	    startTime = sH->getTime();
            if(sH->getResolution()!=-1000) startTimeSmearing = sH->getResolution();
	}
    }
    //--------------------------------------------------

    HIterator*  iterLocal;
    HCategory*  catHitLocal;
    HTofCalPar* calparLocal;

    //--------------------------------------------------
    //  Are we running on real or sim data?
    //
    //  sim  && !embed  && gHades->getEmbeddingMode()==0  sim   data  1. call
    //  sim  && !embed  && gHades->getEmbeddingMode() >0  real  data  1. call embedding
    //  sim  &&  embed      sim   data  2. call embedding
    // !sim  && !embed      real  data  1. call real data

    Bool_t isRealData = kFALSE;
    if((sim && !embed && gHades->getEmbeddingMode() >0) ||
       (!sim && !embed)) isRealData = kTRUE;
    //--------------------------------------------------

    //--------------------------------------------------
    // switch data pointer depending if running for
    // sim or real data!
    if(sim&&embed)  iterLocal=iterTmp;
    else            iterLocal=iter;

    if(sim&&embed)  catHitLocal=fHitCatTmp;
    else            catHitLocal=fHitCat;

    if(sim&&embed)  calparLocal=fCalParSim;
    else            calparLocal=fCalPar;
    //--------------------------------------------------

    Float_t startTimeLocal = startTime;        // real works normal
    if(!isRealData) startTimeLocal = startTimeSmearing;// embedded hist have to use the


    // smearing since startTime is from real data
    iterLocal->Reset();
    while ( (raw=(HTofRaw *)iterLocal->Next())!=NULL) {
	fLoc[0]=raw->getSector();
	fLoc[1]=raw->getModule();
	fLoc[2]=raw->getCell();

	// Hit level is only filled if both left and right time are set
	if(raw->getLeftTime() && raw->getRightTime()){
	    hit = (HTofHit *)catHitLocal->getSlot(fLoc);
	    if (hit) {
		hit=makeHit(hit);
		HTofCalParCell& cell=(*calparLocal)[fLoc[0]][fLoc[1]][fLoc[2]];

		// The TDC's data is elaborated here.
		atof = (raw->getLeftTime() * cell.getLeftK() +
			raw->getRightTime()*cell.getRightK())/2.0 - cell.getTimK();

		//Substract start time. Zero if no start hit level is filled
		atof -= startTimeLocal;

		axpos = cell.getVGroup()*(raw->getRightTime() * cell.getRightK() -
					  raw->getLeftTime()*cell.getLeftK())/2.0 +cell.getPosK();

		// Empirical correction of time of flight
		if(isRealData){  // real data
		    atof = atof + (axpos*axpos*atofCorr);
		}
		// The ADC's data is elaborated here.
		xposAdc=0.0;
		depE=0.0;
		leftA=0.0;
		rightA=0.0;
		flagadc=0;
		//twalk=twoffT;
		twalk=0.;
		twalk_pos=0.;

               // If at least one ADC signal then preliminary calculations.
		if (!isRealData) {  // sim data
		    if (raw->getLeftCharge())  subCl = (raw->getLeftCharge() - cell.getPedestalL());    //original version
		    if (raw->getRightCharge())  subCr = (raw->getRightCharge() - cell.getPedestalR());   //original version
		}

		if (isRealData) { // real data
		    subCl = tot2amp(raw->getLeftCharge() - cell.getPedestalL());    //modified O.S.
		    subCr = tot2amp(raw->getRightCharge() - cell.getPedestalR());   //modified O.S.
		}
		slopeAdcL = (cell.getEdepK())*(TMath::Exp((cell.getGainAsym())/(cell.getAttLen())));
		slopeAdcR = (cell.getEdepK())*(TMath::Exp(-(cell.getGainAsym())/(cell.getAttLen())));

		leftA=subCl*slopeAdcL;       //changed 25.4.2013
		rightA=subCr*slopeAdcR;
		// Individual cases.
		if(subCl>0){
		    flagadc=-1;
		    depE=(subCl*cell.getEdepK())*(TMath::Exp((cell.getGainAsym()-axpos)/(cell.getAttLen())));
		    // leftA=subCl*slopeAdcL;
		    twalk=-(cell.getTimeWalkC1()/(TMath::Sqrt(leftA))); // time walk correction (left ADC)
		    twalk_pos=(cell.getTimeWalkC1()/(TMath::Sqrt(leftA))); // time walk correction for position (left ADC)
		}
		else {
		    twalk=-(cell.getTimeWalkC1()/(TMath::Sqrt(0.35)));
		    twalk_pos=(cell.getTimeWalkC1()/(TMath::Sqrt(0.35)));
		}
		if(subCr>0){
		    flagadc=1;
		    depE=(subCr*cell.getEdepK())*(TMath::Exp((axpos-cell.getGainAsym())/(cell.getAttLen())));
		    //rightA=subCr*slopeAdcR;
		    twalk=twalk-(cell.getTimeWalkC2()/(TMath::Sqrt(rightA))); // time walk correction (right ADC)
		    twalk_pos=twalk_pos-(cell.getTimeWalkC2()/(TMath::Sqrt(rightA))); // time walk correction for position (right ADC)
		}
		else {
		    twalk=twalk-(cell.getTimeWalkC2()/(TMath::Sqrt(0.35)));
		    twalk_pos=twalk_pos-(cell.getTimeWalkC2()/(TMath::Sqrt(0.35)));
		}
		if(subCl>0 && subCr>0) {
		    flagadc=2;
		    xposAdc=(cell.getAttLen()/2.0)*(TMath::Log(subCl/subCr)) + cell.getGainAsym();
		    depE=(cell.getEdepK())*(TMath::Sqrt(subCl*subCr));
		}


		// Time walk correction.
		if(isRealData){ // real data
		    atof  = atof + twalk/2.;
                    axpos = axpos + cell.getVGroup()*twalk_pos/2.;
		}

		hit->setSector((Char_t) fLoc[0]);
		hit->setModule((Char_t) fLoc[1]);
		hit->setCell((Char_t) fLoc[2]);
		hit->setTof(atof);
		hit->setXpos(axpos);
		hit->setXposAdc(xposAdc);
		hit->setEdep(depE);
		hit->setLeftAmp(leftA);
		hit->setRightAmp(rightA);
		hit->setAdcFlag(flagadc);
		fillHit(hit,raw);

		fillGeometry(hit);
	    }
	}
    }
}
void HTofHitF::mergeHitCats(Bool_t sim,Bool_t embed)
{
    //--------------------------------------------------
    HTofHitSim* hit;
    HTofHitSim* hittmp;

    HTofCalPar* calparLocal;
    if(sim&&embed)  calparLocal=fCalParSim;
    else            calparLocal=fCalPar;

    TIterator* hititer=fHitCatTmp->MakeIterator("native");  // sim data in embedding
    hititer->Reset();

    while ( (hittmp=(HTofHitSim *)hititer->Next())!=NULL)
    {
	fLoc[0]=hittmp->getSector();
	fLoc[1]=hittmp->getModule();
	fLoc[2]=hittmp->getCell();
	hit= (HTofHitSim*) fHitCat->getObject(fLoc);

	if(hit)
	{   // real hit is existing already
	    // merging should be done here. At the moment
	    // sim hits will be always transported


	    if(gHades->getEmbeddingMode()==1)
	    {
		//        tof   = (lTime + rTime)/2
		//        xpos  = vgroup * (rTime - lTime)/2
		// ==>
		//        rTime = xpos/vgroup + tof
		//        lTime = xpos/vgroup - tof
		//
		HTofCalParCell& cell=(*calparLocal)[fLoc[0]][fLoc[1]][fLoc[2]];

		Float_t rTime1 = hit->getXpos()/cell.getVGroup() + hit->getTof();
		Float_t lTime1 = hit->getXpos()/cell.getVGroup() - hit->getTof();

		Float_t rTime2 = hittmp->getXpos()/cell.getVGroup() + hittmp->getTof();
		Float_t lTime2 = hittmp->getXpos()/cell.getVGroup() - hittmp->getTof();

		Float_t  rTime = rTime1;
		Float_t  lTime = lTime1;

		if(rTime>rTime2) rTime = rTime2;
		if(lTime>lTime2) lTime = lTime2;


		Float_t tof  = (lTime + rTime)/2.;
		Float_t xpos = cell.getVGroup() * (rTime - lTime)/2.;

		// update real hit

		hit->setTof(tof);
		hit->setXpos(xpos);
		hit->setEdep    (hit->getEdep()    + hittmp->getEdep());
		hit->setLeftAmp (hit->getLeftAmp() + hittmp->getLeftAmp());
		hit->setRightAmp(hit->getRightAmp()+ hittmp->getRightAmp());

		hit->setNTrack2(hittmp->getNTrack1());
	    }
	    else if(gHades->getEmbeddingMode() == 2) {  // let GEANT particle survive
		new (hit) HTofHitSim(*hittmp);
	    } else {
               Error("mergeHitCats()","Unknow embedding mode = %i",gHades->getEmbeddingMode()) ;
	    }
	}
	else
	{   // cell was not fired by real hit before
	    hit= (HTofHitSim*) fHitCat->getSlot(fLoc);
	    if(hit)
	    {
		new (hit)HTofHitSim(*hittmp);
	    }
	    else
	    {
		Error("mergeHitCats()","Could not retrieve slot in catTofHit!");
	    }
	}

    }

    delete hititer;
}

ClassImp(HTofHitF)

Float_t HTofHitF::tot2amp(Float_t tot)
{
  Float_t amp = -1.;
  if(tot<150) amp =  3.0 * tot;
  else amp =  128. + 2.14 * tot;
  return amp;    
}


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