ROOT logo
#include "hgeantmdc.h"
#include "hgeantkine.h"
#include "hmdcdigitizer.h"
#include "hmdcdef.h"
#include "hdebug.h"
#include "hades.h"
#include "hmdcgeantcell.h"
#include "hmdccal1sim.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hevent.h"
#include "hcategory.h"
#include "hlocation.h"
#include "hmdclayergeompar.h"
#include "hmdcdigitpar.h"
#include "hmdccal2parsim.h"
#include "hmdccelleff.h"
#include "hmdcwirestat.h"
#include "hmessagemgr.h"
#include "hmdcsizescells.h"
#include "hmdcdedx2.h"
#include "hmdctimecut.h"
#include "hmdcgeomstruct.h"

#include "TMath.h"
#include "TFile.h"
#include "TGraph.h"

#include <iostream>
#include <iomanip>
#include <iomanip>
#include <map>
using namespace std;

//*-- Author : A.Nekhaev
//*-- Modified: 17/01/2001 by Ilse Koenig
//*-- Modified: 05/11/2001 by J.Markert
//*-- Modified: 1/12/2000 by R. Holzmann
//*-- Modified: 30/07/99 by Ilse Koenig
//*-- Modified: 28/06/99 by Alexander Nekhaev

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////
//
//  HMdcDigitizer digitizes data and puts output values into 
//  CAL1 category for simulated data
//  OPTIONS:
//
//  -----------------------                                ------------
//  |     HMdcUnpacker     |                               | HGeantMdc |
//  |   (embedding mode)   | \                             ------------
//  |                      |  \                                 ||
//  -----------------------    \                                || input to digitizer
//                              \                               \/
//                          --------------    read real    ------------------
//                          | HMdcCal1Sim | ------------>  |  HMdcDigitizer  |
//                          --------------   <-----------  |                 |
//                                            write output |                 |
//                                                         ------------------
//
//  HMdcDigitizer("","",option,flag)
//
//  option=1   : TDC mode for two measured leading edges of two signals
//  option=2   : TDC mode for  measured leading and trailing edge of one signal
//  flag=kTRUE : NTuple with internal variables of the digitizer will be filled and written
//               to the outputfile digitizer.root inside the working directory
//  flag=kFALSE: No NTuple is filled
//------------------------------------------------------------------------------------------------------
//  setNTuple(kFALSE) no nTuple with internal data is filled and written out
//           (kTRUE ) a NTuple with internal data is filled and written to digitizer.root
//  setTdcMode(1) TDC mode for two measured leading edges of two signals
//            (2) TDC mode for  measured leading and trailing edge of one signal
//  setOffsets(1.5,2.5,4.5,5.5, 0 or 1)sets offsets for each type of module which will be
//                                     substracted from the calculated time1 and time2, the
//                                     last flag switches the use of offsets on/off (1=on(default)).
//  setEffLevel(90.,90.,90.,90., 0 or 1) sets level of cell efficiency cut for each type of module, the
//                                       last flag switches the use of efficiency on/off (1=on(default)).
//  setOffsets(1.5,2.5,4.5,5.5, 0 or 1)  offsets (ns), which will be substracted from drif time + tof
//  setTofUse(kFALSE) time of flight will not be added to drift times
//           (kTRUE ) time of flight will be added to drift time
//  setErrorUse(kTRUE)  apply smearing of drift times with errors
//             (kFALSE) do not apply smearing of drift times with errors
//  setWireStatUse(kTRUE)  take into account dead wires and efficiency of single wires
//                (kFALSE) assume all wires working (default)
//  setTimeCutUse(kTRUE)  take into account time cuts
//               (kFALSE) (default)
//  setDeDxUse(kTRUE)  calculate t2-t1 from energy loss of the particle (default)
//            (kFALSE) calculate t2-t1 from GARFIELD tables
//  setNoiseLevel(5.,5.,5.,5.) sets level of noise for each type of module
//  setNoiseRange(low1,low2,low3,low4,hi1,hi2,hi3,hi4) sets the time window of the noise
//                                                     for each module type
//  setNoiseBandWidth(width)       (time-above threshold bump 0-width ns)
//  setNoiseWhiteWidth(upperrange) (upper range in time-above threshold for white noise outside the bump)
//  setNoiseWhiteRatio(ratio);     (ratio between bump/white noise
//  setNoiseMode(1)(default)GEANT cells will be overwritten by noise (if timenoise<time)
//              (2)         GEANT cells will not be touched
//  setEmbeddingMode(Int_t) (default)1=realistic merging og REAL and GEANT data (default)
//                                   2=keep Geant data
//  setSignalSpeed(0.004) sets the speed of the signal on the wire used to calulate the time offset
//                        by the signal propagation on the wire (ns/mm)
//------------------------------------------------------------------------------------------------------
// SHORT INTRODUCTION to HMdcDigitizer:
//
// SCHEME OF DIGITAZATION:
// 1. Reading input from HGeantMdc
// 2. Evaluation of fired cells
// 3. Calulation of drift times / wire offsets
// 4. Storing in HMdcGeantCell category (not persistent)
// 5. Filling arrays of all hits for one cell from HMdcGeantCell
// 6. set efficiency flags to the hits (cell efficiency/layer efficiency/dead wires/efficiency wires)
// 7. Filling real data into arrays if digitizer runs in embedding mode
// 8. sorting arrays with increasing arrival time of the signal (drift + error + tof + wireoffset)
// 9. selecting 1. and 2. valid hit in cell
// 10.filling output to HMdcCal1Sim
// 11.generation of noise
//
// INPUT DATA TO THE DIGITIZER:
// The Digitizer retrieves the GEANT data from
// HGeantMdc (sector,module,layer, hit: xcoord,ycoord,tof,ptot, incidence:theta,phi,tracknumber).
// Evaluation of fired cells:
// HMdcDigitizer::transform(Float_t xcoord, Float_t ycoord, Float_t theta,
//                          Float_t phi   , Float_t tof   , Int_t trkNum) calculates
// which cells have been hit by the track. The Information about the layer geometry
// (pitch, cathod distance, wire orientation, number of wires per layer and number of central wire)
// is taken from HMdcLayerGeomPar. Output of the calculation is the minimum distance from the wire
// and the impact angle in the coordinate system of the cell. All values are stored in the
// HMdcGeantCell for a maximum number of 15 hits per cell via
// HMdcDigitizer::storeCell(Float_t per, Float_t tof, Float_t myangle, Int_t trkNum,
//			    Bool_t flagCutEdge,Floa_t wireOffset).
//
// CALCULATION OF DRIFT TIMES:
// For each cell the drift time1 and time2 are calculated by corresponding functions of
// the HMdcCal2ParSim container which holds the calibration parameters for the "distance->drift time"
// calculation:
// HMdcCal2ParSim::calcTimeDigitizer (sector,module,angle,minDist,&time1,&time1Error) and
// HMdcCal2ParSim::calcTime2Digitizer(sector,module,angle,minDist,&time2,&time2Error).
// If setDeDxUse(kTRUE) (default) is chosen , the time to is calculated via
// HMdcDeDx2::scaledTimeAboveThreshold() inverse by the energy loss - Time over Threshold
// relation ship to assure compatible ToT/DeDx values for experimnt and simulation. The
// parameters for this transformation are obtained from experimental data.
//
// CALCULATION OF WIRE OFFSET:
// calcWireOffset(xcoor,ycoor,wOrient) calulates the time the signal of a given cell would take
// to popagate from the hit point to the readout electronis. The speed of the signal is taken from
// HMdcDigitPar::getSignalSpeed()(ns/mm). Internal functions of HMdcSizesCells are called to calulate
// the path length of the signal.
//
// EFFICIENCY CUTS:
// For each cell the efficiency cuts are calculated by a function of
// HMdcCellEff::calcEfficiency(module,minDist,angle,Level) which holds
// the information for the efficiency cuts on cell level. The level of the cuts can be specified
// by  HMdcDigitizer::setEffLevel(90.,90.,90.,90.) per module. The cut is done on the basis of GARFIELD
// simulations which give information on the charge which is collected on the sense wire of
// each cell for all combinations of distance and impact angle. The numbers which have to be set
// are the percentage of maximum charge required to make a signal. Hits which are on the edge of
// the drift cell will not create a big amount of charge and therefore will be kicked out first.
// The second cut on the layer level is an overall layer efficiency (e.g. 0.98 for 98% Efficiency)
// and will reduce the overall number of fired cells. This value is taken from HMdcDigiPar container.
//
// SIMULATION OF DEAD WIRES:
// With setWireStatUse(kTRUE) the dead wires of the real data are correctly taken into account.
// This cut is handled in the same way as the effciency cuts and has the top priority
// (wire stat -> cell efficieny -> layer efficiency). In all cases the drift time will be set to -999.
// To get the correct result one has to analyze the status flags! The Information about the status
// of the wire is taken from HMdcWireStat.
//
// SIMULATION OD DELTA ELECTRONS
//
//  void   setDeltaElectronUse(Bool_t use, Bool_t useDeltaMomSel=kFALSE, Int_t ionId=109,Float_t t1min=-950.,Float_t t1max=400.,Float_t momCut=20.)
//  void   setDeltaElectronMinMomCut(Float_t s0=2.,Float_t s1=2.,Float_t s2=4.5,Float_t s3=2.,Float_t s4=2.,Float_t s5=4.5)
//
//  Delta electrons can simulated by 3 different ways
//
// 1. Shooting electrons by kine generator ( primary electrons, momentun < momMaxDeltaElecCut) : useDeltaMomSel=kTRUE
// 2. Shooting beam ions by kine generator of evt file input (primary IonID)
// 3. Shooting delta electrons by evt file (primary electron, generator info -3)               : useDeltaMomSel=kFALSE
//
// The delta electrons source are identified in the input by the methodes above.
// Than a random t0 is selected and applied to cal1 objects resluting from deltas.
// The time range used (default -950,400) can be selected. When using the timecut option
// all drift cells fired by deltas with negative t0 will leed to inefficiency of the MDC.
// To take care for the different material budgets of the RICH Mirror (2 sectors glass, 4 carbon) 
// an additional low momentum cut (default 4.5  and 2. MeV) off per sector can be applied.
// By default the treatment of deltas is on and method 3 is set. If one wants to suppress
// delta electrons one can set  setDeltaElectronMinMomCut() to high values.
//
// SELECTING 1. AND 2. VALID HIT:
// According to the the cuts a list of status flags for each recorded track is filled.
// After all calculations the list of Tracks is sorted by the arrival time (tof + drift time + wire offset) by
// HMdcDigitizer::select(Int_t nHits) because only the first track will create a signal.
// The first valid hit (status=1) inside the track list will be found by
// HMdcDigitizer::findFirstValidHit(Int_t* firsthit, Float_t* firsttime2, Int_t* endlist1)
// which returns the index number of the first valid hit and the the last hit which falls
// into the given time window defined by time2 of first valid hit.
// HMdcDigitizer::findSecondValidHit(Int_t endlist1,Int_t* secondhit)
// finds a second valid hit starting with the last entry of the list of the first valid hit.
// All variables will return -999 if no valid hits are found.
//
// FILLING OUTPUT:
// According to the two different TDC modes the HMdcCal1Sim category is filled.
// If HMdcDigitizer::setTofUse(kFALSE) is selected, the time of flight will be substracted and
// only the drift time is written to the output. With HMdcDigitizer::setOffsets(1.5,2.5,4.5,5.5, 0 or 1)
// a common minimum offset (fast particles) per module type can be set and will be subtracted
// from the calculated time to be closer to the real measurement situation.
// With setErrorUse(kFALSE) the digitizer can be forced to write the drift times without error smearing to the
// output.
//
// NOISE SIMULATION:
// Noise simulation should be used only in TDC mode 2 (leading + trailing edge)
// and not in embedding mode!
// The noise simulation is done after output data have been already filled to HMdcCal1 category.
// a loop over the category is performed and the noise is filled in 2 ways.
// 1. a loop over all existing cells in the setup of Mdc is done and randomly picked cells
//    are filled width noise and added to the category ("only noise" cells).
// 2. For the existing cells filled with GEANT data a comparison between the randomly created noise
//    time and the real time is done (if setNoiseMode(1)). The earlier of both is taken and if the noise wins
//    the status flags are changed accordingly.
// With HMdcDigitizer::setNoiseLevel(5.,5.,5.,5.) the simulation of noise can be switched on.
// HMdcDigitizer::fillNoise() loops over all cells existing in the actual setup and will randomly
// pick cells according to the specified probability per module (5.==5%) and set the statusflag to 2.
// If a cell is selected for noise production a second random process generates the time in the
// range of the specified window set by HMdcDigitizer::setNoiseRange(low1,low2,low3,low4,hi1,hi2,hi3,hi4).
// The behaviour of the noise generation can be specified with
// 1. setNoiseBandWidth(width)       (time-above threshold bump 0-width ns)
// 2. setNoiseWhiteWidth(upperrange) (upper range in time-above threshold for white noise outside the bump)
// 3. setNoiseWhiteRatio(ratio);     (ratio between bump/white noise
// With HMdcDigitizer::setNoiseMode(1)(default) a given time in one of the original GEANT cells
// will be overwritten by the the noise time, if timenoise < time.In this case the statusflag of
// the cell will be set to 2 (valid hit but noise).In the case of HMdcDigitizer::setNoiseMode(2) the
// original GEANT cells will not be touched.
//
// EVENT EMBEDDING:
// In the embedding case of GEANT data into REAL data, the digitizer looks to the HMdcCal1Sim and gets the
// data words filled with the REAL data by the HMdcCalibrater1 which would fall in the same Cells as the
// GEANT data. If the embedding mode is set to 1 (default) the digitizer will do a "realistic" merging,
// that means, the first hit from REAL or GEANT data will be accepted. In embedding mode 2 the GEANT data
// will be allways kept and the coresponding REAL data will be overwritten by GEANT data. The embedding
// mode can be switched by HMdcDigitizer::setEmbeddingMode(Int_t)(1=realistic,2=keep Geant data).
// The status flag of REAL data will be 0, where as in the listStatus[5] the status flag will be 3 for
// REAL data hits which are merged into GEANT cells. The track number of real data HMdcCalSim objects will
// be the common track number which can be retrieved via gHades->getEmbeddingRealTrackId().
//
//
// SPECIAL FEATURES:
//-----------creating offsets to simulate calibrated offsets----------------------
// the impact of calibration of time offsets can be simulated too (by default this feature is not used).
// The offsets will be random generated from gRandom->Gaus(mean,sig).
//  void    setSigmaOffsets(Float_t sig)      (default is 2ns)
//  void    setCreateOffsets(Bool_t kTRUE)    (create new table of offsets)
//  void    initOffsets(TString filename)     (if createoffsets=kTRUE a new table will be created and stored
//                                             to file filename (if not "")
//                                             if createoffsets=kFALSE and filename is provided the table
//                                             will be read from ascii file)
//
//-----------manipulate drift times (tdc slope time errors...)--------------------------------
//  void    setScaleTime(Float_t scale)        drift times will be scaled by scale (defualt 1.0)
//  void    setScalerTime1Err(Float_t m0=0,Float_t m1=0,Float_t m2=0,Float_t m3=0) (default 1.0)
//                                             drift times errors (time1) will be scaled per module
//------------------------------------------------------------------------------------------------------
// MODE 1 (two times LEADING EDGE of the TDC signal)
//           nHits ==  -2 for 2 valid hits
//                 ==  -1 for 1 valid hit
//                 ==   0 for a not filled hit (e.g. 1 hit was kicked out by efficiency)
//         status1 ==   1 for a valid first hit
//                 ==   2 for a valid first hit caused by noise
//                 ==   3 for a valid first hit caused by real data embedding
//                 ==  -3 for a not valid hit
//                 ==  -5 for cutted by time cut
//                 ==   0 no hit
//                 ==   3 for REAL data (embedding)
//         status2 ==   1 for a valid second hit
//                 ==   2 for a valid second hit caused by noise
//                 ==   3 for a valid second hit caused by real data embedding
//                 ==  -3 for a not valid hit
//                 ==  -5 for cutted by time cut
//                 ==   0 no hit
//                 ==   3 for REAL data (embedding)
//         angle1  ==   impact of track1 or -99 if not filled
//         angle2  ==   impact of track2 or -99 if not filled
//         minDist1==   minimum distance of track1 or -99 if not filled
//         minDist2==   minimum distance of track2 or -99 if not filled
//         error1  ==   error of time1
//         error2  ==   error of time1 of the second valid hit or -99 if not filled
//         tof1    ==   tof of time1
//         tof2    ==   tof of time1 of the second valid hit or -999 if not filled
//         wireOff1==   signal time on wire of track1 or -99 if not filled
//         wireOff2==   signal time on wire of track2 or -99 if not filled
//         nTrack1 ==   track number of the first valid hit
//                 ==  -99 if not filled
//         nTrack2 ==   track number of the second valid hit
//                 ==  -99 if not filled
//         time1   ==   drift time1 of the first valid hit
//                 ==  -999 if not filled
//         time2   ==   drift time1 of the second valid hit
//                 ==  -999 if not filled
//     listTrack[5] :   contains the track number of the first 5 hits per cell
//                      == -99 if no hit was filled or noise
//     listStatus[5]:   contains the status flags of the first 5 hits per cell
//                      == -1 if hit was kicked out by cell efficiency cut
//                      == -2 if hit was kicked out by layer efficiency cut
//                      == -3 if hit was kicked out by wire stat
//                      == -4 if hit was kicked out by noise
//                      == -5 if cutted by time cut
//                      ==  1 if hit is valid
//                      ==  2 if hit is noise
//                      ==  3 if hit is real data (embedding)
//                      ==  0 if no hit was filled
//     both lists will be filled even if no vaild hit was found
//
// MODE 2 (LEADING AND TRAILING EDGE of the TDC signal)
//           nHits ==  +2 for 2 valid hits
//                 ==   0 for not filled hit (e.g. 1 hit was kicked out by efficiency)
//         status1 ==   1 for a valid first hit
//                 ==   2 for a valid first hit caused by noise
//                 ==   3 for a valid first hit caused by real data embedding
//                 ==  -3 for a not valid hit
//                 ==  -5 for cutted by time cut
//                 ==   0 or no hit
//                 ==   3 REAL data (embedding)
//         status2 ==   1 for a valid first hit
//                 ==   2 for a valid first hit caused by noise
//                 ==   3 for a valid first hit caused by real data embedding
//                 ==  -3 for a not valid hit
//                 ==  -5 for cutted by time cut
//                 ==   no hit
//                 ==   3 for REAL data (embedding)
//         angle1  ==   impact of track1 or -99 if not filled
//         angle2  ==   impact of track1 or -99 if not filled
//         minDist1==   minimum distance of track1 or -99 if not filled
//         minDist2==   minimum distance of track1 or -99 if not filled
//         error1  ==   error of time1 or -99 if not filled
//         error2  ==   error of time2 or -99 if not filled
//         tof1    ==   tof of time1 or -999 if not filled
//         tof2    ==   tof of time2 or -999 if not filled
//         wireOff1==   signal time on wire of track1 or -99 if not filled
//         wireOff2==   signal time on wire of track1 or -99 if not filled
//         nTrack1 ==   track number of first valid hit
//                 ==  -99 if not filled
//         nTrack2 ==   track number of first valid hit
//                 ==  -99 if not filled
//         time1   ==   drift time1 of the first valid hit
//                 ==  -999 if not filled
//         time2   ==   drift time2 of the first valid hit
//                 ==  -999 if not filled
//     listTrack[5] :   contains the track number of the first 5 hits per cell
//                      == -99 if no hit was filled or noise
//     listStatus[5]:   contains the status flags of the first 5 hits per cell
//                      == -1 if hit was kicked out by cell efficiency cut
//                      == -2 if hit was kicked out by layer efficiency cut
//                      == -3 if hit was kicked out by wire stat
//                      == -4 if hit was kicked out by noise
//                      == -5 if cutted by time cut
//                      ==  1 if hit is valid
//                      ==  2 if hit is noise
//                      ==  3 if hit is real data (embedding)
//                      ==  0 if no hit was filled
//     both lists will be filled even if no vaild hit was found
//------------------------------------------------------------------------------------------------------
//     EXAMPLES :
//     In general: if nHits<0 ->TDC MODE=1
//                 if nHits>0 ->TDC MODE=2
//                 if status1/status2>0 -> valid hit (1: normal, 2: noise 3: real data (embedding))
//                 if status1/status2<0 -> no valid hit (-3)
//
//     TDC MODE 1 (2 leading edges)
//     no valid hit:  status1=status2=-3 rest will be filled like normal hits
//     1 valid hit :  time1!=-999,time2=-999,status1=1,status2=-3,nHits=-1,nTrack1!=-99,nTrack2=-99
//     2 valid hits:  time1!=-999,time2!=-999,status1=status2=1,nHits=-2,nTrack1!=-99,nTrack2!=-99
//     noise hit   :  if GEANT hit was overwritten:status1/status2 =2 rest filled like normal hits
//                    if a noise cell was added to GEANT cells:
//                    time1!=-999,time2=-999,status1=2,status2=-3,nHits=-1,
//                    nTrack1=nTrack2=-99
//
//     TDC MODE 2 (leading and trailing edge)
//     no valid hit:  status1=status2=-3 rest will be filled like normal hit
//     1 valid hit :  time1!=-999,time2!=-999,status1=status2=1,nHits=2,nTrack1=nTrack2!=-99
//     noise hit   :  if GEANT hit was overwritten:status1=status2=2 rest filled like normal hits
//                    if a noise cell was added to GEANT cells:
//                    time1!=-999,time2!=-999,status1=status2=2,nHits=2,
//                    nTrack1=nTrack2=-99
//
//    MODE1 and MODE2 :
//
//    if status1/status2=-3 looking to the StatusList[5]: -1 cut on Cell efficiency
//                                                        -2 cut on Layer efficiency
//    The TrackList[5] will be filled with the GEANT track numbers no matter if the hit was
//    valid or not or overwritten by noise!
/////////////////////////////////////////////////////////////////

Float_t HMdcDigitizer::dTime [NMAXHITS]              = {0.};
Float_t HMdcDigitizer::dTime2[NMAXHITS]              = {0.};
Float_t HMdcDigitizer::dTimeErr [NMAXHITS]           = {0.};
Float_t HMdcDigitizer::dTime2Err[NMAXHITS]           = {0.};
Float_t HMdcDigitizer::minimumdist[NMAXHITS]         = {0.};
Int_t   HMdcDigitizer::track[NMAXHITS]               = {-99};
Float_t HMdcDigitizer::timeOfFlight[NMAXHITS]        = {0.};
Float_t HMdcDigitizer::angle[NMAXHITS]               = {0.};
Int_t   HMdcDigitizer::statusflag[NMAXHITS]          = {0};
Float_t HMdcDigitizer::fractionOfmaxCharge[NMAXHITS] = {0};
Bool_t  HMdcDigitizer::cutEdge[NMAXHITS]             = {kFALSE};
Float_t HMdcDigitizer::wireOffset[NMAXHITS]          = {0.};
Float_t HMdcDigitizer::efficiency[NMAXHITS]          = {0.};
Float_t HMdcDigitizer::theta[NMAXHITS]               = {0.};


HMdcDigitizer::HMdcDigitizer(void)
{
    initVariables();
}
HMdcDigitizer::HMdcDigitizer(const Text_t *name,const Text_t *title):
HReconstructor(name,title)
{
    initVariables();
}

HMdcDigitizer::HMdcDigitizer(const Text_t *name,const Text_t *title,Int_t TDCMODE,Bool_t NTUPLE) :
HReconstructor(name,title)
{
    // TDCMODE sets the simulation mode to the two different
    // possibilities of the TDC: 1 == to leading edges
    //                           2 == leading and trailing edge
    // NTUPLE switches the NTuple with the internal information of
    // the digitizer ON or OFF:   kFALSE == no NTuple filled
    //                            kTRUE  == NTuple filled.

    initVariables();
    setTdcMode(TDCMODE);
    setNTuple(NTUPLE);
}

HMdcDigitizer::~HMdcDigitizer(void) {
  

  if(iterin)   delete iterin;
  if(itercell) delete itercell;
  if(itercal1) delete itercal1;
}

void HMdcDigitizer::setOffsets(Float_t off0,Float_t off1,Float_t off2,Float_t off3,Int_t on_off)
{
    // set global time offsets per drift chamber type in nano seconds.
    // The offsets will be substracted from the drift times if on_off == 1
    //
    if(on_off == 1)
    {
	useOffsets = kTRUE;
    }
    else
    {
	useOffsets = kFALSE;
    }
    offsets[0] = off0;
    offsets[1] = off1;
    offsets[2] = off2;
    offsets[3] = off3;
}
void HMdcDigitizer::setEffLevel(Float_t eff0,Float_t eff1,Float_t eff2,Float_t eff3,Int_t on_off)
{
    // set Cell efficiency level per drift chamber type.
    // settings will be used if on_off == 1.
    if(on_off == 1)
    {
	useCellEff = kTRUE;
    }
    else
    {
	useCellEff = kFALSE;
    }
    effLevel[0] = eff0;
    effLevel[1] = eff1;
    effLevel[2] = eff2;
    effLevel[3] = eff3;
}

void HMdcDigitizer::setNoiseLevel(Float_t noise0,Float_t noise1,Float_t noise2,Float_t noise3,Int_t on_off)
{
    // set the noise level per drift chambers in per cent.
    // noise simulation will be used if on_off == 1

    if(on_off == 1)
    {
	useNoise = kTRUE;
    }
    else
    {
	useNoise = kFALSE;
    }
    noiseLevel[0] = noise0 * 0.01;
    noiseLevel[1] = noise1 * 0.01;
    noiseLevel[2] = noise2 * 0.01;
    noiseLevel[3] = noise3 * 0.01;
}

void HMdcDigitizer::setNoiseRange(Int_t rangeLo0,Int_t rangeLo1,Int_t rangeLo2,Int_t rangeLo3,
				  Int_t rangeHi0,Int_t rangeHi1,Int_t rangeHi2,Int_t rangeHi3)
{
    // set the noise range in time1 in nano seconds per chamber type.
    noiseRangeLo[0] = rangeLo0;
    noiseRangeLo[1] = rangeLo1;
    noiseRangeLo[2] = rangeLo2;
    noiseRangeLo[3] = rangeLo3;
    noiseRangeHi[0] = rangeHi0;
    noiseRangeHi[1] = rangeHi1;
    noiseRangeHi[2] = rangeHi2;
    noiseRangeHi[3] = rangeHi3;
}

void HMdcDigitizer::setScalerTime1Err(Float_t m0,Float_t m1,Float_t m2,Float_t m3)
{
    // set the scaler values for error of time1 per chamber type.
    scaleError[0] = m0;
    scaleError[1] = m1;
    scaleError[2] = m2;
    scaleError[3] = m3;
}



void HMdcDigitizer::initVariables()
{
    // sets all used variables to the initial values
    fbetadEdx     = HMdcDeDx2::energyLossGraph(14,0.6,"beta");
    fBetaLow      = 0.7;
    useDeDxScaling= kTRUE;
    useDeDxTimeScaling = kTRUE;
    fGeantCellCat = 0;
    fCalCat       = 0;
    fDigitGeomPar = 0;
    fDigitPar     = 0;
    fCal2ParSim   = 0;
    fCellEff      = 0;
    fWireStat     = 0;
    fTimeCut      = 0;
    fsizescells   = 0;
    fdEdX         = 0;
    fCal          = 0;
    fCalnoise     = 0;
    fCell         = 0;
    iterin        = 0;
    itercell      = 0;
    itercal1      = 0;
    fEventId      = 0;
    pi = acos(-1.)/180;
    time1         = 0;
    time1Error    = 0;
    time2         = 0;
    time2Error    = 0;
    setTdcMode(2);
    setEffLevel  (90 ,90 ,90 ,90);
    setNoiseLevel(5. ,5. ,5. ,5.);
    setOffsets   (1.5,2.5,4.5,5.5);
    setOffsetsUse   (kFALSE);
    setCellEffUse   (kTRUE);
    setWireStatUse  (kFALSE);
    setWireStatEffUse(kTRUE);
    setLayerThicknessEffUse(kTRUE);
    setWireStatOffsetUse(kTRUE);
    setNoiseUse     (kFALSE);
    setTofUse       (kTRUE);
    setErrorUse     (kTRUE);
    setWireOffsetUse(kTRUE);
    setDeDxUse      (kTRUE);
    setTimeCutUse   (kFALSE);
    setNTuple       (kFALSE);
    hasPrinted = kFALSE;
    setTime1Noise(0.);
    setTime2Noise(0.);
    resetListVariables();
    setNoiseMode(1);
    for(Int_t i = 0; i < 5; i ++)
    {
	arrayNoise[i] = 0;
    }
    setNoiseRange(-500,-500,-500,-500,
		  1500,1500,1500,1500);
    setNoiseBandWidth(20.);
    setNoiseWhiteWidth(500.);
    setNoiseWhiteRatio(0.1);
    setEmbeddingMode(1);
    setSignalSpeed(0.004);// ns/mm
    for(Int_t i = 0; i < 4; i ++)
    {
	scaleError[i] = 1.;
	scaleErrorMIPS[i] = 1.;
    }

    for(Int_t s = 0; s < 6; s ++){
        for(Int_t m = 0; m < 4; m ++){
            for(Int_t l = 0; l < 6; l ++){
                for(Int_t c = 0; c < 220; c ++){
                    rndmoffsets[s][m][l][c] = 0.0;
                }
            }
        }
    }
    setCreateOffsets(kFALSE);
    offsetsCreated  = kFALSE;
    setSigmaOffsets(2.0);
    setScaleTime(1.0);
    vLayEff.reserve(500);
    setDeltaElectronUse(kTRUE,kFALSE,109,-950.,400.,20.,2.);
    setDeltaElectronMinMomCut(2.,2.,4.5,2.,2.,4.5);
}
void HMdcDigitizer::setParContainers() {
    // Get pointers to the needed containers.The containers are
    // created and added to the runtime Database if the are not existing

    fDigitGeomPar = (HMdcLayerGeomPar*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcLayerGeomPar"));
    if(!fDigitGeomPar)
    {
	Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCLAYERGEOMPAR RECIEVED!");
	exit(1);
    }
    fDigitPar = (HMdcDigitPar*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcDigitPar"));
    if(!fDigitPar)
    {
	Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCDIGITPAR RECIEVED!");
	exit(1);
    }
    fCal2ParSim  = (HMdcCal2ParSim*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcCal2ParSim"));
    if(!fCal2ParSim)
    {
	Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCCAL2PARSIM RECIEVED!");
	exit(1);
    }
    geomstruct = (HMdcGeomStruct*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcGeomStruct"));
    if(!geomstruct)
    {
	Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCGEOMSTRUCT RECIEVED!");
	exit(1);
    }
    if(getCellEffUse())
    {
	fCellEff = (HMdcCellEff*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcCellEff"));
	if(!fCellEff)
	{
	    Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCCELLEFF RECIEVED!");
	    exit(1);
	}
    }
    if(getWireStatUse())
    {
	fWireStat = (HMdcWireStat*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcWireStat"));
	if(!fWireStat)
	{
	    Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCWIRESTAT RECIEVED!");
	    exit(1);
	}

    }

    fsizescells = (HMdcSizesCells*)HMdcSizesCells::getObject();
    if(!fsizescells)
    {
	Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCSIZESCELLS RECIEVED!");
	exit(1);
    }

    if(getDeDxUse())
    {
	fdEdX = (HMdcDeDx2*)(((HRuntimeDb*)(gHades->getRuntimeDb()))->getContainer("MdcDeDx2"));
	if(!fdEdX)
	{
	    Error("HMdcDigitizer:init()","ZERO POINTER FOR HMDCDEDX2 RECIEVED!");
	    exit(1);
	}
    }
    if(getTimeCutUse() )
    {
        fTimeCut = (HMdcTimeCut*) gHades->getRuntimeDb()->getContainer("MdcTimeCut");
    }

}

void HMdcDigitizer::setNTuples(void) {
    // Creates an NTuple for the internal infomation of the digitizer
    // which is stored in the file digitizer.root in the working directory.
    // The NTuple contains
    // sec,mod,lay,cell: the "software address" of a single cell
    // dist,angle: minimum distance of the track to the wire
    //             and impact angle in coordinates of the cell
    // time1, time1Err,time2,time2Err: values for the drift times
    // tof: time of flight
    // cutEdge: 0 if minimum distance smaler than cell bounderies, 1 if larger
    // status: 1 if valid hit, 2 if noise, 3 for REAL data
    //        -1 if cut by cell efficiency
    //        -2 if cut by layer efficiency
    // track: track number (-99 if no real track)
    // eff:   efficiency value which would correspond to a cut on this minimum dist

    myoutput->cd();
    distance_time = new TNtuple("cal2sim", "cal2sim", "sec:mod:lay:cell:dist:angle:time1:time1Err:time2:time2Err:tof:cutEdge:status:track:eff");

}

Bool_t HMdcDigitizer::init(void) {
    // The parameter containers and the iterators over
    // the categorys MdcGeanRaw, MdcGeantCell and MdcCal1Sim are created.
    // The actual setup of the Mdc detector in the running analysis
    // is retrieved.
    setParContainers();
    getMdcSetup();

    fGeantMdcCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcGeantRaw));
    if(!fGeantMdcCat) {
	Error("HMdcDigitizer::init()","HGeant MDC input missing");
	return kFALSE;
    }
    iterin = (HIterator*)((HCategory*)fGeantMdcCat)->MakeIterator("native");

    fGeantKineCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catGeantKine));
    if(!fGeantKineCat) {
	Error("HMdcDigitizer::init()","HGeant Kine input missing");
	return kFALSE;
    }

    fGeantCellCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcGeantCell));
    if (!fGeantCellCat) {
	fGeantCellCat = (HCategory*)((HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"))->buildCategory(catMdcGeantCell));
	if (!fGeantCellCat) return kFALSE;
	else ((HEvent*)(gHades->getCurrentEvent()))->addCategory(catMdcGeantCell,fGeantCellCat,"Mdc");
    }
    fGeantCellCat->setPersistency(kFALSE);   // We don't want to write this one
    itercell = (HIterator*)((HCategory*)fGeantCellCat)->MakeIterator("native");

    fCalCat = (HCategory*)(((HEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcCal1));
    if (!fCalCat) {
	HMdcDetector* mdc = (HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
	fCalCat = (HCategory*)(((HMdcDetector*)mdc)->buildMatrixCategory("HMdcCal1Sim",0.5F));
	if (!fCalCat) return kFALSE;
	else ((HEvent*)(gHades->getCurrentEvent()))->addCategory(catMdcCal1,fCalCat,"Mdc");
        itercal1 = (HIterator*)fCalCat->MakeIterator("native");

    } else {
	itercal1 = (HIterator*)fCalCat->MakeIterator("native");
	if (fCalCat->getClass() != HMdcCal1Sim::Class()) {
	    Error("HMdcDigitizer::init()","Misconfigured output category");
	    return kFALSE;
	}
    }
    if(getNTuple())
    {
	// create output file and NTuple
	myoutput = new TFile("digitizer.root","RECREATE");
	myoutput->cd();
	setNTuples();
    }

    return kTRUE;
}
Bool_t HMdcDigitizer::reinit(void)
{
    // setup some local variables which need already initialized
    // parameter containers.
    if(fWireStat && useWireStatOffset && !offsetsCreated) {
	memset(&rndmoffsets[0][0][0][0],0, sizeof(Float_t) * 6 * 4 * 6 * 220);

	for(Int_t s = 0;s < 6; s ++){
	    for(Int_t m = 0; m < 4; m ++){
		for(Int_t l = 0; l < 6; l ++){
		    for(Int_t c = 0; c < 220; c ++){
			rndmoffsets[s][m][l][c] = fWireStat->getOffset(s,m,l,c);
		    }
		}
	    }
	}

    } else {
	if(!offsetsCreated) memset(&rndmoffsets[0][0][0][0],0, sizeof(Float_t) * 6 * 4 * 6 * 220);
    }

    fBetaLow = fDigitPar->getCellScale();

    for(Int_t m = 0; m < 4; m ++){
        scaleError[m]     = fDigitPar->getTime1ErrScale(m);
        scaleErrorMIPS[m] = fDigitPar->getTime1ErrScaleMIPS(m);
    }


    Bool_t result = kFALSE;

    setSignalSpeed(fDigitPar->getSignalSpeed());

    result = fsizescells->initContainer();
    if(result){
        // init layEff vars
	for(Int_t s = 0;s < 6; s ++){
	    for(Int_t m = 0; m < 4; m ++){
		for(Int_t l = 0; l < 6; l ++){
		    layEff.cmin[s][m][l] =-1;
		    layEff.cmax[s][m][l] =-1;
		    layEff.Lmax[s][m][l] =-1;
		    layEff.Lmin[s][m][l] =-1;

		}
	    }
	}

	const HGeomVector& p4 = fsizescells->getTargetMiddlePoint();  // use target mid point for impact angle calculation (min + max vals only)

	for(Int_t s = 0;s < 6; s ++){
	    for(Int_t m = 0; m < 4; m ++){
               if(!fsizescells->modStatus(s,m)) continue;
		for(Int_t l = 0; l < 6; l ++){

		    layEff.cmax[s][m][l] = (*fsizescells)  [s][m][l].getNCells()-1;
		    layEff.cmin[s][m][l] = (*fDigitGeomPar)[s][m][l].getCentralWireNr();  // round to int
                     
		    Int_t c = layEff.cmax[s][m][l];
		    {
			const HGeomVector& p1 = *(*fsizescells)[s][m][l][c].getWirePoint(0);
			const HGeomVector& p2 = *(*fsizescells)[s][m][l][c].getWirePoint(1);
			HGeomVector tmp =  p2+p1;
			tmp*=0.5;
			HGeomVector p3  =  tmp;    // mid of wire
			HMdcSizesCellsLayer &sizesCellsLayer = (*fsizescells)[s][m][l];
			Int_t firstCell,lastCell;
			Float_t firstCellPath,midCellPath,lastCellPath;
			Int_t ncells=0;
			if(sizesCellsLayer.calcCrossedCells(p4.getX(),p4.getY(),p4.getZ(),
							    p3.getX(),p3.getY(),p3.getZ(),
							    firstCell,lastCell,
							    firstCellPath,midCellPath,lastCellPath))
			{

			    ncells = 1;
			    ncells += lastCell-firstCell;

			    Float_t totalePathInLayer = 0.;
			    for(Int_t cell=firstCell;cell<=lastCell;++cell) {
				Float_t cellPath;
				if      (cell == firstCell) { cellPath = firstCellPath;}
				else if (cell == lastCell)  { cellPath = lastCellPath; }
				else                        { cellPath = midCellPath;  }
				totalePathInLayer += cellPath;
			    }
			    layEff.Lmax[s][m][l]  = totalePathInLayer ;
			}
		    }
		    c = layEff.cmin[s][m][l];
		    {
			const HGeomVector& p1 = *(*fsizescells)[s][m][l][c].getWirePoint(0);
			const HGeomVector& p2 = *(*fsizescells)[s][m][l][c].getWirePoint(1);
			HGeomVector tmp =  p2+p1;
			tmp*=0.5;
			HGeomVector p3  =  tmp;    // mid of wire
			HMdcSizesCellsLayer &sizesCellsLayer = (*fsizescells)[s][m][l];
			Int_t firstCell,lastCell;
			Float_t firstCellPath,midCellPath,lastCellPath;
			Int_t ncells=0;
			if(sizesCellsLayer.calcCrossedCells(p4.getX(),p4.getY(),p4.getZ(),
							    p3.getX(),p3.getY(),p3.getZ(),
							    firstCell,lastCell,
							    firstCellPath,midCellPath,lastCellPath))
			{

			    ncells = 1;
			    ncells += lastCell-firstCell;

			    Float_t totalePathInLayer = 0.;
			    for(Int_t cell=firstCell;cell<=lastCell;++cell) {
				Float_t cellPath;
				if      (cell == firstCell) { cellPath = firstCellPath;}
				else if (cell == lastCell)  { cellPath = lastCellPath; }
				else                        { cellPath = midCellPath;  }
				totalePathInLayer += cellPath;
			    }
			    layEff.Lmin[s][m][l]  = totalePathInLayer ;
			}
		    }
		} // end lay loop
	    } // end mod loop
	} // end sec loop

    }

    printStatus();
    return result;
}
void HMdcDigitizer::printStatus()
{
    // Prints the Options, default settings and
    // actual configuration of HMdcDigitizer.

  SEPERATOR_msg("*",60);
  INFO_msg(10,HMessageMgr::DET_MDC,"DEFAULT SETTINGS");
  SEPERATOR_msg("-",60);
  INFO_msg(10,HMessageMgr::DET_MDC,"Options input 1 (default)      two leading edges");
  INFO_msg(10,HMessageMgr::DET_MDC,"              2                leading and trailing edge");
  INFO_msg(10,HMessageMgr::DET_MDC,"NTuple        kFALSE (default) no NTuple filled");
  INFO_msg(10,HMessageMgr::DET_MDC,"              kTRUE            NTuple in digitizer.root filled");
  INFO_msg(10,HMessageMgr::DET_MDC,"Use Offsets   kFALSE (default)");
  INFO_msg(10,HMessageMgr::DET_MDC,"Use Tof       kTRUE  (default) cal1sim = drift time + tof");
  INFO_msg(10,HMessageMgr::DET_MDC,"Use Cell Eff  kFALSE (default)");
  INFO_msg(10,HMessageMgr::DET_MDC,"Use Noise     kFALSE (default)");
  INFO_msg(10,HMessageMgr::DET_MDC,"Noise mode    1 (default) GEANT hits will be replaced by noise");
  SEPERATOR_msg("-",60);
  INFO_msg(10,HMessageMgr::DET_MDC,"ACTUAL CONFIGURATION");

  SEPERATOR_msg("*",60);
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),"HMdcDigiSetup:");
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"tdcModeDigi       =  %i :  1 = two leading edges, 2 = leading and trailing edge",getTdcMode());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"NtupleDigi        =  %i :  0 = noNtuple, 1 = digitizer.root",(Int_t)getNTuple());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"useTofDigi        =  %i :  0 = NoTof in cal1, 1 = Tof in cal1 \n",(Int_t)getTofUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"useErrorDigi      =  %i :  0 = NoErr in cal1, 1 = Err in cal1 \n",(Int_t)getErrorUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"useWireOffsetDigi =  %i :  1 = add wireOffset to drift time, 0 = don't add wireOffsets"
			 , getWireOffsetUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"useWireStatDigi   =  %i :  1 = use wirestat container, 0 = don't use wirestat container"
			 , getWireStatUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"useWireStatEff    =  %i :  1 = use eff from wirestat container"
			 , getWireStatEffUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"useWireStatOffset =  %i :  1 = use offsets from wirestat container"
			 , getWireStatOffsetUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"useTimeCut        =  %i :  1 = use time cut container, 0 = don't use time cut container"
			 , (Int_t)getTimeCutUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"offsetsOnDigi     =  %i :  0 = global offsets off, 1 = global offsets on",(Int_t)getOffsetsUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"offsetsDigi       = %4.1f  %4.1f   %4.1f  %4.1f ns offset per plane (substracted from (drift time + tof))\n"
			 ,getOffset(0),getOffset(1),getOffset(2),getOffset(3));
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"noiseModeDigi     =  %i :  1 = override geant by noise, 2 = keep geant cells",getNoiseMode());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"noiseOnDigi       =  %i :  0 = noise off, 1 = noise on",(Int_t)getNoiseUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"noiseLevelDigi    = %4.1f%% %4.1f%%  %4.1f%% %4.1f%% noise level per plane"
			 ,100*getNoiseLevel(0),100*getNoiseLevel(1),100*getNoiseLevel(2),100*getNoiseLevel(3));
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"noiseRangeDigi    =%5i %5i %5i %5i %5i %5i %5i %5i ns lower/upper limit of noise"
			 ,getNoiseRangeLo(0),getNoiseRangeLo(1),getNoiseRangeLo(2),getNoiseRangeLo(3)
			 ,getNoiseRangeHi(0),getNoiseRangeHi(1),getNoiseRangeHi(2),getNoiseRangeHi(3));
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"noiseBandWidth    =  %5.1f ns : width of the t2-t1 noise band",getNoiseBandWidth());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"noiseWhiteWidth   =  %5.1f ns : width of the t2-t1 white noise region",getNoiseWhiteWidth());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"noiseWhiteRatio   =  %5.1f    : ratio between t2-t1 band/white noise\n",getNoiseWhiteRatio());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"cellEffOnDigi     =  %i :  0 = cellEff off, 1 = cellEff",(Int_t)getCellEffUse());
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"cellEffDigi       =  %4.1f%% %4.1f%%  %4.1f%% %4.1f%% level of cellEff per plane"
			 ,getCellEffLevel(0),getCellEffLevel(1),getCellEffLevel(2),getCellEffLevel(3));
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"fBetaLow          =  %f :  onset scaling point for LayerEff,CellEff,time1Err with dEdx"
			 , fBetaLow);
 gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"scaleTime1Err     =  %5.4f %5.4f %5.4f %5.4f input scaling for t1 err"
			 ,scaleError[0],scaleError[1],scaleError[2],scaleError[3]);
  gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName()
			 ,"scaleTime1ErrMIPS =  %5.4f %5.4f %5.4f %5.4f scaling for t1 err for MIPS"
			 ,scaleErrorMIPS[0],scaleErrorMIPS[1],scaleErrorMIPS[2],scaleErrorMIPS[3]);
  hasPrinted=kTRUE;
}

Bool_t HMdcDigitizer::finalize(void)
{
    // If NTuple exist it will be written to digitizer.root.

    if(getNTuple())
    {
        // The NTuple is written to the output file
	myoutput->cd();
	distance_time->Write();
	myoutput->Save();
	myoutput->Close();
    }
    return kTRUE;
}

Int_t HMdcDigitizer::execute(void) {
    // GEANT data are retrieved from HGeantMdc.
    // The GEANT hits will be transformed to the
    // layer coordinate system of the Mdc to find
    // the fired cells. For the fired cells the drift time
    // calulation, noise generation and efficiency cuts will
    // be performed according to the settings and the results
    // will be stored in HMdcCal1Sim.
  Float_t xcoord, ycoord, tof, theta, phi, ptot;
  Int_t trkNum;
  myalpha = 0;
  HGeantMdc* fGeant;
  loc.set(4,0,0,0,0);   // location used to fill the HMdcGeantCell category

  vLayEff.clear();

  //---------------------------------------------------------------------
  // In embedding mode the trackNumber of the
  // real data has to be set
  if(getEmbeddingMode() > 0)
  {
      if(gHades->getEmbeddingDebug() == 1)   fCalCat->Clear();

      itercal1->Reset();
      while ((fCal = (HMdcCal1Sim *)itercal1->Next()) != NULL)
      {

	  fCal->setNTrack1(gHades->getEmbeddingRealTrackId());
	  fCal->setNTrack2(gHades->getEmbeddingRealTrackId());
          fCal->setStatus1(3);
          fCal->setStatus2(3);
	  fCal->resetTrackList(-99); // no track list
          fCal->setTrackList(0,gHades->getEmbeddingRealTrackId());  // real data
	  fCal->resetStatusList(0);  // status flag reset
          fCal->setStatusList(0,3);  // real data
      }
  }
  //---------------------------------------------------------------------

  //---------------------------------------------------------------------
  // time shift for delta electrons
  if(useDeltaElectrons)
  {
      mDeltaTrackT0.clear();

      if(fGeantKineCat){
	  Int_t nKine = fGeantKineCat->getEntries();
	  for(Int_t i=0;i<nKine;i++){
	      HGeantKine* kine =  (HGeantKine*)fGeantKineCat-> getObject(i);
	      Float_t mom = kine->getTotalMomentum() ;
              Int_t generator = kine->getGeneratorInfo();
	      if(kine->getParentTrack() == 0 &&
		 (kine->getID() == ionID ||                                                    // beam ions simulated
		  ( useDeltaMomSelection && kine->getID() == 3 && mom < momMaxDeltaElecCut) || // any electron < momCut (shooting with kine generator)
		  (!useDeltaMomSelection && kine->getID() == 3 && generator ==-3 )             // delta electrons input file source id ==-3
		 )
		)
	      {
		  Float_t t0offset = gRandom->Rndm()* (t1maxDeltaElec-t1minDeltaElec) + t1minDeltaElec;
		  mDeltaTrackT0[kine] = t0offset;
	      }
	  }
      }
  }
  //---------------------------------------------------------------------
  iterin->Reset();
  while((fGeant = (HGeantMdc*)iterin->Next()) != NULL) {// loop over HGeant input
      loc[0] = (Int_t)(fGeant->getSector());
      loc[1] = (Int_t)(fGeant->getModule());

      if(!testMdcSetup(loc[0],loc[1]) ) continue; // checks if the module is present in the setup

      loc[2] = (Int_t)(fGeant->getLayer());
      //   loc[3] is filled in transform(...) with the cell number
      fGeant->getHit(xcoord, ycoord, tof, ptot);
      fGeant->getIncidence(theta, phi);
      trkNum = fGeant->getTrack();

      //---------------------------------------------------------------------
      // identify delta electrons
      Bool_t isDelta      = kFALSE;
      Float_t mom         = 0;
      Int_t   generator   = 0;

      HGeantKine* primary = HGeantKine::getPrimary(trkNum,(HLinearCategory*)fGeantKineCat);
      if(primary) { // primary
	  mom       = primary->getTotalMomentum() ;
	  generator = primary->getGeneratorInfo();
	  if( primary->getID() == ionID ||                                                    // beam ions simulated
	     ( useDeltaMomSelection && primary->getID() == 3 && mom <momMaxDeltaElecCut)  ||  // any electron < momCut (shooting with kine generator)
	     (!useDeltaMomSelection && primary->getID() == 3 && generator ==-3 )              // delta electrons input file source id ==-3
	    ) isDelta = kTRUE;
      } else {
         Error("execute()","No primary for trk = %i found!",trkNum);
      }
      //---------------------------------------------------------------------

      //---------------------------------------------------------------------
      // time shift for delta electrons
      if(useDeltaElectrons)
      {
	  if(isDelta)
	  {
	      Float_t t0offset = 0;
	      itDelta = mDeltaTrackT0.find(primary);
	      if(itDelta != mDeltaTrackT0.end()) t0offset = itDelta->second;
	      else {
		  Error("execute()","No primary in delta map for trk = %i found! Should not happen!",trkNum);
		  primary->print();
	      }
	      if(mom < momMinDeltaCut[loc[0]]) continue;
	      if(fProbDeltaAccepted<1){
		  if(gRandom->Rndm() < fProbDeltaAccepted) continue; // adjust yield of delta electrons
	      }
	      tof+=t0offset;
	      fGeant->setHit(xcoord, ycoord, tof, ptot);  // change also TOF in of geant object to allow matching by tof with cal1 in tracking later
	  }
      } else { // skipp all deltaelectrons
	  if(isDelta) continue;
      }
      //---------------------------------------------------------------------

      if(loc[2]<6)
      {

          Int_t ind = findTrack(trkNum);
	  if(ind == -1) {  // generate random numbers for layer eff
	      HMdcDigiLayEff layeff(trkNum);
	      layeff.ct[loc[0]][loc[1]][loc[2]]++;
	      vLayEff.push_back(layeff);
	  } else {
	      vLayEff[ind].ct[(Int_t)loc[0]][(Int_t)loc[1]][(Int_t)loc[2]]++;
	  }
      }
      if(loc[2] < 6) transform(xcoord,ycoord,theta,phi,tof,trkNum);// transform and store
  }

  fCell = 0;
  fCal  = 0;

  initArrays();

  itercell->Reset();

  setLoopVariables(0,0,0,0);




  while ((fCell=(HMdcGeantCell *)itercell->Next()) != NULL)
  {
     initArrays();
     loc[0] = fCell->getSector();
     loc[1] = fCell->getModule();
     loc[2] = fCell->getLayer();
     loc[3] = fCell->getCell();


    //######################### CHECK IF OBJECT EXISTS (EMBEDDING) #####################
    fCal = 0;
    fCal = (HMdcCal1Sim*)fCalCat->getObject(loc);

    resetCal1Real(); // reset digitizers variables, not cal1!

    if (fCal)
    {  // if object exists before

	getCal1Real();  // copy real cal1 data to digitizers variables
	// consistency check

	if((getNHitsReal() == 2 && getTdcMode() == 1) ||
	   (getNHitsReal() <  0 && getTdcMode() == 2) )
	{
	    Warning("HMdcDigitizer:execute()","HMdcCalibater1 and HMdcDigitizer running in different tdc modes!");
	}
    }
    //##################################################################################



    // Digitisation procedure starts here:


    // First TDC signal
    Int_t nHits = fCell->getNumHits();
    for(Int_t ihit = 0; ihit < nHits; ihit ++)
    {
	fillArrays        (ihit,loc[0],loc[1],fCell);  // fill arrays with all variables needed
	setEfficiencyFlags(ihit,loc[0],loc[1],loc[2]); // checks for efficiency cuts and sets the propper statusflags
        //setTimeCutFlags   (ihit,loc[0],loc[1],loc[2]); // checks time cuts and sets the propper statusflags
    }


    //########################### FILLING REAL DATA ##################################
    if(getEmbeddingMode() == 1 && getTime1Real() != -999)
    {   // if embedding mode and a cell was filled before
	fillArraysReal(nHits);                 // fill the real data into the working arrays
	if(getTdcMode() == 2)     nHits = nHits + 1; // count up the number of hits (1 Hit)
	else if(getTdcMode() == 1)nHits = nHits + 2; // count up the number of hits (2 Hits)
    }
    //################################################################################

    if (nHits > 1) select(nHits);  // sort all hits by arrival time (tof + drifttime + wireOffset)

    resetListVariables();

    if(getNTuple())
    {
	// fill Ntuple with internal information of the Digitizer
	for(Int_t hit = 0; hit < NMAXHITS; hit ++)
	{
	    if(getStatus(hit) == 0)continue;
	    fillNTuple(loc[0],loc[1],loc[2],loc[3],hit,
		       fCell,distance_time);
	}
    }

    //#################################### FILLING OUTPUT #######################################

    findFirstValidHit();


    if(!fCal)
    {   // if object did not exist before allocate a new object
	fCal = (HMdcCal1Sim*)fCalCat->getSlot(loc);
	if (fCal)
	{
	    fCal = new(fCal) HMdcCal1Sim;
	    fCal->setAddress(loc[0],loc[1],loc[2],loc[3]);
	}
	else
	{
	    Warning("HMdcDigitizer:execute()","CAL1SIM:getSlot(loc) failed!");
	}
    }

    //----------------------------------------- MODE1 AND MODE2 ---------------------------------------------------
    if(fCal)
    {
	if(getTdcMode() == 1 || getTdcMode() == 2)
	{ // both TDC modes
	    if(getFirstHit() != -999)
	    {
		// if a valid hit was found

		//--------------------- switch table ----------------------------------------------------------
		// DTime1/2 contains drift time + error + tof + wireoffset:
		//
		// useTof        :  0  +((Int_t)useTof-1  )      -> -1 tof will be substracted
		//                  1  +((Int_t)useTof-1  )      ->  0 tof will not be substracted
		// useError      :  0  +((Int_t)useError-1)      -> -1 error will be substracted
		//                  1  +((Int_t)useError-1)      ->  0 error will not be substracted
		// useOffsets    :  0  -((Int_t)useOffsets)      ->  0 no offsets will be substracted
		//                  1  -((Int_t)useOffsets)      -> -1 offsets will be substracted
                // useWireOffset :  0  +((Int_t)useWireOffset-1) -> -1 wire offsets will be substracted
                //                  1  +((Int_t)useWireOffset-1) ->  0 wire offsets will be included
		//---------------------------------------------------------------------------------------------

		fCal->setTime1(
			       getDTime1(getFirstHit())
			       + ( ((Int_t)getTofUse()  - 1)       * getTof(getFirstHit()) )
			       + ( ((Int_t)getErrorUse() - 1)      * getDTime1Err(getFirstHit()) )
			       - ( ((Int_t)getOffsetsUse())        * getOffset(loc[1]) )
			       + ( ((Int_t)getWireOffsetUse() - 1) * getWireOffset(getFirstHit()) ) );

		fCal->setNTrack1(getTrackN(getFirstHit()));
		fCal->setStatus1(getStatus(getFirstHit()));
		fCal->setAngle1(getAngle(getFirstHit()));
		fCal->setMinDist1(getMinimumDist(getFirstHit()));
		fCal->setError1(getDTime1Err(getFirstHit()));
		fCal->setTof1(getTof(getFirstHit()));
                fCal->setWireOffset1(getWireOffset(getFirstHit()));
	    }
	    else
	    {
		fCal->setStatus1(findNonValidHit()); // no valid hit1 found
	    }
	}

	//----------------------------------------- MODE2 --------------------------------------------------------------------
	if(getTdcMode() == 2)
	{ // leading and trailing edge
	    if(getFirstHit() != -999)
	    { // if a valid hit was found

		fCal->setTime2(
			       getDTime2(getFirstHit())
			       + ( ((Int_t)getTofUse() - 1)       * getTof(getFirstHit()) )
                               + ( ((Int_t)getErrorUse() - 1)     * getDTime2Err(getFirstHit()) )
			       - ( ((Int_t)getOffsetsUse())       * getOffset(loc[1]) )
			       + ( ((Int_t)getWireOffsetUse() - 1)* getWireOffset(getFirstHit()) ) );

		fCal->setNTrack2(getTrackN(getFirstHit()));         // fill same track number as for time1
		fCal->setNHits(2);                                  // second hit = trailing edge
		fCal->setStatus2(getStatus(getFirstHit())); // status is ok
		fCal->setAngle2(getAngle(getFirstHit()));
                fCal->setMinDist2(getMinimumDist(getFirstHit()));
		fCal->setError2(getDTime2Err(getFirstHit()));
                fCal->setTof2(getTof(getFirstHit()));
                fCal->setWireOffset2(getWireOffset(getFirstHit()));
	    }
	    else
	    {
		fCal->setStatus2(findNonValidHit()); // no vaild hit2 found
	    }
	}

	//----------------------------------------- MODE1 -------------------------------------------------------------------------
     
	if (nHits == 1 && getTdcMode() == 1) fCal->setNHits(-1);  // if only one hit was detected
	else
	{
	    if(nHits > 1 && getTdcMode() == 1 && getFirstHit() != -999)
	    { // two times leading edge
		findSecondValidHit();

		if (getSecondHit() == -999 )
		{
		    fCal->setNHits(-1); // if no valid hit2 was found
		}
		else
		{
		    fCal->setTime2(
				   getDTime1(getSecondHit())
				   + ( ((Int_t)getTofUse() - 1)       * getTof(getSecondHit()) )
                                   + ( ((Int_t)getErrorUse() - 1)     * getDTime1Err(getSecondHit()) )
				   - ( ((Int_t)getOffsetsUse())       * getOffset(loc[1]) )
				   + ( ((Int_t)getWireOffsetUse() -1) * getWireOffset(getSecondHit()) ) );
   
		    fCal->setNTrack2(getTrackN(getSecondHit()));          // number of second track is stored
		    fCal->setNHits(-2);                                   // second valid hit was found
		    fCal->setStatus2(getStatus(getSecondHit())); // status of hit2 is ok
		    fCal->setAngle2(getAngle(getSecondHit()));
		    fCal->setMinDist2(getMinimumDist(getSecondHit()));
		    fCal->setError2(getDTime1Err(getSecondHit()));
		    fCal->setTof2(getTof(getSecondHit()));
                    fCal->setWireOffset2(getWireOffset(getSecondHit()));
		}
	    }
	    else if(nHits > 1 && getTdcMode() == 1)
	    {
		fCal->setStatus2(findNonValidHit()); // no valid second hit was found
	    }
	}

	//---------------------------------- FILL LIST OF TRACKS / STATUSFLAGS -----------------------------------------------

	fillTrackList(fCal); // fill list of tracks and statusflags
                             // even if no valid hit was in
    }
  }

  //###################################### NOISE #########################################
  if(getNoiseUse())
  {
      // loop over all cells in actual existing Setup
      // and pick randomly cells.If a cell is selected
      // a random time is filled and the cell is stored
      // in the output. For cells filled by Geant hits
      // the noise time will be compared to the measured
      // time and if the noise comes earlier the real time
      // will be replaced (if noise mode 1 is selected)

      setLoopVariables(0,0,0,0);

      itercal1->Reset();
      Int_t sec,mod,lay,cell;

      while ((fCal = (HMdcCal1Sim *)itercal1->Next()) != NULL)
      {
	  fCal->getAddress(sec,mod,lay,cell);                               // get existing object
	  if(getNoiseMode() == 1 && ( gRandom->Rndm()<getNoiseLevel(mod)) )
	  {
	      // check if the time1 of the noise hit is smaller than time1 of the real hit
	      // if this case is fullfilled the real hit will be overwritten by the noise hit.
	      // if no valid hit was found the noise hit will be written.

	      fillNoiseToGeantCells(mod,fCal);                              // fill this cell with noise if noise comes earlier
	  }
	  fillNoise(firstsec,firstmod,firstlay,firstcell,sec,mod,lay,cell); // fill randomly all cells before the object
	  setLoopVariables(sec,mod,lay,cell + 1,kTRUE);                     // set the loop start no the actual value
      }
      fillNoise(firstsec,firstmod,firstlay,firstcell,5,3,5,999);            // fill rest of noise cells after last real object
  }
  //######################################################################################

  //############################### TIMECUTS #############################################
  if(getTimeCutUse())
  {
      itercal1->Reset();

      while ((fCal = (HMdcCal1Sim *)itercal1->Next()) != NULL)
      {
	  setTimeCutFlags(fCal);
      }
  }
  //######################################################################################

  return 0;
}

void HMdcDigitizer::fillArrays(Int_t ihit,Int_t sec,Int_t mod,HMdcGeantCell* fCell)
{
    // All needed Arrays for the calculations are
    // filled (minimumdist,angle,tracknumber,tof,time1,time2,time1err,time2err)
    Int_t l = fCell->getLayer();
    Int_t c = fCell->getCell();

    setMinimumDist(ihit,fCell->getMinDist    (ihit));
    setAngle      (ihit,fCell->getImpactAngle(ihit));
    setTrackN     (ihit,fCell->getNTrack     (ihit));
    setTof        (ihit,fCell->getTimeFlight (ihit));
    setWireOffset (ihit,fCell->getWireOffset (ihit));
    setEfficiency (ihit,fCell->getEfficiency (ihit));
    setTheta      (ihit,fCell->getTheta (ihit));
    setCutEdge    (ihit,fCell->getFlagCutEdge(ihit));

    fCal2ParSim->calcTimeDigitizer(sec,mod,getAngle(ihit),(getMinimumDist(ihit)),&time1,&time1Error);

    setDTime1   (ihit,(Float_t)time1 * getScaleTime() + time1Error + getTof(ihit) + getWireOffset(ihit) + rndmoffsets[sec][mod][l][c]);
    setDTime1Err(ihit,time1Error);

    if(getDeDxUse())
    {
	// calculate the time2 need for Time over Threshold from the
	// energy loss of the particle. This is needed to get good
	// agreement to the experimental data. The conversion functions
	// are obtained from real data and used to calibrate the dEdX.

        fCal2ParSim->calcTime2Digitizer(sec,mod,getAngle(ihit),(getMinimumDist(ihit)),&time2,&time2Error);

	//--------------------------------------------
        // get particle infos for dEdx calculation
	HGeantKine* kine = (HGeantKine*)fGeantKineCat->getObject(getTrackN(ihit) - 1);
	if(kine){

	    //--------------------------------------------
	    // now loop over all MDC hits of this track until you
	    // find the corresponding hit or reach the end of the list
 	    kine->resetMdcIter(); // make sure that the iterator is at the beginning on the list
	    HGeantMdc* gMdc = 0;
            Bool_t    found = kFALSE;

	    while((gMdc = (HGeantMdc*)kine->nextMdcHit()) != 0)
	    {
		if(gMdc->getModule() == mod &&
		   gMdc->getLayer()  == l) {
		    // found the correct one
		    // important: do not check sector, some paticles
                    // cross sector boundaries!
                    found = kTRUE;
		    break;
		}
	    }
            if(!found) gMdc = 0;
	    //--------------------------------------------
           
	    //--------------------------------------------
            // get momentum of particle
	    Float_t p = 0;
	    if(gMdc){
		Float_t x,y,tof;
		gMdc->getHit(x, y, tof, p);
	    }else{
		// if GeantMdc was not found take
                // momentum from kine instead
		p = kine->getTotalMomentum();
                Warning("fillArrays()","HGeantMdc object not found, take kine momentum instead!");
	    }
	    //--------------------------------------------


	    //--------------------------------------------
            // efficiency scaling with dedx
	    Float_t initFrac  = 100.- getCellEffLevel(mod); // dedx > fBetaLow
            Double_t beta     = HMdcDeDx2::beta(kine->getID(),p);

	    if(useDeDxScaling && beta > fBetaLow){
		// do scaling with beta > fBetaLow
                // take care about very high dedx for beta close to 1
		Double_t dedx_low = fbetadEdx->Eval(fBetaLow);
		Double_t dedx     = fbetadEdx->Eval(beta);
		if(dedx > dedx_low) dedx = dedx_low;
		initFrac          *= dedx_low/dedx;
	    }
            setFractionOfmaxCharge(ihit,initFrac); // will be rewritten in setEfficiencyFlags();
 	    //--------------------------------------------

	    //--------------------------------------------
	    // drift time error scaling with dedx
	    if(useDeDxTimeScaling ) {

		Float_t scale = initFrac/(100.- getCellEffLevel(mod));
                scale+=  (scale-1.) * scaleErrorMIPS[mod];

		time1Error = time1Error * scaleError[mod] * scale;

		setDTime1   (ihit,(Float_t)time1 * getScaleTime() + time1Error + getTof(ihit) + getWireOffset(ihit) + rndmoffsets[sec][mod][l][c]);
		setDTime1Err(ihit,time1Error);
	    }
	    //--------------------------------------------

	    //--------------------------------------------
	    // finally calulate time2 via the dEdX of the
            // particle
	    Float_t t2;
	    t2 = fdEdX->scaledTimeAboveThreshold(kine,p,time1,time2,&time2Error,
						 sec,mod,l,c,getAngle(ihit),getMinimumDist(ihit));

	    if(TMath::Finite(t2) && t2 > 0){
                // if value was not NaN of Inf
		time2 = t2;
	    }
	    //--------------------------------------------
	}else {
            // if kine fails normal time2 will be used later....
	    Error("fillArrays()","ZERO POINTER for kine object retrieved!");
	}
    }else{
        // calulate time2 from GARFIELD simulations
	fCal2ParSim->calcTime2Digitizer(sec,mod,getAngle(ihit),(getMinimumDist(ihit)),&time2,&time2Error);
    }


    Float_t mytime2 = time2*getScaleTime() + time2Error + getTof(ihit) + rndmoffsets[sec][mod][l][c];

    if(mytime2 < getDTime1(ihit))
    {   // make shure that time2 > time1
	setDTime2(ihit,time1 * getScaleTime() + time1Error + 20 + (10 * gRandom->Gaus(0,1)) + getTof(ihit) + getWireOffset(ihit) + rndmoffsets[sec][mod][l][c]);
    }
    else
    {
	setDTime2(ihit,time2 * getScaleTime() + time2Error + getTof(ihit) + getWireOffset(ihit) + rndmoffsets[sec][mod][l][c]);
    }
    setDTime2Err(ihit,time2Error);

}
void HMdcDigitizer::fillArraysReal(Int_t i)
{
    // All needed Arrays for the calculations are
    // filled for the REAL hits (minimumdist,angle,tracknumber,tof,time1,time2,time1err,time2err)
    Float_t def_val = -99;

    if(getTdcMode() == 2 && i < NMAXHITS-1)
    {   // leading and trailing edge
	setMinimumDist(i,def_val);
	setAngle      (i,def_val);
	setTrackN     (i,gHades->getEmbeddingRealTrackId());
	setTof        (i,-999);

	setDTime1     (i,getTime1Real());
	setDTime1Err  (i,def_val);

	if(getTime2Real() > -998)
	{   // if trailing edge has been measured
	    setDTime2(i,getTime2Real());
	}
	else
	{   // create dummy trailing edge
            setDTime2(i,getTime1Real() + 80);
	}
	setDTime2Err(i,def_val);

	setCutEdge(i,kFALSE);
        setWireOffset(i,0.);
        setEfficiency(i,1.);
        setTheta(i,0.);
	setStatus(i,3);
	setFractionOfmaxCharge(i,0);
    }
    else if(getTdcMode() == 1 && i < NMAXHITS-2)
    {   // two leading edges
        // first hit
	setMinimumDist(i,def_val);
	setAngle      (i,def_val);
	setTrackN     (i,gHades->getEmbeddingRealTrackId());
	setTof        (i,-999);

	setDTime1     (i,getTime1Real());
	setDTime1Err  (i,def_val);

	setDTime2     (i,-999);
	setDTime2Err  (i,def_val);

	setCutEdge    (i,kFALSE);
	setWireOffset (i,0.);
        setEfficiency (i,1.);
        setTheta(i,0.);
	setStatus     (i,3);
	setFractionOfmaxCharge(i,0);

        // second hit
	setMinimumDist(i + 1,def_val);
	setAngle      (i + 1,def_val);
	setTrackN     (i + 1,gHades->getEmbeddingRealTrackId());
	setTof        (i + 1,def_val);

	if(getTime2Real() > -998)
	{   // if there has been a real second hit
	    setDTime1(i + 1,getTime2Real());
	}
	else
	{   // if there has been no second hit
            setDTime1(i + 1,1000);
	}
	setDTime1Err (i + 1,def_val);

	setDTime2    (i + 1,-999);
	setDTime2Err (i + 1,def_val);

	setCutEdge   (i + 1,kFALSE);
	setWireOffset(i + 1,0.);
	setStatus    (i + 1,3);
	setFractionOfmaxCharge(i + 1,0);
    }
    else
    {
	Warning("HMdcDigitizer:fillArraysReal()","real hit could not be stored to array,\n because the maximum has been exceeded!");
    }
}
void HMdcDigitizer::setEfficiencyFlags(Int_t ihit,Int_t sec,Int_t mod,Int_t lay)
{
    // Cuts for cell efficiency layer efficiency and wire status are checked
    // and the statusflag of the cells are set correspondingly
    // Has to be done for sim tracks only!
    if(getTrackN(ihit) != gHades->getEmbeddingRealTrackId())
    {

	Float_t layEffPenalty = getEfficiency(ihit); // this number should be multiplied to layer Eff

	Float_t efflevel = getFractionOfmaxCharge(ihit);
        // only for sim hits
	if(evalWireStat(sec,mod,lay,loc[3]))
	{ // if the wire is connected and working or wireStatUse=kFALSE
	    if(getCellEffUse())
	    {
		//--------------------------------------------
		// get particle infos for dEdx calculation
		setStatus             (ihit,fCellEff->calcEfficiency(mod,getMinimumDist(ihit),getAngle(ihit),efflevel));
		setFractionOfmaxCharge(ihit,fCellEff->calcEffval(mod,getMinimumDist(ihit)    ,getAngle(ihit),efflevel));
	    }
	    else
	    {
		setStatus(ihit,1);
		setFractionOfmaxCharge(ihit,100);
	    }
	    // Efficiency of MDC layers can be less then 100%...
	    Float_t eff  = fDigitPar->getLayerEfficiency     (sec,mod,lay);
	    if(useLayerThickness) eff*= layEffPenalty;  // loss scaled by theta (account for impact angle)



	    if(fWireStat && useWireStatEff){ eff *= fWireStat->getEfficiency(sec,mod,lay,loc[3]);}

	    Float_t valRand = 1;

	    Int_t ind = findTrack(getTrackN(ihit));
	    if(ind == -1) {
		Error("setEfficiencyFlags()","tracknumber %i not Found",getTrackN(ihit));
	    } else if (vLayEff[ind].ct[sec][mod][lay] == 1){ // normal tracks
		valRand = vLayEff[ind].eff[sec][mod][lay];
	    } else {  // for curling tracks
		valRand = gRandom->Rndm();
	    }

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

	    if(getCellEffUse()&&useDeDxScaling){
		// do scaling with beta > fBetaLow
		Double_t initFrac  = 100.- getCellEffLevel(mod);                      // dedx > fBetaLow
                Double_t scale     = efflevel/initFrac;                               // get scaling factor back ( > 1 for mip)
		Double_t effScale  = fDigitPar->getLayerEfficiencyScale(sec,mod,lay); // max additional loss for mips ( 0.98 for 2% reduction)

		Double_t dedx_low = fbetadEdx->Eval(fBetaLow);
		Double_t dedx_mip = fbetadEdx->Eval(0.95);
                Double_t scaleMip = dedx_low/dedx_mip;
		eff -=  (( scale - 1. )/(scaleMip -1.))*(1.-effScale);
                if(eff < 0) eff = 0;
	    }
	    //-------------------------------------



	    if(valRand > eff)
	    {
		switch (getStatus(ihit))
		{
		case   1: setStatus(ihit,-2); // if it is kicked out by layer efficiency
		break;
		case  -1: setStatus(ihit,-1); // if it was kicked out by cell efficiency
		break;
		default : setStatus(ihit,-7); // just control
		break;
		}

	    }
	}
	else
	{ // if wire is not connected or dead
	    setStatus(ihit,-3);
	    setFractionOfmaxCharge(ihit,0);
	}
    }
    else
    {
        // real hits should allways be used
	setStatus(ihit,3);
	setFractionOfmaxCharge(ihit,0);
    }
}

void HMdcDigitizer::setTimeCutFlags(Int_t ihit,Int_t sec,Int_t mod,Int_t lay)
{
    // Cuts for drit times and the statusflag of the cells are set
    // correspondingly. Has to be done for sim tracks only!

    if(getTimeCutUse())
    {
	if(getTrackN(ihit) != gHades->getEmbeddingRealTrackId())
	{
	    // only for sim hits
	    if( getStatus(ihit) > 0                             &&
	        (
		 !fTimeCut->cutTime1   (sec,mod,getDTime1(ihit)) ||
		 !fTimeCut->cutTime2   (sec,mod,getDTime2(ihit)) ||
		 !fTimeCut->cutTimesDif(sec,mod,getDTime1(ihit),getDTime2(ihit))
		)
	      )
	    {
		// drift time did not pass the cuts , set the propper statusflag
		setStatus(ihit,-5);
	    }
	}
    }
}
void HMdcDigitizer::setTimeCutFlags(HMdcCal1Sim* cal1)
{
    // Cuts for drit times and the statusflag of the cells are set
    // correspondingly. Has to be done for sim tracks only!

    if(getTimeCutUse())
    {
	if( cal1->getStatus1() > 0 &&
	   (
	    !fTimeCut->cutTime1   (cal1) ||
	    !fTimeCut->cutTime2   (cal1) ||
	    !fTimeCut->cutTimesDif(cal1)
	   )
	  )
	{
	    // drift time did not pass the cuts , set the propper statusflag
	    cal1->setStatus1(-5);
	    cal1->setStatus2(-5);
	}
    }
}
Bool_t HMdcDigitizer::evalWireStat(Int_t sec,Int_t mod,Int_t lay,Int_t cell)
{
    // gets the status of the wire from HMdcWireStat.
    // returns kFALSE if wire is dead or not connected.

    Bool_t result = kTRUE;
    Int_t stat    = -99;
    if(getWireStatUse()) {
        stat = fWireStat->getStatus(sec,mod,lay,cell);
        (stat > 0)? result = kTRUE : result = kFALSE;
    }
    return result;
}

void HMdcDigitizer::initArrays()
{
    // init working arrays with default values

    for(Int_t i = 0; i < NMAXHITS; i ++)   // reset arrays
    {
	dTime              [i] = 0.;
	dTime2             [i] = 0.;
	dTimeErr           [i] = 0.;
	dTime2Err          [i] = 0.;
	minimumdist        [i] = 0.;
	track              [i] = -99;
	timeOfFlight       [i] = 0.;
	angle              [i] = 0.;
	statusflag         [i] = 0;
	fractionOfmaxCharge[i] = 0.;
	cutEdge            [i] = kFALSE;
	wireOffset         [i] = 0.;
	efficiency         [i] = 1.;
	theta              [i] = 0.;
    }
}

void HMdcDigitizer::resetListVariables()
{
    // reset the list variables for the search of valid
    // hits
    setFirstHit  (-999); // number of first valid hit
    setSecondHit (-999); // number of second valid hit
    setFirstTime2(-999); // time2 of first valid hit
    setEndList1  (-999); // last hit in window of first valid hit
};
void HMdcDigitizer::resetCal1Real()
{
    // reset the local variables for the
    // real cal1 hit
    setTime1Real(-999);
    setTime2Real(-999);
    setNHitsReal(0);
};

void HMdcDigitizer::getCal1Real()
{
    // copy time1, time2 and nhits from
    // real cal1 object to local variables
    setTime1Real(fCal->getTime1());
    setTime2Real(fCal->getTime2());
    setNHitsReal(fCal->getNHits());
}


void HMdcDigitizer::fillNTuple(Int_t sec,Int_t mod,Int_t lay,Int_t cell,Int_t ihit,
			       HMdcGeantCell* fCell, TNtuple* distance_time)
{
    // The NTuple is filled with internal data of the digitizer

    distance_time->Fill(sec,mod,lay,cell,
			getMinimumDist(ihit),
			getAngle(ihit),
			getDTime1(ihit),
			getDTime1Err(ihit),
			getDTime2(ihit),
			getDTime2Err(ihit),
			getTof(ihit),
			getCutEdge(ihit),
			getStatus(ihit),
			getTrackN(ihit),
			getFractionOfmaxCharge(ihit)
		       );
}
void HMdcDigitizer::fillNTuple(Int_t sec,Int_t mod,Int_t lay,Int_t cell,
			       Float_t time, Float_t time2,
			       Int_t status)
{
    // The NTuple is filled with internal data of the digitizer
    // in the case of noise generation
    distance_time->Fill(sec,mod,lay,cell,
			-1,
			-1,
			time ,0,
			time2,0,
			0,
			0,
			status,
			-99,
		        100);
}

Float_t HMdcDigitizer::fillTime1Noise(Int_t mod)
{
    // A random time in a specified time window
    // for the noise simulation is calculated
    Float_t time1Noise = -999;
    time1Noise = (gRandom->Rndm() * (getNoiseRangeHi(mod)-getNoiseRangeLo(mod))) + getNoiseRangeLo(mod);
    return  time1Noise;
}
Float_t HMdcDigitizer::fillTime2Noise(Int_t mod)
{
    // A random time in a specified time window
    // for the noise simulation is calculated
    Float_t time2Noise = -999;
    if(gRandom->Rndm() < getNoiseWhiteRatio())
    {
	time2Noise = getTime1Noise() + gRandom->Rndm() * getNoiseWhiteWidth();
    }
    else {
	time2Noise = getTime1Noise() + gRandom->Rndm() * getNoiseBandWidth();
    }
    return  time2Noise;
}
void HMdcDigitizer::fillNoiseLists(HMdcCal1Sim* cal1,Int_t statval,Int_t geant)
{

    // sets the lists of status and tracks
    // statval is put to the first entry of the status list
    // if geant==1 (cell was Geant hit before), the original
    // track numbers and the status flags (except the first) are kept

    if(geant == 0)
    {   // noise only
	Int_t dummystat [5] = {  0,  0,  0,  0,  0};
	Int_t dummytrack[5] = {-99,-99,-99,-99,-99};
	dummystat[0] =statval;

	cal1->setStatusList(dummystat);       // store array in cal1sim level
	cal1->setTrackList(dummytrack);       // store array in cal1sim level
    }
    else
    {   // noise into Geant cell
	Int_t* mylist = cal1->getStatusList();
	mylist[0] = statval;
    }

}
void HMdcDigitizer::fillNoiseToGeantCells(Int_t mod,HMdcCal1Sim* cal1)
{
    // If timenoise < time of the first valid GEANT hit
    // the time is replaced by timenoise and the
    // statusflag is changed from 1 (valid) to 2 (valid but noise)


    setTime1Noise(fillTime1Noise(mod));
    setTime2Noise(fillTime2Noise(mod));

    if(getTime1Noise() < cal1->getTime1())
    {
	    cal1->setStatus1(2);              // noise hit
	    cal1->setTime1(getTime1Noise());  // old time1 is replaced by noise
	    cal1->setTime2(getTime2Noise());  // old time2 is replaced by noise
            cal1->setError1(-99);             // noise has no error
	    cal1->setError2(-99);             // noise has no error
	    cal1->setTof1(-999);               // tof->0 to put the correct noise time to the output
            cal1->setTof2(-999);               // tof->0 to put the correct noise time to the output
	    cal1->setWireOffset1(-99);        // noise has no wire offset
	    cal1->setWireOffset2(-99);        // noise has no wire offset
            cal1->setStatus1(2);              // noise has no wire offset
            cal1->setStatus2(2);              // noise has no wire offset
            cal1->setAngle1(-99);             // no impact angle
            cal1->setAngle2(-99);             // no impact angle
            cal1->setMinDist1(-99);           // no min dist
            cal1->setMinDist2(-99);           // no min mindist
            cal1->setNTrack1(-99);            // no track id
            cal1->setNTrack2(-99);            // no track id
            fillNoiseLists(cal1,-4,1);        // fill list of status/tracks
    }
}
void HMdcDigitizer::setLoopVariables(Int_t s,Int_t m,Int_t l,Int_t c,Bool_t check)
{
    if(check)handleOverFlow(s,m,l,c);
    else {
	firstsec  = s;
	firstmod  = m;
	firstlay  = l;
        firstcell = c;
    }
}
void HMdcDigitizer::handleOverFlow(Int_t firsts, Int_t firstm, Int_t firstl, Int_t firstc)
{
    // if last cell in Layer has been reached
    // the next valid cell in setup has to be taken

    if(firstc>(*geomstruct)[firsts][firstm][firstl])
    {
	// find next valid module

	if(firstl < 5)
	{ // just switch to next layer
	    setLoopVariables(firsts,firstm,firstl + 1,0);
	}
	else
	{ // if last layer, we have to move to next valid module
	    Int_t found = 0;
	    for(Int_t i = firsts; i < 6; i ++)
	    {
		for(Int_t j = firstm; j < 4; j ++)
		{
		    if(testMdcSetup(i,j))
		    {   // if a valid module in this sector has been found
			found ++;
			if(found == 1) setLoopVariables(i,j,0,0);
		    }
		}
	    }
	    // if no valid module found switch to last ( will be skipped : 500 < lastcell)
	    if(found == 0) setLoopVariables(firsts,firstm,firstl,500);
	}
    } else setLoopVariables(firsts,firstm,firstl,firstc);
}

void HMdcDigitizer::fillNoise(Int_t firsts, Int_t firstm, Int_t firstl, Int_t firstc,
			      Int_t lastsec, Int_t lastmod, Int_t lastlay, Int_t lastcell)
{
    // Fills the noise cells to Cal1Sim up to the next GEANT Cell
    // and the rest of the noise cells after the last GEANT Cell (if
    // input lastcell==999).

    fCalnoise = 0;
    locnoise.set(4,0,0,0,0);

    if(lastcell != 999) handleOverFlow(firsts,firstm,firstl,firstc);

    for (Int_t sec = firstsec; sec <= lastsec; sec ++)
    {
        if(sec > 5) continue;
	for (Int_t mod = firstmod; mod <= lastmod; mod ++)
	{
            if(mod > 3) continue;
	    // test if module is existing in current setup
	    if(!testMdcSetup(sec,mod) )continue;

	    for (Int_t lay = firstlay; lay <= lastlay; lay ++)
	    {
                if(lay > 5) continue;
		if(lastcell != 999)
		{
		    for (Int_t cell = firstcell; cell < lastcell; cell ++)
		    {
                        if(cell > (*geomstruct)[sec][mod][lay]) continue;

			if(evalWireStat(sec,mod,lay,cell))
                        { // if wire is connected and working
                            if(gRandom->Rndm()<getNoiseLevel(mod))
                            {
                                locnoise[0] = sec;
                                locnoise[1] = mod;
                                locnoise[2] = lay;
                                locnoise[3] = cell;

				fCalnoise = (HMdcCal1Sim*)fCalCat->getSlot(locnoise);
                                if (fCalnoise)
                                {
				    fCalnoise = new(fCalnoise) HMdcCal1Sim;
                                    fCalnoise->setAddress(sec,mod,lay,cell);
                                    if (getTdcMode() == 1)
                                    {
                                        fCalnoise->setNHits(-1);
                                        fCalnoise->setStatus1(2);
                                        fCalnoise->setStatus2(-3);


					setTime1Noise(fillTime1Noise(locnoise[1]));
                                        setTime2Noise(-999);
                                        fCalnoise->setTime1(getTime1Noise());

					if(getNTuple())
                                        {
                                            fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
                                                       getTime1Noise(),getTime2Noise(),2);
                                        }
                                    }
                                    else if(getTdcMode() == 2)
                                    {
					fCalnoise->setNHits(2);
                                        fCalnoise->setStatus1(2);
                                        fCalnoise->setStatus2(2);
                                        setTime1Noise(fillTime1Noise(locnoise[1]));
                                        setTime2Noise(fillTime2Noise(locnoise[1]));
                                        fCalnoise->setTime1(getTime1Noise());
                                        fCalnoise->setTime2(getTime2Noise());

					if(getNTuple())
                                        {
                                            fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
                                                       getTime1Noise(),getTime2Noise(),2);
                                        }
                                    }
                                    fillNoiseLists(fCalnoise,2,0);
				}
                            }
                        }
                    }
                }
                if(lastcell == 999)
                {   // fill up to the last existing wire
                    HMdcLayerGeomParLay& layernoise = (*fDigitGeomPar)[sec][mod][lay];
                    Int_t   nWires = layernoise.getNumWires(); // number of wires per layer

                    for (Int_t cell = firstc; cell < nWires; cell ++)
                    {
                       if(evalWireStat(sec,mod,lay,cell))
                        { // if wire is connected and working
                            if(gRandom->Rndm() < getNoiseLevel(mod))
                            {
                                locnoise[0] = sec;
                                locnoise[1] = mod;
                                locnoise[2] = lay;
                                locnoise[3] = cell;

                                fCalnoise = (HMdcCal1Sim*)fCalCat->getSlot(locnoise);
                                if(fCalnoise)
                                {
                                    fCalnoise = new(fCalnoise) HMdcCal1Sim;
                                    fCalnoise->setAddress(sec,mod,lay,cell);
                                    if(getTdcMode() == 1)
                                    {
                                        fCalnoise->setNHits(-1);
                                        fCalnoise->setStatus1(2);
                                        fCalnoise->setStatus2(-3);
                                        setTime1Noise(fillTime1Noise(locnoise[1]));
                                        setTime2Noise(-999);
                                        fCalnoise->setTime1(getTime1Noise());

					if(getNTuple())
                                        {
                                            fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
                                                       getTime1Noise(),getTime2Noise(),2);
                                        }
                                    }
                                    else if(getTdcMode() == 2)
                                    {
					fCalnoise->setNHits(2);
                                        fCalnoise->setStatus1(2);
                                        fCalnoise->setStatus2(2);
                                        setTime1Noise(fillTime1Noise(locnoise[1]));
                                        setTime2Noise(fillTime2Noise(locnoise[1]));
                                        fCalnoise->setTime1(getTime1Noise());
                                        fCalnoise->setTime2(getTime2Noise());

					if(getNTuple())
                                        {
                                            fillNTuple(locnoise[0],locnoise[1],locnoise[2],locnoise[3],
                                                       getTime1Noise(),getTime2Noise(),2);

                                        }
                                    }
				    fillNoiseLists(fCalnoise,2,0);
				}
                            }
                        }
                    }
                }
            }
        }
    }
}

void HMdcDigitizer::fillTrackList( HMdcCal1Sim* fCal)
{
    // fills track list and status list for hits in both tdc modes
    Int_t array [5];
    Int_t array1[5];

    for(Int_t i = 0; i < 5; i ++)
    {
	array [i] = getTrackN(i);
	array1[i] = getStatus(i);
    }
    fCal->setTrackList (array);  // store array in cal1sim level
    fCal->setStatusList(array1); // store array in cal1sim level
}
void HMdcDigitizer::findFirstValidHit()
{
    // Function to find the first valid hit (statusflag > 0) inside the
    // array for both tdc modes. Returns the number of the element of the
    // first valid hit and last hit inside the time  window to variables.

    Int_t hit     = 0;
    Int_t lasthit = 0;
    while(getStatus(hit) <= 0) // find first valid hit
    {
	lasthit ++;
	hit ++;
	if(hit == NMAXHITS)
	{
	    // if last element is reached without found
	    // condtion set flags and break
            resetListVariables();
	    break;
	}
    }
    if(hit < NMAXHITS)
    {
	while(lasthit < NMAXHITS && getDTime1(lasthit) <= getDTime2(hit))
	{
	    lasthit ++; // last hist which falls into window of first hit
	}
	// set output values if condition was true
	setFirstHit(hit);
	setFirstTime2(getDTime2(hit));

	if(lasthit < NMAXHITS)
	{
	    setEndList1(lasthit);
	}
	else
	{
	    setEndList1(-999);
	}
    }

}
void HMdcDigitizer::findSecondValidHit()
{
    // Function to find the second valid hit (statusflag > 0) inside the
    // array for tdc mode1. Returns the number of the element of the second
    // valid hit

    Int_t hit = getEndList1() + 1;
    if(hit < NMAXHITS && getEndList1() != -999) // make sure that it is not last element and a valid first hit exist
    {
	while(getStatus(hit) <= 0)
	{
	    // stop if status=1 and second hit starts after first hit ends
	    hit ++;
	    if(hit == NMAXHITS)
	    {
		// if last element is reached without found
		// condtion set flags and break
		setSecondHit(-999);
		break;
	    }
	}
	if(hit < NMAXHITS)
	{
            // set output values if condition was true
	    setSecondHit(hit);
	}
    }
    else
    {
	// function was called with las element
        // and skipped to end => no valid second hit found
	setSecondHit(-999);
    }
}
Int_t HMdcDigitizer::findNonValidHit()
{
    // Function to find the first valid hit (statusflag > 0) inside the
    // array for both tdc modes. Returns the number of the element of the
    // first valid hit and last hit inside the time  window to variables.

    Int_t hit          = 0;
    Int_t foundTimeCut = 0;

    while(getStatus(hit) <= 0) // find first valid hit
    {
	if(getStatus(hit) == -5 ) foundTimeCut ++;

	hit ++;

	if(hit == NMAXHITS)
	{
	    break;
	}
    }
    if(hit == NMAXHITS)
    {   // reached end and did not find a valid hit
	return  foundTimeCut > 0 ? -5 : -3;
    } else { return -7; }

}

void HMdcDigitizer::select(Int_t nHits)
{
    // Puts the drift time values into increasing order.
    // Orders the corresponding track number, time of flight, statusflag
    // and impact angle etc accordingly

    register Int_t a,b,c;
    Int_t exchange;
    Float_t t;
    Float_t t2;
    Float_t tErr;
    Float_t t2Err;

    Float_t flight;
    Float_t angleLocal;
    Int_t statlocal;
    Int_t tracklocal;
    Float_t mindistlocal;
    Bool_t cutEdgelocal;
    Float_t fractionlocal;
    Float_t wireOffsetlocal;

    if(nHits <= NMAXHITS)
    {
	for(a = 0; a < nHits - 1; ++ a)
	{
	    exchange = 0;
	    c = a;

	    t               = dTime[a];
	    tErr            = dTimeErr[a];
	    t2              = dTime2[a];
	    t2Err           = dTime2Err[a];
	    tracklocal      = track[a];
	    flight          = timeOfFlight[a];
	    angleLocal      = angle[a];
	    statlocal       = statusflag[a];
	    mindistlocal    = minimumdist[a];
	    cutEdgelocal    = cutEdge[a];
	    fractionlocal   = fractionOfmaxCharge[a];
            wireOffsetlocal = wireOffset[a];

	    for(b=a+1;b<nHits;++b)
	    {
		if(dTime[b]<t)
		{
		    c = b;

		    t               = dTime[b];
		    tErr            = dTimeErr[b];
		    t2              = dTime2[b];
		    t2Err           = dTime2Err[b];
		    tracklocal      = track[b];
		    flight          = timeOfFlight[b];
		    angleLocal      = angle[b];
		    statlocal       = statusflag[b];
		    mindistlocal    = minimumdist[b];
		    cutEdgelocal    = cutEdge[b];
		    fractionlocal   = fractionOfmaxCharge[b];
		    wireOffsetlocal = wireOffset[b];

		    exchange = 1;
		}
	    }
	    if(exchange)
	    {
		dTime[c]               = dTime[a];
		dTime[a]               = t;
		dTimeErr[c]            = dTimeErr[a];
		dTimeErr[a]            = tErr;
		dTime2[c]              = dTime2[a];
		dTime2[a]              = t2;
		dTime2Err[c]           = dTime2Err[a];
		dTime2Err[a]           = t2Err;
		track[c]               = track[a];
		track[a]               = tracklocal;
		timeOfFlight[c]        = timeOfFlight[a];
		timeOfFlight[a]        = flight;
		angle[c]               = angle[a];
		angle[a]               = angleLocal;
		statusflag[c]          = statusflag[a];
		statusflag[a]          = statlocal;
		minimumdist[c]         = minimumdist[a];
		minimumdist[a]         = mindistlocal;
		cutEdge[c]             = cutEdge[a];
		cutEdge[a]             = cutEdgelocal;
		fractionOfmaxCharge[c] = fractionOfmaxCharge[a];
		fractionOfmaxCharge[a] = fractionlocal;
		wireOffset[c]          = wireOffset[a];
		wireOffset[a]          = wireOffsetlocal;
	    }
	}

    }
    else
    {
	Warning("HMdcDigitizer:select(nHits)","nHits > 15! Entries >15 skipped! ");
    }
}
void HMdcDigitizer::getMdcSetup()
{
    // Gets Mdc detector setup

    HMdcDetector* mdcDet=(HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
    if (!mdcDet)
    {
	Error("HMdcDigitizer::getMdcSetup()","Mdc-Detector setup (gHades->getSetup()->getDetector(\"Mdc\")) missing.");
    }
    for(Int_t s = 0; s < 6; s ++) {
	for(Int_t m = 0; m < 4; m ++) {
	    if (!mdcDet->getModule(s, m)) setup[s][m] = 0;
	    if ( mdcDet->getModule(s, m)) setup[s][m] = 1;
	}
    }
}

Bool_t HMdcDigitizer::testMdcSetup(Int_t s, Int_t m)
{
    // Tests the Mdc setup if the modules are present
    // in the running analysis

    Bool_t result=kFALSE;
    if(setup[s][m] == 0) result = kFALSE;
    if(setup[s][m] == 1) result = kTRUE;
    return result;
}
Bool_t HMdcDigitizer::transform(Float_t xcoor,Float_t ycoor,Float_t theta,
                                Float_t phi  ,Float_t tof  ,Int_t trkNum) {
    // Gets the x,y coordinates, theta and phi, time of flight and track number.
    // From the coordinates and angles the hits in the cells are calculated.
    // All needed parameters are taken from HMdcLayerGeomPar and HMdcDigitPar
    // containers.

    // in HMdcCal2ParSim:
    // Input is the angle of the track (alphaTrack:90 degree for perpendicular impact),which
    // has to be recalculated to the angle of minimum drift distance (alphaDrDist:0 degree for
    // perpendicular impact).
    //   y ^
    //     |  |------------*----|              cathod  plane
    //     |  | cell        *   |
    //     |  |            / *  |
    //     |  |           /90 * |
    //     |  | driftDist/     *|
    //     |  |         / |     *
    //   --|--|--------*^-|-----|*--------->   sense/potential plane
    //     |  |           |     | *        x
    //     |  |      alphaDrDist|  *
    //        |                 |/  *          alphaDriftDist=90-alphaTrack
    //        |      alphaTrack /    *
    //        |-----------------|     * track  cathod plane
    //
    // angles must be between 0 and 90 degree, all other angles have to be shifted
    // before calling the function.

    HMdcSizesCellsLayer &sclayer = (*fsizescells)[loc[0]][loc[1]][loc[2]];

    Int_t nCmin,nCmax;
    if( !sclayer.calcCrCellsGeantMdc(xcoor,ycoor,theta,phi,nCmin,nCmax) ) return kFALSE;

    Float_t effPenalty = effLayerThickness(xcoor,ycoor,theta, phi,loc[0],loc[1],loc[2]);

    //Float_t eff = calcEfficiencyAtLayerEdge(xorg,yorg,loc[0],loc[1],loc[2]);
    Float_t halfPitch   = sclayer.getHalfPitch();
    Float_t halfCatDist = sclayer.getHalfCatDist();
    
    for (loc[3] = nCmin; loc[3] <= nCmax; loc[3] ++) {
    
        Float_t yDist     = sclayer.getYinRotLay(loc[3],xcoor,ycoor) - sclayer.calcWireY(loc[3]);
        Float_t wOrient   = sclayer.getWireOrient(loc[3]) * pi;
        Float_t ctanalpha = tan(theta * pi) * sin(phi * pi - wOrient);
        
        // recalculate the angle to the coordinatessystem of HMdcCal2ParSim
        myalpha = 90. - fabs(atan(ctanalpha) * TMath::RadToDeg());
     
	Float_t sinAlpha = sqrt(1. / (1. + ctanalpha * ctanalpha));
	Float_t cosAlpha = sqrt(1. - sinAlpha * sinAlpha);

	Float_t per = fabs(yDist * sinAlpha);// minimum distance of track to the wire

	Bool_t flagCutEdge = kFALSE;
	if(per * sinAlpha > halfPitch) {  // check if per is inside cell (y)

	    flagCutEdge = kTRUE;

	} else if(per * cosAlpha > halfCatDist) { // check if per is inside cell (z)

	    flagCutEdge = kTRUE;
	}

	Float_t wireOffset = 0;
	if(getWireOffsetUse()) {
          // calculate the time needed by the signal to propagate to the tdc
          HMdcSizesCellsCell& mycell = sclayer[loc[3]];
          if(&mycell != NULL && mycell.getReadoutSide() != '0') {
            Float_t x_wire = sclayer.getXinRotLay(loc[3],xcoor,ycoor);
            wireOffset = getSignalSpeed() * mycell.getSignPath(x_wire);
          }
        }
	storeCell(per,tof,myalpha,trkNum,flagCutEdge,wireOffset,effPenalty,theta);//store the final values in container
    }
    return kTRUE;
}

void HMdcDigitizer::storeCell(Float_t per,Float_t tof,Float_t myangle,Int_t trkNum
			      ,Bool_t flagCutEdge,Float_t wireOffset,Float_t eff,Float_t theta)
{
    // Puts the data (minimum distance, time of flight, impact angle,
    // track number, flagCutEdge) to HMdcGeantCell Category

    hit = (HMdcGeantCell*)fGeantCellCat->getObject(loc);
    if (!hit) {
	hit = (HMdcGeantCell*)fGeantCellCat->getSlot(loc);
	hit = new(hit) HMdcGeantCell;
    }
    Int_t nHit;
    nHit = hit->getNumHits();
    if (nHit < NMAXHITS ) {  // only the first 15 hits are stored
	hit->setSector(loc[0]);
	hit->setModule(loc[1]);
	hit->setLayer(loc[2]);
	hit->setCell(loc[3]);
	hit->setNumHits(nHit +  1);
	hit->setMinDist(per,nHit);
	hit->setTimeFlight(tof,nHit);
	hit->setImpactAngle(myangle,nHit);
	hit->setNTrack(trkNum,nHit);
	hit->setFlagCutEdge(flagCutEdge,nHit);
        hit->setWireOffset(wireOffset,nHit);
	hit->setEfficiency(eff,nHit);
        hit->setTheta(theta,nHit);
    }
    else
    {
	Warning("HMdcDigitizer:storeCell()","hit could not be stored in HMdcGeantCell ,\n because number of hits exceeded the maximum!");
    }
}
void HMdcDigitizer::initOffsets(TString filename)
{
    // if createoffsets=kTRUE (setCreateOffsets()) a gausian distribution arround 0 with
    // sigma = sigmaoffsets is created (setSigmaOffsets(Float_t sig)). The values are written
    // to a ascii file "filename" for future use (if this file exists, it
    // will be over written!).
    // If createoffsets=kFALSE the offsets will not be recreated and instead the digitizer will
    // read them from ascii file "filename".
    // Format :  sector module layer cell offset
    if(createoffsets)
    {   // create the random offsets
        for(Int_t s = 0;s < 6; s ++){
            for(Int_t m = 0; m < 4; m ++){
                for(Int_t l = 0; l < 6; l ++){
                    for(Int_t c = 0; c < 220; c ++){
                        rndmoffsets[s][m][l][c] = gRandom->Gaus(0.,getSigmaOffsets());
                    }
                }
            }
        }

        if(filename.CompareTo("") == 0)
        {
            Warning("HMdcDigitizer:initOffsets()","No file name specified, offsets will not be written to file!");
        }
        else
        {
            FILE* ascii=fopen(filename,"w");
            for(Int_t s = 0; s < 6; s ++){
                for(Int_t m = 0; m < 4; m ++){
                    for(Int_t l = 0; l < 6; l ++){
                        for(Int_t c = 0; c <220; c ++){
                            fprintf(ascii,"%i %i %i %3i %7.3f \n",s,m,l,c,rndmoffsets[s][m][l][c]);
                        }
                    }
                }
            }
            fclose(ascii);
        }
    }
    else
    {
        FILE* ascii = fopen(filename,"r");
        if(!ascii)
        {
            Warning("HMdcDigitizer:initOffsets()","Specified file %s does not exist, offsets will be 0.0.!",filename.Data());
        }
        else
        {
            cout<<"HMdcDigitizer:initOffsets() Reading offset table from file "<<filename.Data()<<endl;
	    Char_t line[400];

            while(1)
            {
                Int_t s,m,l,c;
                Float_t off;
                if(feof(ascii)) break;
                Bool_t res=fgets(line, sizeof(line), ascii);
		if(!res)cout<<"initOffsets: cannot read next line!"<<endl;
                sscanf(line,"%i %i %i %i %f",&s,&m,&l,&c,&off);
                rndmoffsets[s][m][l][c] = off;
            }
            fclose(ascii);
        }
    }
    offsetsCreated = kTRUE;
}

Int_t HMdcDigitizer::findTrack(Int_t trk)
{
    // returns index of track in array
    // if track is not found returns -1

    for(UInt_t i = 0; i < vLayEff.size(); i ++){
       if(vLayEff[i].trackNum == trk) return i;
    }
    return -1;
}

Float_t HMdcDigitizer::effLayerThickness(Float_t xcoor,Float_t ycoor,Float_t th,Float_t ph,Int_t s,Int_t m,Int_t l)
{
    Float_t effmin = fDigitPar ->getLayerEfficiencyThickness(s,m,l);
    if(effmin==0) return 1;
    const Float_t effmax = 1.00;

    HMdcSizesCellsMod&   sizescellsMod = (*fsizescells)[s][m];
    HMdcSizesCellsLayer& sizescellsLay = (*fsizescells)[s][m][l];

    Float_t Lmin = layEff.Lmin[s][m][l];
    Float_t Lmax = layEff.Lmax[s][m][l];

    if(Lmin < 0 || Lmax < 0) {

	Error("effLayerThickness()","Lmin or Lmax not set Lmin =  %f , Lmax =  %f ! ",Lmin,Lmax);
        return 1;
    }

    //-------------------------------------------------------
    // calculate straight line in sec coordinate sys
    // from Geant MDC
    Double_t x1,y1,z1,x2,y2,z2;

    Double_t theta = th*TMath::DegToRad();
    Double_t phi   = ph*TMath::DegToRad();
    Double_t sinTh = sin(theta);
    Double_t xDir  = sinTh*cos(phi);
    Double_t yDir  = sinTh*sin(phi);
    Double_t zDir  = sqrt(1.-sinTh*sinTh);
    x2=x1=xcoor;
    y2=y1=ycoor;
    z2=z1=0.;
    x2 += xDir*1000.;
    y2 += yDir*1000.;
    z2 += zDir*1000.;
    sizescellsMod.transFromZ0(x1,y1,z1);
    sizescellsMod.transFrom  (x2,y2,z2);
    //-------------------------------------------------------



    //-------------------------------------------------------
    // find the total path length in layer
    Int_t firstCell,lastCell;
    Float_t firstCellPath,midCellPath,lastCellPath;
    Int_t ncells=0;
    if(sizescellsLay.calcCrossedCells(x1,y1,z1, x2,y2,z2,
				      firstCell,lastCell,
				      firstCellPath,midCellPath,lastCellPath))
    {

	ncells = 1;
	ncells += lastCell-firstCell;

	Float_t totalePathInLayer = 0.;

	for(Int_t cell=firstCell;cell<=lastCell;++cell) {
	    Float_t cellPath;
	    if      (cell == firstCell) { cellPath = firstCellPath;}
	    else if (cell == lastCell)  { cellPath = lastCellPath; }
	    else                        { cellPath = midCellPath;  }
	    totalePathInLayer += cellPath;
	}

        if(totalePathInLayer>Lmax) totalePathInLayer = Lmax;
        if(totalePathInLayer<Lmin) totalePathInLayer = Lmin;

        Float_t eff  = effmin +  ( (effmax - effmin)  *  (totalePathInLayer-Lmin) / (Lmax-Lmin) );
        //cout<<m<<" "<<l<<" theta " <<th<<" phi "<<ph <<" path " <<totalePathInLayer<<" minPath "<< Lmin <<" maxPath "<< Lmax <<" effmin "<<effmin<<" eff "<<eff<<endl;
        return eff;

    } else return 1;
    //-------------------------------------------------------
}


ClassImp(HMdcDigitizer)
 hmdcdigitizer.cc:1
 hmdcdigitizer.cc:2
 hmdcdigitizer.cc:3
 hmdcdigitizer.cc:4
 hmdcdigitizer.cc:5
 hmdcdigitizer.cc:6
 hmdcdigitizer.cc:7
 hmdcdigitizer.cc:8
 hmdcdigitizer.cc:9
 hmdcdigitizer.cc:10
 hmdcdigitizer.cc:11
 hmdcdigitizer.cc:12
 hmdcdigitizer.cc:13
 hmdcdigitizer.cc:14
 hmdcdigitizer.cc:15
 hmdcdigitizer.cc:16
 hmdcdigitizer.cc:17
 hmdcdigitizer.cc:18
 hmdcdigitizer.cc:19
 hmdcdigitizer.cc:20
 hmdcdigitizer.cc:21
 hmdcdigitizer.cc:22
 hmdcdigitizer.cc:23
 hmdcdigitizer.cc:24
 hmdcdigitizer.cc:25
 hmdcdigitizer.cc:26
 hmdcdigitizer.cc:27
 hmdcdigitizer.cc:28
 hmdcdigitizer.cc:29
 hmdcdigitizer.cc:30
 hmdcdigitizer.cc:31
 hmdcdigitizer.cc:32
 hmdcdigitizer.cc:33
 hmdcdigitizer.cc:34
 hmdcdigitizer.cc:35
 hmdcdigitizer.cc:36
 hmdcdigitizer.cc:37
 hmdcdigitizer.cc:38
 hmdcdigitizer.cc:39
 hmdcdigitizer.cc:40
 hmdcdigitizer.cc:41
 hmdcdigitizer.cc:42
 hmdcdigitizer.cc:43
 hmdcdigitizer.cc:44
 hmdcdigitizer.cc:45
 hmdcdigitizer.cc:46
 hmdcdigitizer.cc:47
 hmdcdigitizer.cc:48
 hmdcdigitizer.cc:49
 hmdcdigitizer.cc:50
 hmdcdigitizer.cc:51
 hmdcdigitizer.cc:52
 hmdcdigitizer.cc:53
 hmdcdigitizer.cc:54
 hmdcdigitizer.cc:55
 hmdcdigitizer.cc:56
 hmdcdigitizer.cc:57
 hmdcdigitizer.cc:58
 hmdcdigitizer.cc:59
 hmdcdigitizer.cc:60
 hmdcdigitizer.cc:61
 hmdcdigitizer.cc:62
 hmdcdigitizer.cc:63
 hmdcdigitizer.cc:64
 hmdcdigitizer.cc:65
 hmdcdigitizer.cc:66
 hmdcdigitizer.cc:67
 hmdcdigitizer.cc:68
 hmdcdigitizer.cc:69
 hmdcdigitizer.cc:70
 hmdcdigitizer.cc:71
 hmdcdigitizer.cc:72
 hmdcdigitizer.cc:73
 hmdcdigitizer.cc:74
 hmdcdigitizer.cc:75
 hmdcdigitizer.cc:76
 hmdcdigitizer.cc:77
 hmdcdigitizer.cc:78
 hmdcdigitizer.cc:79
 hmdcdigitizer.cc:80
 hmdcdigitizer.cc:81
 hmdcdigitizer.cc:82
 hmdcdigitizer.cc:83
 hmdcdigitizer.cc:84
 hmdcdigitizer.cc:85
 hmdcdigitizer.cc:86
 hmdcdigitizer.cc:87
 hmdcdigitizer.cc:88
 hmdcdigitizer.cc:89
 hmdcdigitizer.cc:90
 hmdcdigitizer.cc:91
 hmdcdigitizer.cc:92
 hmdcdigitizer.cc:93
 hmdcdigitizer.cc:94
 hmdcdigitizer.cc:95
 hmdcdigitizer.cc:96
 hmdcdigitizer.cc:97
 hmdcdigitizer.cc:98
 hmdcdigitizer.cc:99
 hmdcdigitizer.cc:100
 hmdcdigitizer.cc:101
 hmdcdigitizer.cc:102
 hmdcdigitizer.cc:103
 hmdcdigitizer.cc:104
 hmdcdigitizer.cc:105
 hmdcdigitizer.cc:106
 hmdcdigitizer.cc:107
 hmdcdigitizer.cc:108
 hmdcdigitizer.cc:109
 hmdcdigitizer.cc:110
 hmdcdigitizer.cc:111
 hmdcdigitizer.cc:112
 hmdcdigitizer.cc:113
 hmdcdigitizer.cc:114
 hmdcdigitizer.cc:115
 hmdcdigitizer.cc:116
 hmdcdigitizer.cc:117
 hmdcdigitizer.cc:118
 hmdcdigitizer.cc:119
 hmdcdigitizer.cc:120
 hmdcdigitizer.cc:121
 hmdcdigitizer.cc:122
 hmdcdigitizer.cc:123
 hmdcdigitizer.cc:124
 hmdcdigitizer.cc:125
 hmdcdigitizer.cc:126
 hmdcdigitizer.cc:127
 hmdcdigitizer.cc:128
 hmdcdigitizer.cc:129
 hmdcdigitizer.cc:130
 hmdcdigitizer.cc:131
 hmdcdigitizer.cc:132
 hmdcdigitizer.cc:133
 hmdcdigitizer.cc:134
 hmdcdigitizer.cc:135
 hmdcdigitizer.cc:136
 hmdcdigitizer.cc:137
 hmdcdigitizer.cc:138
 hmdcdigitizer.cc:139
 hmdcdigitizer.cc:140
 hmdcdigitizer.cc:141
 hmdcdigitizer.cc:142
 hmdcdigitizer.cc:143
 hmdcdigitizer.cc:144
 hmdcdigitizer.cc:145
 hmdcdigitizer.cc:146
 hmdcdigitizer.cc:147
 hmdcdigitizer.cc:148
 hmdcdigitizer.cc:149
 hmdcdigitizer.cc:150
 hmdcdigitizer.cc:151
 hmdcdigitizer.cc:152
 hmdcdigitizer.cc:153
 hmdcdigitizer.cc:154
 hmdcdigitizer.cc:155
 hmdcdigitizer.cc:156
 hmdcdigitizer.cc:157
 hmdcdigitizer.cc:158
 hmdcdigitizer.cc:159
 hmdcdigitizer.cc:160
 hmdcdigitizer.cc:161
 hmdcdigitizer.cc:162
 hmdcdigitizer.cc:163
 hmdcdigitizer.cc:164
 hmdcdigitizer.cc:165
 hmdcdigitizer.cc:166
 hmdcdigitizer.cc:167
 hmdcdigitizer.cc:168
 hmdcdigitizer.cc:169
 hmdcdigitizer.cc:170
 hmdcdigitizer.cc:171
 hmdcdigitizer.cc:172
 hmdcdigitizer.cc:173
 hmdcdigitizer.cc:174
 hmdcdigitizer.cc:175
 hmdcdigitizer.cc:176
 hmdcdigitizer.cc:177
 hmdcdigitizer.cc:178
 hmdcdigitizer.cc:179
 hmdcdigitizer.cc:180
 hmdcdigitizer.cc:181
 hmdcdigitizer.cc:182
 hmdcdigitizer.cc:183
 hmdcdigitizer.cc:184
 hmdcdigitizer.cc:185
 hmdcdigitizer.cc:186
 hmdcdigitizer.cc:187
 hmdcdigitizer.cc:188
 hmdcdigitizer.cc:189
 hmdcdigitizer.cc:190
 hmdcdigitizer.cc:191
 hmdcdigitizer.cc:192
 hmdcdigitizer.cc:193
 hmdcdigitizer.cc:194
 hmdcdigitizer.cc:195
 hmdcdigitizer.cc:196
 hmdcdigitizer.cc:197
 hmdcdigitizer.cc:198
 hmdcdigitizer.cc:199
 hmdcdigitizer.cc:200
 hmdcdigitizer.cc:201
 hmdcdigitizer.cc:202
 hmdcdigitizer.cc:203
 hmdcdigitizer.cc:204
 hmdcdigitizer.cc:205
 hmdcdigitizer.cc:206
 hmdcdigitizer.cc:207
 hmdcdigitizer.cc:208
 hmdcdigitizer.cc:209
 hmdcdigitizer.cc:210
 hmdcdigitizer.cc:211
 hmdcdigitizer.cc:212
 hmdcdigitizer.cc:213
 hmdcdigitizer.cc:214
 hmdcdigitizer.cc:215
 hmdcdigitizer.cc:216
 hmdcdigitizer.cc:217
 hmdcdigitizer.cc:218
 hmdcdigitizer.cc:219
 hmdcdigitizer.cc:220
 hmdcdigitizer.cc:221
 hmdcdigitizer.cc:222
 hmdcdigitizer.cc:223
 hmdcdigitizer.cc:224
 hmdcdigitizer.cc:225
 hmdcdigitizer.cc:226
 hmdcdigitizer.cc:227
 hmdcdigitizer.cc:228
 hmdcdigitizer.cc:229
 hmdcdigitizer.cc:230
 hmdcdigitizer.cc:231
 hmdcdigitizer.cc:232
 hmdcdigitizer.cc:233
 hmdcdigitizer.cc:234
 hmdcdigitizer.cc:235
 hmdcdigitizer.cc:236
 hmdcdigitizer.cc:237
 hmdcdigitizer.cc:238
 hmdcdigitizer.cc:239
 hmdcdigitizer.cc:240
 hmdcdigitizer.cc:241
 hmdcdigitizer.cc:242
 hmdcdigitizer.cc:243
 hmdcdigitizer.cc:244
 hmdcdigitizer.cc:245
 hmdcdigitizer.cc:246
 hmdcdigitizer.cc:247
 hmdcdigitizer.cc:248
 hmdcdigitizer.cc:249
 hmdcdigitizer.cc:250
 hmdcdigitizer.cc:251
 hmdcdigitizer.cc:252
 hmdcdigitizer.cc:253
 hmdcdigitizer.cc:254
 hmdcdigitizer.cc:255
 hmdcdigitizer.cc:256
 hmdcdigitizer.cc:257
 hmdcdigitizer.cc:258
 hmdcdigitizer.cc:259
 hmdcdigitizer.cc:260
 hmdcdigitizer.cc:261
 hmdcdigitizer.cc:262
 hmdcdigitizer.cc:263
 hmdcdigitizer.cc:264
 hmdcdigitizer.cc:265
 hmdcdigitizer.cc:266
 hmdcdigitizer.cc:267
 hmdcdigitizer.cc:268
 hmdcdigitizer.cc:269
 hmdcdigitizer.cc:270
 hmdcdigitizer.cc:271
 hmdcdigitizer.cc:272
 hmdcdigitizer.cc:273
 hmdcdigitizer.cc:274
 hmdcdigitizer.cc:275
 hmdcdigitizer.cc:276
 hmdcdigitizer.cc:277
 hmdcdigitizer.cc:278
 hmdcdigitizer.cc:279
 hmdcdigitizer.cc:280
 hmdcdigitizer.cc:281
 hmdcdigitizer.cc:282
 hmdcdigitizer.cc:283
 hmdcdigitizer.cc:284
 hmdcdigitizer.cc:285
 hmdcdigitizer.cc:286
 hmdcdigitizer.cc:287
 hmdcdigitizer.cc:288
 hmdcdigitizer.cc:289
 hmdcdigitizer.cc:290
 hmdcdigitizer.cc:291
 hmdcdigitizer.cc:292
 hmdcdigitizer.cc:293
 hmdcdigitizer.cc:294
 hmdcdigitizer.cc:295
 hmdcdigitizer.cc:296
 hmdcdigitizer.cc:297
 hmdcdigitizer.cc:298
 hmdcdigitizer.cc:299
 hmdcdigitizer.cc:300
 hmdcdigitizer.cc:301
 hmdcdigitizer.cc:302
 hmdcdigitizer.cc:303
 hmdcdigitizer.cc:304
 hmdcdigitizer.cc:305
 hmdcdigitizer.cc:306
 hmdcdigitizer.cc:307
 hmdcdigitizer.cc:308
 hmdcdigitizer.cc:309
 hmdcdigitizer.cc:310
 hmdcdigitizer.cc:311
 hmdcdigitizer.cc:312
 hmdcdigitizer.cc:313
 hmdcdigitizer.cc:314
 hmdcdigitizer.cc:315
 hmdcdigitizer.cc:316
 hmdcdigitizer.cc:317
 hmdcdigitizer.cc:318
 hmdcdigitizer.cc:319
 hmdcdigitizer.cc:320
 hmdcdigitizer.cc:321
 hmdcdigitizer.cc:322
 hmdcdigitizer.cc:323
 hmdcdigitizer.cc:324
 hmdcdigitizer.cc:325
 hmdcdigitizer.cc:326
 hmdcdigitizer.cc:327
 hmdcdigitizer.cc:328
 hmdcdigitizer.cc:329
 hmdcdigitizer.cc:330
 hmdcdigitizer.cc:331
 hmdcdigitizer.cc:332
 hmdcdigitizer.cc:333
 hmdcdigitizer.cc:334
 hmdcdigitizer.cc:335
 hmdcdigitizer.cc:336
 hmdcdigitizer.cc:337
 hmdcdigitizer.cc:338
 hmdcdigitizer.cc:339
 hmdcdigitizer.cc:340
 hmdcdigitizer.cc:341
 hmdcdigitizer.cc:342
 hmdcdigitizer.cc:343
 hmdcdigitizer.cc:344
 hmdcdigitizer.cc:345
 hmdcdigitizer.cc:346
 hmdcdigitizer.cc:347
 hmdcdigitizer.cc:348
 hmdcdigitizer.cc:349
 hmdcdigitizer.cc:350
 hmdcdigitizer.cc:351
 hmdcdigitizer.cc:352
 hmdcdigitizer.cc:353
 hmdcdigitizer.cc:354
 hmdcdigitizer.cc:355
 hmdcdigitizer.cc:356
 hmdcdigitizer.cc:357
 hmdcdigitizer.cc:358
 hmdcdigitizer.cc:359
 hmdcdigitizer.cc:360
 hmdcdigitizer.cc:361
 hmdcdigitizer.cc:362
 hmdcdigitizer.cc:363
 hmdcdigitizer.cc:364
 hmdcdigitizer.cc:365
 hmdcdigitizer.cc:366
 hmdcdigitizer.cc:367
 hmdcdigitizer.cc:368
 hmdcdigitizer.cc:369
 hmdcdigitizer.cc:370
 hmdcdigitizer.cc:371
 hmdcdigitizer.cc:372
 hmdcdigitizer.cc:373
 hmdcdigitizer.cc:374
 hmdcdigitizer.cc:375
 hmdcdigitizer.cc:376
 hmdcdigitizer.cc:377
 hmdcdigitizer.cc:378
 hmdcdigitizer.cc:379
 hmdcdigitizer.cc:380
 hmdcdigitizer.cc:381
 hmdcdigitizer.cc:382
 hmdcdigitizer.cc:383
 hmdcdigitizer.cc:384
 hmdcdigitizer.cc:385
 hmdcdigitizer.cc:386
 hmdcdigitizer.cc:387
 hmdcdigitizer.cc:388
 hmdcdigitizer.cc:389
 hmdcdigitizer.cc:390
 hmdcdigitizer.cc:391
 hmdcdigitizer.cc:392
 hmdcdigitizer.cc:393
 hmdcdigitizer.cc:394
 hmdcdigitizer.cc:395
 hmdcdigitizer.cc:396
 hmdcdigitizer.cc:397
 hmdcdigitizer.cc:398
 hmdcdigitizer.cc:399
 hmdcdigitizer.cc:400
 hmdcdigitizer.cc:401
 hmdcdigitizer.cc:402
 hmdcdigitizer.cc:403
 hmdcdigitizer.cc:404
 hmdcdigitizer.cc:405
 hmdcdigitizer.cc:406
 hmdcdigitizer.cc:407
 hmdcdigitizer.cc:408
 hmdcdigitizer.cc:409
 hmdcdigitizer.cc:410
 hmdcdigitizer.cc:411
 hmdcdigitizer.cc:412
 hmdcdigitizer.cc:413
 hmdcdigitizer.cc:414
 hmdcdigitizer.cc:415
 hmdcdigitizer.cc:416
 hmdcdigitizer.cc:417
 hmdcdigitizer.cc:418
 hmdcdigitizer.cc:419
 hmdcdigitizer.cc:420
 hmdcdigitizer.cc:421
 hmdcdigitizer.cc:422
 hmdcdigitizer.cc:423
 hmdcdigitizer.cc:424
 hmdcdigitizer.cc:425
 hmdcdigitizer.cc:426
 hmdcdigitizer.cc:427
 hmdcdigitizer.cc:428
 hmdcdigitizer.cc:429
 hmdcdigitizer.cc:430
 hmdcdigitizer.cc:431
 hmdcdigitizer.cc:432
 hmdcdigitizer.cc:433
 hmdcdigitizer.cc:434
 hmdcdigitizer.cc:435
 hmdcdigitizer.cc:436
 hmdcdigitizer.cc:437
 hmdcdigitizer.cc:438
 hmdcdigitizer.cc:439
 hmdcdigitizer.cc:440
 hmdcdigitizer.cc:441
 hmdcdigitizer.cc:442
 hmdcdigitizer.cc:443
 hmdcdigitizer.cc:444
 hmdcdigitizer.cc:445
 hmdcdigitizer.cc:446
 hmdcdigitizer.cc:447
 hmdcdigitizer.cc:448
 hmdcdigitizer.cc:449
 hmdcdigitizer.cc:450
 hmdcdigitizer.cc:451
 hmdcdigitizer.cc:452
 hmdcdigitizer.cc:453
 hmdcdigitizer.cc:454
 hmdcdigitizer.cc:455
 hmdcdigitizer.cc:456
 hmdcdigitizer.cc:457
 hmdcdigitizer.cc:458
 hmdcdigitizer.cc:459
 hmdcdigitizer.cc:460
 hmdcdigitizer.cc:461
 hmdcdigitizer.cc:462
 hmdcdigitizer.cc:463
 hmdcdigitizer.cc:464
 hmdcdigitizer.cc:465
 hmdcdigitizer.cc:466
 hmdcdigitizer.cc:467
 hmdcdigitizer.cc:468
 hmdcdigitizer.cc:469
 hmdcdigitizer.cc:470
 hmdcdigitizer.cc:471
 hmdcdigitizer.cc:472
 hmdcdigitizer.cc:473
 hmdcdigitizer.cc:474
 hmdcdigitizer.cc:475
 hmdcdigitizer.cc:476
 hmdcdigitizer.cc:477
 hmdcdigitizer.cc:478
 hmdcdigitizer.cc:479
 hmdcdigitizer.cc:480
 hmdcdigitizer.cc:481
 hmdcdigitizer.cc:482
 hmdcdigitizer.cc:483
 hmdcdigitizer.cc:484
 hmdcdigitizer.cc:485
 hmdcdigitizer.cc:486
 hmdcdigitizer.cc:487
 hmdcdigitizer.cc:488
 hmdcdigitizer.cc:489
 hmdcdigitizer.cc:490
 hmdcdigitizer.cc:491
 hmdcdigitizer.cc:492
 hmdcdigitizer.cc:493
 hmdcdigitizer.cc:494
 hmdcdigitizer.cc:495
 hmdcdigitizer.cc:496
 hmdcdigitizer.cc:497
 hmdcdigitizer.cc:498
 hmdcdigitizer.cc:499
 hmdcdigitizer.cc:500
 hmdcdigitizer.cc:501
 hmdcdigitizer.cc:502
 hmdcdigitizer.cc:503
 hmdcdigitizer.cc:504
 hmdcdigitizer.cc:505
 hmdcdigitizer.cc:506
 hmdcdigitizer.cc:507
 hmdcdigitizer.cc:508
 hmdcdigitizer.cc:509
 hmdcdigitizer.cc:510
 hmdcdigitizer.cc:511
 hmdcdigitizer.cc:512
 hmdcdigitizer.cc:513
 hmdcdigitizer.cc:514
 hmdcdigitizer.cc:515
 hmdcdigitizer.cc:516
 hmdcdigitizer.cc:517
 hmdcdigitizer.cc:518
 hmdcdigitizer.cc:519
 hmdcdigitizer.cc:520
 hmdcdigitizer.cc:521
 hmdcdigitizer.cc:522
 hmdcdigitizer.cc:523
 hmdcdigitizer.cc:524
 hmdcdigitizer.cc:525
 hmdcdigitizer.cc:526
 hmdcdigitizer.cc:527
 hmdcdigitizer.cc:528
 hmdcdigitizer.cc:529
 hmdcdigitizer.cc:530
 hmdcdigitizer.cc:531
 hmdcdigitizer.cc:532
 hmdcdigitizer.cc:533
 hmdcdigitizer.cc:534
 hmdcdigitizer.cc:535
 hmdcdigitizer.cc:536
 hmdcdigitizer.cc:537
 hmdcdigitizer.cc:538
 hmdcdigitizer.cc:539
 hmdcdigitizer.cc:540
 hmdcdigitizer.cc:541
 hmdcdigitizer.cc:542
 hmdcdigitizer.cc:543
 hmdcdigitizer.cc:544
 hmdcdigitizer.cc:545
 hmdcdigitizer.cc:546
 hmdcdigitizer.cc:547
 hmdcdigitizer.cc:548
 hmdcdigitizer.cc:549
 hmdcdigitizer.cc:550
 hmdcdigitizer.cc:551
 hmdcdigitizer.cc:552
 hmdcdigitizer.cc:553
 hmdcdigitizer.cc:554
 hmdcdigitizer.cc:555
 hmdcdigitizer.cc:556
 hmdcdigitizer.cc:557
 hmdcdigitizer.cc:558
 hmdcdigitizer.cc:559
 hmdcdigitizer.cc:560
 hmdcdigitizer.cc:561
 hmdcdigitizer.cc:562
 hmdcdigitizer.cc:563
 hmdcdigitizer.cc:564
 hmdcdigitizer.cc:565
 hmdcdigitizer.cc:566
 hmdcdigitizer.cc:567
 hmdcdigitizer.cc:568
 hmdcdigitizer.cc:569
 hmdcdigitizer.cc:570
 hmdcdigitizer.cc:571
 hmdcdigitizer.cc:572
 hmdcdigitizer.cc:573
 hmdcdigitizer.cc:574
 hmdcdigitizer.cc:575
 hmdcdigitizer.cc:576
 hmdcdigitizer.cc:577
 hmdcdigitizer.cc:578
 hmdcdigitizer.cc:579
 hmdcdigitizer.cc:580
 hmdcdigitizer.cc:581
 hmdcdigitizer.cc:582
 hmdcdigitizer.cc:583
 hmdcdigitizer.cc:584
 hmdcdigitizer.cc:585
 hmdcdigitizer.cc:586
 hmdcdigitizer.cc:587
 hmdcdigitizer.cc:588
 hmdcdigitizer.cc:589
 hmdcdigitizer.cc:590
 hmdcdigitizer.cc:591
 hmdcdigitizer.cc:592
 hmdcdigitizer.cc:593
 hmdcdigitizer.cc:594
 hmdcdigitizer.cc:595
 hmdcdigitizer.cc:596
 hmdcdigitizer.cc:597
 hmdcdigitizer.cc:598
 hmdcdigitizer.cc:599
 hmdcdigitizer.cc:600
 hmdcdigitizer.cc:601
 hmdcdigitizer.cc:602
 hmdcdigitizer.cc:603
 hmdcdigitizer.cc:604
 hmdcdigitizer.cc:605
 hmdcdigitizer.cc:606
 hmdcdigitizer.cc:607
 hmdcdigitizer.cc:608
 hmdcdigitizer.cc:609
 hmdcdigitizer.cc:610
 hmdcdigitizer.cc:611
 hmdcdigitizer.cc:612
 hmdcdigitizer.cc:613
 hmdcdigitizer.cc:614
 hmdcdigitizer.cc:615
 hmdcdigitizer.cc:616
 hmdcdigitizer.cc:617
 hmdcdigitizer.cc:618
 hmdcdigitizer.cc:619
 hmdcdigitizer.cc:620
 hmdcdigitizer.cc:621
 hmdcdigitizer.cc:622
 hmdcdigitizer.cc:623
 hmdcdigitizer.cc:624
 hmdcdigitizer.cc:625
 hmdcdigitizer.cc:626
 hmdcdigitizer.cc:627
 hmdcdigitizer.cc:628
 hmdcdigitizer.cc:629
 hmdcdigitizer.cc:630
 hmdcdigitizer.cc:631
 hmdcdigitizer.cc:632
 hmdcdigitizer.cc:633
 hmdcdigitizer.cc:634
 hmdcdigitizer.cc:635
 hmdcdigitizer.cc:636
 hmdcdigitizer.cc:637
 hmdcdigitizer.cc:638
 hmdcdigitizer.cc:639
 hmdcdigitizer.cc:640
 hmdcdigitizer.cc:641
 hmdcdigitizer.cc:642
 hmdcdigitizer.cc:643
 hmdcdigitizer.cc:644
 hmdcdigitizer.cc:645
 hmdcdigitizer.cc:646
 hmdcdigitizer.cc:647
 hmdcdigitizer.cc:648
 hmdcdigitizer.cc:649
 hmdcdigitizer.cc:650
 hmdcdigitizer.cc:651
 hmdcdigitizer.cc:652
 hmdcdigitizer.cc:653
 hmdcdigitizer.cc:654
 hmdcdigitizer.cc:655
 hmdcdigitizer.cc:656
 hmdcdigitizer.cc:657
 hmdcdigitizer.cc:658
 hmdcdigitizer.cc:659
 hmdcdigitizer.cc:660
 hmdcdigitizer.cc:661
 hmdcdigitizer.cc:662
 hmdcdigitizer.cc:663
 hmdcdigitizer.cc:664
 hmdcdigitizer.cc:665
 hmdcdigitizer.cc:666
 hmdcdigitizer.cc:667
 hmdcdigitizer.cc:668
 hmdcdigitizer.cc:669
 hmdcdigitizer.cc:670
 hmdcdigitizer.cc:671
 hmdcdigitizer.cc:672
 hmdcdigitizer.cc:673
 hmdcdigitizer.cc:674
 hmdcdigitizer.cc:675
 hmdcdigitizer.cc:676
 hmdcdigitizer.cc:677
 hmdcdigitizer.cc:678
 hmdcdigitizer.cc:679
 hmdcdigitizer.cc:680
 hmdcdigitizer.cc:681
 hmdcdigitizer.cc:682
 hmdcdigitizer.cc:683
 hmdcdigitizer.cc:684
 hmdcdigitizer.cc:685
 hmdcdigitizer.cc:686
 hmdcdigitizer.cc:687
 hmdcdigitizer.cc:688
 hmdcdigitizer.cc:689
 hmdcdigitizer.cc:690
 hmdcdigitizer.cc:691
 hmdcdigitizer.cc:692
 hmdcdigitizer.cc:693
 hmdcdigitizer.cc:694
 hmdcdigitizer.cc:695
 hmdcdigitizer.cc:696
 hmdcdigitizer.cc:697
 hmdcdigitizer.cc:698
 hmdcdigitizer.cc:699
 hmdcdigitizer.cc:700
 hmdcdigitizer.cc:701
 hmdcdigitizer.cc:702
 hmdcdigitizer.cc:703
 hmdcdigitizer.cc:704
 hmdcdigitizer.cc:705
 hmdcdigitizer.cc:706
 hmdcdigitizer.cc:707
 hmdcdigitizer.cc:708
 hmdcdigitizer.cc:709
 hmdcdigitizer.cc:710
 hmdcdigitizer.cc:711
 hmdcdigitizer.cc:712
 hmdcdigitizer.cc:713
 hmdcdigitizer.cc:714
 hmdcdigitizer.cc:715
 hmdcdigitizer.cc:716
 hmdcdigitizer.cc:717
 hmdcdigitizer.cc:718
 hmdcdigitizer.cc:719
 hmdcdigitizer.cc:720
 hmdcdigitizer.cc:721
 hmdcdigitizer.cc:722
 hmdcdigitizer.cc:723
 hmdcdigitizer.cc:724
 hmdcdigitizer.cc:725
 hmdcdigitizer.cc:726
 hmdcdigitizer.cc:727
 hmdcdigitizer.cc:728
 hmdcdigitizer.cc:729
 hmdcdigitizer.cc:730
 hmdcdigitizer.cc:731
 hmdcdigitizer.cc:732
 hmdcdigitizer.cc:733
 hmdcdigitizer.cc:734
 hmdcdigitizer.cc:735
 hmdcdigitizer.cc:736
 hmdcdigitizer.cc:737
 hmdcdigitizer.cc:738
 hmdcdigitizer.cc:739
 hmdcdigitizer.cc:740
 hmdcdigitizer.cc:741
 hmdcdigitizer.cc:742
 hmdcdigitizer.cc:743
 hmdcdigitizer.cc:744
 hmdcdigitizer.cc:745
 hmdcdigitizer.cc:746
 hmdcdigitizer.cc:747
 hmdcdigitizer.cc:748
 hmdcdigitizer.cc:749
 hmdcdigitizer.cc:750
 hmdcdigitizer.cc:751
 hmdcdigitizer.cc:752
 hmdcdigitizer.cc:753
 hmdcdigitizer.cc:754
 hmdcdigitizer.cc:755
 hmdcdigitizer.cc:756
 hmdcdigitizer.cc:757
 hmdcdigitizer.cc:758
 hmdcdigitizer.cc:759
 hmdcdigitizer.cc:760
 hmdcdigitizer.cc:761
 hmdcdigitizer.cc:762
 hmdcdigitizer.cc:763
 hmdcdigitizer.cc:764
 hmdcdigitizer.cc:765
 hmdcdigitizer.cc:766
 hmdcdigitizer.cc:767
 hmdcdigitizer.cc:768
 hmdcdigitizer.cc:769
 hmdcdigitizer.cc:770
 hmdcdigitizer.cc:771
 hmdcdigitizer.cc:772
 hmdcdigitizer.cc:773
 hmdcdigitizer.cc:774
 hmdcdigitizer.cc:775
 hmdcdigitizer.cc:776
 hmdcdigitizer.cc:777
 hmdcdigitizer.cc:778
 hmdcdigitizer.cc:779
 hmdcdigitizer.cc:780
 hmdcdigitizer.cc:781
 hmdcdigitizer.cc:782
 hmdcdigitizer.cc:783
 hmdcdigitizer.cc:784
 hmdcdigitizer.cc:785
 hmdcdigitizer.cc:786
 hmdcdigitizer.cc:787
 hmdcdigitizer.cc:788
 hmdcdigitizer.cc:789
 hmdcdigitizer.cc:790
 hmdcdigitizer.cc:791
 hmdcdigitizer.cc:792
 hmdcdigitizer.cc:793
 hmdcdigitizer.cc:794
 hmdcdigitizer.cc:795
 hmdcdigitizer.cc:796
 hmdcdigitizer.cc:797
 hmdcdigitizer.cc:798
 hmdcdigitizer.cc:799
 hmdcdigitizer.cc:800
 hmdcdigitizer.cc:801
 hmdcdigitizer.cc:802
 hmdcdigitizer.cc:803
 hmdcdigitizer.cc:804
 hmdcdigitizer.cc:805
 hmdcdigitizer.cc:806
 hmdcdigitizer.cc:807
 hmdcdigitizer.cc:808
 hmdcdigitizer.cc:809
 hmdcdigitizer.cc:810
 hmdcdigitizer.cc:811
 hmdcdigitizer.cc:812
 hmdcdigitizer.cc:813
 hmdcdigitizer.cc:814
 hmdcdigitizer.cc:815
 hmdcdigitizer.cc:816
 hmdcdigitizer.cc:817
 hmdcdigitizer.cc:818
 hmdcdigitizer.cc:819
 hmdcdigitizer.cc:820
 hmdcdigitizer.cc:821
 hmdcdigitizer.cc:822
 hmdcdigitizer.cc:823
 hmdcdigitizer.cc:824
 hmdcdigitizer.cc:825
 hmdcdigitizer.cc:826
 hmdcdigitizer.cc:827
 hmdcdigitizer.cc:828
 hmdcdigitizer.cc:829
 hmdcdigitizer.cc:830
 hmdcdigitizer.cc:831
 hmdcdigitizer.cc:832
 hmdcdigitizer.cc:833
 hmdcdigitizer.cc:834
 hmdcdigitizer.cc:835
 hmdcdigitizer.cc:836
 hmdcdigitizer.cc:837
 hmdcdigitizer.cc:838
 hmdcdigitizer.cc:839
 hmdcdigitizer.cc:840
 hmdcdigitizer.cc:841
 hmdcdigitizer.cc:842
 hmdcdigitizer.cc:843
 hmdcdigitizer.cc:844
 hmdcdigitizer.cc:845
 hmdcdigitizer.cc:846
 hmdcdigitizer.cc:847
 hmdcdigitizer.cc:848
 hmdcdigitizer.cc:849
 hmdcdigitizer.cc:850
 hmdcdigitizer.cc:851
 hmdcdigitizer.cc:852
 hmdcdigitizer.cc:853
 hmdcdigitizer.cc:854
 hmdcdigitizer.cc:855
 hmdcdigitizer.cc:856
 hmdcdigitizer.cc:857
 hmdcdigitizer.cc:858
 hmdcdigitizer.cc:859
 hmdcdigitizer.cc:860
 hmdcdigitizer.cc:861
 hmdcdigitizer.cc:862
 hmdcdigitizer.cc:863
 hmdcdigitizer.cc:864
 hmdcdigitizer.cc:865
 hmdcdigitizer.cc:866
 hmdcdigitizer.cc:867
 hmdcdigitizer.cc:868
 hmdcdigitizer.cc:869
 hmdcdigitizer.cc:870
 hmdcdigitizer.cc:871
 hmdcdigitizer.cc:872
 hmdcdigitizer.cc:873
 hmdcdigitizer.cc:874
 hmdcdigitizer.cc:875
 hmdcdigitizer.cc:876
 hmdcdigitizer.cc:877
 hmdcdigitizer.cc:878
 hmdcdigitizer.cc:879
 hmdcdigitizer.cc:880
 hmdcdigitizer.cc:881
 hmdcdigitizer.cc:882
 hmdcdigitizer.cc:883
 hmdcdigitizer.cc:884
 hmdcdigitizer.cc:885
 hmdcdigitizer.cc:886
 hmdcdigitizer.cc:887
 hmdcdigitizer.cc:888
 hmdcdigitizer.cc:889
 hmdcdigitizer.cc:890
 hmdcdigitizer.cc:891
 hmdcdigitizer.cc:892
 hmdcdigitizer.cc:893
 hmdcdigitizer.cc:894
 hmdcdigitizer.cc:895
 hmdcdigitizer.cc:896
 hmdcdigitizer.cc:897
 hmdcdigitizer.cc:898
 hmdcdigitizer.cc:899
 hmdcdigitizer.cc:900
 hmdcdigitizer.cc:901
 hmdcdigitizer.cc:902
 hmdcdigitizer.cc:903
 hmdcdigitizer.cc:904
 hmdcdigitizer.cc:905
 hmdcdigitizer.cc:906
 hmdcdigitizer.cc:907
 hmdcdigitizer.cc:908
 hmdcdigitizer.cc:909
 hmdcdigitizer.cc:910
 hmdcdigitizer.cc:911
 hmdcdigitizer.cc:912
 hmdcdigitizer.cc:913
 hmdcdigitizer.cc:914
 hmdcdigitizer.cc:915
 hmdcdigitizer.cc:916
 hmdcdigitizer.cc:917
 hmdcdigitizer.cc:918
 hmdcdigitizer.cc:919
 hmdcdigitizer.cc:920
 hmdcdigitizer.cc:921
 hmdcdigitizer.cc:922
 hmdcdigitizer.cc:923
 hmdcdigitizer.cc:924
 hmdcdigitizer.cc:925
 hmdcdigitizer.cc:926
 hmdcdigitizer.cc:927
 hmdcdigitizer.cc:928
 hmdcdigitizer.cc:929
 hmdcdigitizer.cc:930
 hmdcdigitizer.cc:931
 hmdcdigitizer.cc:932
 hmdcdigitizer.cc:933
 hmdcdigitizer.cc:934
 hmdcdigitizer.cc:935
 hmdcdigitizer.cc:936
 hmdcdigitizer.cc:937
 hmdcdigitizer.cc:938
 hmdcdigitizer.cc:939
 hmdcdigitizer.cc:940
 hmdcdigitizer.cc:941
 hmdcdigitizer.cc:942
 hmdcdigitizer.cc:943
 hmdcdigitizer.cc:944
 hmdcdigitizer.cc:945
 hmdcdigitizer.cc:946
 hmdcdigitizer.cc:947
 hmdcdigitizer.cc:948
 hmdcdigitizer.cc:949
 hmdcdigitizer.cc:950
 hmdcdigitizer.cc:951
 hmdcdigitizer.cc:952
 hmdcdigitizer.cc:953
 hmdcdigitizer.cc:954
 hmdcdigitizer.cc:955
 hmdcdigitizer.cc:956
 hmdcdigitizer.cc:957
 hmdcdigitizer.cc:958
 hmdcdigitizer.cc:959
 hmdcdigitizer.cc:960
 hmdcdigitizer.cc:961
 hmdcdigitizer.cc:962
 hmdcdigitizer.cc:963
 hmdcdigitizer.cc:964
 hmdcdigitizer.cc:965
 hmdcdigitizer.cc:966
 hmdcdigitizer.cc:967
 hmdcdigitizer.cc:968
 hmdcdigitizer.cc:969
 hmdcdigitizer.cc:970
 hmdcdigitizer.cc:971
 hmdcdigitizer.cc:972
 hmdcdigitizer.cc:973
 hmdcdigitizer.cc:974
 hmdcdigitizer.cc:975
 hmdcdigitizer.cc:976
 hmdcdigitizer.cc:977
 hmdcdigitizer.cc:978
 hmdcdigitizer.cc:979
 hmdcdigitizer.cc:980
 hmdcdigitizer.cc:981
 hmdcdigitizer.cc:982
 hmdcdigitizer.cc:983
 hmdcdigitizer.cc:984
 hmdcdigitizer.cc:985
 hmdcdigitizer.cc:986
 hmdcdigitizer.cc:987
 hmdcdigitizer.cc:988
 hmdcdigitizer.cc:989
 hmdcdigitizer.cc:990
 hmdcdigitizer.cc:991
 hmdcdigitizer.cc:992
 hmdcdigitizer.cc:993
 hmdcdigitizer.cc:994
 hmdcdigitizer.cc:995
 hmdcdigitizer.cc:996
 hmdcdigitizer.cc:997
 hmdcdigitizer.cc:998
 hmdcdigitizer.cc:999
 hmdcdigitizer.cc:1000
 hmdcdigitizer.cc:1001
 hmdcdigitizer.cc:1002
 hmdcdigitizer.cc:1003
 hmdcdigitizer.cc:1004
 hmdcdigitizer.cc:1005
 hmdcdigitizer.cc:1006
 hmdcdigitizer.cc:1007
 hmdcdigitizer.cc:1008
 hmdcdigitizer.cc:1009
 hmdcdigitizer.cc:1010
 hmdcdigitizer.cc:1011
 hmdcdigitizer.cc:1012
 hmdcdigitizer.cc:1013
 hmdcdigitizer.cc:1014
 hmdcdigitizer.cc:1015
 hmdcdigitizer.cc:1016
 hmdcdigitizer.cc:1017
 hmdcdigitizer.cc:1018
 hmdcdigitizer.cc:1019
 hmdcdigitizer.cc:1020
 hmdcdigitizer.cc:1021
 hmdcdigitizer.cc:1022
 hmdcdigitizer.cc:1023
 hmdcdigitizer.cc:1024
 hmdcdigitizer.cc:1025
 hmdcdigitizer.cc:1026
 hmdcdigitizer.cc:1027
 hmdcdigitizer.cc:1028
 hmdcdigitizer.cc:1029
 hmdcdigitizer.cc:1030
 hmdcdigitizer.cc:1031
 hmdcdigitizer.cc:1032
 hmdcdigitizer.cc:1033
 hmdcdigitizer.cc:1034
 hmdcdigitizer.cc:1035
 hmdcdigitizer.cc:1036
 hmdcdigitizer.cc:1037
 hmdcdigitizer.cc:1038
 hmdcdigitizer.cc:1039
 hmdcdigitizer.cc:1040
 hmdcdigitizer.cc:1041
 hmdcdigitizer.cc:1042
 hmdcdigitizer.cc:1043
 hmdcdigitizer.cc:1044
 hmdcdigitizer.cc:1045
 hmdcdigitizer.cc:1046
 hmdcdigitizer.cc:1047
 hmdcdigitizer.cc:1048
 hmdcdigitizer.cc:1049
 hmdcdigitizer.cc:1050
 hmdcdigitizer.cc:1051
 hmdcdigitizer.cc:1052
 hmdcdigitizer.cc:1053
 hmdcdigitizer.cc:1054
 hmdcdigitizer.cc:1055
 hmdcdigitizer.cc:1056
 hmdcdigitizer.cc:1057
 hmdcdigitizer.cc:1058
 hmdcdigitizer.cc:1059
 hmdcdigitizer.cc:1060
 hmdcdigitizer.cc:1061
 hmdcdigitizer.cc:1062
 hmdcdigitizer.cc:1063
 hmdcdigitizer.cc:1064
 hmdcdigitizer.cc:1065
 hmdcdigitizer.cc:1066
 hmdcdigitizer.cc:1067
 hmdcdigitizer.cc:1068
 hmdcdigitizer.cc:1069
 hmdcdigitizer.cc:1070
 hmdcdigitizer.cc:1071
 hmdcdigitizer.cc:1072
 hmdcdigitizer.cc:1073
 hmdcdigitizer.cc:1074
 hmdcdigitizer.cc:1075
 hmdcdigitizer.cc:1076
 hmdcdigitizer.cc:1077
 hmdcdigitizer.cc:1078
 hmdcdigitizer.cc:1079
 hmdcdigitizer.cc:1080
 hmdcdigitizer.cc:1081
 hmdcdigitizer.cc:1082
 hmdcdigitizer.cc:1083
 hmdcdigitizer.cc:1084
 hmdcdigitizer.cc:1085
 hmdcdigitizer.cc:1086
 hmdcdigitizer.cc:1087
 hmdcdigitizer.cc:1088
 hmdcdigitizer.cc:1089
 hmdcdigitizer.cc:1090
 hmdcdigitizer.cc:1091
 hmdcdigitizer.cc:1092
 hmdcdigitizer.cc:1093
 hmdcdigitizer.cc:1094
 hmdcdigitizer.cc:1095
 hmdcdigitizer.cc:1096
 hmdcdigitizer.cc:1097
 hmdcdigitizer.cc:1098
 hmdcdigitizer.cc:1099
 hmdcdigitizer.cc:1100
 hmdcdigitizer.cc:1101
 hmdcdigitizer.cc:1102
 hmdcdigitizer.cc:1103
 hmdcdigitizer.cc:1104
 hmdcdigitizer.cc:1105
 hmdcdigitizer.cc:1106
 hmdcdigitizer.cc:1107
 hmdcdigitizer.cc:1108
 hmdcdigitizer.cc:1109
 hmdcdigitizer.cc:1110
 hmdcdigitizer.cc:1111
 hmdcdigitizer.cc:1112
 hmdcdigitizer.cc:1113
 hmdcdigitizer.cc:1114
 hmdcdigitizer.cc:1115
 hmdcdigitizer.cc:1116
 hmdcdigitizer.cc:1117
 hmdcdigitizer.cc:1118
 hmdcdigitizer.cc:1119
 hmdcdigitizer.cc:1120
 hmdcdigitizer.cc:1121
 hmdcdigitizer.cc:1122
 hmdcdigitizer.cc:1123
 hmdcdigitizer.cc:1124
 hmdcdigitizer.cc:1125
 hmdcdigitizer.cc:1126
 hmdcdigitizer.cc:1127
 hmdcdigitizer.cc:1128
 hmdcdigitizer.cc:1129
 hmdcdigitizer.cc:1130
 hmdcdigitizer.cc:1131
 hmdcdigitizer.cc:1132
 hmdcdigitizer.cc:1133
 hmdcdigitizer.cc:1134
 hmdcdigitizer.cc:1135
 hmdcdigitizer.cc:1136
 hmdcdigitizer.cc:1137
 hmdcdigitizer.cc:1138
 hmdcdigitizer.cc:1139
 hmdcdigitizer.cc:1140
 hmdcdigitizer.cc:1141
 hmdcdigitizer.cc:1142
 hmdcdigitizer.cc:1143
 hmdcdigitizer.cc:1144
 hmdcdigitizer.cc:1145
 hmdcdigitizer.cc:1146
 hmdcdigitizer.cc:1147
 hmdcdigitizer.cc:1148
 hmdcdigitizer.cc:1149
 hmdcdigitizer.cc:1150
 hmdcdigitizer.cc:1151
 hmdcdigitizer.cc:1152
 hmdcdigitizer.cc:1153
 hmdcdigitizer.cc:1154
 hmdcdigitizer.cc:1155
 hmdcdigitizer.cc:1156
 hmdcdigitizer.cc:1157
 hmdcdigitizer.cc:1158
 hmdcdigitizer.cc:1159
 hmdcdigitizer.cc:1160
 hmdcdigitizer.cc:1161
 hmdcdigitizer.cc:1162
 hmdcdigitizer.cc:1163
 hmdcdigitizer.cc:1164
 hmdcdigitizer.cc:1165
 hmdcdigitizer.cc:1166
 hmdcdigitizer.cc:1167
 hmdcdigitizer.cc:1168
 hmdcdigitizer.cc:1169
 hmdcdigitizer.cc:1170
 hmdcdigitizer.cc:1171
 hmdcdigitizer.cc:1172
 hmdcdigitizer.cc:1173
 hmdcdigitizer.cc:1174
 hmdcdigitizer.cc:1175
 hmdcdigitizer.cc:1176
 hmdcdigitizer.cc:1177
 hmdcdigitizer.cc:1178
 hmdcdigitizer.cc:1179
 hmdcdigitizer.cc:1180
 hmdcdigitizer.cc:1181
 hmdcdigitizer.cc:1182
 hmdcdigitizer.cc:1183
 hmdcdigitizer.cc:1184
 hmdcdigitizer.cc:1185
 hmdcdigitizer.cc:1186
 hmdcdigitizer.cc:1187
 hmdcdigitizer.cc:1188
 hmdcdigitizer.cc:1189
 hmdcdigitizer.cc:1190
 hmdcdigitizer.cc:1191
 hmdcdigitizer.cc:1192
 hmdcdigitizer.cc:1193
 hmdcdigitizer.cc:1194
 hmdcdigitizer.cc:1195
 hmdcdigitizer.cc:1196
 hmdcdigitizer.cc:1197
 hmdcdigitizer.cc:1198
 hmdcdigitizer.cc:1199
 hmdcdigitizer.cc:1200
 hmdcdigitizer.cc:1201
 hmdcdigitizer.cc:1202
 hmdcdigitizer.cc:1203
 hmdcdigitizer.cc:1204
 hmdcdigitizer.cc:1205
 hmdcdigitizer.cc:1206
 hmdcdigitizer.cc:1207
 hmdcdigitizer.cc:1208
 hmdcdigitizer.cc:1209
 hmdcdigitizer.cc:1210
 hmdcdigitizer.cc:1211
 hmdcdigitizer.cc:1212
 hmdcdigitizer.cc:1213
 hmdcdigitizer.cc:1214
 hmdcdigitizer.cc:1215
 hmdcdigitizer.cc:1216
 hmdcdigitizer.cc:1217
 hmdcdigitizer.cc:1218
 hmdcdigitizer.cc:1219
 hmdcdigitizer.cc:1220
 hmdcdigitizer.cc:1221
 hmdcdigitizer.cc:1222
 hmdcdigitizer.cc:1223
 hmdcdigitizer.cc:1224
 hmdcdigitizer.cc:1225
 hmdcdigitizer.cc:1226
 hmdcdigitizer.cc:1227
 hmdcdigitizer.cc:1228
 hmdcdigitizer.cc:1229
 hmdcdigitizer.cc:1230
 hmdcdigitizer.cc:1231
 hmdcdigitizer.cc:1232
 hmdcdigitizer.cc:1233
 hmdcdigitizer.cc:1234
 hmdcdigitizer.cc:1235
 hmdcdigitizer.cc:1236
 hmdcdigitizer.cc:1237
 hmdcdigitizer.cc:1238
 hmdcdigitizer.cc:1239
 hmdcdigitizer.cc:1240
 hmdcdigitizer.cc:1241
 hmdcdigitizer.cc:1242
 hmdcdigitizer.cc:1243
 hmdcdigitizer.cc:1244
 hmdcdigitizer.cc:1245
 hmdcdigitizer.cc:1246
 hmdcdigitizer.cc:1247
 hmdcdigitizer.cc:1248
 hmdcdigitizer.cc:1249
 hmdcdigitizer.cc:1250
 hmdcdigitizer.cc:1251
 hmdcdigitizer.cc:1252
 hmdcdigitizer.cc:1253
 hmdcdigitizer.cc:1254
 hmdcdigitizer.cc:1255
 hmdcdigitizer.cc:1256
 hmdcdigitizer.cc:1257
 hmdcdigitizer.cc:1258
 hmdcdigitizer.cc:1259
 hmdcdigitizer.cc:1260
 hmdcdigitizer.cc:1261
 hmdcdigitizer.cc:1262
 hmdcdigitizer.cc:1263
 hmdcdigitizer.cc:1264
 hmdcdigitizer.cc:1265
 hmdcdigitizer.cc:1266
 hmdcdigitizer.cc:1267
 hmdcdigitizer.cc:1268
 hmdcdigitizer.cc:1269
 hmdcdigitizer.cc:1270
 hmdcdigitizer.cc:1271
 hmdcdigitizer.cc:1272
 hmdcdigitizer.cc:1273
 hmdcdigitizer.cc:1274
 hmdcdigitizer.cc:1275
 hmdcdigitizer.cc:1276
 hmdcdigitizer.cc:1277
 hmdcdigitizer.cc:1278
 hmdcdigitizer.cc:1279
 hmdcdigitizer.cc:1280
 hmdcdigitizer.cc:1281
 hmdcdigitizer.cc:1282
 hmdcdigitizer.cc:1283
 hmdcdigitizer.cc:1284
 hmdcdigitizer.cc:1285
 hmdcdigitizer.cc:1286
 hmdcdigitizer.cc:1287
 hmdcdigitizer.cc:1288
 hmdcdigitizer.cc:1289
 hmdcdigitizer.cc:1290
 hmdcdigitizer.cc:1291
 hmdcdigitizer.cc:1292
 hmdcdigitizer.cc:1293
 hmdcdigitizer.cc:1294
 hmdcdigitizer.cc:1295
 hmdcdigitizer.cc:1296
 hmdcdigitizer.cc:1297
 hmdcdigitizer.cc:1298
 hmdcdigitizer.cc:1299
 hmdcdigitizer.cc:1300
 hmdcdigitizer.cc:1301
 hmdcdigitizer.cc:1302
 hmdcdigitizer.cc:1303
 hmdcdigitizer.cc:1304
 hmdcdigitizer.cc:1305
 hmdcdigitizer.cc:1306
 hmdcdigitizer.cc:1307
 hmdcdigitizer.cc:1308
 hmdcdigitizer.cc:1309
 hmdcdigitizer.cc:1310
 hmdcdigitizer.cc:1311
 hmdcdigitizer.cc:1312
 hmdcdigitizer.cc:1313
 hmdcdigitizer.cc:1314
 hmdcdigitizer.cc:1315
 hmdcdigitizer.cc:1316
 hmdcdigitizer.cc:1317
 hmdcdigitizer.cc:1318
 hmdcdigitizer.cc:1319
 hmdcdigitizer.cc:1320
 hmdcdigitizer.cc:1321
 hmdcdigitizer.cc:1322
 hmdcdigitizer.cc:1323
 hmdcdigitizer.cc:1324
 hmdcdigitizer.cc:1325
 hmdcdigitizer.cc:1326
 hmdcdigitizer.cc:1327
 hmdcdigitizer.cc:1328
 hmdcdigitizer.cc:1329
 hmdcdigitizer.cc:1330
 hmdcdigitizer.cc:1331
 hmdcdigitizer.cc:1332
 hmdcdigitizer.cc:1333
 hmdcdigitizer.cc:1334
 hmdcdigitizer.cc:1335
 hmdcdigitizer.cc:1336
 hmdcdigitizer.cc:1337
 hmdcdigitizer.cc:1338
 hmdcdigitizer.cc:1339
 hmdcdigitizer.cc:1340
 hmdcdigitizer.cc:1341
 hmdcdigitizer.cc:1342
 hmdcdigitizer.cc:1343
 hmdcdigitizer.cc:1344
 hmdcdigitizer.cc:1345
 hmdcdigitizer.cc:1346
 hmdcdigitizer.cc:1347
 hmdcdigitizer.cc:1348
 hmdcdigitizer.cc:1349
 hmdcdigitizer.cc:1350
 hmdcdigitizer.cc:1351
 hmdcdigitizer.cc:1352
 hmdcdigitizer.cc:1353
 hmdcdigitizer.cc:1354
 hmdcdigitizer.cc:1355
 hmdcdigitizer.cc:1356
 hmdcdigitizer.cc:1357
 hmdcdigitizer.cc:1358
 hmdcdigitizer.cc:1359
 hmdcdigitizer.cc:1360
 hmdcdigitizer.cc:1361
 hmdcdigitizer.cc:1362
 hmdcdigitizer.cc:1363
 hmdcdigitizer.cc:1364
 hmdcdigitizer.cc:1365
 hmdcdigitizer.cc:1366
 hmdcdigitizer.cc:1367
 hmdcdigitizer.cc:1368
 hmdcdigitizer.cc:1369
 hmdcdigitizer.cc:1370
 hmdcdigitizer.cc:1371
 hmdcdigitizer.cc:1372
 hmdcdigitizer.cc:1373
 hmdcdigitizer.cc:1374
 hmdcdigitizer.cc:1375
 hmdcdigitizer.cc:1376
 hmdcdigitizer.cc:1377
 hmdcdigitizer.cc:1378
 hmdcdigitizer.cc:1379
 hmdcdigitizer.cc:1380
 hmdcdigitizer.cc:1381
 hmdcdigitizer.cc:1382
 hmdcdigitizer.cc:1383
 hmdcdigitizer.cc:1384
 hmdcdigitizer.cc:1385
 hmdcdigitizer.cc:1386
 hmdcdigitizer.cc:1387
 hmdcdigitizer.cc:1388
 hmdcdigitizer.cc:1389
 hmdcdigitizer.cc:1390
 hmdcdigitizer.cc:1391
 hmdcdigitizer.cc:1392
 hmdcdigitizer.cc:1393
 hmdcdigitizer.cc:1394
 hmdcdigitizer.cc:1395
 hmdcdigitizer.cc:1396
 hmdcdigitizer.cc:1397
 hmdcdigitizer.cc:1398
 hmdcdigitizer.cc:1399
 hmdcdigitizer.cc:1400
 hmdcdigitizer.cc:1401
 hmdcdigitizer.cc:1402
 hmdcdigitizer.cc:1403
 hmdcdigitizer.cc:1404
 hmdcdigitizer.cc:1405
 hmdcdigitizer.cc:1406
 hmdcdigitizer.cc:1407
 hmdcdigitizer.cc:1408
 hmdcdigitizer.cc:1409
 hmdcdigitizer.cc:1410
 hmdcdigitizer.cc:1411
 hmdcdigitizer.cc:1412
 hmdcdigitizer.cc:1413
 hmdcdigitizer.cc:1414
 hmdcdigitizer.cc:1415
 hmdcdigitizer.cc:1416
 hmdcdigitizer.cc:1417
 hmdcdigitizer.cc:1418
 hmdcdigitizer.cc:1419
 hmdcdigitizer.cc:1420
 hmdcdigitizer.cc:1421
 hmdcdigitizer.cc:1422
 hmdcdigitizer.cc:1423
 hmdcdigitizer.cc:1424
 hmdcdigitizer.cc:1425
 hmdcdigitizer.cc:1426
 hmdcdigitizer.cc:1427
 hmdcdigitizer.cc:1428
 hmdcdigitizer.cc:1429
 hmdcdigitizer.cc:1430
 hmdcdigitizer.cc:1431
 hmdcdigitizer.cc:1432
 hmdcdigitizer.cc:1433
 hmdcdigitizer.cc:1434
 hmdcdigitizer.cc:1435
 hmdcdigitizer.cc:1436
 hmdcdigitizer.cc:1437
 hmdcdigitizer.cc:1438
 hmdcdigitizer.cc:1439
 hmdcdigitizer.cc:1440
 hmdcdigitizer.cc:1441
 hmdcdigitizer.cc:1442
 hmdcdigitizer.cc:1443
 hmdcdigitizer.cc:1444
 hmdcdigitizer.cc:1445
 hmdcdigitizer.cc:1446
 hmdcdigitizer.cc:1447
 hmdcdigitizer.cc:1448
 hmdcdigitizer.cc:1449
 hmdcdigitizer.cc:1450
 hmdcdigitizer.cc:1451
 hmdcdigitizer.cc:1452
 hmdcdigitizer.cc:1453
 hmdcdigitizer.cc:1454
 hmdcdigitizer.cc:1455
 hmdcdigitizer.cc:1456
 hmdcdigitizer.cc:1457
 hmdcdigitizer.cc:1458
 hmdcdigitizer.cc:1459
 hmdcdigitizer.cc:1460
 hmdcdigitizer.cc:1461
 hmdcdigitizer.cc:1462
 hmdcdigitizer.cc:1463
 hmdcdigitizer.cc:1464
 hmdcdigitizer.cc:1465
 hmdcdigitizer.cc:1466
 hmdcdigitizer.cc:1467
 hmdcdigitizer.cc:1468
 hmdcdigitizer.cc:1469
 hmdcdigitizer.cc:1470
 hmdcdigitizer.cc:1471
 hmdcdigitizer.cc:1472
 hmdcdigitizer.cc:1473
 hmdcdigitizer.cc:1474
 hmdcdigitizer.cc:1475
 hmdcdigitizer.cc:1476
 hmdcdigitizer.cc:1477
 hmdcdigitizer.cc:1478
 hmdcdigitizer.cc:1479
 hmdcdigitizer.cc:1480
 hmdcdigitizer.cc:1481
 hmdcdigitizer.cc:1482
 hmdcdigitizer.cc:1483
 hmdcdigitizer.cc:1484
 hmdcdigitizer.cc:1485
 hmdcdigitizer.cc:1486
 hmdcdigitizer.cc:1487
 hmdcdigitizer.cc:1488
 hmdcdigitizer.cc:1489
 hmdcdigitizer.cc:1490
 hmdcdigitizer.cc:1491
 hmdcdigitizer.cc:1492
 hmdcdigitizer.cc:1493
 hmdcdigitizer.cc:1494
 hmdcdigitizer.cc:1495
 hmdcdigitizer.cc:1496
 hmdcdigitizer.cc:1497
 hmdcdigitizer.cc:1498
 hmdcdigitizer.cc:1499
 hmdcdigitizer.cc:1500
 hmdcdigitizer.cc:1501
 hmdcdigitizer.cc:1502
 hmdcdigitizer.cc:1503
 hmdcdigitizer.cc:1504
 hmdcdigitizer.cc:1505
 hmdcdigitizer.cc:1506
 hmdcdigitizer.cc:1507
 hmdcdigitizer.cc:1508
 hmdcdigitizer.cc:1509
 hmdcdigitizer.cc:1510
 hmdcdigitizer.cc:1511
 hmdcdigitizer.cc:1512
 hmdcdigitizer.cc:1513
 hmdcdigitizer.cc:1514
 hmdcdigitizer.cc:1515
 hmdcdigitizer.cc:1516
 hmdcdigitizer.cc:1517
 hmdcdigitizer.cc:1518
 hmdcdigitizer.cc:1519
 hmdcdigitizer.cc:1520
 hmdcdigitizer.cc:1521
 hmdcdigitizer.cc:1522
 hmdcdigitizer.cc:1523
 hmdcdigitizer.cc:1524
 hmdcdigitizer.cc:1525
 hmdcdigitizer.cc:1526
 hmdcdigitizer.cc:1527
 hmdcdigitizer.cc:1528
 hmdcdigitizer.cc:1529
 hmdcdigitizer.cc:1530
 hmdcdigitizer.cc:1531
 hmdcdigitizer.cc:1532
 hmdcdigitizer.cc:1533
 hmdcdigitizer.cc:1534
 hmdcdigitizer.cc:1535
 hmdcdigitizer.cc:1536
 hmdcdigitizer.cc:1537
 hmdcdigitizer.cc:1538
 hmdcdigitizer.cc:1539
 hmdcdigitizer.cc:1540
 hmdcdigitizer.cc:1541
 hmdcdigitizer.cc:1542
 hmdcdigitizer.cc:1543
 hmdcdigitizer.cc:1544
 hmdcdigitizer.cc:1545
 hmdcdigitizer.cc:1546
 hmdcdigitizer.cc:1547
 hmdcdigitizer.cc:1548
 hmdcdigitizer.cc:1549
 hmdcdigitizer.cc:1550
 hmdcdigitizer.cc:1551
 hmdcdigitizer.cc:1552
 hmdcdigitizer.cc:1553
 hmdcdigitizer.cc:1554
 hmdcdigitizer.cc:1555
 hmdcdigitizer.cc:1556
 hmdcdigitizer.cc:1557
 hmdcdigitizer.cc:1558
 hmdcdigitizer.cc:1559
 hmdcdigitizer.cc:1560
 hmdcdigitizer.cc:1561
 hmdcdigitizer.cc:1562
 hmdcdigitizer.cc:1563
 hmdcdigitizer.cc:1564
 hmdcdigitizer.cc:1565
 hmdcdigitizer.cc:1566
 hmdcdigitizer.cc:1567
 hmdcdigitizer.cc:1568
 hmdcdigitizer.cc:1569
 hmdcdigitizer.cc:1570
 hmdcdigitizer.cc:1571
 hmdcdigitizer.cc:1572
 hmdcdigitizer.cc:1573
 hmdcdigitizer.cc:1574
 hmdcdigitizer.cc:1575
 hmdcdigitizer.cc:1576
 hmdcdigitizer.cc:1577
 hmdcdigitizer.cc:1578
 hmdcdigitizer.cc:1579
 hmdcdigitizer.cc:1580
 hmdcdigitizer.cc:1581
 hmdcdigitizer.cc:1582
 hmdcdigitizer.cc:1583
 hmdcdigitizer.cc:1584
 hmdcdigitizer.cc:1585
 hmdcdigitizer.cc:1586
 hmdcdigitizer.cc:1587
 hmdcdigitizer.cc:1588
 hmdcdigitizer.cc:1589
 hmdcdigitizer.cc:1590
 hmdcdigitizer.cc:1591
 hmdcdigitizer.cc:1592
 hmdcdigitizer.cc:1593
 hmdcdigitizer.cc:1594
 hmdcdigitizer.cc:1595
 hmdcdigitizer.cc:1596
 hmdcdigitizer.cc:1597
 hmdcdigitizer.cc:1598
 hmdcdigitizer.cc:1599
 hmdcdigitizer.cc:1600
 hmdcdigitizer.cc:1601
 hmdcdigitizer.cc:1602
 hmdcdigitizer.cc:1603
 hmdcdigitizer.cc:1604
 hmdcdigitizer.cc:1605
 hmdcdigitizer.cc:1606
 hmdcdigitizer.cc:1607
 hmdcdigitizer.cc:1608
 hmdcdigitizer.cc:1609
 hmdcdigitizer.cc:1610
 hmdcdigitizer.cc:1611
 hmdcdigitizer.cc:1612
 hmdcdigitizer.cc:1613
 hmdcdigitizer.cc:1614
 hmdcdigitizer.cc:1615
 hmdcdigitizer.cc:1616
 hmdcdigitizer.cc:1617
 hmdcdigitizer.cc:1618
 hmdcdigitizer.cc:1619
 hmdcdigitizer.cc:1620
 hmdcdigitizer.cc:1621
 hmdcdigitizer.cc:1622
 hmdcdigitizer.cc:1623
 hmdcdigitizer.cc:1624
 hmdcdigitizer.cc:1625
 hmdcdigitizer.cc:1626
 hmdcdigitizer.cc:1627
 hmdcdigitizer.cc:1628
 hmdcdigitizer.cc:1629
 hmdcdigitizer.cc:1630
 hmdcdigitizer.cc:1631
 hmdcdigitizer.cc:1632
 hmdcdigitizer.cc:1633
 hmdcdigitizer.cc:1634
 hmdcdigitizer.cc:1635
 hmdcdigitizer.cc:1636
 hmdcdigitizer.cc:1637
 hmdcdigitizer.cc:1638
 hmdcdigitizer.cc:1639
 hmdcdigitizer.cc:1640
 hmdcdigitizer.cc:1641
 hmdcdigitizer.cc:1642
 hmdcdigitizer.cc:1643
 hmdcdigitizer.cc:1644
 hmdcdigitizer.cc:1645
 hmdcdigitizer.cc:1646
 hmdcdigitizer.cc:1647
 hmdcdigitizer.cc:1648
 hmdcdigitizer.cc:1649
 hmdcdigitizer.cc:1650
 hmdcdigitizer.cc:1651
 hmdcdigitizer.cc:1652
 hmdcdigitizer.cc:1653
 hmdcdigitizer.cc:1654
 hmdcdigitizer.cc:1655
 hmdcdigitizer.cc:1656
 hmdcdigitizer.cc:1657
 hmdcdigitizer.cc:1658
 hmdcdigitizer.cc:1659
 hmdcdigitizer.cc:1660
 hmdcdigitizer.cc:1661
 hmdcdigitizer.cc:1662
 hmdcdigitizer.cc:1663
 hmdcdigitizer.cc:1664
 hmdcdigitizer.cc:1665
 hmdcdigitizer.cc:1666
 hmdcdigitizer.cc:1667
 hmdcdigitizer.cc:1668
 hmdcdigitizer.cc:1669
 hmdcdigitizer.cc:1670
 hmdcdigitizer.cc:1671
 hmdcdigitizer.cc:1672
 hmdcdigitizer.cc:1673
 hmdcdigitizer.cc:1674
 hmdcdigitizer.cc:1675
 hmdcdigitizer.cc:1676
 hmdcdigitizer.cc:1677
 hmdcdigitizer.cc:1678
 hmdcdigitizer.cc:1679
 hmdcdigitizer.cc:1680
 hmdcdigitizer.cc:1681
 hmdcdigitizer.cc:1682
 hmdcdigitizer.cc:1683
 hmdcdigitizer.cc:1684
 hmdcdigitizer.cc:1685
 hmdcdigitizer.cc:1686
 hmdcdigitizer.cc:1687
 hmdcdigitizer.cc:1688
 hmdcdigitizer.cc:1689
 hmdcdigitizer.cc:1690
 hmdcdigitizer.cc:1691
 hmdcdigitizer.cc:1692
 hmdcdigitizer.cc:1693
 hmdcdigitizer.cc:1694
 hmdcdigitizer.cc:1695
 hmdcdigitizer.cc:1696
 hmdcdigitizer.cc:1697
 hmdcdigitizer.cc:1698
 hmdcdigitizer.cc:1699
 hmdcdigitizer.cc:1700
 hmdcdigitizer.cc:1701
 hmdcdigitizer.cc:1702
 hmdcdigitizer.cc:1703
 hmdcdigitizer.cc:1704
 hmdcdigitizer.cc:1705
 hmdcdigitizer.cc:1706
 hmdcdigitizer.cc:1707
 hmdcdigitizer.cc:1708
 hmdcdigitizer.cc:1709
 hmdcdigitizer.cc:1710
 hmdcdigitizer.cc:1711
 hmdcdigitizer.cc:1712
 hmdcdigitizer.cc:1713
 hmdcdigitizer.cc:1714
 hmdcdigitizer.cc:1715
 hmdcdigitizer.cc:1716
 hmdcdigitizer.cc:1717
 hmdcdigitizer.cc:1718
 hmdcdigitizer.cc:1719
 hmdcdigitizer.cc:1720
 hmdcdigitizer.cc:1721
 hmdcdigitizer.cc:1722
 hmdcdigitizer.cc:1723
 hmdcdigitizer.cc:1724
 hmdcdigitizer.cc:1725
 hmdcdigitizer.cc:1726
 hmdcdigitizer.cc:1727
 hmdcdigitizer.cc:1728
 hmdcdigitizer.cc:1729
 hmdcdigitizer.cc:1730
 hmdcdigitizer.cc:1731
 hmdcdigitizer.cc:1732
 hmdcdigitizer.cc:1733
 hmdcdigitizer.cc:1734
 hmdcdigitizer.cc:1735
 hmdcdigitizer.cc:1736
 hmdcdigitizer.cc:1737
 hmdcdigitizer.cc:1738
 hmdcdigitizer.cc:1739
 hmdcdigitizer.cc:1740
 hmdcdigitizer.cc:1741
 hmdcdigitizer.cc:1742
 hmdcdigitizer.cc:1743
 hmdcdigitizer.cc:1744
 hmdcdigitizer.cc:1745
 hmdcdigitizer.cc:1746
 hmdcdigitizer.cc:1747
 hmdcdigitizer.cc:1748
 hmdcdigitizer.cc:1749
 hmdcdigitizer.cc:1750
 hmdcdigitizer.cc:1751
 hmdcdigitizer.cc:1752
 hmdcdigitizer.cc:1753
 hmdcdigitizer.cc:1754
 hmdcdigitizer.cc:1755
 hmdcdigitizer.cc:1756
 hmdcdigitizer.cc:1757
 hmdcdigitizer.cc:1758
 hmdcdigitizer.cc:1759
 hmdcdigitizer.cc:1760
 hmdcdigitizer.cc:1761
 hmdcdigitizer.cc:1762
 hmdcdigitizer.cc:1763
 hmdcdigitizer.cc:1764
 hmdcdigitizer.cc:1765
 hmdcdigitizer.cc:1766
 hmdcdigitizer.cc:1767
 hmdcdigitizer.cc:1768
 hmdcdigitizer.cc:1769
 hmdcdigitizer.cc:1770
 hmdcdigitizer.cc:1771
 hmdcdigitizer.cc:1772
 hmdcdigitizer.cc:1773
 hmdcdigitizer.cc:1774
 hmdcdigitizer.cc:1775
 hmdcdigitizer.cc:1776
 hmdcdigitizer.cc:1777
 hmdcdigitizer.cc:1778
 hmdcdigitizer.cc:1779
 hmdcdigitizer.cc:1780
 hmdcdigitizer.cc:1781
 hmdcdigitizer.cc:1782
 hmdcdigitizer.cc:1783
 hmdcdigitizer.cc:1784
 hmdcdigitizer.cc:1785
 hmdcdigitizer.cc:1786
 hmdcdigitizer.cc:1787
 hmdcdigitizer.cc:1788
 hmdcdigitizer.cc:1789
 hmdcdigitizer.cc:1790
 hmdcdigitizer.cc:1791
 hmdcdigitizer.cc:1792
 hmdcdigitizer.cc:1793
 hmdcdigitizer.cc:1794
 hmdcdigitizer.cc:1795
 hmdcdigitizer.cc:1796
 hmdcdigitizer.cc:1797
 hmdcdigitizer.cc:1798
 hmdcdigitizer.cc:1799
 hmdcdigitizer.cc:1800
 hmdcdigitizer.cc:1801
 hmdcdigitizer.cc:1802
 hmdcdigitizer.cc:1803
 hmdcdigitizer.cc:1804
 hmdcdigitizer.cc:1805
 hmdcdigitizer.cc:1806
 hmdcdigitizer.cc:1807
 hmdcdigitizer.cc:1808
 hmdcdigitizer.cc:1809
 hmdcdigitizer.cc:1810
 hmdcdigitizer.cc:1811
 hmdcdigitizer.cc:1812
 hmdcdigitizer.cc:1813
 hmdcdigitizer.cc:1814
 hmdcdigitizer.cc:1815
 hmdcdigitizer.cc:1816
 hmdcdigitizer.cc:1817
 hmdcdigitizer.cc:1818
 hmdcdigitizer.cc:1819
 hmdcdigitizer.cc:1820
 hmdcdigitizer.cc:1821
 hmdcdigitizer.cc:1822
 hmdcdigitizer.cc:1823
 hmdcdigitizer.cc:1824
 hmdcdigitizer.cc:1825
 hmdcdigitizer.cc:1826
 hmdcdigitizer.cc:1827
 hmdcdigitizer.cc:1828
 hmdcdigitizer.cc:1829
 hmdcdigitizer.cc:1830
 hmdcdigitizer.cc:1831
 hmdcdigitizer.cc:1832
 hmdcdigitizer.cc:1833
 hmdcdigitizer.cc:1834
 hmdcdigitizer.cc:1835
 hmdcdigitizer.cc:1836
 hmdcdigitizer.cc:1837
 hmdcdigitizer.cc:1838
 hmdcdigitizer.cc:1839
 hmdcdigitizer.cc:1840
 hmdcdigitizer.cc:1841
 hmdcdigitizer.cc:1842
 hmdcdigitizer.cc:1843
 hmdcdigitizer.cc:1844
 hmdcdigitizer.cc:1845
 hmdcdigitizer.cc:1846
 hmdcdigitizer.cc:1847
 hmdcdigitizer.cc:1848
 hmdcdigitizer.cc:1849
 hmdcdigitizer.cc:1850
 hmdcdigitizer.cc:1851
 hmdcdigitizer.cc:1852
 hmdcdigitizer.cc:1853
 hmdcdigitizer.cc:1854
 hmdcdigitizer.cc:1855
 hmdcdigitizer.cc:1856
 hmdcdigitizer.cc:1857
 hmdcdigitizer.cc:1858
 hmdcdigitizer.cc:1859
 hmdcdigitizer.cc:1860
 hmdcdigitizer.cc:1861
 hmdcdigitizer.cc:1862
 hmdcdigitizer.cc:1863
 hmdcdigitizer.cc:1864
 hmdcdigitizer.cc:1865
 hmdcdigitizer.cc:1866
 hmdcdigitizer.cc:1867
 hmdcdigitizer.cc:1868
 hmdcdigitizer.cc:1869
 hmdcdigitizer.cc:1870
 hmdcdigitizer.cc:1871
 hmdcdigitizer.cc:1872
 hmdcdigitizer.cc:1873
 hmdcdigitizer.cc:1874
 hmdcdigitizer.cc:1875
 hmdcdigitizer.cc:1876
 hmdcdigitizer.cc:1877
 hmdcdigitizer.cc:1878
 hmdcdigitizer.cc:1879
 hmdcdigitizer.cc:1880
 hmdcdigitizer.cc:1881
 hmdcdigitizer.cc:1882
 hmdcdigitizer.cc:1883
 hmdcdigitizer.cc:1884
 hmdcdigitizer.cc:1885
 hmdcdigitizer.cc:1886
 hmdcdigitizer.cc:1887
 hmdcdigitizer.cc:1888
 hmdcdigitizer.cc:1889
 hmdcdigitizer.cc:1890
 hmdcdigitizer.cc:1891
 hmdcdigitizer.cc:1892
 hmdcdigitizer.cc:1893
 hmdcdigitizer.cc:1894
 hmdcdigitizer.cc:1895
 hmdcdigitizer.cc:1896
 hmdcdigitizer.cc:1897
 hmdcdigitizer.cc:1898
 hmdcdigitizer.cc:1899
 hmdcdigitizer.cc:1900
 hmdcdigitizer.cc:1901
 hmdcdigitizer.cc:1902
 hmdcdigitizer.cc:1903
 hmdcdigitizer.cc:1904
 hmdcdigitizer.cc:1905
 hmdcdigitizer.cc:1906
 hmdcdigitizer.cc:1907
 hmdcdigitizer.cc:1908
 hmdcdigitizer.cc:1909
 hmdcdigitizer.cc:1910
 hmdcdigitizer.cc:1911
 hmdcdigitizer.cc:1912
 hmdcdigitizer.cc:1913
 hmdcdigitizer.cc:1914
 hmdcdigitizer.cc:1915
 hmdcdigitizer.cc:1916
 hmdcdigitizer.cc:1917
 hmdcdigitizer.cc:1918
 hmdcdigitizer.cc:1919
 hmdcdigitizer.cc:1920
 hmdcdigitizer.cc:1921
 hmdcdigitizer.cc:1922
 hmdcdigitizer.cc:1923
 hmdcdigitizer.cc:1924
 hmdcdigitizer.cc:1925
 hmdcdigitizer.cc:1926
 hmdcdigitizer.cc:1927
 hmdcdigitizer.cc:1928
 hmdcdigitizer.cc:1929
 hmdcdigitizer.cc:1930
 hmdcdigitizer.cc:1931
 hmdcdigitizer.cc:1932
 hmdcdigitizer.cc:1933
 hmdcdigitizer.cc:1934
 hmdcdigitizer.cc:1935
 hmdcdigitizer.cc:1936
 hmdcdigitizer.cc:1937
 hmdcdigitizer.cc:1938
 hmdcdigitizer.cc:1939
 hmdcdigitizer.cc:1940
 hmdcdigitizer.cc:1941
 hmdcdigitizer.cc:1942
 hmdcdigitizer.cc:1943
 hmdcdigitizer.cc:1944
 hmdcdigitizer.cc:1945
 hmdcdigitizer.cc:1946
 hmdcdigitizer.cc:1947
 hmdcdigitizer.cc:1948
 hmdcdigitizer.cc:1949
 hmdcdigitizer.cc:1950
 hmdcdigitizer.cc:1951
 hmdcdigitizer.cc:1952
 hmdcdigitizer.cc:1953
 hmdcdigitizer.cc:1954
 hmdcdigitizer.cc:1955
 hmdcdigitizer.cc:1956
 hmdcdigitizer.cc:1957
 hmdcdigitizer.cc:1958
 hmdcdigitizer.cc:1959
 hmdcdigitizer.cc:1960
 hmdcdigitizer.cc:1961
 hmdcdigitizer.cc:1962
 hmdcdigitizer.cc:1963
 hmdcdigitizer.cc:1964
 hmdcdigitizer.cc:1965
 hmdcdigitizer.cc:1966
 hmdcdigitizer.cc:1967
 hmdcdigitizer.cc:1968
 hmdcdigitizer.cc:1969
 hmdcdigitizer.cc:1970
 hmdcdigitizer.cc:1971
 hmdcdigitizer.cc:1972
 hmdcdigitizer.cc:1973
 hmdcdigitizer.cc:1974
 hmdcdigitizer.cc:1975
 hmdcdigitizer.cc:1976
 hmdcdigitizer.cc:1977
 hmdcdigitizer.cc:1978
 hmdcdigitizer.cc:1979
 hmdcdigitizer.cc:1980
 hmdcdigitizer.cc:1981
 hmdcdigitizer.cc:1982
 hmdcdigitizer.cc:1983
 hmdcdigitizer.cc:1984
 hmdcdigitizer.cc:1985
 hmdcdigitizer.cc:1986
 hmdcdigitizer.cc:1987
 hmdcdigitizer.cc:1988
 hmdcdigitizer.cc:1989
 hmdcdigitizer.cc:1990
 hmdcdigitizer.cc:1991
 hmdcdigitizer.cc:1992
 hmdcdigitizer.cc:1993
 hmdcdigitizer.cc:1994
 hmdcdigitizer.cc:1995
 hmdcdigitizer.cc:1996
 hmdcdigitizer.cc:1997
 hmdcdigitizer.cc:1998
 hmdcdigitizer.cc:1999
 hmdcdigitizer.cc:2000
 hmdcdigitizer.cc:2001
 hmdcdigitizer.cc:2002
 hmdcdigitizer.cc:2003
 hmdcdigitizer.cc:2004
 hmdcdigitizer.cc:2005
 hmdcdigitizer.cc:2006
 hmdcdigitizer.cc:2007
 hmdcdigitizer.cc:2008
 hmdcdigitizer.cc:2009
 hmdcdigitizer.cc:2010
 hmdcdigitizer.cc:2011
 hmdcdigitizer.cc:2012
 hmdcdigitizer.cc:2013
 hmdcdigitizer.cc:2014
 hmdcdigitizer.cc:2015
 hmdcdigitizer.cc:2016
 hmdcdigitizer.cc:2017
 hmdcdigitizer.cc:2018
 hmdcdigitizer.cc:2019
 hmdcdigitizer.cc:2020
 hmdcdigitizer.cc:2021
 hmdcdigitizer.cc:2022
 hmdcdigitizer.cc:2023
 hmdcdigitizer.cc:2024
 hmdcdigitizer.cc:2025
 hmdcdigitizer.cc:2026
 hmdcdigitizer.cc:2027
 hmdcdigitizer.cc:2028
 hmdcdigitizer.cc:2029
 hmdcdigitizer.cc:2030
 hmdcdigitizer.cc:2031
 hmdcdigitizer.cc:2032
 hmdcdigitizer.cc:2033
 hmdcdigitizer.cc:2034
 hmdcdigitizer.cc:2035
 hmdcdigitizer.cc:2036
 hmdcdigitizer.cc:2037
 hmdcdigitizer.cc:2038
 hmdcdigitizer.cc:2039
 hmdcdigitizer.cc:2040
 hmdcdigitizer.cc:2041
 hmdcdigitizer.cc:2042
 hmdcdigitizer.cc:2043
 hmdcdigitizer.cc:2044
 hmdcdigitizer.cc:2045
 hmdcdigitizer.cc:2046
 hmdcdigitizer.cc:2047
 hmdcdigitizer.cc:2048
 hmdcdigitizer.cc:2049
 hmdcdigitizer.cc:2050
 hmdcdigitizer.cc:2051
 hmdcdigitizer.cc:2052
 hmdcdigitizer.cc:2053
 hmdcdigitizer.cc:2054
 hmdcdigitizer.cc:2055
 hmdcdigitizer.cc:2056
 hmdcdigitizer.cc:2057
 hmdcdigitizer.cc:2058
 hmdcdigitizer.cc:2059
 hmdcdigitizer.cc:2060
 hmdcdigitizer.cc:2061
 hmdcdigitizer.cc:2062
 hmdcdigitizer.cc:2063
 hmdcdigitizer.cc:2064
 hmdcdigitizer.cc:2065
 hmdcdigitizer.cc:2066
 hmdcdigitizer.cc:2067
 hmdcdigitizer.cc:2068
 hmdcdigitizer.cc:2069
 hmdcdigitizer.cc:2070
 hmdcdigitizer.cc:2071
 hmdcdigitizer.cc:2072
 hmdcdigitizer.cc:2073
 hmdcdigitizer.cc:2074
 hmdcdigitizer.cc:2075
 hmdcdigitizer.cc:2076
 hmdcdigitizer.cc:2077
 hmdcdigitizer.cc:2078
 hmdcdigitizer.cc:2079
 hmdcdigitizer.cc:2080
 hmdcdigitizer.cc:2081
 hmdcdigitizer.cc:2082
 hmdcdigitizer.cc:2083
 hmdcdigitizer.cc:2084
 hmdcdigitizer.cc:2085
 hmdcdigitizer.cc:2086
 hmdcdigitizer.cc:2087
 hmdcdigitizer.cc:2088
 hmdcdigitizer.cc:2089
 hmdcdigitizer.cc:2090
 hmdcdigitizer.cc:2091
 hmdcdigitizer.cc:2092
 hmdcdigitizer.cc:2093
 hmdcdigitizer.cc:2094
 hmdcdigitizer.cc:2095
 hmdcdigitizer.cc:2096
 hmdcdigitizer.cc:2097
 hmdcdigitizer.cc:2098
 hmdcdigitizer.cc:2099
 hmdcdigitizer.cc:2100
 hmdcdigitizer.cc:2101
 hmdcdigitizer.cc:2102
 hmdcdigitizer.cc:2103
 hmdcdigitizer.cc:2104
 hmdcdigitizer.cc:2105
 hmdcdigitizer.cc:2106
 hmdcdigitizer.cc:2107
 hmdcdigitizer.cc:2108
 hmdcdigitizer.cc:2109
 hmdcdigitizer.cc:2110
 hmdcdigitizer.cc:2111
 hmdcdigitizer.cc:2112
 hmdcdigitizer.cc:2113
 hmdcdigitizer.cc:2114
 hmdcdigitizer.cc:2115
 hmdcdigitizer.cc:2116
 hmdcdigitizer.cc:2117
 hmdcdigitizer.cc:2118
 hmdcdigitizer.cc:2119
 hmdcdigitizer.cc:2120
 hmdcdigitizer.cc:2121
 hmdcdigitizer.cc:2122
 hmdcdigitizer.cc:2123
 hmdcdigitizer.cc:2124
 hmdcdigitizer.cc:2125
 hmdcdigitizer.cc:2126
 hmdcdigitizer.cc:2127
 hmdcdigitizer.cc:2128
 hmdcdigitizer.cc:2129
 hmdcdigitizer.cc:2130
 hmdcdigitizer.cc:2131
 hmdcdigitizer.cc:2132
 hmdcdigitizer.cc:2133
 hmdcdigitizer.cc:2134
 hmdcdigitizer.cc:2135
 hmdcdigitizer.cc:2136
 hmdcdigitizer.cc:2137
 hmdcdigitizer.cc:2138
 hmdcdigitizer.cc:2139
 hmdcdigitizer.cc:2140
 hmdcdigitizer.cc:2141
 hmdcdigitizer.cc:2142
 hmdcdigitizer.cc:2143
 hmdcdigitizer.cc:2144
 hmdcdigitizer.cc:2145
 hmdcdigitizer.cc:2146
 hmdcdigitizer.cc:2147
 hmdcdigitizer.cc:2148
 hmdcdigitizer.cc:2149
 hmdcdigitizer.cc:2150
 hmdcdigitizer.cc:2151
 hmdcdigitizer.cc:2152
 hmdcdigitizer.cc:2153
 hmdcdigitizer.cc:2154
 hmdcdigitizer.cc:2155
 hmdcdigitizer.cc:2156
 hmdcdigitizer.cc:2157
 hmdcdigitizer.cc:2158
 hmdcdigitizer.cc:2159
 hmdcdigitizer.cc:2160
 hmdcdigitizer.cc:2161
 hmdcdigitizer.cc:2162
 hmdcdigitizer.cc:2163
 hmdcdigitizer.cc:2164
 hmdcdigitizer.cc:2165
 hmdcdigitizer.cc:2166
 hmdcdigitizer.cc:2167
 hmdcdigitizer.cc:2168
 hmdcdigitizer.cc:2169
 hmdcdigitizer.cc:2170
 hmdcdigitizer.cc:2171
 hmdcdigitizer.cc:2172
 hmdcdigitizer.cc:2173
 hmdcdigitizer.cc:2174
 hmdcdigitizer.cc:2175
 hmdcdigitizer.cc:2176
 hmdcdigitizer.cc:2177
 hmdcdigitizer.cc:2178
 hmdcdigitizer.cc:2179
 hmdcdigitizer.cc:2180
 hmdcdigitizer.cc:2181
 hmdcdigitizer.cc:2182
 hmdcdigitizer.cc:2183
 hmdcdigitizer.cc:2184
 hmdcdigitizer.cc:2185
 hmdcdigitizer.cc:2186
 hmdcdigitizer.cc:2187
 hmdcdigitizer.cc:2188
 hmdcdigitizer.cc:2189
 hmdcdigitizer.cc:2190
 hmdcdigitizer.cc:2191
 hmdcdigitizer.cc:2192
 hmdcdigitizer.cc:2193
 hmdcdigitizer.cc:2194
 hmdcdigitizer.cc:2195
 hmdcdigitizer.cc:2196
 hmdcdigitizer.cc:2197
 hmdcdigitizer.cc:2198
 hmdcdigitizer.cc:2199
 hmdcdigitizer.cc:2200
 hmdcdigitizer.cc:2201
 hmdcdigitizer.cc:2202
 hmdcdigitizer.cc:2203
 hmdcdigitizer.cc:2204
 hmdcdigitizer.cc:2205
 hmdcdigitizer.cc:2206
 hmdcdigitizer.cc:2207
 hmdcdigitizer.cc:2208
 hmdcdigitizer.cc:2209
 hmdcdigitizer.cc:2210
 hmdcdigitizer.cc:2211
 hmdcdigitizer.cc:2212
 hmdcdigitizer.cc:2213
 hmdcdigitizer.cc:2214
 hmdcdigitizer.cc:2215
 hmdcdigitizer.cc:2216
 hmdcdigitizer.cc:2217
 hmdcdigitizer.cc:2218
 hmdcdigitizer.cc:2219
 hmdcdigitizer.cc:2220
 hmdcdigitizer.cc:2221
 hmdcdigitizer.cc:2222
 hmdcdigitizer.cc:2223
 hmdcdigitizer.cc:2224
 hmdcdigitizer.cc:2225
 hmdcdigitizer.cc:2226
 hmdcdigitizer.cc:2227
 hmdcdigitizer.cc:2228
 hmdcdigitizer.cc:2229
 hmdcdigitizer.cc:2230
 hmdcdigitizer.cc:2231
 hmdcdigitizer.cc:2232
 hmdcdigitizer.cc:2233
 hmdcdigitizer.cc:2234
 hmdcdigitizer.cc:2235
 hmdcdigitizer.cc:2236
 hmdcdigitizer.cc:2237
 hmdcdigitizer.cc:2238
 hmdcdigitizer.cc:2239
 hmdcdigitizer.cc:2240
 hmdcdigitizer.cc:2241
 hmdcdigitizer.cc:2242
 hmdcdigitizer.cc:2243
 hmdcdigitizer.cc:2244
 hmdcdigitizer.cc:2245
 hmdcdigitizer.cc:2246
 hmdcdigitizer.cc:2247
 hmdcdigitizer.cc:2248
 hmdcdigitizer.cc:2249
 hmdcdigitizer.cc:2250
 hmdcdigitizer.cc:2251
 hmdcdigitizer.cc:2252
 hmdcdigitizer.cc:2253
 hmdcdigitizer.cc:2254
 hmdcdigitizer.cc:2255
 hmdcdigitizer.cc:2256
 hmdcdigitizer.cc:2257
 hmdcdigitizer.cc:2258
 hmdcdigitizer.cc:2259
 hmdcdigitizer.cc:2260
 hmdcdigitizer.cc:2261
 hmdcdigitizer.cc:2262
 hmdcdigitizer.cc:2263
 hmdcdigitizer.cc:2264
 hmdcdigitizer.cc:2265
 hmdcdigitizer.cc:2266
 hmdcdigitizer.cc:2267
 hmdcdigitizer.cc:2268
 hmdcdigitizer.cc:2269
 hmdcdigitizer.cc:2270
 hmdcdigitizer.cc:2271
 hmdcdigitizer.cc:2272
 hmdcdigitizer.cc:2273
 hmdcdigitizer.cc:2274
 hmdcdigitizer.cc:2275
 hmdcdigitizer.cc:2276
 hmdcdigitizer.cc:2277
 hmdcdigitizer.cc:2278
 hmdcdigitizer.cc:2279
 hmdcdigitizer.cc:2280
 hmdcdigitizer.cc:2281
 hmdcdigitizer.cc:2282
 hmdcdigitizer.cc:2283
 hmdcdigitizer.cc:2284
 hmdcdigitizer.cc:2285
 hmdcdigitizer.cc:2286
 hmdcdigitizer.cc:2287
 hmdcdigitizer.cc:2288
 hmdcdigitizer.cc:2289
 hmdcdigitizer.cc:2290
 hmdcdigitizer.cc:2291
 hmdcdigitizer.cc:2292
 hmdcdigitizer.cc:2293
 hmdcdigitizer.cc:2294
 hmdcdigitizer.cc:2295
 hmdcdigitizer.cc:2296
 hmdcdigitizer.cc:2297
 hmdcdigitizer.cc:2298
 hmdcdigitizer.cc:2299
 hmdcdigitizer.cc:2300
 hmdcdigitizer.cc:2301
 hmdcdigitizer.cc:2302
 hmdcdigitizer.cc:2303
 hmdcdigitizer.cc:2304
 hmdcdigitizer.cc:2305
 hmdcdigitizer.cc:2306
 hmdcdigitizer.cc:2307
 hmdcdigitizer.cc:2308
 hmdcdigitizer.cc:2309
 hmdcdigitizer.cc:2310
 hmdcdigitizer.cc:2311
 hmdcdigitizer.cc:2312
 hmdcdigitizer.cc:2313
 hmdcdigitizer.cc:2314
 hmdcdigitizer.cc:2315
 hmdcdigitizer.cc:2316
 hmdcdigitizer.cc:2317
 hmdcdigitizer.cc:2318
 hmdcdigitizer.cc:2319
 hmdcdigitizer.cc:2320
 hmdcdigitizer.cc:2321
 hmdcdigitizer.cc:2322
 hmdcdigitizer.cc:2323
 hmdcdigitizer.cc:2324
 hmdcdigitizer.cc:2325
 hmdcdigitizer.cc:2326
 hmdcdigitizer.cc:2327
 hmdcdigitizer.cc:2328
 hmdcdigitizer.cc:2329
 hmdcdigitizer.cc:2330
 hmdcdigitizer.cc:2331
 hmdcdigitizer.cc:2332
 hmdcdigitizer.cc:2333
 hmdcdigitizer.cc:2334
 hmdcdigitizer.cc:2335
 hmdcdigitizer.cc:2336
 hmdcdigitizer.cc:2337
 hmdcdigitizer.cc:2338
 hmdcdigitizer.cc:2339
 hmdcdigitizer.cc:2340
 hmdcdigitizer.cc:2341
 hmdcdigitizer.cc:2342
 hmdcdigitizer.cc:2343
 hmdcdigitizer.cc:2344
 hmdcdigitizer.cc:2345
 hmdcdigitizer.cc:2346
 hmdcdigitizer.cc:2347
 hmdcdigitizer.cc:2348
 hmdcdigitizer.cc:2349
 hmdcdigitizer.cc:2350
 hmdcdigitizer.cc:2351
 hmdcdigitizer.cc:2352
 hmdcdigitizer.cc:2353
 hmdcdigitizer.cc:2354
 hmdcdigitizer.cc:2355
 hmdcdigitizer.cc:2356
 hmdcdigitizer.cc:2357
 hmdcdigitizer.cc:2358
 hmdcdigitizer.cc:2359
 hmdcdigitizer.cc:2360
 hmdcdigitizer.cc:2361
 hmdcdigitizer.cc:2362
 hmdcdigitizer.cc:2363
 hmdcdigitizer.cc:2364
 hmdcdigitizer.cc:2365
 hmdcdigitizer.cc:2366
 hmdcdigitizer.cc:2367
 hmdcdigitizer.cc:2368
 hmdcdigitizer.cc:2369
 hmdcdigitizer.cc:2370
 hmdcdigitizer.cc:2371
 hmdcdigitizer.cc:2372
 hmdcdigitizer.cc:2373
 hmdcdigitizer.cc:2374
 hmdcdigitizer.cc:2375
 hmdcdigitizer.cc:2376
 hmdcdigitizer.cc:2377
 hmdcdigitizer.cc:2378
 hmdcdigitizer.cc:2379
 hmdcdigitizer.cc:2380
 hmdcdigitizer.cc:2381
 hmdcdigitizer.cc:2382
 hmdcdigitizer.cc:2383
 hmdcdigitizer.cc:2384
 hmdcdigitizer.cc:2385
 hmdcdigitizer.cc:2386
 hmdcdigitizer.cc:2387
 hmdcdigitizer.cc:2388
 hmdcdigitizer.cc:2389
 hmdcdigitizer.cc:2390
 hmdcdigitizer.cc:2391
 hmdcdigitizer.cc:2392
 hmdcdigitizer.cc:2393
 hmdcdigitizer.cc:2394
 hmdcdigitizer.cc:2395
 hmdcdigitizer.cc:2396
 hmdcdigitizer.cc:2397
 hmdcdigitizer.cc:2398
 hmdcdigitizer.cc:2399
 hmdcdigitizer.cc:2400
 hmdcdigitizer.cc:2401
 hmdcdigitizer.cc:2402
 hmdcdigitizer.cc:2403
 hmdcdigitizer.cc:2404
 hmdcdigitizer.cc:2405
 hmdcdigitizer.cc:2406
 hmdcdigitizer.cc:2407
 hmdcdigitizer.cc:2408
 hmdcdigitizer.cc:2409
 hmdcdigitizer.cc:2410
 hmdcdigitizer.cc:2411
 hmdcdigitizer.cc:2412
 hmdcdigitizer.cc:2413
 hmdcdigitizer.cc:2414
 hmdcdigitizer.cc:2415
 hmdcdigitizer.cc:2416
 hmdcdigitizer.cc:2417
 hmdcdigitizer.cc:2418
 hmdcdigitizer.cc:2419
 hmdcdigitizer.cc:2420
 hmdcdigitizer.cc:2421
 hmdcdigitizer.cc:2422
 hmdcdigitizer.cc:2423
 hmdcdigitizer.cc:2424
 hmdcdigitizer.cc:2425
 hmdcdigitizer.cc:2426
 hmdcdigitizer.cc:2427
 hmdcdigitizer.cc:2428
 hmdcdigitizer.cc:2429
 hmdcdigitizer.cc:2430
 hmdcdigitizer.cc:2431
 hmdcdigitizer.cc:2432
 hmdcdigitizer.cc:2433
 hmdcdigitizer.cc:2434
 hmdcdigitizer.cc:2435
 hmdcdigitizer.cc:2436
 hmdcdigitizer.cc:2437
 hmdcdigitizer.cc:2438
 hmdcdigitizer.cc:2439
 hmdcdigitizer.cc:2440
 hmdcdigitizer.cc:2441
 hmdcdigitizer.cc:2442
 hmdcdigitizer.cc:2443
 hmdcdigitizer.cc:2444
 hmdcdigitizer.cc:2445
 hmdcdigitizer.cc:2446
 hmdcdigitizer.cc:2447
 hmdcdigitizer.cc:2448
 hmdcdigitizer.cc:2449
 hmdcdigitizer.cc:2450
 hmdcdigitizer.cc:2451
 hmdcdigitizer.cc:2452
 hmdcdigitizer.cc:2453
 hmdcdigitizer.cc:2454
 hmdcdigitizer.cc:2455
 hmdcdigitizer.cc:2456
 hmdcdigitizer.cc:2457
 hmdcdigitizer.cc:2458
 hmdcdigitizer.cc:2459
 hmdcdigitizer.cc:2460
 hmdcdigitizer.cc:2461
 hmdcdigitizer.cc:2462
 hmdcdigitizer.cc:2463
 hmdcdigitizer.cc:2464
 hmdcdigitizer.cc:2465
 hmdcdigitizer.cc:2466
 hmdcdigitizer.cc:2467
 hmdcdigitizer.cc:2468
 hmdcdigitizer.cc:2469
 hmdcdigitizer.cc:2470
 hmdcdigitizer.cc:2471
 hmdcdigitizer.cc:2472
 hmdcdigitizer.cc:2473
 hmdcdigitizer.cc:2474
 hmdcdigitizer.cc:2475
 hmdcdigitizer.cc:2476
 hmdcdigitizer.cc:2477
 hmdcdigitizer.cc:2478
 hmdcdigitizer.cc:2479
 hmdcdigitizer.cc:2480
 hmdcdigitizer.cc:2481
 hmdcdigitizer.cc:2482
 hmdcdigitizer.cc:2483
 hmdcdigitizer.cc:2484
 hmdcdigitizer.cc:2485
 hmdcdigitizer.cc:2486
 hmdcdigitizer.cc:2487
 hmdcdigitizer.cc:2488
 hmdcdigitizer.cc:2489
 hmdcdigitizer.cc:2490
 hmdcdigitizer.cc:2491
 hmdcdigitizer.cc:2492
 hmdcdigitizer.cc:2493
 hmdcdigitizer.cc:2494
 hmdcdigitizer.cc:2495
 hmdcdigitizer.cc:2496
 hmdcdigitizer.cc:2497
 hmdcdigitizer.cc:2498
 hmdcdigitizer.cc:2499
 hmdcdigitizer.cc:2500
 hmdcdigitizer.cc:2501
 hmdcdigitizer.cc:2502
 hmdcdigitizer.cc:2503
 hmdcdigitizer.cc:2504
 hmdcdigitizer.cc:2505
 hmdcdigitizer.cc:2506
 hmdcdigitizer.cc:2507
 hmdcdigitizer.cc:2508
 hmdcdigitizer.cc:2509
 hmdcdigitizer.cc:2510
 hmdcdigitizer.cc:2511
 hmdcdigitizer.cc:2512
 hmdcdigitizer.cc:2513
 hmdcdigitizer.cc:2514
 hmdcdigitizer.cc:2515
 hmdcdigitizer.cc:2516
 hmdcdigitizer.cc:2517
 hmdcdigitizer.cc:2518
 hmdcdigitizer.cc:2519
 hmdcdigitizer.cc:2520
 hmdcdigitizer.cc:2521
 hmdcdigitizer.cc:2522
 hmdcdigitizer.cc:2523
 hmdcdigitizer.cc:2524
 hmdcdigitizer.cc:2525
 hmdcdigitizer.cc:2526
 hmdcdigitizer.cc:2527
 hmdcdigitizer.cc:2528
 hmdcdigitizer.cc:2529
 hmdcdigitizer.cc:2530
 hmdcdigitizer.cc:2531
 hmdcdigitizer.cc:2532
 hmdcdigitizer.cc:2533
 hmdcdigitizer.cc:2534
 hmdcdigitizer.cc:2535
 hmdcdigitizer.cc:2536
 hmdcdigitizer.cc:2537
 hmdcdigitizer.cc:2538
 hmdcdigitizer.cc:2539
 hmdcdigitizer.cc:2540
 hmdcdigitizer.cc:2541
 hmdcdigitizer.cc:2542
 hmdcdigitizer.cc:2543
 hmdcdigitizer.cc:2544
 hmdcdigitizer.cc:2545
 hmdcdigitizer.cc:2546
 hmdcdigitizer.cc:2547
 hmdcdigitizer.cc:2548
 hmdcdigitizer.cc:2549
 hmdcdigitizer.cc:2550
 hmdcdigitizer.cc:2551
 hmdcdigitizer.cc:2552
 hmdcdigitizer.cc:2553
 hmdcdigitizer.cc:2554
 hmdcdigitizer.cc:2555
 hmdcdigitizer.cc:2556
 hmdcdigitizer.cc:2557
 hmdcdigitizer.cc:2558
 hmdcdigitizer.cc:2559
 hmdcdigitizer.cc:2560
 hmdcdigitizer.cc:2561
 hmdcdigitizer.cc:2562
 hmdcdigitizer.cc:2563
 hmdcdigitizer.cc:2564
 hmdcdigitizer.cc:2565
 hmdcdigitizer.cc:2566
 hmdcdigitizer.cc:2567
 hmdcdigitizer.cc:2568
 hmdcdigitizer.cc:2569
 hmdcdigitizer.cc:2570
 hmdcdigitizer.cc:2571
 hmdcdigitizer.cc:2572
 hmdcdigitizer.cc:2573
 hmdcdigitizer.cc:2574
 hmdcdigitizer.cc:2575
 hmdcdigitizer.cc:2576
 hmdcdigitizer.cc:2577
 hmdcdigitizer.cc:2578
 hmdcdigitizer.cc:2579
 hmdcdigitizer.cc:2580
 hmdcdigitizer.cc:2581
 hmdcdigitizer.cc:2582
 hmdcdigitizer.cc:2583
 hmdcdigitizer.cc:2584
 hmdcdigitizer.cc:2585
 hmdcdigitizer.cc:2586
 hmdcdigitizer.cc:2587
 hmdcdigitizer.cc:2588
 hmdcdigitizer.cc:2589
 hmdcdigitizer.cc:2590
 hmdcdigitizer.cc:2591
 hmdcdigitizer.cc:2592
 hmdcdigitizer.cc:2593
 hmdcdigitizer.cc:2594
 hmdcdigitizer.cc:2595
 hmdcdigitizer.cc:2596
 hmdcdigitizer.cc:2597
 hmdcdigitizer.cc:2598
 hmdcdigitizer.cc:2599
 hmdcdigitizer.cc:2600
 hmdcdigitizer.cc:2601
 hmdcdigitizer.cc:2602
 hmdcdigitizer.cc:2603
 hmdcdigitizer.cc:2604
 hmdcdigitizer.cc:2605
 hmdcdigitizer.cc:2606
 hmdcdigitizer.cc:2607
 hmdcdigitizer.cc:2608
 hmdcdigitizer.cc:2609
 hmdcdigitizer.cc:2610
 hmdcdigitizer.cc:2611
 hmdcdigitizer.cc:2612
 hmdcdigitizer.cc:2613
 hmdcdigitizer.cc:2614
 hmdcdigitizer.cc:2615