ROOT logo
using namespace std;
#include "TRandom.h"
#include "TDirectory.h"
#include <time.h>
#include "htofdigitizer.h"
#include "tofdef.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "htofdetector.h"
#include "hgeanttof.h"
#include "hgeantkine.h"
#include "hlinearcategory.h"
#include "htofrawsim.h"
#include "hevent.h"
#include "hcategory.h"
#include "hlocation.h"
#include "htofdigipar.h"
#include "htofcalpar.h"
#include "htofwalkpar.h"
#include "htofrawsimfilter.h"

#include <iostream> 
#include <iomanip>


//*-- Author : D.Vasiliev
//*-- Modified: 03/08/2006 J. Markert
//*-- Modified: 05/06/2006 P. Tlusty
//*-- Modified: 27/10/2002 D.Zovinec
//*-- Modified: 13/02/2002 by D.Zovinec
//*-- Modified: 30/11/2000 by R.Holzmann
//*-- Modified: 16/12/99 by J.Bielcik
//*-- Modified: 9/12/99 by V.Charriere
//*-- Modified: 8/11/99 by R.Holzmann
//*-- Modified: 24/10/99 by D.Vasiliev

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////////////////
//
//  HTofDigitizer digitizes data, puts output values into
//  raw data category. The input data are read from the HGeantTof
//  category. After calculating TOF of and Charge etc the output
//  is stored in the HTofRawSim category.
//                                                                        //
//                                                                        //
//                                      ------------                      //
//                                     | HGeantTof  |                     //
//                                      ------------                      //
//                                           |                            //
//   ----------------------           -----------------                   //
//  |     HTofUnpacker     |         |  HTofDigitizer  |                  //
//  |   (embedding mode)   |      -- |                 |                  //
//  |                      |     /   ------------------                   //
//   ----------------------     /             |                           //
//              |              /       ----------------                   //
//         -------------      /       |  HTofRawSimTmp |                  //
//        | HTofRawSim  |----         | non persistent | (embedding mode, //
//         -------------               ----------------   sim data)       //
//  sim (sim mode)      \              /                                  //
//  or real (embedding)  \            /                                   //
//                       -----------------                                //
//                      |  HTofHitFSim    |                               //
//                       -----------------                                //
//                       /       |                                        //
//                      /  ----------------                               //
//                     /  | HTofHitSimTmp  | (embedding mode              //
//                    /   | non persistent |  sim data )                  //
//                   /     ----------------                               //
//                  /     /                                               //
//                 /     /                                                //
//         -------------                                                  //
//        | HTofHitSim  | sim (sim mode) or                               //
//         -------------  sim and real data                               //
//                        (embedding)                                     //
//                                                                        //
//                                                                        //
//                                                                        //
//  In the case of TRACK EMBEDDING of simulated tracks into
//  experimental data the real data are written by the HTofUnpacker into
//  HTofRawSim category. In embedding mode the digitizer will write his
//  output to HTofRawSimTmp to merge real and sim data on hit level
//  (keep calibrations constistent).
//  The embedding mode is recognized automatically by analyzing the
//  gHades->getEmbeddingMode() flag.
//            Mode ==0 means no embedding
//                 ==1 realistic embedding (first real or sim hit makes the game)
//                 ==2 keep GEANT tracks   (as 1, but GEANT track numbers will always
//                     win against real data. besides the tracknumber the output will
//                     be the same as in 1)
//
// In HTofRawSim the track number which created the left/right hit will be
// stored. For real data the number will be equal to gHades->getEmbeddingRealTrackId().
// For the suppression of secondaries produced in the TOF itself there are
// several configuration possibilities:
// They can be switched via setStoreFirstTrack(Int_t flag):
//     flag ==  0 realistic (secondaries included)
//              1 primary particle is stored
//              2 (default) the first track number entering the tof in SAME SECTOR is stored
//              3 as 2 but condition on SAME SECTOR && MOD
//              4 as 2 but SAME SECTOR && MOD && ROD
//
// To make the influence of the above selections easily visible
// in the output HTofRawSim a debug mode can be switched with
// void   setDebug(Bool_t flag). In this case the track numbers
// affected by the criteria 1-4 will have negative track numbers
// (multiples of -200). The multiplication factor gives the number
// of steps from the start point to the stored track (chain of
// secondaries). In case 1 it is always -200 if a particle has not
// been a primary one. With void setOutputFile(TString outname)
// an internal Ntuple can be written out with HGeantTof infos
// of the original hit and the changed one.
//
// For comparison of the new digitizer (after implemantation of
// embedding) and old digitizer (stored 2 fastest tracks instead
// of left/right track) the old execute function can be
// run by using void   setUseOld(Bool_t flag).
//
// The pointer to the TofDigitizer can be retrieved via
// static HTofDigitizer* getTofDigtizer(). This function
// returns NULL if the Digitizer has not been created yet!
//
/////////////////////////////////////////////////////////////////////
HTofDigitizer*  HTofDigitizer::pTofDigi=NULL;
Float_t HTofDigitizer::timeResZero = 0.240;  // time resolution in the centre of the strip [ns].

Bool_t HTofDigitizer::initParContainer() {

    fDigiPar=(HTofDigiPar *)gHades->getRuntimeDb()->getContainer("TofDigiPar");
    if(!fDigiPar){
	Error("initParContainer()","Could not retrieve HTofDigiPar !");
	return kFALSE;
    }
    fTofCalPar=(HTofCalPar *)gHades->getRuntimeDb()->getContainer("TofCalPar");
    if(!fTofCalPar){
	Error("initParContainer()","Could not retrieve HTofCalPar !");
	return kFALSE;
    }
    fTofWalkPar=(HTofWalkPar *)gHades->getRuntimeDb()->getContainer("TofWalkPar");
    if(!fTofWalkPar){
	Error("initParContainer()","Could not retrieve HTofWalkPar !");
	return kFALSE;
    }

    return kTRUE;
}


HTofDigitizer::HTofDigitizer(const Text_t *name,const Text_t *title) :
HReconstructor(name,title) {

    fGeantCat=0;
    fGeantKineCat=0;
    fRawCat=0;
    fRawCatTmp=0;
    fDigiPar=0;
    fLoc.set(3,0,0,0);
    iterGeant=0;
    iterTofRaw=0;
    iterTofRawTmp=0;

    storeFirstTrack=2;
    debug          =kFALSE;
    out            =NULL;
    outFile        =NULL;
    pTofDigi       =this;
    useOld         =kFALSE;
}

HTofDigitizer::~HTofDigitizer(void) {

    if(iterGeant)    { delete iterGeant    ; iterGeant     = 0;}
    if(iterTofRaw)   { delete iterTofRaw   ; iterTofRaw    = 0;}
    if(iterTofRawTmp){ delete iterTofRawTmp; iterTofRawTmp = 0;}
}

Bool_t HTofDigitizer::init(void) {

    time_t curtime;
    if(!initParContainer()) return kFALSE;

    fGeantCat = gHades->getCurrentEvent()->getCategory(catTofGeantRaw);
    if (!fGeantCat) {
	fGeantCat = gHades->getSetup()->getDetector("Tof")->buildCategory(catTofGeantRaw);
	if (!fGeantCat) return kFALSE;
	else gHades->getCurrentEvent()->addCategory(catTofGeantRaw,fGeantCat,"Tof");
    }

    fGeantKineCat=(HLinearCategory*)gHades->getCurrentEvent()->getCategory(catGeantKine);
    if(!fGeantKineCat){
	Error("HTofDigitizer::init()","No catGeantKine in input!");
	return kFALSE;
    }

    fRawCat = gHades->getCurrentEvent()->getCategory(catTofRaw);
    if (!fRawCat) {
	HTofDetector* tof=(HTofDetector*)(gHades->getSetup()->getDetector("Tof"));
	fRawCat=tof->buildMatrixCategory("HTofRawSim",0.5F);
	if (!fRawCat) return kFALSE;
	else gHades->getCurrentEvent()->addCategory(catTofRaw,fRawCat,"Tof");
    }

    fRawCatTmp = gHades->getCurrentEvent()->getCategory(catTofRawTmp);
    if (!fRawCatTmp) {
	HTofDetector* tof=(HTofDetector*)(gHades->getSetup()->getDetector("Tof"));
	fRawCatTmp=tof->buildMatrixCategory("HTofRawSimTmp",0.5F);
	if (!fRawCatTmp) return kFALSE;
	else gHades->getCurrentEvent()->addCategory(catTofRawTmp,fRawCatTmp,"Tof");
	fRawCatTmp->setPersistency(kFALSE);
    }

    iterGeant = (HIterator *)fGeantCat->MakeIterator("native");
    iterTofRaw = (HIterator *)fRawCat->MakeIterator("native");
    iterTofRawTmp = (HIterator *)fRawCatTmp->MakeIterator("native");

    time(&curtime);
    return kTRUE;
}
Int_t HTofDigitizer::executeOld(void) {

    const Float_t deg2rad = 0.017453293; // deg to rad conversion.
    const Float_t quantEff = 0.24;       // PMT quantum efficiency.
    const Float_t photYield = 11100.0;   // photon yield in scintillator (phot/MeV).
    const Float_t relAmplResol = 0.08;   // sigma of Gaus distribution.
    const Float_t minEnerRelease = 1.8;  // minimum energy release (MeV/cm)

    HGeantTof* geant = 0;
    HTofRawSim* raw = 0;
    HTofRawSimFilter fRawFilter;

    Float_t hl, al, ar, vg, slopeTDCl, slopeTDCr;
    Int_t thrCFDl, thrCFDr, thrADCl, thrADCr;

    Int_t   numTrack, numTrack1 = -1, numTrack2 = -1;      //track numbers
    Float_t trackLen;
    Float_t timeL, timeR, chargeL, chargeR;
    Int_t timeCh, chargeCh;
    Float_t prevTimeL, prevTimeR, prevChargeL, prevChargeR;
    Float_t timeResol,amplResol, chargeRef;

    Float_t geaTof = 0.;
    Float_t geaTof1[6][8][8];
    Float_t geaTof2[6][8][8];
    Float_t geaEner = 0.;
    Float_t geaX = 0.;
    Float_t geaY = 0.;     // used by Tofino only
    Float_t geaMom = 0.;

    iterGeant->Reset();   // this works only in split mode=2
    // (for 0 and 1 the iterator must be recreated)

    while ((geant=(HGeantTof *)iterGeant->Next())!=0) {

	fLoc[1] = geant->getModule();
	if (fLoc[1] > 21 || fLoc[1] < 14) continue;   // this is a Tofino, skip it!
	fLoc[1] = 21 - fLoc[1];       // Tof modules in HGeant: (0->21) = (in->out)

	fLoc[0] = geant->getSector();
	fLoc[2] = geant->getCell();
	fLoc[2] = 7 - fLoc[2];        // reverse also order of rods in Tof module


	raw = (HTofRawSim*) fRawCat->getObject(fLoc);   // test if cell in use
	if(raw) {
	    raw->incNHit();  // increment counter for additional hits
	    numTrack1 = raw->getNTrack1();
	    numTrack2 = raw->getNTrack2();
	    prevTimeL = raw->getLeftTime();
	    prevTimeR = raw->getRightTime();
	    prevChargeL = raw->getLeftCharge();
	    prevChargeR = raw->getRightCharge();
	}
	else {
	    prevTimeL = prevTimeR = 100000.;
	    prevChargeL = prevChargeR = 0.;
	    raw = (HTofRawSim*) fRawCat->getNewSlot(fLoc);  // get new slot
	    if(!raw) continue;
	    raw = new(raw) HTofRawSim;
	    raw->setNHit(1);
	}

	HTofDigiParCell& cell=(*fDigiPar)[fLoc[0]][fLoc[1]][fLoc[2]];
	hl = cell.getHalfLen();
	al = cell.getAttenLen();
	ar = cell.getAngleRef();
	vg = cell.getGroupVel();
	slopeTDCl = cell.getLeftTDCSlope();
	slopeTDCr = cell.getRightTDCSlope();
	thrCFDl = cell.getLeftCFDThreshold();
	thrCFDr = cell.getRightCFDThreshold();
	thrADCl = cell.getLeftADCThreshold();
	thrADCr = cell.getRightADCThreshold();

	geant->getHit(geaEner,geaX,geaY,geaTof,geaMom,trackLen);

	numTrack=geant->getTrack();

	if((vg!=0.0) && (al!=0.0))  {
	    timeL = geaTof + (hl - geaX)/vg;
	    //timeResol = timeResZero*exp((hl - geaX)/(2.*al));
	    //timeL = gRandom->Gaus(timeL,timeResol);
	    timeR = geaTof + (hl + geaX)/vg;
	    //timeResol = timeResZero*exp((hl + geaX)/(2.*al));
	    //timeR = gRandom->Gaus(timeR,timeResol);

	    timeCh = (Int_t) (timeL/slopeTDCl);
	    if (timeCh < 0) timeCh = 0;
	    if (timeCh > 4095) timeCh = 4095;
	    timeL = ( Float_t ) (timeCh) + 0.5;

	    timeCh = (Int_t) (timeR/slopeTDCr);
	    if (timeCh < 0) timeCh = 0;
	    if (timeCh > 4095) timeCh = 4095;
	    timeR = ( Float_t ) (timeCh) + 0.5;

	    if(raw->getNHit()>1){
		if(geaTof < geaTof1[fLoc[0]][fLoc[1]][fLoc[2]]){
		    numTrack2=numTrack1;
		    numTrack1=numTrack;
		    geaTof2[fLoc[0]][fLoc[1]][fLoc[2]]=geaTof1[fLoc[0]][fLoc[1]][fLoc[2]];
		    geaTof1[fLoc[0]][fLoc[1]][fLoc[2]]=geaTof;
		} else {
		    if(geaTof < geaTof2[fLoc[0]][fLoc[1]][fLoc[2]]){
			numTrack2=numTrack;
			geaTof2[fLoc[0]][fLoc[1]][fLoc[2]]=geaTof;
		    }
		}
	    }

	    if(timeL > prevTimeL) timeL = prevTimeL;
	    if(timeR > prevTimeR) timeR = prevTimeR;

	    chargeL = geaEner*photYield*quantEff*0.5*(1 - cos(ar*deg2rad))*exp(-(hl-geaX)/al);
	    amplResol = chargeL*relAmplResol;
	    chargeL = gRandom->Gaus(chargeL,amplResol);
	    chargeR = geaEner*photYield*quantEff*0.5*(1 - cos(ar*deg2rad))*exp(-(hl+geaX)/al);
	    amplResol = chargeR*relAmplResol;
	    chargeR = gRandom->Gaus(chargeR,amplResol);

	    chargeRef = photYield*quantEff*0.5*(1-cos(ar*deg2rad))*minEnerRelease*exp(-hl/al);
	    if(fLoc[1] <= 3) chargeRef *= 3.;
	    if(fLoc[1]>3 && fLoc[1]<=7) chargeRef *= 2.;

	    chargeCh = (Int_t) ((chargeL/chargeRef)*256. + prevChargeL);
	    if (chargeCh < 0) chargeCh = 0;
	    if (chargeCh > MAXCHRGCH)  chargeCh = MAXCHRGCH;
	    chargeL = (Float_t)chargeCh;

	    chargeCh = (Int_t) ((chargeR/chargeRef)*256. + prevChargeR);
	    if (chargeCh < 0) chargeCh = 0;
	    if (chargeCh > MAXCHRGCH)  chargeCh = MAXCHRGCH;
	    chargeR = (Float_t)chargeCh;

	} else {

	    timeL = 4095.;
	    timeR = 4095.;
	    chargeL = MAXCHRGCH;
	    chargeR = MAXCHRGCH;
	}
	raw->setLeftTime(timeL);
	raw->setRightTime(timeR);
	raw->setLeftCharge(chargeL);
	raw->setRightCharge(chargeR);
	raw->setSector((Char_t) fLoc[0]);
	raw->setModule((Char_t) fLoc[1]);
	raw->setCell((Char_t) fLoc[2]);
	if(raw->getNHit()>1){
	    raw->setNTrack1(numTrack1);
	    raw->setNTrack2(numTrack2);
	} else {
	    raw->setNTrack1(numTrack);
	    raw->setNTrack2(-1);
	    geaTof1[fLoc[0]][fLoc[1]][fLoc[2]]=geaTof;
	    geaTof2[fLoc[0]][fLoc[1]][fLoc[2]]=100000.;
	}
    }

    // Exclusion of hits with charge less than ADC threshold.
    // Time of hits with charge less than CFD threshold is set
    // to zero. These hits are excluded later in the hitfinder.

    iterTofRaw->Reset();
    while ( (raw=(HTofRawSim *)iterTofRaw->Next())!=NULL) {
	fLoc[0] = raw->getSector();
	fLoc[1] = raw->getModule();
	fLoc[2] = raw->getCell();
	timeL=raw->getLeftTime();
	timeR=raw->getRightTime();
	chargeL=raw->getLeftCharge();
	chargeR=raw->getRightCharge();

	HTofDigiParCell& cell=(*fDigiPar)[fLoc[0]][fLoc[1]][fLoc[2]];
	hl = cell.getHalfLen();
	al = cell.getAttenLen();
	thrCFDl = cell.getLeftCFDThreshold();
	thrCFDr = cell.getRightCFDThreshold();
	thrADCl = cell.getLeftADCThreshold();
	thrADCr = cell.getRightADCThreshold();
	slopeTDCl = cell.getLeftTDCSlope();
	slopeTDCr = cell.getRightTDCSlope();

	timeResol = timeResZero*exp(hl/(2.*al))/slopeTDCl;
	raw->setLeftTime(gRandom->Gaus(timeL,timeResol));
	timeResol = timeResZero*exp(hl/(2.*al))/slopeTDCr;
	raw->setRightTime(gRandom->Gaus(timeR,timeResol));

	if(((Int_t)timeL)<0) raw->setLeftTime(0.0);
	if(((Int_t)timeR)<0) raw->setRightTime(0.0);
	// overflow suppression
	if(((Int_t)timeL)>=4095) raw->setLeftTime(0.0);
	if(((Int_t)timeR)>=4095) raw->setRightTime(0.0);


	// CFD and ADC thresholds
	if(((Int_t)chargeL)<thrCFDl){
	    raw->setLeftTime(0.0);
	    if(((Int_t)chargeL)<thrADCl){
		raw->setLeftCharge(0.0);
	    }

	}
	if(((Int_t) chargeR)<thrCFDr){
	    raw->setRightTime(0.0);
	    if(((Int_t) chargeR)<thrADCr){
		raw->setRightCharge(0.0);
	    }
	}
    }

    fRawCat->filter(fRawFilter);

    return 0;
}

Int_t HTofDigitizer::execute(void) {

    if(useOld) return executeOld();

    Int_t embeddingmode=gHades->getEmbeddingMode(); // flag embedding 1=realistic 2:keep geant

    HTofRawSimFilter fRawFilter;

    //-------------------------------------------------
    // loop over raw sim category and set the default values
    // for embedding mode the real data
    // have -1 as track id -> set to standard
    // track number for embedding and increment the the
    // hit counter
    if(embeddingmode>0){
	HTofRawSim* raw = 0;
	iterTofRaw->Reset();
	while ((raw=(HTofRawSim *)iterTofRaw ->Next())!=0) {
	    raw->setNHit(1); // increment counter for additional hits
	    raw->setLeftNTrack(gHades->getEmbeddingRealTrackId());
	    raw->setRightNTrack(gHades->getEmbeddingRealTrackId());
	}
    }
    //-------------------------------------------------

    //-------------------------------------------------
    // loop over geant category and fill catTofRawTmp
    // the relsults will be copied later to the final output catTofRaw
    fillArray();
    //-------------------------------------------------

    //-------------------------------------------------
    // Exclusion of hits with charge less than ADC threshold.
    // Time of hits with charge less than CFD threshold is set
    // to zero. These hits are excluded later in the hitfinder.
    doFinalCheckOnArray();
    //-------------------------------------------------

    if(embeddingmode==0)
    {
	// in embedding mode catTofRawTmp will be used
	// from HTofHitF to merge real and embedded data
        // on hit level

	//-------------------------------------------------
	// Now copy tmp object to final output
	fillOutput();
	//-------------------------------------------------

	//-------------------------------------------------
	//
	// HTofRawSimFilter is an HFilter to reduce the number of the
	// HTofRawSim data in the catTofRaw category.
	// (If HTofRawSim object has LeftCharge==0 && RightCharge==0 &&
	// LeftTime==0 && RightTime==0 it is deleted from the category.)

	fRawCat->filter(fRawFilter);
	//-------------------------------------------------
    } else {
	fRawCatTmp->filter(fRawFilter);
    }
    return 0;
}
void HTofDigitizer::fillArray()
{
    //-------------------------------------------------
    // loop over geant category and fill catTofRawTmp
    // the relsults will be copied later to the final output catTofRaw


    const Float_t deg2rad = 0.017453293; // deg to rad conversion.
    const Float_t quantEff = 0.24;       // PMT quantum efficiency.
    const Float_t photYield = 11100.0;   // photon yield in scintillator (phot/MeV).
    const Float_t relAmplResol = 0.08;   // sigma of Gaus distribution.
    const Float_t minEnerRelease = 1.8;  // minimum energy release (MeV/cm)

    HGeantTof* geant = 0;
    HTofRawSim* raw = 0;

    Float_t hl, al, ar, vg, slopeTDCl, slopeTDCr;

    Int_t   numTrack, numTrack1 = -1, numTrack2 = -1;      //track numbers
    Float_t trackLen;
    Float_t timeL, timeR, chargeL, chargeR;
    Int_t timeCh, chargeCh;
    Float_t prevTimeL, prevTimeR, prevChargeL, prevChargeR;
    Float_t amplResol, chargeRef;

    Float_t geaTof  = 0.;
    Float_t geaEner = 0.;
    Float_t geaX    = 0.;
    Float_t geaY    = 0.;     // used by Tofino only
    Float_t geaMom  = 0.;


    iterGeant->Reset();   // this works only in split mode=2
    // (for 0 and 1 the iterator must be recreated)
    while ((geant=(HGeantTof *)iterGeant->Next())!=0) {

	fLoc[1] = geant->getModule();
	if (fLoc[1] > 21 || fLoc[1] < 14) continue;   // this is a Tofino, skip it!
	fLoc[1] = 21 - fLoc[1];       // Tof modules in HGeant: (0->21) = (in->out)

	fLoc[0] = geant->getSector();
	fLoc[2] = geant->getCell();
	fLoc[2] = 7 - fLoc[2];        // reverse also order of rods in Tof module


	//-------------------------------------------------
	// get TofRawSim object
	// if the same adress object exists already sorting has
	// to be done to find the earliest hit
	raw = (HTofRawSim*) fRawCatTmp->getObject(fLoc);   // test if cell in use
	if(raw) {
	    // if cell already exists
	    raw->incNHit();  // increment counter for additional hits
	    numTrack1 = raw->getLeftNTrack();
	    numTrack2 = raw->getRightNTrack();

	    prevTimeL = raw->getLeftTime();
	    prevTimeR = raw->getRightTime();
	    prevChargeL = raw->getLeftCharge();
	    prevChargeR = raw->getRightCharge();
	}
	else {
	    prevTimeL = prevTimeR = 100000.;
	    prevChargeL = prevChargeR = 0.;
	    raw = (HTofRawSim*) fRawCatTmp->getNewSlot(fLoc);  // get new slot
	    if(!raw) {
		Error("execute()","Could not retrieve new Slot in Category catTofRawTmp!");
		continue;
	    }
	    raw = new(raw) HTofRawSim;
	    raw->setNHit(1);
	}
	//-------------------------------------------------

	//-------------------------------------------------
	// get simulation paramters for the cell
	HTofDigiParCell& cell=(*fDigiPar)[fLoc[0]][fLoc[1]][fLoc[2]];
	hl = cell.getHalfLen();
	ar = cell.getAngleRef();
	al = cell.getAttenLen();
	vg = cell.getGroupVel();
	slopeTDCl = cell.getLeftTDCSlope();
	slopeTDCr = cell.getRightTDCSlope();
	//-------------------------------------------------

	//-------------------------------------------------
	// get GEANT values of the hit
	geant->getHit(geaEner,geaX,geaY,geaTof,geaMom,trackLen);
	numTrack=geant->getTrack();



	//-------------------------------------------------
	// find the first track ID entering the TOF
	// depending on storeFirstTrack flag
	// if replacing of tof track number is used
	HGeantTof* pOld=geant;
	HGeantTof* pNew=geant;
	Int_t tempTrack=0;
	Int_t count    =0;
	tempTrack=findFirstHitInTof(pOld,&pNew,&count);
	if(out)   fillNtuple       (pOld, pNew, count);
	numTrack =tempTrack;
	//-------------------------------------------------

	if(raw->getNHit()==1){
	    // for a new hit left and right
	    // track number have to be set
	    numTrack2=numTrack;
	    numTrack1=numTrack;
	}
	//-------------------------------------------------

	if((vg!=0.0) && (al!=0.0))  {

	    //-------------------------------------------------
	    // calculation of left / right times
	    timeL = geaTof + (hl - geaX)/vg;
	    timeR = geaTof + (hl + geaX)/vg;

	    timeCh = (Int_t) (timeL/slopeTDCl);
	    if (timeCh < 0) timeCh = 0;
	    if (timeCh > 4095) timeCh = 4095;
	    timeL = ( Float_t ) (timeCh) + 0.5;

	    timeCh = (Int_t) (timeR/slopeTDCr);
	    if (timeCh < 0) timeCh = 0;
	    if (timeCh > 4095) timeCh = 4095;
	    timeR = ( Float_t ) (timeCh) + 0.5;
	    //-------------------------------------------------

	    //-------------------------------------------------
	    // comparing the measured left/right tofs to the previous
	    // existing times (=100000 if there was no hit before)
	    // The shorter times wins.
	    //-------------------------------------------------

	    if(raw->getNHit()>1){
		// for a Double_t hit the track numbers and measured
		// times have to be sorted.
		if(timeL < prevTimeL){
		    // sort track number by left time
		    numTrack1=numTrack;
		}

		if(timeR < prevTimeR){
		    // sort track number by right time
		    numTrack2=numTrack;
		}
	    }
	    // if times are larger than prevTimes keep
	    // the previous times
	    if(timeL > prevTimeL) {timeL = prevTimeL;}
	    if(timeR > prevTimeR) {timeR = prevTimeR;}
	    //-------------------------------------------------



	    //-------------------------------------------------
	    // calculation of charges
	    chargeL = geaEner*photYield*quantEff*0.5*(1 - cos(ar*deg2rad))*exp(-(hl-geaX)/al);
	    amplResol = chargeL*relAmplResol;
	    chargeL = gRandom->Gaus(chargeL,amplResol);
	    chargeR = geaEner*photYield*quantEff*0.5*(1 - cos(ar*deg2rad))*exp(-(hl+geaX)/al);
	    amplResol = chargeR*relAmplResol;
	    chargeR = gRandom->Gaus(chargeR,amplResol);

	    chargeRef = photYield*quantEff*0.5*(1-cos(ar*deg2rad))*minEnerRelease*exp(-hl/al);
	    if(fLoc[1] <= 3) chargeRef *= 3.;
	    if(fLoc[1]>3 && fLoc[1]<=7) chargeRef *= 2.;

	    chargeCh = (Int_t) ((chargeL/chargeRef)*256. + prevChargeL);
	    if (chargeCh < 0) chargeCh = 0;
	    if (chargeCh > MAXCHRGCH)  chargeCh = MAXCHRGCH;
	    chargeL = (Float_t)chargeCh;

	    chargeCh = (Int_t) ((chargeR/chargeRef)*256. + prevChargeR);
	    if (chargeCh < 0) chargeCh = 0;
	    if (chargeCh > MAXCHRGCH)  chargeCh = MAXCHRGCH;
	    chargeR = (Float_t)chargeCh;
	    //-------------------------------------------------

	} else {

	    //-------------------------------------------------
	    // setting default values for times and charges
	    timeL = 4095.;
	    timeR = 4095.;
	    chargeL = MAXCHRGCH;
	    chargeR = MAXCHRGCH;
	    //-------------------------------------------------
	}

	//-------------------------------------------------
	// filling the hit object
	raw->setLeftTime(timeL);
	raw->setRightTime(timeR);
	raw->setLeftCharge(chargeL);
	raw->setRightCharge(chargeR);
	raw->setSector((Char_t) fLoc[0]);
	raw->setModule((Char_t) fLoc[1]);
	raw->setCell((Char_t) fLoc[2]);
	raw->setLeftNTrack(numTrack1);
	raw->setRightNTrack(numTrack2);
	//-------------------------------------------------

    } // end loop over geant category
}
void HTofDigitizer::doFinalCheckOnArray()
{

    //-------------------------------------------------
    // Exclusion of hits with charge less than ADC threshold.
    // Time of hits with charge less than CFD threshold is set
    // to zero. These hits are excluded later in the hitfinder.

    HTofRawSim* raw = 0;

    Float_t hl, al, slopeTDCl, slopeTDCr;
    Int_t thrCFDl, thrCFDr, thrADCl, thrADCr;

    Float_t timeL, timeR, chargeL, chargeR;
    Float_t timeResol;

    Float_t subCl,subCr,depE;


    iterTofRawTmp->Reset();
    while ( (raw=(HTofRawSim *)iterTofRawTmp->Next())!=NULL) {
	fLoc[0] = raw->getSector();
	fLoc[1] = raw->getModule();
	fLoc[2] = raw->getCell();
	timeL=raw->getLeftTime();
	timeR=raw->getRightTime();


	chargeL=raw->getLeftCharge();    //???? threshold should changed too
	chargeR=raw->getRightCharge();   //???? threshold should changed too

	raw->setLeftCharge (fTofWalkPar->scaleGeantToData(chargeL));
	raw->setRightCharge(fTofWalkPar->scaleGeantToData(chargeR));

	HTofDigiParCell& cell=(*fDigiPar)[fLoc[0]][fLoc[1]][fLoc[2]];

	subCl = (raw->getLeftCharge());    //original version
	subCr = (raw->getRightCharge());   //original version
	depE = (*fTofCalPar)[fLoc[0]][fLoc[1]][fLoc[2]].getEdepK()  * (TMath::Sqrt(subCl*subCr));


        //----------------------------------------------------------
        // get particle information for beta scaling of sigmadX
        // used in HTofWalkPar
	Int_t tr1 = raw->getNTrack1();
	Int_t tr2 = raw->getNTrack2();
	HGeantKine* kine1 = 0;
	HGeantKine* kine2 = 0;
	HGeantKine* kine  = 0;

	if(tr1>0) kine1 = (HGeantKine*)fGeantKineCat ->getObject(tr1-1);
	if(tr2>0) kine2 = (HGeantKine*)fGeantKineCat ->getObject(tr2-1);
        Double_t beta = 0;
        kine = kine1;


	if      (tr1 == tr2)   { kine = kine1;}
	else if (tr2 == -1 )   { kine = kine1;}
	else if (tr2 != tr1 )  {  // this case for apr12 ~ 2%
	    if        (kine2->getParentTrack()==0 && kine1->getParentTrack()>0)  { // tr2 is primary and tr1 is not
		kine = kine2;
	    } else if (kine2->getParentTrack()==0 && kine1->getParentTrack()==0) {  //both primary
		kine = kine1;
	    } else if (kine2->getParentTrack()>0  && kine1->getParentTrack()>0)  {  //both secondary
		kine = kine1;
	    } else if (kine2->getParentTrack()>0  && kine1->getParentTrack()==0) {  // tr1 is primary and tr2 is not
		kine = kine1;
	    }
	}

	Double_t mass   = HPhysicsConstants::mass(kine->getID());
	Double_t p      = kine->getTotalMomentum();
	if(mass > 0) {
	    beta = sqrt(1. / (((mass*mass)/(p*p)) + 1.));
	}
	//----------------------------------------------------------



	Float_t sigma  = fTofWalkPar->getDxSigmaDigi(fLoc[0], fLoc[1], fLoc[2],depE,cell.getGroupVel(),beta) ;   // dx sigma adoped for different vgroup
	timeResZero = sigma / cell.getGroupVel() * 1.41421;

	hl = cell.getHalfLen();
	al = cell.getAttenLen();
	thrCFDl = cell.getLeftCFDThreshold();
	thrCFDr = cell.getRightCFDThreshold();
	thrADCl = cell.getLeftADCThreshold();
	thrADCr = cell.getRightADCThreshold();
	slopeTDCl = cell.getLeftTDCSlope();
	slopeTDCr = cell.getRightTDCSlope();

	timeResol = timeResZero*exp(hl/(2.*al))/slopeTDCl;
	raw->setLeftTime(gRandom->Gaus(timeL,timeResol));
	timeResol = timeResZero*exp(hl/(2.*al))/slopeTDCr;
	raw->setRightTime(gRandom->Gaus(timeR,timeResol));

	if(((Int_t)timeL)<0) raw->setLeftTime(0.0);
	if(((Int_t)timeR)<0) raw->setRightTime(0.0);
	// overflow suppression
	if(((Int_t)timeL)>=4095) raw->setLeftTime(0.0);
	if(((Int_t)timeR)>=4095) raw->setRightTime(0.0);


	// CFD and ADC thresholds
	if(((Int_t)chargeL)<thrCFDl){
	    raw->setLeftTime(0.0);
	    if(((Int_t)chargeL)<thrADCl){
		raw->setLeftCharge(0.0);
	    }

	}
	if(((Int_t) chargeR)<thrCFDr){
	    raw->setRightTime(0.0);
	    if(((Int_t) chargeR)<thrADCr){
		raw->setRightCharge(0.0);
	    }
	}
    }
    //-------------------------------------------------
}

void HTofDigitizer::fillOutput()
{
    //-------------------------------------------------
    // Now copy tmp object to final output
    Int_t embeddingmode=gHades->getEmbeddingMode(); // flag embedding 1=realistic 2:keep geant

    Int_t   numTrack1 = -1, numTrack2 = -1;            //track numbers
    Float_t timeL, timeR, chargeL, chargeR;
    Int_t   numTrack1Out = -1, numTrack2Out = -1;      //track numbers
    Float_t timeLOut, timeROut, chargeLOut, chargeROut;

    HTofRawSim* raw = 0;
    HTofRawSim * rawOut;
    iterTofRawTmp->Reset();
    while ( (raw=(HTofRawSim *)iterTofRawTmp->Next())!=NULL) {
	fLoc[0] = raw->getSector();
	fLoc[1] = raw->getModule();
	fLoc[2] = raw->getCell();
	timeL     = raw->getLeftTime();
	timeR     = raw->getRightTime();
	chargeL   = raw->getLeftCharge();
	chargeR   = raw->getRightCharge();
	numTrack1 = raw->getLeftNTrack();
	numTrack2 = raw->getRightNTrack();

	rawOut = (HTofRawSim*) fRawCat->getObject(fLoc);   // test if cell in use

	if(rawOut)
	{
	    if(embeddingmode>0)
	    {
		// if cell already exists
		raw->incNHit();  // increment counter for additional hits
		numTrack1Out = rawOut->getLeftNTrack();
		numTrack2Out = rawOut->getRightNTrack();
		timeLOut     = rawOut->getLeftTime();
		timeROut     = rawOut->getRightTime();
		chargeLOut   = rawOut->getLeftCharge();
		chargeROut   = rawOut->getRightCharge();


		//-------------------------------------------------
		// in case of Double_t hits real hits should be
		// taken into account. In embeddingmode=2 real hits
		// should not overwrite sim track numbers.

		//-------------------------------------------------
		// for embeddingmode=2 the GEANT hits should be kept anyway
		// if times are larger than prevTimes keep
		// the previous times

		if(timeL < timeLOut) {
		    numTrack1Out = numTrack1;
		    timeLOut     = timeL;
		}

		if(embeddingmode==2) numTrack1Out = numTrack1; // keep Geant

		if(timeR < timeROut) {
		    numTrack2Out = numTrack2;
		    timeROut     = timeR;

		}
		if(embeddingmode==2) numTrack2Out = numTrack2; // keep Geant
		//-------------------------------------------------

		rawOut->setLeftNTrack(numTrack1Out);
		rawOut->setRightNTrack(numTrack2Out);
		rawOut->setLeftTime(timeLOut);
		rawOut->setRightTime(timeROut);
		rawOut->setLeftCharge (chargeLOut+chargeL);
		rawOut->setRightCharge(chargeROut+chargeR);
	    }
	    else
	    {
		Error("fillOutput()","Slot was used before. This case should never happen in sim mode! Will overwrite object!");
		rawOut = new(rawOut) HTofRawSim(*raw);
	    }

	}
	else
	{
	    rawOut = (HTofRawSim*) fRawCat->getNewSlot(fLoc);  // get new slot
	    if(!raw)
	    {
		Error("execute()","Could not retrieve new Slot in Category catTofRaw!");
		continue;
	    }
	    rawOut = new(rawOut) HTofRawSim(*raw);
	}
	//-------------------------------------------------
    }
    //-------------------------------------------------
}

Bool_t HTofDigitizer::finalize()
{
    TDirectory* saveDir=gDirectory;
    if(out)
    {
	outFile->cd();
	out->Write();
	outFile->Save();
	outFile->Close();
    }
    saveDir->cd();
    return kTRUE;
}
Int_t HTofDigitizer::findFirstHitInTof(HGeantTof* poldTof,HGeantTof** pnewTof,Int_t* count)
{
    //-------------------------------------------------
    // find the first track ID entering the TOF
    // Used to suppress the secondaries created in the
    // TOF itself.
    //        0 (default) = realistic (secondaries included)
    //        1 primary particle is stored
    //        2 the first track number entering the tof in SAME SECTOR is stored
    //        3 as 2 but condition on SAME SECTOR && MOD
    //        4 as 2 but SAME SECTOR && MOD && ROD

    Int_t numTrack=poldTof->getTrack();

    if(numTrack<=0) return numTrack; // nothing to do for real data
    HGeantKine* kine=0;
    *count=0;

    //--------------------------------------------------------
    // return the track number for
    // the selected option storeFirstTrack

    //--------------------------------------
    // case 0
    if(storeFirstTrack==0) return numTrack;
    //--------------------------------------
    // case 1
    if(storeFirstTrack==1)
    {   // return track number of primary particle
	// of the given track
	kine=(HGeantKine*)fGeantKineCat->getObject(numTrack-1);
	Int_t parent=kine->getParentTrack();


	kine=HGeantKine::getPrimary(numTrack,fGeantKineCat);
	if(parent>0)(*count)--; // mark only those which change
	if(debug)
	{
	    // make the changed track numbers easily
	    // visible in output. ONLY DEBUGGING!!!!
	    return (*count)*200;
	}
	else return kine->getTrack();
    }

    //--------------------------------------
    // case 2 and 3
    kine=(HGeantKine*)fGeantKineCat->getObject(numTrack-1);
    if(kine->getParentTrack()==0){return numTrack;} // nothing to do

    Int_t s,m,c;
    s= poldTof->getSector();
    m= 21-poldTof->getModule();
    c= 7 -poldTof->getCell();

    Int_t first=0;
    Int_t tempTrack=numTrack;
    while((kine=kine->getParent(tempTrack,fGeantKineCat))!=0)
    {
	first=kine->getFirstTofHit();
	if(first!=-1)
	{
	    // track is still in TOF

	    // now we have to check if it is in TOF or TOFINO
	    HGeantTof* gtof=(HGeantTof*)fGeantCat->getObject(first);

	    Int_t s1,m1,c1;
	    s1=m1=c1=0;

	    m1 = 21-gtof->getModule();
	    if(m1>=0)
	    {
		// inside TOF
		s1= gtof->getSector();
		c1= 7-gtof->getCell();

		if(storeFirstTrack==2&&
		   s==s1)
		{   // case 2 :: check only sector
		    tempTrack  =kine->getTrack();
		    (*pnewTof)=gtof;
		    (*count)--;
		}
		if(storeFirstTrack==3&&
		   s==s1&&m==m1)
		{   // case 3 :: check only sector,module
		    tempTrack  =kine->getTrack();
		    (*pnewTof)=gtof;
		    (*count)--;
		}
		else if(storeFirstTrack==4&&
			s==s1&&m==m1&&c==c1)
		{   // case 4 :: check for same rod
		    tempTrack  =kine->getTrack();
		    (*pnewTof)=gtof;
		    (*count)--;
		}
		else {
		    // track has no TOF hit any longer
		    // which fulfills the condition
		    break;
		}

	    } else {
		// track is in TOFINO
		break;
	    }
	}
	else {
	    // track has no TOF hit any longer,
	    // so the previous object was the one we
	    // searched  for
	    break;
	}
    }
    if(debug&&(*count)<0)
    {   // make the changed track numbers easily
	// visible in output. ONLY DEBUGGING!!!!
	return (*count)*200;
    }
    else return tempTrack;
}
void HTofDigitizer::setOutputFile(TString outname)
{
    // set ouput file for internal Ntuple. Create
    // Ntuple inside output.

    TString outName;
    if(outname.CompareTo("")==0){
	outName ="tofdigiNtuple.root";
	Info("HTofDigitizer::setOutputFile()","No name speciefied use Output file : %s ",outName.Data());
    }
    else
    {
	outName=outname;
	Info("HTofDigitizer::setOutputFile()","Output file : %s ",outName.Data());
    }
    TDirectory* saveDir=gDirectory;
    outFile=new TFile(outName.Data(),"RECREATE");

    if(outFile)
    {
	outFile->cd();

	out=new TNtuple("ntuple","ntuple","s:m:c:" // old cell
			"s1:m1:c1:"                // new cell
			"gE:gE2:"                  // geant energy
			"gX:gX1:gY:gY1:"           // geant xy old/new
			"gTof:gTof1:"              // geant tof
			"gMom:gMom1:"              // geant momentum
			"gLen:gLen1:"              // geant track length
			"trackOld:trackNew:"       // geant track number
			"parentOld:parentNew:"     // geant parent track
			"count");                  // number of iterations

	if(!out)
	{
	    Error("HTofDigitizer::setOutputFile()","Could not create Ntuple!");
	    exit(1);
	}
    } else {

	Error("HTofDigitizer::setOutputFile()","Could not create Output File!");
	exit(1);

    }
    saveDir->cd();
}
void HTofDigitizer::fillNtuple(HGeantTof* pold,HGeantTof* pnew,Int_t count)
{
    // old GEANT TOF hit
    HGeantKine* kine=0;
    Int_t parentOld,parentNew;
    Int_t trackOld,trackNew;

    Float_t geaEner,geaX,geaY,geaTof,geaMom,trackLen ;
    pold->getHit(geaEner,geaX,geaY,geaTof,geaMom,trackLen);

    kine=(HGeantKine*)fGeantKineCat->getObject(pold->getTrack()-1);
    parentOld=kine->getParentTrack();
    trackOld =kine->getTrack();



    // new GEANT TOF hit
    Float_t geaEner1,geaX1,geaY1,geaTof1,geaMom1,trackLen1 ;
    pnew->getHit(geaEner1,geaX1,geaY1,geaTof1,geaMom1,trackLen1);

    kine=(HGeantKine*)fGeantKineCat->getObject(pnew->getTrack()-1);
    parentNew=kine->getParentTrack();
    trackNew =kine->getTrack();

    Float_t dat[23]={0};



    dat[0] = pold->getSector();
    dat[1] = 21-pold->getModule();
    dat[2] = 7-pold->getCell();

    dat[3] = pnew->getSector();
    dat[4] = 21-pnew->getModule();
    dat[5] = 7-pnew->getCell();

    dat[6] = geaEner;
    dat[7] = geaEner1;
    dat[8] = geaX;
    dat[9] = geaX1;
    dat[10]= geaY;
    dat[11]= geaY1;
    dat[12]= geaTof;
    dat[13]= geaTof1;
    dat[14]= geaMom;
    dat[15]= geaMom1;
    dat[16]= trackLen;
    dat[17]= trackLen1;
    dat[18]= trackOld;
    dat[19]= trackNew;
    dat[20]= parentOld;
    dat[21]= parentNew;

    dat[22]= count;


    out->Fill(dat);

}

ClassImp(HTofDigitizer)
 htofdigitizer.cc:1
 htofdigitizer.cc:2
 htofdigitizer.cc:3
 htofdigitizer.cc:4
 htofdigitizer.cc:5
 htofdigitizer.cc:6
 htofdigitizer.cc:7
 htofdigitizer.cc:8
 htofdigitizer.cc:9
 htofdigitizer.cc:10
 htofdigitizer.cc:11
 htofdigitizer.cc:12
 htofdigitizer.cc:13
 htofdigitizer.cc:14
 htofdigitizer.cc:15
 htofdigitizer.cc:16
 htofdigitizer.cc:17
 htofdigitizer.cc:18
 htofdigitizer.cc:19
 htofdigitizer.cc:20
 htofdigitizer.cc:21
 htofdigitizer.cc:22
 htofdigitizer.cc:23
 htofdigitizer.cc:24
 htofdigitizer.cc:25
 htofdigitizer.cc:26
 htofdigitizer.cc:27
 htofdigitizer.cc:28
 htofdigitizer.cc:29
 htofdigitizer.cc:30
 htofdigitizer.cc:31
 htofdigitizer.cc:32
 htofdigitizer.cc:33
 htofdigitizer.cc:34
 htofdigitizer.cc:35
 htofdigitizer.cc:36
 htofdigitizer.cc:37
 htofdigitizer.cc:38
 htofdigitizer.cc:39
 htofdigitizer.cc:40
 htofdigitizer.cc:41
 htofdigitizer.cc:42
 htofdigitizer.cc:43
 htofdigitizer.cc:44
 htofdigitizer.cc:45
 htofdigitizer.cc:46
 htofdigitizer.cc:47
 htofdigitizer.cc:48
 htofdigitizer.cc:49
 htofdigitizer.cc:50
 htofdigitizer.cc:51
 htofdigitizer.cc:52
 htofdigitizer.cc:53
 htofdigitizer.cc:54
 htofdigitizer.cc:55
 htofdigitizer.cc:56
 htofdigitizer.cc:57
 htofdigitizer.cc:58
 htofdigitizer.cc:59
 htofdigitizer.cc:60
 htofdigitizer.cc:61
 htofdigitizer.cc:62
 htofdigitizer.cc:63
 htofdigitizer.cc:64
 htofdigitizer.cc:65
 htofdigitizer.cc:66
 htofdigitizer.cc:67
 htofdigitizer.cc:68
 htofdigitizer.cc:69
 htofdigitizer.cc:70
 htofdigitizer.cc:71
 htofdigitizer.cc:72
 htofdigitizer.cc:73
 htofdigitizer.cc:74
 htofdigitizer.cc:75
 htofdigitizer.cc:76
 htofdigitizer.cc:77
 htofdigitizer.cc:78
 htofdigitizer.cc:79
 htofdigitizer.cc:80
 htofdigitizer.cc:81
 htofdigitizer.cc:82
 htofdigitizer.cc:83
 htofdigitizer.cc:84
 htofdigitizer.cc:85
 htofdigitizer.cc:86
 htofdigitizer.cc:87
 htofdigitizer.cc:88
 htofdigitizer.cc:89
 htofdigitizer.cc:90
 htofdigitizer.cc:91
 htofdigitizer.cc:92
 htofdigitizer.cc:93
 htofdigitizer.cc:94
 htofdigitizer.cc:95
 htofdigitizer.cc:96
 htofdigitizer.cc:97
 htofdigitizer.cc:98
 htofdigitizer.cc:99
 htofdigitizer.cc:100
 htofdigitizer.cc:101
 htofdigitizer.cc:102
 htofdigitizer.cc:103
 htofdigitizer.cc:104
 htofdigitizer.cc:105
 htofdigitizer.cc:106
 htofdigitizer.cc:107
 htofdigitizer.cc:108
 htofdigitizer.cc:109
 htofdigitizer.cc:110
 htofdigitizer.cc:111
 htofdigitizer.cc:112
 htofdigitizer.cc:113
 htofdigitizer.cc:114
 htofdigitizer.cc:115
 htofdigitizer.cc:116
 htofdigitizer.cc:117
 htofdigitizer.cc:118
 htofdigitizer.cc:119
 htofdigitizer.cc:120
 htofdigitizer.cc:121
 htofdigitizer.cc:122
 htofdigitizer.cc:123
 htofdigitizer.cc:124
 htofdigitizer.cc:125
 htofdigitizer.cc:126
 htofdigitizer.cc:127
 htofdigitizer.cc:128
 htofdigitizer.cc:129
 htofdigitizer.cc:130
 htofdigitizer.cc:131
 htofdigitizer.cc:132
 htofdigitizer.cc:133
 htofdigitizer.cc:134
 htofdigitizer.cc:135
 htofdigitizer.cc:136
 htofdigitizer.cc:137
 htofdigitizer.cc:138
 htofdigitizer.cc:139
 htofdigitizer.cc:140
 htofdigitizer.cc:141
 htofdigitizer.cc:142
 htofdigitizer.cc:143
 htofdigitizer.cc:144
 htofdigitizer.cc:145
 htofdigitizer.cc:146
 htofdigitizer.cc:147
 htofdigitizer.cc:148
 htofdigitizer.cc:149
 htofdigitizer.cc:150
 htofdigitizer.cc:151
 htofdigitizer.cc:152
 htofdigitizer.cc:153
 htofdigitizer.cc:154
 htofdigitizer.cc:155
 htofdigitizer.cc:156
 htofdigitizer.cc:157
 htofdigitizer.cc:158
 htofdigitizer.cc:159
 htofdigitizer.cc:160
 htofdigitizer.cc:161
 htofdigitizer.cc:162
 htofdigitizer.cc:163
 htofdigitizer.cc:164
 htofdigitizer.cc:165
 htofdigitizer.cc:166
 htofdigitizer.cc:167
 htofdigitizer.cc:168
 htofdigitizer.cc:169
 htofdigitizer.cc:170
 htofdigitizer.cc:171
 htofdigitizer.cc:172
 htofdigitizer.cc:173
 htofdigitizer.cc:174
 htofdigitizer.cc:175
 htofdigitizer.cc:176
 htofdigitizer.cc:177
 htofdigitizer.cc:178
 htofdigitizer.cc:179
 htofdigitizer.cc:180
 htofdigitizer.cc:181
 htofdigitizer.cc:182
 htofdigitizer.cc:183
 htofdigitizer.cc:184
 htofdigitizer.cc:185
 htofdigitizer.cc:186
 htofdigitizer.cc:187
 htofdigitizer.cc:188
 htofdigitizer.cc:189
 htofdigitizer.cc:190
 htofdigitizer.cc:191
 htofdigitizer.cc:192
 htofdigitizer.cc:193
 htofdigitizer.cc:194
 htofdigitizer.cc:195
 htofdigitizer.cc:196
 htofdigitizer.cc:197
 htofdigitizer.cc:198
 htofdigitizer.cc:199
 htofdigitizer.cc:200
 htofdigitizer.cc:201
 htofdigitizer.cc:202
 htofdigitizer.cc:203
 htofdigitizer.cc:204
 htofdigitizer.cc:205
 htofdigitizer.cc:206
 htofdigitizer.cc:207
 htofdigitizer.cc:208
 htofdigitizer.cc:209
 htofdigitizer.cc:210
 htofdigitizer.cc:211
 htofdigitizer.cc:212
 htofdigitizer.cc:213
 htofdigitizer.cc:214
 htofdigitizer.cc:215
 htofdigitizer.cc:216
 htofdigitizer.cc:217
 htofdigitizer.cc:218
 htofdigitizer.cc:219
 htofdigitizer.cc:220
 htofdigitizer.cc:221
 htofdigitizer.cc:222
 htofdigitizer.cc:223
 htofdigitizer.cc:224
 htofdigitizer.cc:225
 htofdigitizer.cc:226
 htofdigitizer.cc:227
 htofdigitizer.cc:228
 htofdigitizer.cc:229
 htofdigitizer.cc:230
 htofdigitizer.cc:231
 htofdigitizer.cc:232
 htofdigitizer.cc:233
 htofdigitizer.cc:234
 htofdigitizer.cc:235
 htofdigitizer.cc:236
 htofdigitizer.cc:237
 htofdigitizer.cc:238
 htofdigitizer.cc:239
 htofdigitizer.cc:240
 htofdigitizer.cc:241
 htofdigitizer.cc:242
 htofdigitizer.cc:243
 htofdigitizer.cc:244
 htofdigitizer.cc:245
 htofdigitizer.cc:246
 htofdigitizer.cc:247
 htofdigitizer.cc:248
 htofdigitizer.cc:249
 htofdigitizer.cc:250
 htofdigitizer.cc:251
 htofdigitizer.cc:252
 htofdigitizer.cc:253
 htofdigitizer.cc:254
 htofdigitizer.cc:255
 htofdigitizer.cc:256
 htofdigitizer.cc:257
 htofdigitizer.cc:258
 htofdigitizer.cc:259
 htofdigitizer.cc:260
 htofdigitizer.cc:261
 htofdigitizer.cc:262
 htofdigitizer.cc:263
 htofdigitizer.cc:264
 htofdigitizer.cc:265
 htofdigitizer.cc:266
 htofdigitizer.cc:267
 htofdigitizer.cc:268
 htofdigitizer.cc:269
 htofdigitizer.cc:270
 htofdigitizer.cc:271
 htofdigitizer.cc:272
 htofdigitizer.cc:273
 htofdigitizer.cc:274
 htofdigitizer.cc:275
 htofdigitizer.cc:276
 htofdigitizer.cc:277
 htofdigitizer.cc:278
 htofdigitizer.cc:279
 htofdigitizer.cc:280
 htofdigitizer.cc:281
 htofdigitizer.cc:282
 htofdigitizer.cc:283
 htofdigitizer.cc:284
 htofdigitizer.cc:285
 htofdigitizer.cc:286
 htofdigitizer.cc:287
 htofdigitizer.cc:288
 htofdigitizer.cc:289
 htofdigitizer.cc:290
 htofdigitizer.cc:291
 htofdigitizer.cc:292
 htofdigitizer.cc:293
 htofdigitizer.cc:294
 htofdigitizer.cc:295
 htofdigitizer.cc:296
 htofdigitizer.cc:297
 htofdigitizer.cc:298
 htofdigitizer.cc:299
 htofdigitizer.cc:300
 htofdigitizer.cc:301
 htofdigitizer.cc:302
 htofdigitizer.cc:303
 htofdigitizer.cc:304
 htofdigitizer.cc:305
 htofdigitizer.cc:306
 htofdigitizer.cc:307
 htofdigitizer.cc:308
 htofdigitizer.cc:309
 htofdigitizer.cc:310
 htofdigitizer.cc:311
 htofdigitizer.cc:312
 htofdigitizer.cc:313
 htofdigitizer.cc:314
 htofdigitizer.cc:315
 htofdigitizer.cc:316
 htofdigitizer.cc:317
 htofdigitizer.cc:318
 htofdigitizer.cc:319
 htofdigitizer.cc:320
 htofdigitizer.cc:321
 htofdigitizer.cc:322
 htofdigitizer.cc:323
 htofdigitizer.cc:324
 htofdigitizer.cc:325
 htofdigitizer.cc:326
 htofdigitizer.cc:327
 htofdigitizer.cc:328
 htofdigitizer.cc:329
 htofdigitizer.cc:330
 htofdigitizer.cc:331
 htofdigitizer.cc:332
 htofdigitizer.cc:333
 htofdigitizer.cc:334
 htofdigitizer.cc:335
 htofdigitizer.cc:336
 htofdigitizer.cc:337
 htofdigitizer.cc:338
 htofdigitizer.cc:339
 htofdigitizer.cc:340
 htofdigitizer.cc:341
 htofdigitizer.cc:342
 htofdigitizer.cc:343
 htofdigitizer.cc:344
 htofdigitizer.cc:345
 htofdigitizer.cc:346
 htofdigitizer.cc:347
 htofdigitizer.cc:348
 htofdigitizer.cc:349
 htofdigitizer.cc:350
 htofdigitizer.cc:351
 htofdigitizer.cc:352
 htofdigitizer.cc:353
 htofdigitizer.cc:354
 htofdigitizer.cc:355
 htofdigitizer.cc:356
 htofdigitizer.cc:357
 htofdigitizer.cc:358
 htofdigitizer.cc:359
 htofdigitizer.cc:360
 htofdigitizer.cc:361
 htofdigitizer.cc:362
 htofdigitizer.cc:363
 htofdigitizer.cc:364
 htofdigitizer.cc:365
 htofdigitizer.cc:366
 htofdigitizer.cc:367
 htofdigitizer.cc:368
 htofdigitizer.cc:369
 htofdigitizer.cc:370
 htofdigitizer.cc:371
 htofdigitizer.cc:372
 htofdigitizer.cc:373
 htofdigitizer.cc:374
 htofdigitizer.cc:375
 htofdigitizer.cc:376
 htofdigitizer.cc:377
 htofdigitizer.cc:378
 htofdigitizer.cc:379
 htofdigitizer.cc:380
 htofdigitizer.cc:381
 htofdigitizer.cc:382
 htofdigitizer.cc:383
 htofdigitizer.cc:384
 htofdigitizer.cc:385
 htofdigitizer.cc:386
 htofdigitizer.cc:387
 htofdigitizer.cc:388
 htofdigitizer.cc:389
 htofdigitizer.cc:390
 htofdigitizer.cc:391
 htofdigitizer.cc:392
 htofdigitizer.cc:393
 htofdigitizer.cc:394
 htofdigitizer.cc:395
 htofdigitizer.cc:396
 htofdigitizer.cc:397
 htofdigitizer.cc:398
 htofdigitizer.cc:399
 htofdigitizer.cc:400
 htofdigitizer.cc:401
 htofdigitizer.cc:402
 htofdigitizer.cc:403
 htofdigitizer.cc:404
 htofdigitizer.cc:405
 htofdigitizer.cc:406
 htofdigitizer.cc:407
 htofdigitizer.cc:408
 htofdigitizer.cc:409
 htofdigitizer.cc:410
 htofdigitizer.cc:411
 htofdigitizer.cc:412
 htofdigitizer.cc:413
 htofdigitizer.cc:414
 htofdigitizer.cc:415
 htofdigitizer.cc:416
 htofdigitizer.cc:417
 htofdigitizer.cc:418
 htofdigitizer.cc:419
 htofdigitizer.cc:420
 htofdigitizer.cc:421
 htofdigitizer.cc:422
 htofdigitizer.cc:423
 htofdigitizer.cc:424
 htofdigitizer.cc:425
 htofdigitizer.cc:426
 htofdigitizer.cc:427
 htofdigitizer.cc:428
 htofdigitizer.cc:429
 htofdigitizer.cc:430
 htofdigitizer.cc:431
 htofdigitizer.cc:432
 htofdigitizer.cc:433
 htofdigitizer.cc:434
 htofdigitizer.cc:435
 htofdigitizer.cc:436
 htofdigitizer.cc:437
 htofdigitizer.cc:438
 htofdigitizer.cc:439
 htofdigitizer.cc:440
 htofdigitizer.cc:441
 htofdigitizer.cc:442
 htofdigitizer.cc:443
 htofdigitizer.cc:444
 htofdigitizer.cc:445
 htofdigitizer.cc:446
 htofdigitizer.cc:447
 htofdigitizer.cc:448
 htofdigitizer.cc:449
 htofdigitizer.cc:450
 htofdigitizer.cc:451
 htofdigitizer.cc:452
 htofdigitizer.cc:453
 htofdigitizer.cc:454
 htofdigitizer.cc:455
 htofdigitizer.cc:456
 htofdigitizer.cc:457
 htofdigitizer.cc:458
 htofdigitizer.cc:459
 htofdigitizer.cc:460
 htofdigitizer.cc:461
 htofdigitizer.cc:462
 htofdigitizer.cc:463
 htofdigitizer.cc:464
 htofdigitizer.cc:465
 htofdigitizer.cc:466
 htofdigitizer.cc:467
 htofdigitizer.cc:468
 htofdigitizer.cc:469
 htofdigitizer.cc:470
 htofdigitizer.cc:471
 htofdigitizer.cc:472
 htofdigitizer.cc:473
 htofdigitizer.cc:474
 htofdigitizer.cc:475
 htofdigitizer.cc:476
 htofdigitizer.cc:477
 htofdigitizer.cc:478
 htofdigitizer.cc:479
 htofdigitizer.cc:480
 htofdigitizer.cc:481
 htofdigitizer.cc:482
 htofdigitizer.cc:483
 htofdigitizer.cc:484
 htofdigitizer.cc:485
 htofdigitizer.cc:486
 htofdigitizer.cc:487
 htofdigitizer.cc:488
 htofdigitizer.cc:489
 htofdigitizer.cc:490
 htofdigitizer.cc:491
 htofdigitizer.cc:492
 htofdigitizer.cc:493
 htofdigitizer.cc:494
 htofdigitizer.cc:495
 htofdigitizer.cc:496
 htofdigitizer.cc:497
 htofdigitizer.cc:498
 htofdigitizer.cc:499
 htofdigitizer.cc:500
 htofdigitizer.cc:501
 htofdigitizer.cc:502
 htofdigitizer.cc:503
 htofdigitizer.cc:504
 htofdigitizer.cc:505
 htofdigitizer.cc:506
 htofdigitizer.cc:507
 htofdigitizer.cc:508
 htofdigitizer.cc:509
 htofdigitizer.cc:510
 htofdigitizer.cc:511
 htofdigitizer.cc:512
 htofdigitizer.cc:513
 htofdigitizer.cc:514
 htofdigitizer.cc:515
 htofdigitizer.cc:516
 htofdigitizer.cc:517
 htofdigitizer.cc:518
 htofdigitizer.cc:519
 htofdigitizer.cc:520
 htofdigitizer.cc:521
 htofdigitizer.cc:522
 htofdigitizer.cc:523
 htofdigitizer.cc:524
 htofdigitizer.cc:525
 htofdigitizer.cc:526
 htofdigitizer.cc:527
 htofdigitizer.cc:528
 htofdigitizer.cc:529
 htofdigitizer.cc:530
 htofdigitizer.cc:531
 htofdigitizer.cc:532
 htofdigitizer.cc:533
 htofdigitizer.cc:534
 htofdigitizer.cc:535
 htofdigitizer.cc:536
 htofdigitizer.cc:537
 htofdigitizer.cc:538
 htofdigitizer.cc:539
 htofdigitizer.cc:540
 htofdigitizer.cc:541
 htofdigitizer.cc:542
 htofdigitizer.cc:543
 htofdigitizer.cc:544
 htofdigitizer.cc:545
 htofdigitizer.cc:546
 htofdigitizer.cc:547
 htofdigitizer.cc:548
 htofdigitizer.cc:549
 htofdigitizer.cc:550
 htofdigitizer.cc:551
 htofdigitizer.cc:552
 htofdigitizer.cc:553
 htofdigitizer.cc:554
 htofdigitizer.cc:555
 htofdigitizer.cc:556
 htofdigitizer.cc:557
 htofdigitizer.cc:558
 htofdigitizer.cc:559
 htofdigitizer.cc:560
 htofdigitizer.cc:561
 htofdigitizer.cc:562
 htofdigitizer.cc:563
 htofdigitizer.cc:564
 htofdigitizer.cc:565
 htofdigitizer.cc:566
 htofdigitizer.cc:567
 htofdigitizer.cc:568
 htofdigitizer.cc:569
 htofdigitizer.cc:570
 htofdigitizer.cc:571
 htofdigitizer.cc:572
 htofdigitizer.cc:573
 htofdigitizer.cc:574
 htofdigitizer.cc:575
 htofdigitizer.cc:576
 htofdigitizer.cc:577
 htofdigitizer.cc:578
 htofdigitizer.cc:579
 htofdigitizer.cc:580
 htofdigitizer.cc:581
 htofdigitizer.cc:582
 htofdigitizer.cc:583
 htofdigitizer.cc:584
 htofdigitizer.cc:585
 htofdigitizer.cc:586
 htofdigitizer.cc:587
 htofdigitizer.cc:588
 htofdigitizer.cc:589
 htofdigitizer.cc:590
 htofdigitizer.cc:591
 htofdigitizer.cc:592
 htofdigitizer.cc:593
 htofdigitizer.cc:594
 htofdigitizer.cc:595
 htofdigitizer.cc:596
 htofdigitizer.cc:597
 htofdigitizer.cc:598
 htofdigitizer.cc:599
 htofdigitizer.cc:600
 htofdigitizer.cc:601
 htofdigitizer.cc:602
 htofdigitizer.cc:603
 htofdigitizer.cc:604
 htofdigitizer.cc:605
 htofdigitizer.cc:606
 htofdigitizer.cc:607
 htofdigitizer.cc:608
 htofdigitizer.cc:609
 htofdigitizer.cc:610
 htofdigitizer.cc:611
 htofdigitizer.cc:612
 htofdigitizer.cc:613
 htofdigitizer.cc:614
 htofdigitizer.cc:615
 htofdigitizer.cc:616
 htofdigitizer.cc:617
 htofdigitizer.cc:618
 htofdigitizer.cc:619
 htofdigitizer.cc:620
 htofdigitizer.cc:621
 htofdigitizer.cc:622
 htofdigitizer.cc:623
 htofdigitizer.cc:624
 htofdigitizer.cc:625
 htofdigitizer.cc:626
 htofdigitizer.cc:627
 htofdigitizer.cc:628
 htofdigitizer.cc:629
 htofdigitizer.cc:630
 htofdigitizer.cc:631
 htofdigitizer.cc:632
 htofdigitizer.cc:633
 htofdigitizer.cc:634
 htofdigitizer.cc:635
 htofdigitizer.cc:636
 htofdigitizer.cc:637
 htofdigitizer.cc:638
 htofdigitizer.cc:639
 htofdigitizer.cc:640
 htofdigitizer.cc:641
 htofdigitizer.cc:642
 htofdigitizer.cc:643
 htofdigitizer.cc:644
 htofdigitizer.cc:645
 htofdigitizer.cc:646
 htofdigitizer.cc:647
 htofdigitizer.cc:648
 htofdigitizer.cc:649
 htofdigitizer.cc:650
 htofdigitizer.cc:651
 htofdigitizer.cc:652
 htofdigitizer.cc:653
 htofdigitizer.cc:654
 htofdigitizer.cc:655
 htofdigitizer.cc:656
 htofdigitizer.cc:657
 htofdigitizer.cc:658
 htofdigitizer.cc:659
 htofdigitizer.cc:660
 htofdigitizer.cc:661
 htofdigitizer.cc:662
 htofdigitizer.cc:663
 htofdigitizer.cc:664
 htofdigitizer.cc:665
 htofdigitizer.cc:666
 htofdigitizer.cc:667
 htofdigitizer.cc:668
 htofdigitizer.cc:669
 htofdigitizer.cc:670
 htofdigitizer.cc:671
 htofdigitizer.cc:672
 htofdigitizer.cc:673
 htofdigitizer.cc:674
 htofdigitizer.cc:675
 htofdigitizer.cc:676
 htofdigitizer.cc:677
 htofdigitizer.cc:678
 htofdigitizer.cc:679
 htofdigitizer.cc:680
 htofdigitizer.cc:681
 htofdigitizer.cc:682
 htofdigitizer.cc:683
 htofdigitizer.cc:684
 htofdigitizer.cc:685
 htofdigitizer.cc:686
 htofdigitizer.cc:687
 htofdigitizer.cc:688
 htofdigitizer.cc:689
 htofdigitizer.cc:690
 htofdigitizer.cc:691
 htofdigitizer.cc:692
 htofdigitizer.cc:693
 htofdigitizer.cc:694
 htofdigitizer.cc:695
 htofdigitizer.cc:696
 htofdigitizer.cc:697
 htofdigitizer.cc:698
 htofdigitizer.cc:699
 htofdigitizer.cc:700
 htofdigitizer.cc:701
 htofdigitizer.cc:702
 htofdigitizer.cc:703
 htofdigitizer.cc:704
 htofdigitizer.cc:705
 htofdigitizer.cc:706
 htofdigitizer.cc:707
 htofdigitizer.cc:708
 htofdigitizer.cc:709
 htofdigitizer.cc:710
 htofdigitizer.cc:711
 htofdigitizer.cc:712
 htofdigitizer.cc:713
 htofdigitizer.cc:714
 htofdigitizer.cc:715
 htofdigitizer.cc:716
 htofdigitizer.cc:717
 htofdigitizer.cc:718
 htofdigitizer.cc:719
 htofdigitizer.cc:720
 htofdigitizer.cc:721
 htofdigitizer.cc:722
 htofdigitizer.cc:723
 htofdigitizer.cc:724
 htofdigitizer.cc:725
 htofdigitizer.cc:726
 htofdigitizer.cc:727
 htofdigitizer.cc:728
 htofdigitizer.cc:729
 htofdigitizer.cc:730
 htofdigitizer.cc:731
 htofdigitizer.cc:732
 htofdigitizer.cc:733
 htofdigitizer.cc:734
 htofdigitizer.cc:735
 htofdigitizer.cc:736
 htofdigitizer.cc:737
 htofdigitizer.cc:738
 htofdigitizer.cc:739
 htofdigitizer.cc:740
 htofdigitizer.cc:741
 htofdigitizer.cc:742
 htofdigitizer.cc:743
 htofdigitizer.cc:744
 htofdigitizer.cc:745
 htofdigitizer.cc:746
 htofdigitizer.cc:747
 htofdigitizer.cc:748
 htofdigitizer.cc:749
 htofdigitizer.cc:750
 htofdigitizer.cc:751
 htofdigitizer.cc:752
 htofdigitizer.cc:753
 htofdigitizer.cc:754
 htofdigitizer.cc:755
 htofdigitizer.cc:756
 htofdigitizer.cc:757
 htofdigitizer.cc:758
 htofdigitizer.cc:759
 htofdigitizer.cc:760
 htofdigitizer.cc:761
 htofdigitizer.cc:762
 htofdigitizer.cc:763
 htofdigitizer.cc:764
 htofdigitizer.cc:765
 htofdigitizer.cc:766
 htofdigitizer.cc:767
 htofdigitizer.cc:768
 htofdigitizer.cc:769
 htofdigitizer.cc:770
 htofdigitizer.cc:771
 htofdigitizer.cc:772
 htofdigitizer.cc:773
 htofdigitizer.cc:774
 htofdigitizer.cc:775
 htofdigitizer.cc:776
 htofdigitizer.cc:777
 htofdigitizer.cc:778
 htofdigitizer.cc:779
 htofdigitizer.cc:780
 htofdigitizer.cc:781
 htofdigitizer.cc:782
 htofdigitizer.cc:783
 htofdigitizer.cc:784
 htofdigitizer.cc:785
 htofdigitizer.cc:786
 htofdigitizer.cc:787
 htofdigitizer.cc:788
 htofdigitizer.cc:789
 htofdigitizer.cc:790
 htofdigitizer.cc:791
 htofdigitizer.cc:792
 htofdigitizer.cc:793
 htofdigitizer.cc:794
 htofdigitizer.cc:795
 htofdigitizer.cc:796
 htofdigitizer.cc:797
 htofdigitizer.cc:798
 htofdigitizer.cc:799
 htofdigitizer.cc:800
 htofdigitizer.cc:801
 htofdigitizer.cc:802
 htofdigitizer.cc:803
 htofdigitizer.cc:804
 htofdigitizer.cc:805
 htofdigitizer.cc:806
 htofdigitizer.cc:807
 htofdigitizer.cc:808
 htofdigitizer.cc:809
 htofdigitizer.cc:810
 htofdigitizer.cc:811
 htofdigitizer.cc:812
 htofdigitizer.cc:813
 htofdigitizer.cc:814
 htofdigitizer.cc:815
 htofdigitizer.cc:816
 htofdigitizer.cc:817
 htofdigitizer.cc:818
 htofdigitizer.cc:819
 htofdigitizer.cc:820
 htofdigitizer.cc:821
 htofdigitizer.cc:822
 htofdigitizer.cc:823
 htofdigitizer.cc:824
 htofdigitizer.cc:825
 htofdigitizer.cc:826
 htofdigitizer.cc:827
 htofdigitizer.cc:828
 htofdigitizer.cc:829
 htofdigitizer.cc:830
 htofdigitizer.cc:831
 htofdigitizer.cc:832
 htofdigitizer.cc:833
 htofdigitizer.cc:834
 htofdigitizer.cc:835
 htofdigitizer.cc:836
 htofdigitizer.cc:837
 htofdigitizer.cc:838
 htofdigitizer.cc:839
 htofdigitizer.cc:840
 htofdigitizer.cc:841
 htofdigitizer.cc:842
 htofdigitizer.cc:843
 htofdigitizer.cc:844
 htofdigitizer.cc:845
 htofdigitizer.cc:846
 htofdigitizer.cc:847
 htofdigitizer.cc:848
 htofdigitizer.cc:849
 htofdigitizer.cc:850
 htofdigitizer.cc:851
 htofdigitizer.cc:852
 htofdigitizer.cc:853
 htofdigitizer.cc:854
 htofdigitizer.cc:855
 htofdigitizer.cc:856
 htofdigitizer.cc:857
 htofdigitizer.cc:858
 htofdigitizer.cc:859
 htofdigitizer.cc:860
 htofdigitizer.cc:861
 htofdigitizer.cc:862
 htofdigitizer.cc:863
 htofdigitizer.cc:864
 htofdigitizer.cc:865
 htofdigitizer.cc:866
 htofdigitizer.cc:867
 htofdigitizer.cc:868
 htofdigitizer.cc:869
 htofdigitizer.cc:870
 htofdigitizer.cc:871
 htofdigitizer.cc:872
 htofdigitizer.cc:873
 htofdigitizer.cc:874
 htofdigitizer.cc:875
 htofdigitizer.cc:876
 htofdigitizer.cc:877
 htofdigitizer.cc:878
 htofdigitizer.cc:879
 htofdigitizer.cc:880
 htofdigitizer.cc:881
 htofdigitizer.cc:882
 htofdigitizer.cc:883
 htofdigitizer.cc:884
 htofdigitizer.cc:885
 htofdigitizer.cc:886
 htofdigitizer.cc:887
 htofdigitizer.cc:888
 htofdigitizer.cc:889
 htofdigitizer.cc:890
 htofdigitizer.cc:891
 htofdigitizer.cc:892
 htofdigitizer.cc:893
 htofdigitizer.cc:894
 htofdigitizer.cc:895
 htofdigitizer.cc:896
 htofdigitizer.cc:897
 htofdigitizer.cc:898
 htofdigitizer.cc:899
 htofdigitizer.cc:900
 htofdigitizer.cc:901
 htofdigitizer.cc:902
 htofdigitizer.cc:903
 htofdigitizer.cc:904
 htofdigitizer.cc:905
 htofdigitizer.cc:906
 htofdigitizer.cc:907
 htofdigitizer.cc:908
 htofdigitizer.cc:909
 htofdigitizer.cc:910
 htofdigitizer.cc:911
 htofdigitizer.cc:912
 htofdigitizer.cc:913
 htofdigitizer.cc:914
 htofdigitizer.cc:915
 htofdigitizer.cc:916
 htofdigitizer.cc:917
 htofdigitizer.cc:918
 htofdigitizer.cc:919
 htofdigitizer.cc:920
 htofdigitizer.cc:921
 htofdigitizer.cc:922
 htofdigitizer.cc:923
 htofdigitizer.cc:924
 htofdigitizer.cc:925
 htofdigitizer.cc:926
 htofdigitizer.cc:927
 htofdigitizer.cc:928
 htofdigitizer.cc:929
 htofdigitizer.cc:930
 htofdigitizer.cc:931
 htofdigitizer.cc:932
 htofdigitizer.cc:933
 htofdigitizer.cc:934
 htofdigitizer.cc:935
 htofdigitizer.cc:936
 htofdigitizer.cc:937
 htofdigitizer.cc:938
 htofdigitizer.cc:939
 htofdigitizer.cc:940
 htofdigitizer.cc:941
 htofdigitizer.cc:942
 htofdigitizer.cc:943
 htofdigitizer.cc:944
 htofdigitizer.cc:945
 htofdigitizer.cc:946
 htofdigitizer.cc:947
 htofdigitizer.cc:948
 htofdigitizer.cc:949
 htofdigitizer.cc:950
 htofdigitizer.cc:951
 htofdigitizer.cc:952
 htofdigitizer.cc:953
 htofdigitizer.cc:954
 htofdigitizer.cc:955
 htofdigitizer.cc:956
 htofdigitizer.cc:957
 htofdigitizer.cc:958
 htofdigitizer.cc:959
 htofdigitizer.cc:960
 htofdigitizer.cc:961
 htofdigitizer.cc:962
 htofdigitizer.cc:963
 htofdigitizer.cc:964
 htofdigitizer.cc:965
 htofdigitizer.cc:966
 htofdigitizer.cc:967
 htofdigitizer.cc:968
 htofdigitizer.cc:969
 htofdigitizer.cc:970
 htofdigitizer.cc:971
 htofdigitizer.cc:972
 htofdigitizer.cc:973
 htofdigitizer.cc:974
 htofdigitizer.cc:975
 htofdigitizer.cc:976
 htofdigitizer.cc:977
 htofdigitizer.cc:978
 htofdigitizer.cc:979
 htofdigitizer.cc:980
 htofdigitizer.cc:981
 htofdigitizer.cc:982
 htofdigitizer.cc:983
 htofdigitizer.cc:984
 htofdigitizer.cc:985
 htofdigitizer.cc:986
 htofdigitizer.cc:987
 htofdigitizer.cc:988
 htofdigitizer.cc:989
 htofdigitizer.cc:990
 htofdigitizer.cc:991
 htofdigitizer.cc:992
 htofdigitizer.cc:993
 htofdigitizer.cc:994
 htofdigitizer.cc:995
 htofdigitizer.cc:996
 htofdigitizer.cc:997
 htofdigitizer.cc:998
 htofdigitizer.cc:999
 htofdigitizer.cc:1000
 htofdigitizer.cc:1001
 htofdigitizer.cc:1002
 htofdigitizer.cc:1003
 htofdigitizer.cc:1004
 htofdigitizer.cc:1005
 htofdigitizer.cc:1006
 htofdigitizer.cc:1007
 htofdigitizer.cc:1008
 htofdigitizer.cc:1009
 htofdigitizer.cc:1010
 htofdigitizer.cc:1011
 htofdigitizer.cc:1012
 htofdigitizer.cc:1013
 htofdigitizer.cc:1014
 htofdigitizer.cc:1015
 htofdigitizer.cc:1016
 htofdigitizer.cc:1017
 htofdigitizer.cc:1018
 htofdigitizer.cc:1019
 htofdigitizer.cc:1020
 htofdigitizer.cc:1021
 htofdigitizer.cc:1022
 htofdigitizer.cc:1023
 htofdigitizer.cc:1024
 htofdigitizer.cc:1025
 htofdigitizer.cc:1026
 htofdigitizer.cc:1027
 htofdigitizer.cc:1028
 htofdigitizer.cc:1029
 htofdigitizer.cc:1030
 htofdigitizer.cc:1031
 htofdigitizer.cc:1032
 htofdigitizer.cc:1033
 htofdigitizer.cc:1034
 htofdigitizer.cc:1035
 htofdigitizer.cc:1036
 htofdigitizer.cc:1037
 htofdigitizer.cc:1038
 htofdigitizer.cc:1039
 htofdigitizer.cc:1040
 htofdigitizer.cc:1041
 htofdigitizer.cc:1042
 htofdigitizer.cc:1043
 htofdigitizer.cc:1044
 htofdigitizer.cc:1045
 htofdigitizer.cc:1046
 htofdigitizer.cc:1047
 htofdigitizer.cc:1048
 htofdigitizer.cc:1049
 htofdigitizer.cc:1050
 htofdigitizer.cc:1051
 htofdigitizer.cc:1052
 htofdigitizer.cc:1053
 htofdigitizer.cc:1054
 htofdigitizer.cc:1055
 htofdigitizer.cc:1056
 htofdigitizer.cc:1057
 htofdigitizer.cc:1058
 htofdigitizer.cc:1059
 htofdigitizer.cc:1060
 htofdigitizer.cc:1061
 htofdigitizer.cc:1062
 htofdigitizer.cc:1063
 htofdigitizer.cc:1064
 htofdigitizer.cc:1065
 htofdigitizer.cc:1066
 htofdigitizer.cc:1067
 htofdigitizer.cc:1068
 htofdigitizer.cc:1069
 htofdigitizer.cc:1070
 htofdigitizer.cc:1071
 htofdigitizer.cc:1072
 htofdigitizer.cc:1073
 htofdigitizer.cc:1074
 htofdigitizer.cc:1075
 htofdigitizer.cc:1076
 htofdigitizer.cc:1077
 htofdigitizer.cc:1078
 htofdigitizer.cc:1079
 htofdigitizer.cc:1080
 htofdigitizer.cc:1081
 htofdigitizer.cc:1082
 htofdigitizer.cc:1083
 htofdigitizer.cc:1084
 htofdigitizer.cc:1085
 htofdigitizer.cc:1086
 htofdigitizer.cc:1087
 htofdigitizer.cc:1088
 htofdigitizer.cc:1089
 htofdigitizer.cc:1090
 htofdigitizer.cc:1091
 htofdigitizer.cc:1092
 htofdigitizer.cc:1093
 htofdigitizer.cc:1094
 htofdigitizer.cc:1095
 htofdigitizer.cc:1096
 htofdigitizer.cc:1097
 htofdigitizer.cc:1098
 htofdigitizer.cc:1099
 htofdigitizer.cc:1100
 htofdigitizer.cc:1101
 htofdigitizer.cc:1102
 htofdigitizer.cc:1103
 htofdigitizer.cc:1104
 htofdigitizer.cc:1105
 htofdigitizer.cc:1106
 htofdigitizer.cc:1107
 htofdigitizer.cc:1108
 htofdigitizer.cc:1109
 htofdigitizer.cc:1110
 htofdigitizer.cc:1111
 htofdigitizer.cc:1112
 htofdigitizer.cc:1113
 htofdigitizer.cc:1114
 htofdigitizer.cc:1115
 htofdigitizer.cc:1116
 htofdigitizer.cc:1117
 htofdigitizer.cc:1118
 htofdigitizer.cc:1119
 htofdigitizer.cc:1120
 htofdigitizer.cc:1121
 htofdigitizer.cc:1122
 htofdigitizer.cc:1123
 htofdigitizer.cc:1124
 htofdigitizer.cc:1125
 htofdigitizer.cc:1126
 htofdigitizer.cc:1127
 htofdigitizer.cc:1128
 htofdigitizer.cc:1129
 htofdigitizer.cc:1130
 htofdigitizer.cc:1131
 htofdigitizer.cc:1132
 htofdigitizer.cc:1133
 htofdigitizer.cc:1134
 htofdigitizer.cc:1135
 htofdigitizer.cc:1136
 htofdigitizer.cc:1137
 htofdigitizer.cc:1138
 htofdigitizer.cc:1139
 htofdigitizer.cc:1140
 htofdigitizer.cc:1141
 htofdigitizer.cc:1142
 htofdigitizer.cc:1143
 htofdigitizer.cc:1144
 htofdigitizer.cc:1145
 htofdigitizer.cc:1146
 htofdigitizer.cc:1147
 htofdigitizer.cc:1148
 htofdigitizer.cc:1149
 htofdigitizer.cc:1150
 htofdigitizer.cc:1151
 htofdigitizer.cc:1152
 htofdigitizer.cc:1153
 htofdigitizer.cc:1154
 htofdigitizer.cc:1155
 htofdigitizer.cc:1156
 htofdigitizer.cc:1157
 htofdigitizer.cc:1158
 htofdigitizer.cc:1159
 htofdigitizer.cc:1160
 htofdigitizer.cc:1161
 htofdigitizer.cc:1162
 htofdigitizer.cc:1163
 htofdigitizer.cc:1164
 htofdigitizer.cc:1165
 htofdigitizer.cc:1166
 htofdigitizer.cc:1167