ROOT logo
//*-- Authors: Leszek Kidon & Jacek Otwinowski
//*-- Last Modified: 08/07/2001 (Marcin Jaskula)
//*-- Last Modified: 17/11/2005 (Jacek Otwinowski)
//*-- Last Modified: 05/12/2006 (Jacek Otwinowski)
//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////////////////////////
//
//  HShowerPadDigitizer
//
// This class digitizes the shower pads. For each fired wire it calculates all
// the pads which the charge couples to. For each pad the track numbers of the
// particles that fired the pad are stored in a linear category (HShowerTrack).
// This category is sortable, in particular the track numbers are sorted by
// the respective pad address.
// All the fired pads are stored in a matrix category (catShowerRawMatr,
// this matrix category is used only for the simulated data).
//
//  The Shower digitization is split into several tasks as shown
//  in the flow diagram below.
//
//   ----------------------                                                                               //
//  |     HShowerUnpacker  |                                                                              //
//  |   (embedding mode)   | \                                                                            //
//  |                      |  \      ------------------                                                   //
//   ----------------------   |     |  HGeantShower    |                                                  //
//                            |      ------------------\                                                  //
//                            |                         \                                                 //
//                            |      ------------------  \------------->  ----------------------          //
//                            |     |  HGeantWire      |   <------------ |  HShowerHitDigitizer |         //
//                            |      ------------------\                  ----------------------          //
//                            |                         \                                                 //
//                 -------------     ------------------  \------------->  -----------------------         //
//             -- | HShowerRaw  |   |  HShowerRawMatr  |   <------------ |  HShowerPadDigitizer  |        //
//            |    -------------     ------------------\                 |( creates track objects|        //
//            |                                         \                |  for real tracks in   |        //
//   ----------------------          ------------------  \               |  embedding mode too)  |        //
//  |   HShowerCalibrater  |        |  HShowerTrack    |  \<------------  -----------------------         //
//  |   (embedding mode)   |         ------------------\   \                                              //
//   ----------------------                             \   \             -----------------------         //
//            |                      ------------------  \   ----------> |   HShowerCopy         |        //
//             -------------------> |  HShowerCal      |  \<------------ |(add charge of real hit|        //
//                                   ------------------\   \             | in embedding too )    |        //
//                                                      \   \             -----------------------         //
//                                   ------------------  ----\--------->  -----------------------         //
//                                  |  HShowerHitHdr   |   <--\--------- |  HShowerHitFinder     |        //
//                                   ------------------        \          -----------------------         //
//                                   ------------------         \        |                                //
//                                  |  HShowerPID      |   <-----\-------|                                //
//                                   ------------------           \      |                                //
//                                   ------------------            \     |                                //
//                                  |  HShowerHit      |   <--------\----|                                //
//                                   ------------------ <            \                                    //
//                                                       \            \                                   //
//                                                        \-------------> ------------------------        //
//                                                                       | HShowerHitTrackMatcher |       //
//                                                                        ------------------------        //
//
//
//
//
//  In the case of TRACK EMBEDDING of simulated tracks into
//  experimental data the real data are written by the HShowerUnpacker into
//  HShowerRaw category. The real hits are taken into
//  account by the digitizer (adding of charges). 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)
//
//-------------------------------------------------
// Used to suppress the secondaries created in the
// SHOWER itself.
//        0 = realistic (secondaries included)
//        1 primary particle is stored
//        2 the first track number entering the SHOWER in SAME SECTOR is stored
//        3 the first track number entering the TOFINO in SAME SECTOR is stored
//          or the primary track if no TOFINO was found
//        4 (default) the first track number entering the TOFINO in SAME SECTOR is stored
//          or the first track in SHOWER if no TOFINO was found
//
//
//       The mode can be selected by static void HShowerPadDigitizer::setModeTrack(Int_t mode)
//
//////////////////////////////////////////////////////////////////////////////
#include "hshowerpaddigitizer.h"

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hshowerdetector.h"
#include "hcategory.h"
#include "hmatrixcategory.h"
#include "hlinearcategory.h"
#include "hlocation.h"
#include "hshowergeantwire.h"
#include "hshowercal.h"
#include "hshowertrack.h"
#include "hshowerdigipar.h"
#include "hshowergeometry.h"
#include "hdebug.h"
#include "hades.h"
#include "hgeantshower.h"
#include "hgeanttof.h"
#include "hgeantrpc.h"
#include "hgeantkine.h"
#include "showerdef.h"

#include "TMath.h"

#include <algorithm>

#define MIN(A,B) (((A) <= (B)) ? (A) : (B))
#define MAX(A,B) (((A) >= (B)) ? (A) : (B))
#define TABLE_SIZE 10

ClassImp(HShowerPadDigitizer)
Int_t HShowerPadDigitizer::modeTrack = 4;

HShowerPadDigitizer::HShowerPadDigitizer(const Text_t *name,const Text_t *title) :
  HShowerDigitizer(name,title)
{
  fTrackIter = NULL;
  fChannelCoeff = 256.0 / 60.0; // QDC calibration factor
  fShowerRawMatrIter = NULL;
  isRpc = kFALSE;
}

HShowerPadDigitizer::HShowerPadDigitizer()
{
  fTrackIter = NULL;
  fShowerRawMatrIter = NULL;
  isRpc = kFALSE;
}


HShowerPadDigitizer::~HShowerPadDigitizer(void) {
  if (fTrackIter) delete fTrackIter;
  if (fShowerRawMatrIter) delete fShowerRawMatrIter;

}

Bool_t HShowerPadDigitizer::init()
{
    // creates ShowerGeantWire(input), ShowerRawMatr(output) and ShowerTrack
    // categories and adds them to current event
    // creates an iterator for ShowerTrack category

    printf("initialization of shower pad digitizer \n");
    HCategory *pCat;
    HShowerDetector *pShowerDet = (HShowerDetector*)gHades->getSetup()->getDetector("Shower");

    pCat=gHades->getCurrentEvent()->getCategory(catShowerGeantWire);
    if (!pCat) {
	pCat=pShowerDet->buildCategory(catShowerGeantWire);

	if (!pCat) return kFALSE;
	else gHades->getCurrentEvent()->addCategory(catShowerGeantWire, pCat, "Shower");
    }
    setInCat(pCat);

    pCat=gHades->getCurrentEvent()->getCategory(catShowerRawMatr);
    if (!pCat) {
	pCat=pShowerDet->buildCategory(catShowerRawMatr);

	if (!pCat) return kFALSE;
	else {
	    gHades->getCurrentEvent()->addCategory(catShowerRawMatr, pCat, "Shower");
	}
    }
    setOutCat(pCat);
	if(pCat) fShowerRawMatrIter=(HIterator*)pCat->MakeIterator("native");

    if(gHades->getEmbeddingMode()>0)
    {   // we need to get the HShowerCal catgeory
        // in addition
	pCat=gHades->getCurrentEvent()->getCategory(catShowerCal);
	if (!pCat) {
            Error("init()","No catShowerCal in input ... needed for embedding!");
	    return kFALSE;
	}
	if(pCat) fShowerCalIter= (HIterator*)pCat->MakeIterator("native");
    }

    pCat=gHades->getCurrentEvent()->getCategory(catShowerTrack);
    if (!pCat) {
	pCat=pShowerDet->buildCategory(catShowerTrack);

	if (!pCat) return kFALSE;
	else gHades->getCurrentEvent()->addCategory(catShowerTrack, pCat, "Shower");
    }

    setTrackCat(pCat);
    fTrackIter = (HIterator*)getTrackCat()->MakeIterator("native");

    //------------------------------------------
    // getting sim categories
    fGeantKineCat = (HLinearCategory*)gHades->getCurrentEvent()->getCategory(catGeantKine);
    if(!fGeantKineCat){
	Error("init()","Received Zero pointer for catGeantKine!");
        return kFALSE;
    }
    fGeantShowerCat = (HLinearCategory*)gHades->getCurrentEvent()->getCategory(catShowerGeantRaw);
    if(!fGeantShowerCat){
	Error("init()","Received Zero pointer for catShowerGeantRaw!");
        return kFALSE;
    }
    fGeantTofCat = (HLinearCategory*)gHades->getCurrentEvent()->getCategory(catTofGeantRaw);
    if(!fGeantTofCat){
	Warning("init()","Received Zero pointer for catTofGeantRaw!");
    }
    fGeantRpcCat = (HLinearCategory*)gHades->getCurrentEvent()->getCategory(catRpcGeantRaw);
    if(!fGeantRpcCat){
	Warning("init()","Received Zero pointer for catRpcGeantRaw!");
    }

    if (!fGeantRpcCat && !fGeantTofCat) return kFALSE;

    if (fGeantRpcCat) isRpc = kTRUE;
    //------------------------------------------


    return HShowerDigitizer::init();
}

HShowerPadDigitizer& HShowerPadDigitizer::operator=(HShowerPadDigitizer &c) {
// It should have been done
  return c;
}

Int_t HShowerPadDigitizer::execute()
{

    trackMap.clear();    // filled in digitize()->digiPads()->updatePad()

    if(gHades->getEmbeddingMode() > 0 && gHades->getEmbeddingDebug()!=1)
    {
	//---------------------------------------------------------------
	// loop over ShowerCal category and create the
	// corresponding HShowerTrack for the real data objects.

	HLocation loc;
	loc.set(4,0,0,0);
	HShowerCal *pCal;
	fShowerCalIter->Reset();
        HShowerRaw pRaw;
	while ((pCal = (HShowerCal *)fShowerCalIter->Next()) != 0)
	{
	    loc[0] = pCal->getSector();
	    loc[1] = pCal->getModule();
	    loc[2] = pCal->getRow();
	    loc[3] = pCal->getCol();
	    pRaw.setSector(loc[0]);
            pRaw.setModule(loc[1]);
            pRaw.setRow(loc[2]);
            pRaw.setCol(loc[3]);

	    //------------------------------------------------------------
            // add pads to track map
	    Int_t addTr = pCal->getAddress();
	    vector<Int_t> v;
	    v.push_back(gHades->getEmbeddingRealTrackId());
	    trackMap.insert( make_pair( addTr, v ) );
            //------------------------------------------------------------
	}
    }
    //---------------------------------------------------------------


    //---------------------------------------------------------------
    TObject *pHit;

    lNrEvent++;
    fIter->Reset();
    while((pHit = fIter->Next()))
    {
	   digitize(pHit);
    }
    //---------------------------------------------------------------



    //---------------------------------------------------------------
    // create HShowerTrack object for each unique track of the fired pad
    HShowerTrack*  pShowerTrack;
    HLocation loc;
    Int_t s,m,row,col;

    vector<Int_t> check;
    for( map<Int_t, vector<Int_t> >::iterator iter = trackMap.begin(); iter != trackMap.end(); ++iter)
    {

	vector<Int_t>& list = iter ->second;
	Int_t nAddress      = iter ->first;

	s   =  nAddress                       /100000;
	m   = (nAddress - 100000*s)           / 10000;
	row = (nAddress - 100000*s - 10000*m) /   100;
	col = (nAddress - 100000*s - 10000*m - 100*row);

	loc.set(4,s,m,row,col);

        Int_t n = list.size();

	std::sort( list.begin(), list.end() ); // sort increasing order : real,primary,secondary with TOF,secondary with no TOF

	check.clear();
	for( Int_t i = 0; i < n; ++ i ) {
	    Int_t nTrack  = list[i];
	    if(     nTrack > 100000000) { nTrack -= 100000000; }     // secondary with no TOF
	    else if(nTrack >     10000) { nTrack -=     10000; }     // secondary with TOF
            else if(nTrack >         0) {                      }     // primary
	    else if(nTrack < 0)         {                      }     // real
	    if (i > 0 && find( check.begin(), check.end(), nTrack ) != check.end() ){
		// track exists already .... nothing todo
	    } else {
                // new track ... create HShowerTrack
		check.push_back(nTrack);

		pShowerTrack = (HShowerTrack*)((HLinearCategory*)getTrackCat())->getNewSlot(loc);

		if (pShowerTrack) {
		    pShowerTrack = new(pShowerTrack) HShowerTrack;
		    pShowerTrack->setAddress(nAddress);
		    pShowerTrack->setTrack(nTrack);
		}
	    }
	}
    }
    //---------------------------------------------------------------


    //---------------------------------------------------------------
    // gain and efficiency
    Double_t fQ;
    HShowerRawMatr *pRawMatr;
    fShowerRawMatrIter->Reset();
    while((pRawMatr = (HShowerRawMatr*)fShowerRawMatrIter->Next()))
    {
	   // calculate gain
	   fQ = gainCharge(pRawMatr);
	   pRawMatr->setCharge(fQ);

	   // effciency model good for post1 and post2
	   if(!checkEfficiency(pRawMatr)) {
	      pRawMatr->setCharge(0.0);
	   }
	}
    //---------------------------------------------------------------

    sort();   // this is used to call the track sort() in pad digitizer

    return 0;
}


Bool_t HShowerPadDigitizer::digitize(TObject *pHit) {
#if DEBUG_LEVEL>2
  gDebuger->enterFunc("HShowerPadDigitizer::execute");
  gDebuger->message("Hit  cat points to %p",pHit);
#endif

  HShowerGeantWire *pGeantWire = (HShowerGeantWire*) pHit;
  if (pGeantWire) {
    digiPads(pGeantWire);
  }

#if DEBUG_LEVEL>2
  gDebuger->leaveFunc("HShowerPadDigitizer::execute");
#endif

  return (pGeantWire) ? kTRUE : kFALSE;
}

Int_t HShowerPadDigitizer::sort() {
//    if (((HLinearCategory*)getTrackCat())->IsSortable())
    ((HLinearCategory*)getTrackCat())->sort();
    return 0;
}

Int_t HShowerPadDigitizer::findFirstHitInShower(Int_t trackID)
{
    //-------------------------------------------------
    // Used to suppress the secondaries created in the
    // SHOWER itself.
    //        0 = realistic (secondaries included)
    //        1 primary particle is stored
    //        2 the first track number entering the SHOWER in SAME SECTOR is stored
    //        3 the first track number entering the TOFINO in SAME SECTOR is stored
    //          or the primary track if no TOFINO was found
    //        4 (default) the first track number entering the TOFINO in SAME SECTOR is stored
    //          or the first track in SHOWER if no TOFINO was found


    Int_t numTrack = trackID;

    if(numTrack <= 0) return numTrack; // nothing to do for negative track numbers

    //--------------------------------------
    // case 0  : in = out
    if(modeTrack == 0) { return numTrack; }

    HGeantShower *poldShower;
    Int_t first = 0;
    Int_t parent= 0;

    HGeantKine* kine = (HGeantKine*)fGeantKineCat->getObject(numTrack - 1);
    if(kine){
        parent = kine->getParentTrack();

	if( parent == 0) {  return numTrack; } // nothing todo

	first = kine->getFirstShowerHit();
	if(first != -1){
	    poldShower = (HGeantShower*)fGeantShowerCat->getObject(first);
	} else {
	    Error("findFirstHitInShower()","No first shower hit!");
	    return numTrack;
	}

    } else {
	Error("findFirstHitInShower()","Received Zero pointer for kine!");
	return numTrack;
    }
    if(numTrack != poldShower->getTrack()){
	Error("findFirstHitInShower()","First shower hit not same trackID!");
	return numTrack;
    }

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


    Int_t s = poldShower->getSector();

    //--------------------------------------
    // case 1  : in -> primary
    if(modeTrack == 1)
    {   // return track number of primary particle
	// of the given track

	kine = HGeantKine::getPrimary(numTrack,fGeantKineCat);
	return kine->getTrack();
    }

    //--------------------------------------
    // case 2 and 3  : entering SHOWER/TOF

    Int_t tempTrack = numTrack;
    first           = 0;

    //--------------------------------------
    // case 2  : entering SHOWER
    if(modeTrack == 2)
    {
	while((kine = kine->getParent(tempTrack,fGeantKineCat)) != 0)
	{
	    first = kine->getFirstShowerHit();
	    if(first != -1)
	    {
		// track is still in SHOWER

		HGeantShower* gshower = (HGeantShower*)fGeantShowerCat->getObject(first);
		Int_t s1 = gshower->getSector();

		if(s == s1)
		{   // check only sector
		    tempTrack = kine->getTrack();
		} else {
		    // track has no SHOWER hit any longer
		    // which fulfills the condition
		    break;
		}
	    } else {
		// track has no SHOWER hit any longer,
		// so the previous object was the one we
		// searched for
		break;
	    }
	}
        return tempTrack;
    }
    //--------------------------------------

    //--------------------------------------
    // case 3  : entering TOFINO
    if(modeTrack >= 3)
    {
	Bool_t foundTof  = kFALSE;
	Int_t tempTrack2 = tempTrack;
	do {
	    first = kine->getFirstTofHit();
	    if(first != -1)
	    { // we are in TOF
		HGeantTof* gtof = (HGeantTof*)fGeantTofCat->getObject(first);
		Int_t s1 = gtof->getSector();
		Int_t m  = gtof->getModule();

		if(s == s1 && m > 21 )
		{   // check only sector + TOFINO
		    foundTof  = kTRUE;
		    tempTrack = tempTrack2;
		}
	    }
	    tempTrack2 = kine->getParentTrack();

	} while( tempTrack2 > 0 && (kine = (HGeantKine*)fGeantKineCat->getObject(tempTrack2 - 1)) != 0);

	if(foundTof) { tempTrack += 10000; }
        else {
	    kine = (HGeantKine*)fGeantKineCat->getObject(numTrack - 1);


	    if( modeTrack == 3 ){
		// store primaries if no TOFino was found
		kine = HGeantKine::getPrimary(numTrack,fGeantKineCat);
		tempTrack = kine->getTrack() + 100000000;
	    } else if (modeTrack == 4){
        	//--------------------------------------
                // recover first particle entering SHOWER
		while((kine = kine->getParent(tempTrack,fGeantKineCat)) != 0)
		{
		    first = kine->getFirstShowerHit();
		    if(first != -1)
		    {
			// track is still in SHOWER
			HGeantShower* gshower = (HGeantShower*)fGeantShowerCat->getObject(first);
			Int_t s1 = gshower->getSector();

			if(s == s1)
			{   // check only sector
			    tempTrack = kine->getTrack();
			} else {
			    // track has no SHOWER hit any longer
			    // which fulfills the condition
			    break;
			}
		    } else {
			// track has no SHOWER hit any longer,
			// so the previous object was the one we
			// searched for
			break;
		    }
		}
		tempTrack += 100000000;
		//--------------------------------------
	    }
	}
    }
    //--------------------------------------

    return tempTrack;
}

Int_t HShowerPadDigitizer::findFirstHitInRpc(Int_t trackID)
{
    //-------------------------------------------------
    // Used to suppress the secondaries created in the
    // SHOWER itself.
    //        0 = realistic (secondaries included)
    //        1 primary particle is stored
    //        2 the first track number entering the SHOWER in SAME SECTOR is stored
    //        3 the first track number entering the RPC in SAME SECTOR is stored
    //          or the primary track if no RPC was found
    //        4 (default) the first track number entering the RPC in SAME SECTOR is stored
    //          or the first track in SHOWER if no RPC was found


    Int_t numTrack = trackID;

    if(numTrack <= 0) return numTrack; // nothing to do for negative track numbers

    //--------------------------------------
    // case 0  : in = out
    if(modeTrack == 0) { return numTrack; }

    HGeantShower *poldShower;
    Int_t first = 0;
    Int_t parent= 0;

    HGeantKine* kine = (HGeantKine*)fGeantKineCat->getObject(numTrack - 1);
    if(kine){
        parent = kine->getParentTrack();

	if( parent == 0) {  return numTrack; } // nothing todo

	first = kine->getFirstShowerHit();
	if(first != -1){
	    poldShower = (HGeantShower*)fGeantShowerCat->getObject(first);
	} else {
	    Error("findFirstHitInRpc()","No first shower hit!");
	    return numTrack;
	}

    } else {
	Error("findFirstHitInRpc()","Received Zero pointer for kine!");
	return numTrack;
    }
    if(numTrack != poldShower->getTrack()){
	Error("findFirstHitInRpc()","First shower hit not same trackID!");
	return numTrack;
    }

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


    Int_t s = poldShower->getSector();

    //--------------------------------------
    // case 1  : in -> primary
    if(modeTrack == 1)
    {   // return track number of primary particle
	// of the given track

	kine = HGeantKine::getPrimary(numTrack,fGeantKineCat);
	return kine->getTrack();
    }

    //--------------------------------------
    // case 2 and 3  : entering SHOWER/RPC

    Int_t tempTrack = numTrack;
    first           = 0;

    //--------------------------------------
    // case 2  : entering SHOWER
    if(modeTrack == 2)
    {
	while((kine = kine->getParent(tempTrack,fGeantKineCat)) != 0)
	{
	    first = kine->getFirstShowerHit();
	    if(first != -1)
	    {
		// track is still in SHOWER

		HGeantShower* gshower = (HGeantShower*)fGeantShowerCat->getObject(first);
		Int_t s1 = gshower->getSector();

		if(s == s1)
		{   // check only sector
		    tempTrack = kine->getTrack();
		} else {
		    // track has no SHOWER hit any longer
		    // which fulfills the condition
		    break;
		}
	    } else {
		// track has no SHOWER hit any longer,
		// so the previous object was the one we
		// searched for
		break;
	    }
	}
        return tempTrack;
    }
    //--------------------------------------

    //--------------------------------------
    // case 3  : entering RPC
    if(modeTrack >= 3)
    {
	Bool_t foundRPC  = kFALSE;
	Int_t tempTrack2 = tempTrack;
	do {
	    first = kine->getFirstRpcHit();
	    if(first != -1)
	    { // we are in TOF
		HGeantRpc* grpc = (HGeantRpc*)fGeantRpcCat->getObject(first);
		Int_t s1 = grpc->getSector();

		if(s == s1)
		{   // check only sector + RPC
		    foundRPC  = kTRUE;
		    tempTrack = tempTrack2;
		}
	    }
	    tempTrack2 = kine->getParentTrack();

	} while( tempTrack2 > 0 && (kine = (HGeantKine*)fGeantKineCat->getObject(tempTrack2 - 1)) != 0);

	if(foundRPC) { tempTrack += 10000; }
        else {
	    kine = (HGeantKine*)fGeantKineCat->getObject(numTrack - 1);


	    if( modeTrack == 3 ){
		// store primaries if no RPC was found
		kine = HGeantKine::getPrimary(numTrack,fGeantKineCat);
		tempTrack = kine->getTrack() + 100000000;
	    } else if (modeTrack == 4){
        	//--------------------------------------
                // recover first particle entering SHOWER
		while((kine = kine->getParent(tempTrack,fGeantKineCat)) != 0)
		{
		    first = kine->getFirstShowerHit();
		    if(first != -1)
		    {
			// track is still in SHOWER
			HGeantShower* gshower = (HGeantShower*)fGeantShowerCat->getObject(first);
			Int_t s1 = gshower->getSector();

			if(s == s1)
			{   // check only sector
			    tempTrack = kine->getTrack();
			} else {
			    // track has no SHOWER hit any longer
			    // which fulfills the condition
			    break;
			}
		    } else {
			// track has no SHOWER hit any longer,
			// so the previous object was the one we
			// searched for
			break;
		    }
		}
		tempTrack += 100000000;
		//--------------------------------------
	    }
	}
    }
    //--------------------------------------

    return tempTrack;
}

Int_t HShowerPadDigitizer::findFirstHit(Int_t trackID)
{
    if(isRpc) {return findFirstHitInRpc   (trackID);}
    else      {return findFirstHitInShower(trackID);}
}


void HShowerPadDigitizer::updatePad(HShowerPad *pPad, Float_t fIndQ, Int_t nSect, Int_t nMod, Int_t nTrack)
{
   Int_t nRow, nCol;
   HShowerRaw *pShowerRaw=NULL;
   HLocation loc;
   Float_t fUpdateThreshold = pDigiPar->getUpdatePadThreshold();

   pPad->getPadPos(&nRow, &nCol);
   loc.set(4, nSect, nMod, nRow, nCol);

   pShowerRaw = (HShowerRaw*)((HMatrixCategory*)getOutCat())->getObject(loc);
   if (!pShowerRaw)
   {
      pShowerRaw = (HShowerRaw*)((HMatrixCategory*)getOutCat())->getSlot(loc);
      if (pShowerRaw != NULL)
      {
        pShowerRaw = new(pShowerRaw) HShowerRaw;
        pShowerRaw->setSector(loc[0]);
        pShowerRaw->setModule(loc[1]);
        pShowerRaw->setRow(loc[2]);
        pShowerRaw->setCol(loc[3]);
      }
   }

    if(pShowerRaw)
    {
        pShowerRaw->addCharge(fIndQ);

	if(pShowerRaw->getCharge() >= fUpdateThreshold) {

	    Int_t tempTrack = findFirstHit(nTrack);
	    //------------------------------------------------------------
	    Int_t addTr   = pShowerRaw->getAddress();
	    map<Int_t,vector<Int_t> >::iterator pos  = trackMap.find(addTr);
	    if( pos == trackMap.end() ) {  // address not yet registered
		vector<Int_t> v;
		v.push_back(tempTrack);
		trackMap.insert( make_pair( addTr, v ) );
	    } else {                       // add track to the list of the pad
		(pos->second).push_back(tempTrack);
	    }
	    //------------------------------------------------------------

	}
    }
}

Float_t HShowerPadDigitizer::calcCharge(Float_t charge, Float_t dist,
                Float_t Xd, Float_t Yd, Float_t Xu, Float_t Yu) {
//charge density matrix is calculated

const Float_t twoPI = 6.28318530718;

return ((charge/twoPI)*(
                      atan(Xd*Yd/(dist*sqrt(dist*dist+Xd*Xd+Yd*Yd))) -
                      atan(Xd*Yu/(dist*sqrt(dist*dist+Xd*Xd+Yu*Yu))) +
                      atan(Xu*Yu/(dist*sqrt(dist*dist+Xu*Xu+Yu*Yu))) -
                      atan(Xu*Yd/(dist*sqrt(dist*dist+Xu*Xu+Yd*Yd)))));
}

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

void HShowerPadDigitizer::digiPads(HShowerGeantWire* pWireHit)
{
Float_t fX, fY, fQ;
Float_t factor;
Float_t sum;
Int_t   nPadX, nPadY, nPadRange;
Float_t pChargeTable[MAX_PADS_DIST];
Int_t     iMaxInArray, m;
HShowerPad *pTmpPad;
HShowerPad *pCPad;
Float_t fPadThreshold    = pDigiPar->getPadThreshold();
Float_t fUpdateThreshold = pDigiPar->getUpdatePadThreshold();
HShowerPadTab *pPadParam = pGeometry->getPadParam(pWireHit->getModule());

    // don't calculate if charge belowe threshold
    if((fQ = pWireHit->getCharge()) < fUpdateThreshold)
        return;
        
    pWireHit->getXY(&fX, &fY);

            //row = Y,col = X
    if((pCPad = pPadParam->getPad(fX, fY)) == NULL)
        return;

    pCPad->getPadPos(&nPadY, &nPadX);  //row = Y; col = X
    iMaxInArray = MAX_PADS_DIST;
    nPadRange   = (MAX_PADS_DIST - 1) / 2;

    if(numericalCalc(pCPad, pWireHit, pChargeTable) != 0)
        return;

        // calculate sum for the first renormalization
    sum = 0.0f;
    for(m = 0; m < iMaxInArray; m++)
        sum += pChargeTable[m];

    if(sum <= 0.0f)
        return;

    factor = fQ / sum;
    for(m = 0; m < iMaxInArray; m++)
    {
        pChargeTable[m] *= factor;
    }

        // calculate sum for a renormalization
    sum = 0.0f;
    for(m = 0; m < iMaxInArray; m++)
    {
        if(pChargeTable[m] >= fPadThreshold)
            sum += pChargeTable[m];
        else
            pChargeTable[m] = 0.0f;
    }

        // if sum is below threshold put all charge to the central pad
    if(sum < fPadThreshold)
    {
        for(m = 0; m < iMaxInArray; m++)
            pChargeTable[m] = 0.0f;

        pChargeTable[nPadRange] = fQ;
    }
    else
    {
            // renormalization: sum of the charge on the pads
            //                  must be equal to the charge on the wire
        factor = fQ / sum;

        for(m = 0; m < iMaxInArray; m++)
        {
            if(pChargeTable[m] > 0.0f)
                pChargeTable[m] *= factor;
        }
    }

    for(m = 0; m < iMaxInArray; m++)
    {
        pTmpPad = pPadParam->getPad(nPadY, nPadX + m - nPadRange);
        if(((m == nPadRange) || (pChargeTable[m] >= fPadThreshold))
                && (pTmpPad != NULL) && (pTmpPad->getPadFlag()))
        {
            updatePad(pTmpPad, pChargeTable[m], pWireHit->getSector(),
                        pWireHit->getModule(), pWireHit->getTrack());
        }
    }
}
//---------------------------------------------------------
Double_t HShowerPadDigitizer::gainCharge(HShowerRawMatr *pRawMatr) 
{
// gain charge in simulation

  return pRawMatr->getCharge()*pDigiPar->getGain(pRawMatr->getSector(),
                                                 pRawMatr->getModule());
}

//---------------------------------------------------------
Bool_t HShowerPadDigitizer::checkEfficiency(HShowerRawMatr *pRawMatr) 
{
// check efficiency 
// model good for post converters

// if pre-converter
if(pRawMatr->getModule() == 0) return kTRUE;

Double_t threshold = pDigiPar->getThreshold(pRawMatr->getSector(),pRawMatr->getModule());

   if(pRawMatr->getCharge() > threshold) return kTRUE;
   else return kFALSE;
}

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

Int_t HShowerPadDigitizer::calcLimit(Float_t fCor, Int_t nMatrixRange,
                                                            Float_t fBoxSize)
{
//charge density matrix is delimited to the sensitive area which covers fired pads


  Int_t k, nLimit;

  k = (Int_t)((fabs(fCor) + 0.5*fBoxSize)/fBoxSize);

  if (fCor < 0 )
     nLimit = (k>nMatrixRange) ? 0 : nMatrixRange - k;
  else
     nLimit = (k>nMatrixRange) ? 2*nMatrixRange : nMatrixRange + k;

  return nLimit;
}


void HShowerPadDigitizer::moveCoord(HShowerPad *pPad,Float_t distWire, Float_t fDx, Float_t fDy,
          Float_t *corXld, Float_t *corYld, Float_t *corXlu, Float_t *corYlu,
          Float_t *corXrd, Float_t *corYrd, Float_t *corXru, Float_t *corYru) {
// moves charge density matrix to the place where is placed induced charge on the sense wire

  *corXld = pPad->getXld() - fDx;
// *corYld = pPad->getYld() - fDy;
  *corYld =  fDy - fDy - distWire;
  *corXlu = pPad->getXlu() - fDx;
//  *corYlu = pPad->getYlu() - fDy;
  *corYlu = fDy - fDy + distWire;
  *corXrd = pPad->getXrd() - fDx;
//  *corYrd = pPad->getYrd() - fDy;
  *corYrd = fDy - fDy - distWire;
  *corXru = pPad->getXru() - fDx;
//  *corYru = pPad->getYru() - fDy;
  *corYru = fDy - fDy + distWire;
}


void HShowerPadDigitizer::analyticCalc(HShowerPad *pPad, HShowerGeantWire* pWireHit)
{
// this function calculates charge induced on pad analytically
// it is useful only for square or rectangular pads
  Float_t fX, fY;
  Float_t fIndQ;

  Float_t corXld, corYld, corXlu, corYlu;
  Float_t corXrd, corYrd, corXru, corYru;
  pWireHit->getXY(&fX, &fY);

  Int_t nModule = pWireHit->getModule();

  HShowerWireTab *pfWire = pGeometry->getWireTab(nModule);
  Float_t distWire  = pfWire->getDistWire();

//  cout <<  " distWire " << distWire << endl;



  moveCoord(pPad, distWire, fX, fY, &corXld, &corYld, &corXlu, &corYlu,
                                &corXrd, &corYrd, &corXru, &corYru);

  fIndQ =  calcCharge(pWireHit->getCharge(),
     pDigiPar->getPlaneDist(),
     corXld, corYld, corXru, corYru);

  updatePad(pPad, fIndQ, pWireHit->getSector(),
                         pWireHit->getModule(), pWireHit->getTrack());
}

//------------------------------------------------------------------------------

Int_t HShowerPadDigitizer::numericalCalc(HShowerPad *pPad,
            HShowerGeantWire* pWireHit, Float_t pfValues[MAX_PADS_DIST])
{
Float_t       fAl, fAr, fBl, fBr;
Float_t       fXd, fXu, fYd, fYu;
Float_t       fXmin, fXmax;
Float_t       fYmin, fYmax;
Float_t       fWireX, fWireY;
Float_t       fY, fX, fQ;
Int_t         i;
HShowerFrameCorner *pCorner;

    if((pPad == NULL) || (pPad->getPadFlag() == 0))
        return -1;

  Int_t iModule                 = pWireHit->getModule();
  HShowerFrame *pFrame          = pGeometry->getFrame(iModule);
  Float_t fDistWire             = pGeometry->getWireTab(iModule)->getDistWire();
  Int_t iMatrixRange            = pDigiPar->getMatrixRange();
  Float_t fBoxSize              = pDigiPar->getBoxSize();
  const Float_t* pfChargeMatrix = pDigiPar->getChargeMatrix();

        // left border
    if((pPad->getPadFlag() == 2) && (pPad->getXld() < 0.0))
    {
        pCorner = pFrame->getCorner(0);
        fXd = pCorner->getX();
        fYd = pCorner->getY();

        pCorner = pFrame->getCorner(1);
        fXu = pCorner->getX();
        fYu = pCorner->getY();
    }
    else
    {
        fXd = pPad->getXld();
        fYd = pPad->getYld();
        fXu = pPad->getXlu();
        fYu = pPad->getYlu();
    }

    fAl = (fXu - fXd) / (fYu - fYd);
    fBl = fXu - fAl * fYu;

        // right border
    if((pPad->getPadFlag() == 2) && (pPad->getXld() >= 0.0))
    {
        pCorner = pFrame->getCorner(3);
        fXd = pCorner->getX();
        fYd = pCorner->getY();

        pCorner = pFrame->getCorner(2);
        fXu = pCorner->getX();
        fYu = pCorner->getY();
    }
    else
    {
        fXd = pPad->getXrd();
        fYd = pPad->getYrd();
        fXu = pPad->getXru();
        fYu = pPad->getYru();
    }

    fAr = (fXu - fXd) / (fYu - fYd);
    fBr = fXu - fAr * fYu;

        // range of the charge matrix
    pWireHit->getXY(&fWireX, &fWireY);
    fXmin = fWireX - iMatrixRange * fBoxSize;
    fXmax = fWireX + iMatrixRange * fBoxSize;
    fYmin = fWireY - fDistWire + 0.5 * fBoxSize;
    fYmax = fWireY + fDistWire - 0.5 * fBoxSize;

    memset(pfValues, 0, MAX_PADS_DIST * sizeof(Float_t));

    for(fY = fYmin; fY <= fYmax; fY += fBoxSize)
    {
            // left border
        if((fX = fAl * fY + fBl) >= fXmin && (fWireX-fX) >= 0.0)
        {
            i = (int)((fX - fXmin) / fBoxSize);
	    if(i>2*iMatrixRange||i<0)
	    {
			cout << " left border fWireX-fX " << fWireX-fX <<  endl;
			cout << " fXd,fYd,fXu,fYu " << pPad->getXld() <<","<< pPad->getYld() << ","<< pPad->getXlu() << ","<< pPad->getYlu() <<  endl;
		Error("numericalCalc()","left border matrix : max %i, ind %i, fX %7.4f, fXmin %7.4f, fWireX %7.4f,fBoxSize %5.3f, PadNr %i",2*iMatrixRange,i,fX,fXmin,fWireX,fBoxSize,pPad->getPadNr());
		continue;
	    }
	    pfValues[0] += pfChargeMatrix[i];
            fQ = pfChargeMatrix[i];
        }
        else
            fQ = 0.0f;

            // right border
        if((fX = fAr * fY + fBr) <= fXmax && (fWireX-fX) <= 0.0)
        {
            i = (int)((fX - fXmin) / fBoxSize);
 	    if(i>2*iMatrixRange||i<0)
	    {
		cout << " right border fWireX-fX " << fWireX-fX <<  endl;
		cout << " fXd,fYd,fXu,fYu " << pPad->getXrd() <<","<< pPad->getYrd() << ","<< pPad->getXru() << ","<< pPad->getYru() <<  endl;

		Error("numericalCalc()","right border matrix : max %i, ind %i, fX %7.4f, fXmin %7.4f, fWireX %7.4f, fBoxSize %5.3f, PadNr %i",2*iMatrixRange,i,fX,fXmin,fWireX,fBoxSize,pPad->getPadNr());
		continue;
	    }
	    	pfValues[1] += pfChargeMatrix[i] - fQ;
            pfValues[2] += pfChargeMatrix[2 * iMatrixRange] - pfChargeMatrix[i];
        }
        else
            pfValues[1] += pfChargeMatrix[2 * iMatrixRange] - fQ;
    }

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