ROOT logo
#include "htofhitf2.h"
#include "hades.h"
#include "htofraw.h"
#include "htofrawsim.h"
#include "htofhit.h"
#include "htofhitsim.h"
#include "htofcalpar.h"
#include "htofwalkpar.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 "htofdetector.h"
#include "hgeomvolume.h"
#include "hgeomcompositevolume.h"
#include "hgeomtransform.h"
#include "htofgeompar.h"
#include "htofdigipar.h"
#include "hdetgeompar.h"
#include "hgeomvector.h"
#include "hspecgeompar.h"
#include "hstart2hit.h"
#include "hstartdef.h"



#include "TMath.h"

using namespace std;


#include <fstream>
#include <iomanip>

ClassImp(HTofHitF2)

//*-- 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 
/////////////////////////////////////////////////////////////////////////
// HTofHitF2 Tof hit finder
//
// adapted from /u/halo/packages/abase/new by Manuel Sanchez (17/06/98)
//
// HTofHitF2 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.
//
/////////////////////////////////////////////////////////////////////////

Bool_t  HTofHitF2::bforceKeepGeant=kFALSE;

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

}

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

}

HTofHitF2::~HTofHitF2(void)
{
    if(iter)    delete iter;
    if(iterTmp) delete iterTmp;
}

void HTofHitF2::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");
    fDigiPar      = (HTofDigiPar *) rtdb->getContainer("TofDigiPar");


    if(!fTofSimulation || ( fTofSimulation && gHades->getEmbeddingMode()>0) ){
        // walk correction not needed for simulation
	fTofWalkPar   = (HTofWalkPar *) rtdb->getContainer("TofWalkPar");
	fTofWalkPar->getContainers(); // need other container for calculation
    }
    return;

}

Bool_t HTofHitF2::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

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

	if(ev->getCategory(catGeantKine)) fTofSimulation=kTRUE;

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

	    //-------------------------------------------------
            // input categories
	    fRawCat = ev->getCategory(catTofRaw);
	    if (!fRawCat) {
		if (!fRawCat) return kFALSE;
	    }
	    iter=(HIterator*)fRawCat->MakeIterator("native");

	    // 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");


	    //-------------------------------------------------
            // output categories
	    if(!fTofSimulation){ // real data
		fHitCat = ev->getCategory(catTofHit);
		if (!fHitCat) {
		    fHitCat = tof->buildCategory(catTofHit);
		    if (!fHitCat) return kFALSE;
		    else ev->addCategory(catTofHit,fHitCat,"Tof");
		}
	    } else { // simulation or embedding
		fHitCat=ev->getCategory(catTofHit);
		if (!fHitCat) {
		    fHitCat=tof->buildMatrixCategory("HTofHitSim",0.5F);
		    if (!fHitCat) return kFALSE;
		    else ev->addCategory(catTofHit,fHitCat,"Tof");
		} else {
		    if (fHitCat->getClass()!=HTofHitSim::Class()) {
			Error("HTofHitfSim::init()","Misconfigured output category");
			return kFALSE;
		    }
		}
	    }

	    if(fTofSimulation && gHades->getEmbeddingMode()>0)
	    {  // embedding mode
		fRawCatTmp =ev->getCategory(catTofRawTmp);
		if(!fRawCatTmp){
		    Error("init()","No catTofRawTmp in input! You are in embedding mode!");
		    return kFALSE;
		}
		iterTmp = (HIterator*)fRawCatTmp->MakeIterator();  // cannot be "native", because
		// iter->getLocation() is used

		fHitCatTmp=ev->getCategory(catTofHitTmp);
		if (!fHitCatTmp) {
		    fHitCatTmp=tof->buildMatrixCategory("HTofHitSimTmp",0.5F);
		    if (!fHitCatTmp) {
			Error("init()","Could no build catTofHitTmp !");
			return kFALSE;
		    }
		    else ev->addCategory(catTofHitTmp,fHitCatTmp,"Tof");
		    fHitCatTmp->setPersistency(kFALSE);
		}

		fCalParSim = new HTofCalPar("TofCalPar_Sim_Embedding","","TofCalProductionSimEmbedding");
		if(fCalParSim)rtdb->addContainer(fCalParSim);
		else {
		    Error("init()","Could no create HTofCalPar for sim params, needed for embedding !");
		}

	    }
	    //-------------------------------------------------



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

    } else {
	Error("init","Setup, RuntimeDb or event structure not found");
	r = kFALSE; // Notify error to task manager
    }

    return r;

}

Int_t HTofHitF2::execute(void)
{
    // Find the hits.
    //See also HReconstructor::execute
#if DEBUG_LEVEL>2
    gDebuger->enterFunc("HTofHitF2::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("HTofHitF2::execute");
#endif
    return 0;
}

void HTofHitF2::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 HTofHitF2::fillHitCat(Bool_t sim,Bool_t embed)
{


    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) {

		if(fTofSimulation) hit=new (hit) HTofHitSim;
		else               hit=new (hit) HTofHit;

		HTofCalParCell& cell  =(*calparLocal)[fLoc[0]][fLoc[1]][fLoc[2]];

		// New calibration with 20 bins and two side walk correction
		// The starting point starts at X=0 -> center of the rod.
		// After 6 iteration value converged (usually already at the third
		// iteration the minimum is reached.
                if (isRealData) { // walk correction has to be perform
		    fTofWalkPar->getTofPos(raw, atof, axpos, 0., startTimeLocal);
		    Float_t postemp = axpos;
		    fTofWalkPar->getTofPos(raw, atof, axpos, postemp, startTimeLocal);
		    postemp = axpos;
		    fTofWalkPar->getTofPos(raw, atof, axpos, postemp, startTimeLocal);
		    postemp = axpos;
		    fTofWalkPar->getTofPos(raw, atof, axpos, postemp, startTimeLocal);
		    postemp = axpos;
		    fTofWalkPar->getTofPos(raw, atof, axpos, postemp, startTimeLocal);
		    postemp = axpos;
		    fTofWalkPar->getTofPos(raw, atof, axpos, postemp, startTimeLocal);
		} else {  // for sim hits no walk correction
		    // 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();
		}

		// 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));
		}


		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);

		if(fTofSimulation) {
		    HTofHitSim *hs=(HTofHitSim *)hit;
		    HTofRawSim *rs=(HTofRawSim *)raw;
		    hs->setNTrack1(rs->getNTrack1());
		    hs->setNTrack2(rs->getNTrack2());
		}

		fillGeometry(hit);
	    }
	}
    }
}
void HTofHitF2::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 && !bforceKeepGeant)
	    {
		HTofCalParCell&  cell    =(*calparLocal)[fLoc[0]][fLoc[1]][fLoc[2]];
                HTofDigiParCell& celldigi=(*fDigiPar)   [fLoc[0]][fLoc[1]][fLoc[2]];

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

		Float_t rTime2 = (celldigi.getHalfLen() + hittmp->getXpos())/cell.getVGroup() + hittmp->getTof();
                Float_t lTime2 = (celldigi.getHalfLen() - 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. - celldigi.getHalfLen()/cell.getVGroup();
		Float_t xpos = cell.getVGroup() * (rTime - lTime)/2.;


		hit->setTof(tof);
		hit->setXpos(xpos);

		fillGeometry(hit);  // fill lab pos again

		hit->setEdep    (hit->getEdep()    + hittmp->getEdep());
		hit->setLeftAmp (hit->getLeftAmp() + hittmp->getLeftAmp());
		hit->setRightAmp(hit->getRightAmp()+ hittmp->getRightAmp());

		if(hittmp->getNTrack1()==hittmp->getNTrack2()){ // first track id is real track , second geant id
		    hit->setNTrack2(hittmp->getNTrack1());
		} else { // if we have 2 different numbers we want to keep it: drop real track id
		    hit->setNTrack1(hittmp->getNTrack1());
		    hit->setNTrack2(hittmp->getNTrack2());
		}

	    }
	    else if(gHades->getEmbeddingMode() == 2 || (gHades->getEmbeddingMode()==1 && bforceKeepGeant) ) {  // 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;
}


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


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