ROOT logo
using namespace std;
#include "TRandom.h"
#include "hemcdigitizer.h" 
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hemcdetector.h" 
#include "hgeantemc.h"
#include "hgeantkine.h"
#include "hevent.h"
#include "hlinearcategory.h"
#include "hemccalsim.h"
#include "hemcgeompar.h"
#include "hemcdigipar.h"
#include "hemccellstatuspar.h"
#include "hemcsimulpar.h"
#include "hstartdef.h"
#include "hstart2hit.h"

#include <iostream>

//*-- Author   : V. Pechenov
//*-- Modified :

/////////////////////////////////////////////////////////////////////
//
//  HEmcDigitizer digitizes data, puts output values into cal data category
//
// Input data for digitization:
// Two types of HGeantEmc objects:
// 1. Hit which has track number = -777 keeps integrated number of photo electrons
// 2. Hit which has track number > 0 keeps a time of flight, momentum, track length and number of photo electrons
//
// Parameters for recalculating of the number of photo electrons to the energy deposit
// Parameters for the time and energy deposit smearings
// Parameter for the start signal smearing
//
// Two modes of reconstruction: simulation and embedding
//
// HEmcDigitizer
//  collects all tracks in the cell,
//  corrects GEANT time of flight to the time in the input EMC plane,
//  sorts tracks by corrected time and assigns the cell time to the fastest track which has energy deposit above threshold,
//  sorts tracks by energy and assigns the cell to the track which has maximal energy deposit.
//
// Digitizer retrieves a particle from track history which crosses parallel plane to EMC plane and distance to front of EMC is equal to zVertBorder.
// zVertBorder >= 0    EMC front plane is used
// zVertBorder = -130. RPC front plane is used (default value)
//
/////////////////////////////////////////////////////////////////////

ClassImp(HEmcDigitizer)

HEmcDigitizer::HEmcDigitizer(void) {
  initVariables();
}

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

HEmcDigitizer::~HEmcDigitizer(void) {
  if (iterGeantEmc) delete iterGeantEmc;
  clearCellobjects();
  cellobjects.clear();
}

void HEmcDigitizer::initVariables(void) {
  fGeantEmcCat     = NULL;
  fGeantKineCat    = NULL;
  fCalCat          = NULL;
  iterGeantEmc     = NULL;
  fGeomPar         = NULL;
  fDigiPar         = NULL;
  fStartHitCat     = NULL;
  zVertBorder      = -130.;    // [mm]
  energyDepositCut = 15.;      // [MeV]
  signalVelocity   = 299.792;  // [mm/ns]
  halfOfCellLength = 210.;     // [mm] 
  embeddingmode    = 0;
  fLoc.setNIndex(2);
  fLoc.set(2,0,0);
}

Bool_t HEmcDigitizer::init(void) {
  fEmcDet = (HEmcDetector*)(gHades->getSetup()->getDetector("Emc"));
  if(!fEmcDet){
    Error("init","No Emc Detector found");
    return kFALSE;
  }

  // working array
  cellobjects.resize(cellObjectsSize(), 0 );   // size is constant over run time

  // GEANT input data
  fGeantEmcCat = gHades->getCurrentEvent()->getCategory(catEmcGeantRaw);  
  if (!fGeantEmcCat) {
    Error("HEmcDigitizer::init()","HGeant EMC input missing");
    return kFALSE;
  }
  iterGeantEmc = (HIterator *)fGeantEmcCat->MakeIterator("native");

  fGeantKineCat = (HLinearCategory*)gHades->getCurrentEvent()->getCategory(catGeantKine);
  if(!fGeantKineCat){
      Error("HEmcDigitizer::init()","No catGeantKine in input!");
      return kFALSE;
  }
  
  // Build the Calibration category
  fCalCat = gHades->getCurrentEvent()->getCategory(catEmcCal);  
  if (fCalCat == NULL) {
    fCalCat = fEmcDet->buildMatrixCategory("HEmcCalSim",0.5);  
    gHades->getCurrentEvent()->addCategory(catEmcCal,fCalCat,"Emc");
  }
  if(fCalCat == NULL) return kFALSE;
  if(gHades->getEmbeddingMode()>0) embeddingmode = 1;
  
  
  fStartHitCat=gHades->getCurrentEvent()->getCategory(catStart2Hit);
  if (!fStartHitCat) Warning("init","Start hit level not defined; setting start time to 0");

  return setParameterContainers();
}

Bool_t HEmcDigitizer::setParameterContainers(void) {
  fGeomPar=(HEmcGeomPar*)gHades->getRuntimeDb()->getContainer("EmcGeomPar");
  if (!fGeomPar){
    Error("initParContainer","No EmcGeomPar parameter container");
    return kFALSE;
  }
  fDigiPar    =(HEmcDigiPar *)gHades->getRuntimeDb()->getContainer("EmcDigiPar");
  if (!fDigiPar){
    Error("initParContainer","No EmcDigiPar parameter container");
    return kFALSE;
  }
  fSimulPar    =(HEmcSimulPar *)gHades->getRuntimeDb()->getContainer("EmcSimulPar");
  if (!fSimulPar){
    Error("initParContainer","No EmcSimulPar parameter container");
    return kFALSE;
  }
  pStatuspar = (HEmcCellStatusPar*)gHades->getRuntimeDb()->getContainer("EmcCellStatusPar");
  if (!pStatuspar) return kFALSE;
  return kTRUE;
}

Bool_t HEmcDigitizer::reinit(void) {
  // sets some local variables read from initialized parameter container
  sigmaT               = fDigiPar->getSigmaT();
  phot2Energy[0]       = fDigiPar->getPhot2E();        // for PMT type 1 (1.5inch)
  phot2Energy[1]       = fDigiPar->getPhot2E2();       // for PMT type 2 (3.0inch)
  Float_t sigmaEIntern = fDigiPar->getSigmaEIntern();
  Float_t sigmaEReal   = fDigiPar->getSigmaEReal();    // for PMT type 1 (1.5inch)
  Float_t sigmaEReal2  = fDigiPar->getSigmaEReal2();   // for PMT type 2 (3.0inch)
  facEnergSmear[0]     = 1000.*TMath::Sqrt(sigmaEReal*sigmaEReal - sigmaEIntern*sigmaEIntern);
  facEnergSmear[1]     = 1000.*TMath::Sqrt(sigmaEReal2*sigmaEReal2 - sigmaEIntern*sigmaEIntern);
  for(Int_t s=0;s<6;s++) labTrans[s] = fGeomPar->getModule(s)->getLabTransform();
  return kTRUE;
}

Int_t HEmcDigitizer::execute(void) {
  // Digitization of GEANT hits and storage in HEmcCalSim
  
  // Getting start time smearing
  Float_t startTimeSmearing = 0; //[ns]
  if (fStartHitCat && fStartHitCat->getEntries()>0) {
    HStart2Hit *pStartH = (HStart2Hit *) fStartHitCat->getObject(0);
    if(pStartH != NULL && pStartH->getResolution()!=-1000) {
      startTimeSmearing = pStartH->getResolution();
    }
  }
  
  // Case of embedding real tracks in the sim.data
  if(embeddingmode > 0) {
    if(gHades->getEmbeddingDebug() == 1) {
      fCalCat->Clear();
    } else {
      Int_t nentr = fCalCat->getEntries();
      for(Int_t n=0;n<nentr;n++) {
        HEmcCalSim* pCal = (HEmcCalSim*)fCalCat->getObject(n);
        Int_t sec  = pCal->getSector();
        Int_t cell = pCal->getCell();
        if (sec<0 || sec>5 || cell<0 || cell>=emcMaxComponents) {
          Warning("HEmcDigitizer:execute","EmcCal cell address invalid: sec=%i cell=%i",sec,cell);
          continue;
        }
        Int_t ind = cellObjectIndex(sec,cell);
        if(cellobjects[ind] == NULL) {
          cellobjects[ind] = new celldata;
          cellobjects[ind]->reset();
        }
        cellobjects[ind]->isEmbeddedReal = kTRUE;
        celltrack* celltr = new celltrack;
        celltr->reset();
        celltr->trackEn   = pCal->getEnergy();
        celltr->gtime     = pCal->getTime();
        celltr->gtrack    = gHades->getEmbeddingRealTrackId();
        cellobjects[ind]->ctracks.push_back(celltr);
      }
    }
  }
  // loop over the HGeantEmc objects and fill temporary working objects
  iterGeantEmc->Reset();
  HGeantEmc*  geantemc = 0;
  while ((geantemc=(HGeantEmc *)iterGeantEmc->Next())!=0) {
    Int_t trackNumber = geantemc->getTrack();
    Int_t sec         = geantemc->getSector();
    Int_t cell        = geantemc->getCell();
    if (sec<0 || sec>5 || cell<0 || cell>=emcMaxComponents) {
      Warning("HEmcDigitizer:execute","Emc Geant cell address invalid: sec=%i cell=%i",sec,cell);
      continue;
    }
    if(trackNumber <= 0 && trackNumber != -777) continue; // nothing to do for real data
    
    Int_t pos = HEmcDetector::getPositionFromCell(cell);
    if (pStatuspar->getCellStatus(sec, pos) == 0) continue;
    
    Float_t peHit, xHit, yHit, zHit, tofHit, momHit, trackLength;
    geantemc->getHit(peHit, xHit, yHit, zHit, tofHit, momHit, trackLength);
    if(peHit == 0.) continue;                             // Number of photo electrons must be > 0

    Int_t pmtType = fSimulPar->getPmtType(sec,cell);
    if(pmtType < 1 || pmtType > 2) continue;    // never should happens
    Float_t energyHit = peHit * phot2Energy[pmtType-1];         // Convert to MeV
    
    Int_t ind = cellObjectIndex(sec,cell);
    if(cellobjects[ind] == NULL) {
      cellobjects[ind] = new celldata;
      cellobjects[ind]->reset();
      cellobjects[ind]->energy = 0.F;
    }
    celldata* cdata = cellobjects[ind];
    
    if(trackNumber == -777) {          // -777: hits with integrated number of photo electrons
      cdata->energy += energyHit;
    } else {
      HGeantEmc* pFirstEmc = getInputHit(geantemc,trackNumber);
      if(trackNumber <= 0 || pFirstEmc == NULL) continue;

      // Correction for the signal speed:
      tofHit -= (zHit+halfOfCellLength)/signalVelocity;
      // "zHit+halfOfCellLength" is distance from beginning of cell to the HGeandEmc hit

      Bool_t isInTheList = kFALSE;
      Int_t  numInpTrack = pFirstEmc->getTrack(); 

      if(std::find((cdata->inputTracks).begin(),(cdata->inputTracks).end(),numInpTrack) != cdata->inputTracks.end()) continue;
      cdata->inputTracks.push_back(numInpTrack);
      Float_t tofHitD;
      pFirstEmc->getHit(peHit, xHit, yHit, zHit, tofHitD, momHit, trackLength);
      Int_t pmtType = fSimulPar->getPmtType(sec,cell);
      energyHit = peHit * phot2Energy[pmtType-1];  // Convert to MeV

      // Is this track in the track list already:
      for(UInt_t i=0;i<cdata->ctracks.size();i++) {
        celltrack* celltr = cdata->ctracks[i];
        if (celltr->gtrack == trackNumber) {
          // The current track found in list
          isInTheList      = kTRUE;
          celltr->trackEn += energyHit;
          if (tofHit < celltr->gtime) celltr->gtime = tofHit;
          break;
        }
      }
      if( !isInTheList ) {
        // If track is not in the list yet
        // create new object for this cell and add them to the list of tracks for this cell
        celltrack* celltr = new celltrack;
        celltr->reset();
        celltr->trackEn   = energyHit;
        celltr->gtime     = tofHit;
        celltr->gtrack    = trackNumber;
        cdata->ctracks.push_back(celltr);
      }
    }
  } // end of HGeantEmc loop
  
  for(UInt_t i = 0; i < cellobjects.size(); i ++) {
    celldata* cdata = cellobjects[i];
    if (cdata!=NULL && cdata->energy>0.) {
      if(cdata->ctracks.size() == 0) continue;
      Int_t cell = cellFromIndex(i);
      fLoc[0] = sectorFromIndex(i);
      fLoc[1] = cell;
      HEmcCalSim* cal = (HEmcCalSim*) fCalCat->getSlot(fLoc);
      if (cal == NULL) {
        Warning("HEmcDigitizer:execute","HEmcCalSim:getSlot(loc) failed!");
        continue;
      }
      Float_t sigmaE = 0.;
      Float_t energy = 0.;
      if(cdata->energy > 0.) {
        Int_t pmtType = fSimulPar->getPmtType(fLoc[0],cell);
        sigmaE = TMath::Sqrt(cdata->energy/1000.) * facEnergSmear[pmtType-1];
        energy = gRandom->Gaus(cdata->energy,sigmaE);
      }
      if(!cdata->isEmbeddedReal) {
        cal = new(cal) HEmcCalSim;
        cal->setSector(fLoc[0]);
        cal->setCell(cell);
        Char_t  row,col;
        fEmcDet->getRowCol(cell,row,col);
        cal->setRow(row);
        cal->setColumn(col);
      } else {  // Embedded real hit
        energy += cal->getEnergy();
        sigmaE  = TMath::Sqrt(sigmaE*sigmaE + cal->getSigmaEnergy()*cal->getSigmaEnergy());
      }
      // ------  energy -------------
      cal->setEnergy(energy);
      cal->setSigmaEnergy(sigmaE);
      if(cal->getEnergy() < energyDepositCut) cal->setStatus(-1);  // Energy deposit < threshold in this cell

      // ------  time and track numbers ------
      // Take track number and time from track when sum. of energy deposit exceed threshold
      cdata->sortTime();
      Float_t    energySum = 0.;
      celltrack* celltr    = NULL;
      for(UInt_t k = 0; k < cdata->ctracks.size(); k++ ) {
        celltr = cdata->ctracks[k];
        energySum += celltr->trackEn;
        if (energySum > energyDepositCut) break;
      }
      if(!cdata->isEmbeddedReal || gHades->getEmbeddingRealTrackId() != celltr->gtrack) {
        cal->setTime(gRandom->Gaus(celltr->gtime,sigmaT) - startTimeSmearing);
        cal->setTimeTrack(celltr->gtrack);
        cal->setSigmaTime(sigmaT);
      } // else keep time and sigma from real hit
      
      // ------ sort by enegry  ---------------
      cdata->sortEnergy();
      for(UInt_t k = 0; k < cdata->ctracks.size() && k<5; k++ ) {
        celltrack* celltr = cdata->ctracks[k];
        cal->setTrack(celltr->gtrack, celltr->trackEn);
      }     
      
      cal->setNHits(1);
      cal->setTotMult(cdata->ctracks.size());
    }
  }
  
  clearCellobjects();               // clear temporary data
  return 0;
}

void  HEmcDigitizer::clearCellobjects(){
  // deletes objects in working array and sets pointer to 0
  // the vector is still not cleared
  for(UInt_t i = 0; i < cellobjects.size(); i++) {
    if(cellobjects[i]) cellobjects[i]->reset();
  }
}

HGeantEmc* HEmcDigitizer::getInputHit(HGeantEmc* pGeantEmc,Int_t &inputTrack) const {
  // Return pointer to the first HGeantEmc hit for track pGeantEmc->getTrack() or 
  // parent track if it has HGeantEmc hit in this cell
  // Return inputTrack: geant track number of the parent track of pGeantEmc->getTrack() 
  // which first reach EMC(or RPC) in this sector first
  Int_t track = pGeantEmc->getTrack();
  inputTrack  = track;
  Int_t       sec        = pGeantEmc->getSector();
  Int_t       cell       = pGeantEmc->getCell();
  HGeantKine* kine       = (HGeantKine*)fGeantKineCat->getObject(track-1);
  
  HGeantEmc*  firstHitInCell = pGeantEmc;
  
  do {
    track = kine->getTrack();
    Int_t first = kine->getFirstEmcHit();
    if(first != -1) {
      // track is in EMC
      kine->resetEmcIter();
      HGeantEmc* gemc = NULL;
      while( (gemc = (HGeantEmc*)kine->nextEmcHit()) != NULL) {
        if(gemc->getSector() != sec) continue;
        inputTrack = kine->getTrack();
        if(gemc->getCell() == cell) { 
          Float_t peHit,xHit, yHit, zHit, tofHit, momHit, trackLength;
          gemc->getHit(peHit, xHit, yHit, zHit, tofHit, momHit, trackLength);
          if(peHit > 0.) {
            firstHitInCell = gemc;
            break;  // Take the first hit
          }
        }
      }
    }
  } while((kine = kine->getParent(track,fGeantKineCat)) != NULL);
  
  if(zVertBorder < 0.) {
    // Test vertex of inputTrack and if it was borned in RPC region take parent track as inputTrack 
    HGeomVector ver;
    kine = (HGeantKine*)fGeantKineCat->getObject(inputTrack-1);
    while(kTRUE) {
      kine->getVertex(ver);
      ver  = labTrans[sec].transTo(ver);
      if(ver.getZ() < zVertBorder || ver.getZ()>0.) break;
      kine = kine->getParent(inputTrack,fGeantKineCat);
      if(kine == NULL) break;
      inputTrack = kine->getTrack();
    }
  }
    
  return firstHitInCell;
}
 hemcdigitizer.cc:1
 hemcdigitizer.cc:2
 hemcdigitizer.cc:3
 hemcdigitizer.cc:4
 hemcdigitizer.cc:5
 hemcdigitizer.cc:6
 hemcdigitizer.cc:7
 hemcdigitizer.cc:8
 hemcdigitizer.cc:9
 hemcdigitizer.cc:10
 hemcdigitizer.cc:11
 hemcdigitizer.cc:12
 hemcdigitizer.cc:13
 hemcdigitizer.cc:14
 hemcdigitizer.cc:15
 hemcdigitizer.cc:16
 hemcdigitizer.cc:17
 hemcdigitizer.cc:18
 hemcdigitizer.cc:19
 hemcdigitizer.cc:20
 hemcdigitizer.cc:21
 hemcdigitizer.cc:22
 hemcdigitizer.cc:23
 hemcdigitizer.cc:24
 hemcdigitizer.cc:25
 hemcdigitizer.cc:26
 hemcdigitizer.cc:27
 hemcdigitizer.cc:28
 hemcdigitizer.cc:29
 hemcdigitizer.cc:30
 hemcdigitizer.cc:31
 hemcdigitizer.cc:32
 hemcdigitizer.cc:33
 hemcdigitizer.cc:34
 hemcdigitizer.cc:35
 hemcdigitizer.cc:36
 hemcdigitizer.cc:37
 hemcdigitizer.cc:38
 hemcdigitizer.cc:39
 hemcdigitizer.cc:40
 hemcdigitizer.cc:41
 hemcdigitizer.cc:42
 hemcdigitizer.cc:43
 hemcdigitizer.cc:44
 hemcdigitizer.cc:45
 hemcdigitizer.cc:46
 hemcdigitizer.cc:47
 hemcdigitizer.cc:48
 hemcdigitizer.cc:49
 hemcdigitizer.cc:50
 hemcdigitizer.cc:51
 hemcdigitizer.cc:52
 hemcdigitizer.cc:53
 hemcdigitizer.cc:54
 hemcdigitizer.cc:55
 hemcdigitizer.cc:56
 hemcdigitizer.cc:57
 hemcdigitizer.cc:58
 hemcdigitizer.cc:59
 hemcdigitizer.cc:60
 hemcdigitizer.cc:61
 hemcdigitizer.cc:62
 hemcdigitizer.cc:63
 hemcdigitizer.cc:64
 hemcdigitizer.cc:65
 hemcdigitizer.cc:66
 hemcdigitizer.cc:67
 hemcdigitizer.cc:68
 hemcdigitizer.cc:69
 hemcdigitizer.cc:70
 hemcdigitizer.cc:71
 hemcdigitizer.cc:72
 hemcdigitizer.cc:73
 hemcdigitizer.cc:74
 hemcdigitizer.cc:75
 hemcdigitizer.cc:76
 hemcdigitizer.cc:77
 hemcdigitizer.cc:78
 hemcdigitizer.cc:79
 hemcdigitizer.cc:80
 hemcdigitizer.cc:81
 hemcdigitizer.cc:82
 hemcdigitizer.cc:83
 hemcdigitizer.cc:84
 hemcdigitizer.cc:85
 hemcdigitizer.cc:86
 hemcdigitizer.cc:87
 hemcdigitizer.cc:88
 hemcdigitizer.cc:89
 hemcdigitizer.cc:90
 hemcdigitizer.cc:91
 hemcdigitizer.cc:92
 hemcdigitizer.cc:93
 hemcdigitizer.cc:94
 hemcdigitizer.cc:95
 hemcdigitizer.cc:96
 hemcdigitizer.cc:97
 hemcdigitizer.cc:98
 hemcdigitizer.cc:99
 hemcdigitizer.cc:100
 hemcdigitizer.cc:101
 hemcdigitizer.cc:102
 hemcdigitizer.cc:103
 hemcdigitizer.cc:104
 hemcdigitizer.cc:105
 hemcdigitizer.cc:106
 hemcdigitizer.cc:107
 hemcdigitizer.cc:108
 hemcdigitizer.cc:109
 hemcdigitizer.cc:110
 hemcdigitizer.cc:111
 hemcdigitizer.cc:112
 hemcdigitizer.cc:113
 hemcdigitizer.cc:114
 hemcdigitizer.cc:115
 hemcdigitizer.cc:116
 hemcdigitizer.cc:117
 hemcdigitizer.cc:118
 hemcdigitizer.cc:119
 hemcdigitizer.cc:120
 hemcdigitizer.cc:121
 hemcdigitizer.cc:122
 hemcdigitizer.cc:123
 hemcdigitizer.cc:124
 hemcdigitizer.cc:125
 hemcdigitizer.cc:126
 hemcdigitizer.cc:127
 hemcdigitizer.cc:128
 hemcdigitizer.cc:129
 hemcdigitizer.cc:130
 hemcdigitizer.cc:131
 hemcdigitizer.cc:132
 hemcdigitizer.cc:133
 hemcdigitizer.cc:134
 hemcdigitizer.cc:135
 hemcdigitizer.cc:136
 hemcdigitizer.cc:137
 hemcdigitizer.cc:138
 hemcdigitizer.cc:139
 hemcdigitizer.cc:140
 hemcdigitizer.cc:141
 hemcdigitizer.cc:142
 hemcdigitizer.cc:143
 hemcdigitizer.cc:144
 hemcdigitizer.cc:145
 hemcdigitizer.cc:146
 hemcdigitizer.cc:147
 hemcdigitizer.cc:148
 hemcdigitizer.cc:149
 hemcdigitizer.cc:150
 hemcdigitizer.cc:151
 hemcdigitizer.cc:152
 hemcdigitizer.cc:153
 hemcdigitizer.cc:154
 hemcdigitizer.cc:155
 hemcdigitizer.cc:156
 hemcdigitizer.cc:157
 hemcdigitizer.cc:158
 hemcdigitizer.cc:159
 hemcdigitizer.cc:160
 hemcdigitizer.cc:161
 hemcdigitizer.cc:162
 hemcdigitizer.cc:163
 hemcdigitizer.cc:164
 hemcdigitizer.cc:165
 hemcdigitizer.cc:166
 hemcdigitizer.cc:167
 hemcdigitizer.cc:168
 hemcdigitizer.cc:169
 hemcdigitizer.cc:170
 hemcdigitizer.cc:171
 hemcdigitizer.cc:172
 hemcdigitizer.cc:173
 hemcdigitizer.cc:174
 hemcdigitizer.cc:175
 hemcdigitizer.cc:176
 hemcdigitizer.cc:177
 hemcdigitizer.cc:178
 hemcdigitizer.cc:179
 hemcdigitizer.cc:180
 hemcdigitizer.cc:181
 hemcdigitizer.cc:182
 hemcdigitizer.cc:183
 hemcdigitizer.cc:184
 hemcdigitizer.cc:185
 hemcdigitizer.cc:186
 hemcdigitizer.cc:187
 hemcdigitizer.cc:188
 hemcdigitizer.cc:189
 hemcdigitizer.cc:190
 hemcdigitizer.cc:191
 hemcdigitizer.cc:192
 hemcdigitizer.cc:193
 hemcdigitizer.cc:194
 hemcdigitizer.cc:195
 hemcdigitizer.cc:196
 hemcdigitizer.cc:197
 hemcdigitizer.cc:198
 hemcdigitizer.cc:199
 hemcdigitizer.cc:200
 hemcdigitizer.cc:201
 hemcdigitizer.cc:202
 hemcdigitizer.cc:203
 hemcdigitizer.cc:204
 hemcdigitizer.cc:205
 hemcdigitizer.cc:206
 hemcdigitizer.cc:207
 hemcdigitizer.cc:208
 hemcdigitizer.cc:209
 hemcdigitizer.cc:210
 hemcdigitizer.cc:211
 hemcdigitizer.cc:212
 hemcdigitizer.cc:213
 hemcdigitizer.cc:214
 hemcdigitizer.cc:215
 hemcdigitizer.cc:216
 hemcdigitizer.cc:217
 hemcdigitizer.cc:218
 hemcdigitizer.cc:219
 hemcdigitizer.cc:220
 hemcdigitizer.cc:221
 hemcdigitizer.cc:222
 hemcdigitizer.cc:223
 hemcdigitizer.cc:224
 hemcdigitizer.cc:225
 hemcdigitizer.cc:226
 hemcdigitizer.cc:227
 hemcdigitizer.cc:228
 hemcdigitizer.cc:229
 hemcdigitizer.cc:230
 hemcdigitizer.cc:231
 hemcdigitizer.cc:232
 hemcdigitizer.cc:233
 hemcdigitizer.cc:234
 hemcdigitizer.cc:235
 hemcdigitizer.cc:236
 hemcdigitizer.cc:237
 hemcdigitizer.cc:238
 hemcdigitizer.cc:239
 hemcdigitizer.cc:240
 hemcdigitizer.cc:241
 hemcdigitizer.cc:242
 hemcdigitizer.cc:243
 hemcdigitizer.cc:244
 hemcdigitizer.cc:245
 hemcdigitizer.cc:246
 hemcdigitizer.cc:247
 hemcdigitizer.cc:248
 hemcdigitizer.cc:249
 hemcdigitizer.cc:250
 hemcdigitizer.cc:251
 hemcdigitizer.cc:252
 hemcdigitizer.cc:253
 hemcdigitizer.cc:254
 hemcdigitizer.cc:255
 hemcdigitizer.cc:256
 hemcdigitizer.cc:257
 hemcdigitizer.cc:258
 hemcdigitizer.cc:259
 hemcdigitizer.cc:260
 hemcdigitizer.cc:261
 hemcdigitizer.cc:262
 hemcdigitizer.cc:263
 hemcdigitizer.cc:264
 hemcdigitizer.cc:265
 hemcdigitizer.cc:266
 hemcdigitizer.cc:267
 hemcdigitizer.cc:268
 hemcdigitizer.cc:269
 hemcdigitizer.cc:270
 hemcdigitizer.cc:271
 hemcdigitizer.cc:272
 hemcdigitizer.cc:273
 hemcdigitizer.cc:274
 hemcdigitizer.cc:275
 hemcdigitizer.cc:276
 hemcdigitizer.cc:277
 hemcdigitizer.cc:278
 hemcdigitizer.cc:279
 hemcdigitizer.cc:280
 hemcdigitizer.cc:281
 hemcdigitizer.cc:282
 hemcdigitizer.cc:283
 hemcdigitizer.cc:284
 hemcdigitizer.cc:285
 hemcdigitizer.cc:286
 hemcdigitizer.cc:287
 hemcdigitizer.cc:288
 hemcdigitizer.cc:289
 hemcdigitizer.cc:290
 hemcdigitizer.cc:291
 hemcdigitizer.cc:292
 hemcdigitizer.cc:293
 hemcdigitizer.cc:294
 hemcdigitizer.cc:295
 hemcdigitizer.cc:296
 hemcdigitizer.cc:297
 hemcdigitizer.cc:298
 hemcdigitizer.cc:299
 hemcdigitizer.cc:300
 hemcdigitizer.cc:301
 hemcdigitizer.cc:302
 hemcdigitizer.cc:303
 hemcdigitizer.cc:304
 hemcdigitizer.cc:305
 hemcdigitizer.cc:306
 hemcdigitizer.cc:307
 hemcdigitizer.cc:308
 hemcdigitizer.cc:309
 hemcdigitizer.cc:310
 hemcdigitizer.cc:311
 hemcdigitizer.cc:312
 hemcdigitizer.cc:313
 hemcdigitizer.cc:314
 hemcdigitizer.cc:315
 hemcdigitizer.cc:316
 hemcdigitizer.cc:317
 hemcdigitizer.cc:318
 hemcdigitizer.cc:319
 hemcdigitizer.cc:320
 hemcdigitizer.cc:321
 hemcdigitizer.cc:322
 hemcdigitizer.cc:323
 hemcdigitizer.cc:324
 hemcdigitizer.cc:325
 hemcdigitizer.cc:326
 hemcdigitizer.cc:327
 hemcdigitizer.cc:328
 hemcdigitizer.cc:329
 hemcdigitizer.cc:330
 hemcdigitizer.cc:331
 hemcdigitizer.cc:332
 hemcdigitizer.cc:333
 hemcdigitizer.cc:334
 hemcdigitizer.cc:335
 hemcdigitizer.cc:336
 hemcdigitizer.cc:337
 hemcdigitizer.cc:338
 hemcdigitizer.cc:339
 hemcdigitizer.cc:340
 hemcdigitizer.cc:341
 hemcdigitizer.cc:342
 hemcdigitizer.cc:343
 hemcdigitizer.cc:344
 hemcdigitizer.cc:345
 hemcdigitizer.cc:346
 hemcdigitizer.cc:347
 hemcdigitizer.cc:348
 hemcdigitizer.cc:349
 hemcdigitizer.cc:350
 hemcdigitizer.cc:351
 hemcdigitizer.cc:352
 hemcdigitizer.cc:353
 hemcdigitizer.cc:354
 hemcdigitizer.cc:355
 hemcdigitizer.cc:356
 hemcdigitizer.cc:357
 hemcdigitizer.cc:358
 hemcdigitizer.cc:359
 hemcdigitizer.cc:360
 hemcdigitizer.cc:361
 hemcdigitizer.cc:362
 hemcdigitizer.cc:363
 hemcdigitizer.cc:364
 hemcdigitizer.cc:365
 hemcdigitizer.cc:366
 hemcdigitizer.cc:367
 hemcdigitizer.cc:368
 hemcdigitizer.cc:369
 hemcdigitizer.cc:370
 hemcdigitizer.cc:371
 hemcdigitizer.cc:372
 hemcdigitizer.cc:373
 hemcdigitizer.cc:374
 hemcdigitizer.cc:375
 hemcdigitizer.cc:376
 hemcdigitizer.cc:377
 hemcdigitizer.cc:378
 hemcdigitizer.cc:379
 hemcdigitizer.cc:380
 hemcdigitizer.cc:381
 hemcdigitizer.cc:382
 hemcdigitizer.cc:383
 hemcdigitizer.cc:384
 hemcdigitizer.cc:385
 hemcdigitizer.cc:386
 hemcdigitizer.cc:387
 hemcdigitizer.cc:388
 hemcdigitizer.cc:389
 hemcdigitizer.cc:390
 hemcdigitizer.cc:391
 hemcdigitizer.cc:392
 hemcdigitizer.cc:393
 hemcdigitizer.cc:394
 hemcdigitizer.cc:395
 hemcdigitizer.cc:396
 hemcdigitizer.cc:397
 hemcdigitizer.cc:398
 hemcdigitizer.cc:399
 hemcdigitizer.cc:400
 hemcdigitizer.cc:401
 hemcdigitizer.cc:402
 hemcdigitizer.cc:403
 hemcdigitizer.cc:404
 hemcdigitizer.cc:405