ROOT logo
//*--- Author : V.Pechenov
//*--- Modified: 06.07.05 V.Pechenov

using namespace std;
#include <iostream>
#include <iomanip>
#include "hmdcidealtracking.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hmdcgetcontainers.h"
#include "hmdcsizescells.h"
#include "hgeantkine.h"
#include "hgeantmdc.h"
#include "hmdccal1sim.h"
#include "hmdcsegsim.h"
#include "hmdchitsim.h"
#include "hmdctrkcand.h"
#include "TRandom.h"


//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////////////
//
// HMdcIdealTracking
//
// Filling of HMdcHitSim, HMdcSegSim and HMdcTrackCand containers
// by pure GEANT information. With fillParallelCategories() the
// reconstructor is forced to fill HMdcHitIdeal, HMdcSegIdeal and
// HMdcTrackCandIdeal (catMdcHitIdeal,catMdcSegIdeal,catMdcTrkCandIdeal).
// This catgeories are copies of the above. In this case the ideal tracking
// can be run in parallel to the normal tracking.
//
// HMdcHitSim is filled by corresponding HGeantMdc information. 
// HMdcSegSim - by two HGeantMdc hits (only x and y position is used)
//              or by HGeantMdc if only one Mdc is active in segment
//              The list of wires is filled if catMdcCal1Sim exists.
// HMdcTrackCand - for true combinations of inner and outer segments only
//
// HMdcHit::getTrackFinder() return 2 for containers filled by this
// code.
//
// Conditions of HGeantMdc hits selection:
// 1. Direction: target->meta.
// 2. Hits in the same sector only (after selection 1.
// 3. For inner segment >=5 HGeantMdc hits (or HMdcCal1Sim hist).
// 4. For outer segment must be inner one.
// 5. For outer segment >=4 HGeantMdc hits (or HMdcCal1Sim hist).
//
//////////////////////////////////////////////////////////////////////////////


ClassImp(HMdcIdealTracking)

HMdcIdealTracking::HMdcIdealTracking(void) {
  // Constructor
  clear();
}

HMdcIdealTracking::HMdcIdealTracking(const Text_t *name,const Text_t *title) : 
    HReconstructor(name,title) {
  // Constructor
  clear();
}

HMdcIdealTracking::~HMdcIdealTracking() {
  // Destructor
  HMdcSizesCells::deleteCont();
  if(iterGeantKine) delete iterGeantKine;
  iterGeantKine=0;
  if(lCells) delete lCells;
  lCells=0;
}

void HMdcIdealTracking::clear(void) {
  // Setting pointer to the categories to NULL
  pGeantKineCat       = NULL;
  pGeantMdcCat        = NULL;
  pMdcCal1Cat         = NULL;
  pMdcSegCat          = NULL;
  pMdcHitCat          = NULL;
  pMdcTrkCandCat      = NULL;
  iterGeantKine       = NULL;
  fillParallel        = kFALSE;
  lCells              = 0;
  nFiredLayersSeg1cut = 5;
  nFiredLayersSeg2cut = 4;
  setResolutionX(0.,0.,0.,0.);
  setResolutionY(0.,0.,0.,0.);
}

Bool_t HMdcIdealTracking::init(void) {
  // Categories and parameters initialization
  HMdcGetContainers* fGetCont = HMdcGetContainers::getObject();
  pGeantKineCat = fGetCont->getCatGeantKine();
  if(pGeantKineCat == 0) {
    Error("init","No catGeantKine in tree!");
    return kFALSE;
  }
  iterGeantKine=(HIterator*)pGeantKineCat->MakeIterator();
  pGeantMdcCat  = fGetCont->getCatGeantMdc();
  if(pGeantMdcCat == 0) {
    Error("init","No catGeantMdc in tree!");
    return kFALSE;
  }
  HMdcDetector* pMdcDetector = fGetCont->getMdcDetector();
  for(Int_t s=0;s<6;s++) for(Int_t m=0;m<4;m++) isMdcActive[s][m] = fGetCont->isModActive(s,m);

  if(!fillParallel)
  {
      pMdcSegCat = gHades->getCurrentEvent()->getCategory(catMdcSeg);
      if(!pMdcSegCat) {
	  pMdcSegCat = pMdcDetector->buildMatrixCategory("HMdcSegSim",0.5F);
	  if (!pMdcSegCat) return kFALSE;
	  gHades->getCurrentEvent()->addCategory(catMdcSeg,pMdcSegCat,"Mdc");
      } else {
	  const Text_t* clName=pMdcSegCat->getClassName();
	  if(strcmp(clName,"HMdcSegSim")!=0) {
	      Error("init","Category catMdcSeg exist but class name is not HMdcSegSim!");
	      return kFALSE;
	  } else Warning("init","Category catMdcSeg exist already!");
      }
  }
  if(fillParallel)
  {
      pMdcSegCat = gHades->getCurrentEvent()->getCategory(catMdcSegIdeal);
      if(!pMdcSegCat) {
	  pMdcSegCat = pMdcDetector->buildMatrixCategory("HMdcSegIdeal",0.5F);
	  if (!pMdcSegCat) return kFALSE;
	  gHades->getCurrentEvent()->addCategory(catMdcSegIdeal,pMdcSegCat,"Mdc");
      } else {
	  const Text_t* clName=pMdcSegCat->getClassName();
	  if(strcmp(clName,"HMdcSegIdeal")!=0) {
	      Error("init","Category catMdcSegIdeal exist but class name is not HMdcSegIdeal!");
	      return kFALSE;
	  } else Warning("init","Category catMdcSegIdeal exist already!");
      }
  }
  if(!fillParallel)
  {
      pMdcHitCat = gHades->getCurrentEvent()->getCategory(catMdcHit);
      if (!pMdcHitCat) {
	  pMdcHitCat = pMdcDetector->buildMatrixCategory("HMdcHitSim",0.5F);
	  if (!pMdcHitCat) return kFALSE;
	  gHades->getCurrentEvent()->addCategory(catMdcHit,pMdcHitCat,"Mdc");
      } else {
	  const Text_t* clName=pMdcHitCat->getClassName();
	  if(strcmp(clName,"HMdcHitSim")!=0) {
	      Error("init","Category catMdcHit exist but class name is not HMdcHitSim!");
	      return kFALSE;
	  } else Warning("init","Category catMdcHit exist already!");
      }
  }

  if(fillParallel)
  {
      pMdcHitCat = gHades->getCurrentEvent()->getCategory(catMdcHitIdeal);
      if (!pMdcHitCat) {
	  pMdcHitCat = pMdcDetector->buildMatrixCategory("HMdcHitIdeal",0.5F);
	  if (!pMdcHitCat) return kFALSE;
	  gHades->getCurrentEvent()->addCategory(catMdcHitIdeal,pMdcHitCat,"Mdc");
      } else {
	  const Text_t* clName=pMdcHitCat->getClassName();
	  if(strcmp(clName,"HMdcHitIdeal")!=0) {
	      Error("init","Category catMdcHitIdeal exist but class name is not HMdcHitIdeal!");
	      return kFALSE;
	  } else Warning("init","Category catMdcHitIdeal exist already!");
      }
  }

  if(!fillParallel)
  {
      pMdcTrkCandCat = gHades->getCurrentEvent()->getCategory(catMdcTrkCand);
      if (!pMdcTrkCandCat) {
	  pMdcTrkCandCat = pMdcDetector->buildMatrixCategory("HMdcTrkCand",0.5F);
	  if (!pMdcTrkCandCat) return kFALSE;
	  gHades->getCurrentEvent()->addCategory(catMdcTrkCand,pMdcTrkCandCat,"Mdc");
      } else {
	  const Text_t* clName=pMdcTrkCandCat->getClassName();
	  if(strcmp(clName,"HMdcTrkCand")!=0) {
	      Error("init","Category catMdcTrkCand exist but class name is not HMdcTrkCand!");
	      return kFALSE;
	  } else Warning("init","Category catMdcTrkCand exist already!");
      }
  }
  if(fillParallel)
  {
      pMdcTrkCandCat = gHades->getCurrentEvent()->getCategory(catMdcTrkCandIdeal);
      if (!pMdcTrkCandCat) {
	  pMdcTrkCandCat = pMdcDetector->buildMatrixCategory("HMdcTrkCandIdeal",0.5F);
	  if (!pMdcTrkCandCat) return kFALSE;
	  gHades->getCurrentEvent()->addCategory(catMdcTrkCandIdeal,pMdcTrkCandCat,"Mdc");
      } else {
	  const Text_t* clName=pMdcTrkCandCat->getClassName();
	  if(strcmp(clName,"HMdcTrkCandIdeal")!=0) {
	      Error("init","Category catMdcTrkCandIdeal exist but class name is not HMdcTrkCandIdeal!");
	      return kFALSE;
	  } else Warning("init","Category catMdcTrkCandIdeal exist already!");
      }
  }

  pMdcCal1Cat = fGetCont->getCatMdcCal1();
  if(pMdcCal1Cat) {
    const Text_t* clName=pMdcCal1Cat->getClassName();
    if(strcmp(clName,"HMdcCal1Sim")!=0) {
      Error("init","Category catMdcCal1 exist but class name is not HMdcCal1Sim!");
      return kFALSE;
    }
    lCells=new HMdcList24GroupCells();
  }
  pMSizesCells = HMdcSizesCells::getObject();
  locSeg.set(2,0,0);
  locHit.set(2,0,0);
  locTrkCand.set(1,0);

  return kTRUE;
}

Bool_t HMdcIdealTracking::reinit(void) {
  // Parameters reinitialization
  if(!pMSizesCells->initContainer()) return kFALSE;
  return kTRUE;
}

Int_t HMdcIdealTracking::execute(void) {
  // Filling of HMdcHitSim, HMdcSegSim and HMdcTrackCand containers
  // by pure GEANT information.
  // HMdcHitSim is filled by corresponding HGeantMdc information. 
  // HMdcSegSim - by two HGeantMdc hits (only x and y position is used)
  //              or by HGeantMdc if only one Mdc is active in segment
  // HMdcTrackCand - for true combinations of inner and outer segments only
  iterGeantKine->Reset();
  HGeantKine* pGeantKine;
  while((pGeantKine=(HGeantKine*)iterGeantKine->Next())) {
    trackNumber = pGeantKine->getTrack();
    if(!testTrack(pGeantKine)) continue;
    Int_t indxSeg1=fillHitsSeg(0);
    if(indxSeg1<0) continue;
    Int_t indxSeg2=fillHitsSeg(1);
    HMdcTrkCand* pTrkCand=fillTrkCandISeg(indxSeg1);
    if(indxSeg2>=0) pTrkCand=fillTrkCandOSeg(pTrkCand,indxSeg2);
  }
  return 0;
}

Bool_t HMdcIdealTracking::testTrack(HGeantKine* pGeantKine) {
  // Selection tracks.
  // Conditions of HGeantMdc hits selection:
  // 1. Direction: target->meta 
  // 2. Hits in the same sector only (after selection 1.
  // 3. For inner segment >=nFiredLayersSeg1cut HGeantMdc hits (or HMdcCal1Sim hits)
  // 4. For outer segment must be inner one.
  // 5. For outer segment >=nFiredLayersSeg2cut HGeantMdc hits (or HMdcCal1Sim hits)
  if(lCells) lCells->clear();
  pGeantKine->resetMdcIter();
  HGeantMdc* pGeantMdc;
  Int_t sec=-1;
  Int_t mod=-1;
  Int_t lay=-1;
  trackSector=-1;
  for(Int_t m=0;m<4;m++) {
    nGeantMdcLay[m]=0;
    geantHitMod[m]=0;
    for(Int_t l=0;l<6;l++) geantHitLay[m][l]=0;
  }

  while((pGeantMdc=(HGeantMdc*)pGeantKine->nextMdcHit()) != NULL) {
    Int_t sector = pGeantMdc->getSector();
    Int_t module = pGeantMdc->getModule();
    Int_t layer  = pGeantMdc->getLayer();
    
    Float_t ath,aph;
    pGeantMdc->getIncidence(ath,aph);
    if(ath>=90.)         { break;} // track must not go back!
    if(sec<0) sec=sector;
    else if(sec!=sector) { break;} // track must be in one sector only!
    if(module<mod)       { break;} // track must not go back!
    else if(module>mod) {
      mod=module;
      lay=-1;
    }
    if(layer!=6) {
	if(layer<=lay)   { break;} // track must not go back!
	if(geantHitLay[module][layer] != 0) { break; } // must be one hit in layer
      lay=layer;
      if(isMdcActive[sector][module]) {
	geantHitLay[module][layer]=pGeantMdc;
        nGeantMdcLay[module]++;
        if(pMdcCal1Cat) collectWires(sector,module,layer,pGeantMdc);
      }
    } else {
	if(geantHitMod[module] != 0) { break;} // must be one hit in mdc
      if(isMdcActive[sector][module]) geantHitMod[module]=pGeantMdc;
    }
  }
  if(lCells!=NULL && pMdcCal1Cat!=NULL) for(Int_t m=0;m<4;m++) nGeantMdcLay[m]=lCells->getNLayersMod(m);
  // Test inner segment:
  if(geantHitMod[0]==NULL && geantHitMod[1]==NULL) { return kFALSE; }
  if(nGeantMdcLay[0]+nGeantMdcLay[1] < nFiredLayersSeg1cut)    { return kFALSE; }
  // Test outer segment:
  if(nGeantMdcLay[2]+nGeantMdcLay[3] < nFiredLayersSeg2cut) {
    geantHitMod[2]  = geantHitMod[3]  = NULL;
    nGeantMdcLay[2] = nGeantMdcLay[3] = 0;
  }
  trackSector=sec;
  return kTRUE;
}

void HMdcIdealTracking::collectWires(Int_t s,Int_t m, Int_t l,
    HGeantMdc* pGeantMdc) {
  // Collecting list of fired wires (if category catMdcCal1 exist)
  HMdcSizesCellsLayer& pSCLay=(*pMSizesCells)[s][m][l];
  if(&pSCLay==0) return;
  Float_t ax,ay,atof,ptof;
  pGeantMdc->getHit(ax,ay,atof,ptof);
  Int_t cell=pSCLay.calcCellNum(ax,ay); // Not precise, but well enough!
  Int_t c=(cell<3) ? 0:cell-3;
  Int_t cmax=cell+3;
  for(;c<=cmax;c++) {
    locCal1.set(4,s,m,l,c);
    HMdcCal1Sim* pMdcCal1=(HMdcCal1Sim*)pMdcCal1Cat->getObject(locCal1);
    if(pMdcCal1==0) continue;
    Int_t nHits=pMdcCal1->getNHits();
    if(nHits > 2 || nHits==0) continue;
    UChar_t times = (nHits==-2) ? 3:1;
    if((times&1) && (pMdcCal1->getStatus1()<=0           || 
                     pMdcCal1->getNTrack1()!=trackNumber ||
                     TMath::Abs(atof-pMdcCal1->getTof1())>0.05) ) times &= 2;
    if((times&2) && (pMdcCal1->getStatus2()<=0           || 
                     pMdcCal1->getNTrack2()!=trackNumber ||
                     TMath::Abs(atof-pMdcCal1->getTof2())>0.05) ) times &= 1;
    if(times==0) continue;
    lCells->setTime(l+m*6,c,times);
  }
}

Int_t HMdcIdealTracking::fillHitsSeg(Int_t segment) {
  // Filling HMdcSegSim container
  Int_t m1=segment*2;
  Int_t m2=m1+1;
  if(trackSector<0) return -1;
  if(geantHitMod[m1]==0 && geantHitMod[m2]==0) return -1;
  Int_t indx1=fillHit(m1);
  Int_t indx2=fillHit(m2);
  if(indx1<0 && indx2<0) return -1;
  Int_t index=-1;
  HMdcSegSim* pMdcSeg = getSegSlot(segment,index);
  if(!pMdcSeg) return -1;
  HMdcSizesCellsSec& fSCSec=(*pMSizesCells)[trackSector];
  if(&fSCSec==0) return -1;
  Double_t zm,r0,theta,phi,zPrime,rPrime;
  if(indx1>=0 && indx2>=0) {
    HMdcSizesCells::calcMdcSeg(x1[m1],y1[m1],z1[m1],x1[m2],y1[m2],z1[m2],zm,r0,theta,phi);
    fSCSec.calcRZToTargLine(x1[m1],y1[m1],z1[m1],x1[m2],y1[m2],z1[m2],zPrime,rPrime);
    pMdcSeg->setXYPar(x1[m1],y1[m1],x1[m2],y1[m2]);
  } else {
    Int_t m=(indx2<0) ? m1:m2;
    HMdcSizesCells::calcMdcSeg(x1[m],y1[m],z1[m],x2[m],y2[m],z2[m],zm,r0,theta,phi);
    fSCSec.calcRZToTargLine(x1[m],y1[m],z1[m],x2[m],y2[m],z2[m],zPrime,rPrime);
    pMdcSeg->setXYPar(x1[m],y1[m],x2[m],y2[m]);
  }
  pMdcSeg->setPar(zm,r0,theta,phi);
  pMdcSeg->setZprime(zPrime);
  pMdcSeg->setRprime(rPrime);
  if(indx1>=0) pMdcSeg->setHitInd(0,indx1);
  if(indx2>=0) pMdcSeg->setHitInd(1,indx2);
  UChar_t nHitsSeg = nGeantMdcLay[m1]+nGeantMdcLay[m2];
  pMdcSeg->setNTracks(1,&trackNumber, &nHitsSeg);
  pMdcSeg->setNTracks(1,1,0);
  pMdcSeg->setChi2(1.); //!!!???
  setWires(pMdcSeg,segment);
  return index;
}

HMdcSegSim* HMdcIdealTracking::getSegSlot(Int_t segment, Int_t& index) {
  // Geting a slot for HMdcSegSim obj. and setting address
  locSeg[0]=trackSector;
  locSeg[1]=segment;
  HMdcSegSim* pMdcSeg = (HMdcSegSim*)pMdcSegCat->getNewSlot(locSeg,&index);
  if(!pMdcSeg) {
    Warning("getSegSlot"," No slot in catMdcSeg available");
    return 0;
  }
  pMdcSeg = new(pMdcSeg) HMdcSegSim;
  pMdcSeg->setSec(trackSector);
  pMdcSeg->setIOSeg(segment);
  return pMdcSeg;
}

Int_t HMdcIdealTracking::fillHit(Int_t module) {
  // Filling HMdcHitSim container
  HGeantMdc* pGeantMdc=geantHitMod[module];
  if(pGeantMdc==0) return -1;
  Int_t index=-1;
  HMdcHitSim* pMdcHit = getHitSlot(module,index);
  if(!pMdcHit) return -1;
  HMdcSizesCellsMod& pSCMod=(*pMSizesCells)[trackSector][module];
  if(&pSCMod==0) return -1;
  Float_t ax,ay,atof,ptof,ath,aph;
  pGeantMdc->getHit(ax,ay,atof,ptof);


  //------------------------------------------
  // resolution smearing in x,y (neglect phi,theta)
  // default sigmas = 0
  if(sigX[module]){
      ax += gRandom->Gaus() * sigX[module];
  }
  if(sigY[module]){
      ay += gRandom->Gaus() * sigY[module];
  }
  //------------------------------------------

  pGeantMdc->getIncidence(ath,aph);
  Double_t theta=ath*TMath::DegToRad();
  Double_t phi  =aph*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);
  pMdcHit->setPar(ax,ay,xDir,yDir, atof);
  pMdcHit->setX(ax,sigX[module]);
  pMdcHit->setY(ay,sigY[module]);
  pMdcHit->setChi2(0.); //!!!???
  pMdcHit->setTrackFinder(2);  // !!!
  pMdcHit->setNTracks(1,&trackNumber, nGeantMdcLay+module);
  x2[module]=x1[module]=ax;
  y2[module]=y1[module]=ay;
  z2[module]=z1[module]=0.;
  x2[module]+=xDir*1000.;
  y2[module]+=yDir*1000.;
  z2[module]+=zDir*1000.;
  pSCMod.transFromZ0(x1[module],y1[module],z1[module]);
  pSCMod.transFrom(x2[module],y2[module],z2[module]);
  setWires(pMdcHit,module);
  return index;
}

HMdcHitSim* HMdcIdealTracking::getHitSlot(Int_t module, Int_t& index) {
  // Geting a slot for HMdcHitSim obj. and setting address
  locHit[0]=trackSector;
  locHit[1]=module;
  HMdcHitSim* pMdcHit = (HMdcHitSim*)pMdcHitCat->getNewSlot(locHit,&index);
  if(!pMdcHit) {
    Warning("getHitSlot"," No slot in catMdcHit available");
    index=-1;
    return 0;
  }
  pMdcHit=new(pMdcHit) HMdcHitSim;
  pMdcHit->setSecMod(trackSector,module);
  return pMdcHit;
}

HMdcTrkCand* HMdcIdealTracking::fillTrkCandISeg(Int_t segIndex) {
  // Filling HMdcTrkCand container by inner segment
  locTrkCand[0]=trackSector;
  Int_t index;
  HMdcTrkCand* pTrkCand = 
      (HMdcTrkCand*)pMdcTrkCandCat->getNewSlot(locTrkCand,&index);
  if(!pTrkCand) {
    Warning("fillTrkCandISeg"," No slot available in catMdcTrkCand");
    return 0;
  }
  return new(pTrkCand) HMdcTrkCand(trackSector,segIndex,index);
}

HMdcTrkCand* HMdcIdealTracking::fillTrkCandOSeg(HMdcTrkCand* fTCand,
    Int_t segIndex) {
  // Filling HMdcTrkCand container by outer segment
  Int_t index;
  HMdcTrkCand* pTrkCand =
      (HMdcTrkCand*)pMdcTrkCandCat->getNewSlot(locTrkCand,&index);
  if(!pTrkCand) {
    Warning("fillTrkCandOSeg"," No slot available in catMdcTrkCand");
    return 0;
  }
  return new(pTrkCand) HMdcTrkCand(fTCand,segIndex,index);
}

Bool_t HMdcIdealTracking::finalize(void) {
  return kTRUE;
}
 
void HMdcIdealTracking::setWires(HMdcSegSim* pMdcSeg, Int_t seg) {
  // Filling list of cells in HMdcSeg
  if(!lCells) return;
  Int_t lc = seg*12;
  for(Int_t l=0; l<12; l++,lc++) pMdcSeg->setLayerGroup(l,lCells->getOneLayerGroup(lc));
  UChar_t  nHitsSeg = pMdcSeg->getSumWires();
  pMdcSeg->setNTracks(1,&trackNumber, &nHitsSeg);
}

void HMdcIdealTracking::setWires(HMdcHitSim* pMdcHit, Int_t mod) {
  // Filling list of cells in HMdcHit
  if(!lCells) return;
  Int_t lc = mod*6;
  for(Int_t l=0; l<6; l++,lc++) pMdcHit->setLayerGroup(l,lCells->getOneLayerGroup(lc));
  UChar_t  nHitsHit=pMdcHit->getSumWires();
  pMdcHit->setNTracks(1,&trackNumber, &nHitsHit);
}

void HMdcIdealTracking::printStatus(void) {
  // prints the parameters to the screen

  printf("--------------------------------------------------------------------------------------------\n");
  printf("HMdcIdealTrackingSetup:\n");
  printf("Minimal number of fired layers in inner segment = %i\n",nFiredLayersSeg1cut);
  printf("Minimal number of fired layers in outer segment = %i\n",nFiredLayersSeg2cut);
  printf("Sigma for gaussian resolution for MDC in x [mm] = %5.2g %5.2g %5.2g %5.2g\n",sigX[0],sigX[1],sigX[2],sigX[3]);
  printf("Sigma for gaussian resolution for MDC in y [mm] = %5.2g %5.2g %5.2g %5.2g\n",sigY[0],sigY[1],sigY[2],sigY[3]);
  if(fillParallel) {
    printf("Fill HMdcHitSim,HMdcSegSim and HMdcTrkCand to ideal categories\n");
    printf("     catMdcSegIdeal, catMdcHitIdeal, catMdcTrkCandIdeal\n");
  }
  printf ("--------------------------------------------------------------------------------------------\n");
}
 hmdcidealtracking.cc:1
 hmdcidealtracking.cc:2
 hmdcidealtracking.cc:3
 hmdcidealtracking.cc:4
 hmdcidealtracking.cc:5
 hmdcidealtracking.cc:6
 hmdcidealtracking.cc:7
 hmdcidealtracking.cc:8
 hmdcidealtracking.cc:9
 hmdcidealtracking.cc:10
 hmdcidealtracking.cc:11
 hmdcidealtracking.cc:12
 hmdcidealtracking.cc:13
 hmdcidealtracking.cc:14
 hmdcidealtracking.cc:15
 hmdcidealtracking.cc:16
 hmdcidealtracking.cc:17
 hmdcidealtracking.cc:18
 hmdcidealtracking.cc:19
 hmdcidealtracking.cc:20
 hmdcidealtracking.cc:21
 hmdcidealtracking.cc:22
 hmdcidealtracking.cc:23
 hmdcidealtracking.cc:24
 hmdcidealtracking.cc:25
 hmdcidealtracking.cc:26
 hmdcidealtracking.cc:27
 hmdcidealtracking.cc:28
 hmdcidealtracking.cc:29
 hmdcidealtracking.cc:30
 hmdcidealtracking.cc:31
 hmdcidealtracking.cc:32
 hmdcidealtracking.cc:33
 hmdcidealtracking.cc:34
 hmdcidealtracking.cc:35
 hmdcidealtracking.cc:36
 hmdcidealtracking.cc:37
 hmdcidealtracking.cc:38
 hmdcidealtracking.cc:39
 hmdcidealtracking.cc:40
 hmdcidealtracking.cc:41
 hmdcidealtracking.cc:42
 hmdcidealtracking.cc:43
 hmdcidealtracking.cc:44
 hmdcidealtracking.cc:45
 hmdcidealtracking.cc:46
 hmdcidealtracking.cc:47
 hmdcidealtracking.cc:48
 hmdcidealtracking.cc:49
 hmdcidealtracking.cc:50
 hmdcidealtracking.cc:51
 hmdcidealtracking.cc:52
 hmdcidealtracking.cc:53
 hmdcidealtracking.cc:54
 hmdcidealtracking.cc:55
 hmdcidealtracking.cc:56
 hmdcidealtracking.cc:57
 hmdcidealtracking.cc:58
 hmdcidealtracking.cc:59
 hmdcidealtracking.cc:60
 hmdcidealtracking.cc:61
 hmdcidealtracking.cc:62
 hmdcidealtracking.cc:63
 hmdcidealtracking.cc:64
 hmdcidealtracking.cc:65
 hmdcidealtracking.cc:66
 hmdcidealtracking.cc:67
 hmdcidealtracking.cc:68
 hmdcidealtracking.cc:69
 hmdcidealtracking.cc:70
 hmdcidealtracking.cc:71
 hmdcidealtracking.cc:72
 hmdcidealtracking.cc:73
 hmdcidealtracking.cc:74
 hmdcidealtracking.cc:75
 hmdcidealtracking.cc:76
 hmdcidealtracking.cc:77
 hmdcidealtracking.cc:78
 hmdcidealtracking.cc:79
 hmdcidealtracking.cc:80
 hmdcidealtracking.cc:81
 hmdcidealtracking.cc:82
 hmdcidealtracking.cc:83
 hmdcidealtracking.cc:84
 hmdcidealtracking.cc:85
 hmdcidealtracking.cc:86
 hmdcidealtracking.cc:87
 hmdcidealtracking.cc:88
 hmdcidealtracking.cc:89
 hmdcidealtracking.cc:90
 hmdcidealtracking.cc:91
 hmdcidealtracking.cc:92
 hmdcidealtracking.cc:93
 hmdcidealtracking.cc:94
 hmdcidealtracking.cc:95
 hmdcidealtracking.cc:96
 hmdcidealtracking.cc:97
 hmdcidealtracking.cc:98
 hmdcidealtracking.cc:99
 hmdcidealtracking.cc:100
 hmdcidealtracking.cc:101
 hmdcidealtracking.cc:102
 hmdcidealtracking.cc:103
 hmdcidealtracking.cc:104
 hmdcidealtracking.cc:105
 hmdcidealtracking.cc:106
 hmdcidealtracking.cc:107
 hmdcidealtracking.cc:108
 hmdcidealtracking.cc:109
 hmdcidealtracking.cc:110
 hmdcidealtracking.cc:111
 hmdcidealtracking.cc:112
 hmdcidealtracking.cc:113
 hmdcidealtracking.cc:114
 hmdcidealtracking.cc:115
 hmdcidealtracking.cc:116
 hmdcidealtracking.cc:117
 hmdcidealtracking.cc:118
 hmdcidealtracking.cc:119
 hmdcidealtracking.cc:120
 hmdcidealtracking.cc:121
 hmdcidealtracking.cc:122
 hmdcidealtracking.cc:123
 hmdcidealtracking.cc:124
 hmdcidealtracking.cc:125
 hmdcidealtracking.cc:126
 hmdcidealtracking.cc:127
 hmdcidealtracking.cc:128
 hmdcidealtracking.cc:129
 hmdcidealtracking.cc:130
 hmdcidealtracking.cc:131
 hmdcidealtracking.cc:132
 hmdcidealtracking.cc:133
 hmdcidealtracking.cc:134
 hmdcidealtracking.cc:135
 hmdcidealtracking.cc:136
 hmdcidealtracking.cc:137
 hmdcidealtracking.cc:138
 hmdcidealtracking.cc:139
 hmdcidealtracking.cc:140
 hmdcidealtracking.cc:141
 hmdcidealtracking.cc:142
 hmdcidealtracking.cc:143
 hmdcidealtracking.cc:144
 hmdcidealtracking.cc:145
 hmdcidealtracking.cc:146
 hmdcidealtracking.cc:147
 hmdcidealtracking.cc:148
 hmdcidealtracking.cc:149
 hmdcidealtracking.cc:150
 hmdcidealtracking.cc:151
 hmdcidealtracking.cc:152
 hmdcidealtracking.cc:153
 hmdcidealtracking.cc:154
 hmdcidealtracking.cc:155
 hmdcidealtracking.cc:156
 hmdcidealtracking.cc:157
 hmdcidealtracking.cc:158
 hmdcidealtracking.cc:159
 hmdcidealtracking.cc:160
 hmdcidealtracking.cc:161
 hmdcidealtracking.cc:162
 hmdcidealtracking.cc:163
 hmdcidealtracking.cc:164
 hmdcidealtracking.cc:165
 hmdcidealtracking.cc:166
 hmdcidealtracking.cc:167
 hmdcidealtracking.cc:168
 hmdcidealtracking.cc:169
 hmdcidealtracking.cc:170
 hmdcidealtracking.cc:171
 hmdcidealtracking.cc:172
 hmdcidealtracking.cc:173
 hmdcidealtracking.cc:174
 hmdcidealtracking.cc:175
 hmdcidealtracking.cc:176
 hmdcidealtracking.cc:177
 hmdcidealtracking.cc:178
 hmdcidealtracking.cc:179
 hmdcidealtracking.cc:180
 hmdcidealtracking.cc:181
 hmdcidealtracking.cc:182
 hmdcidealtracking.cc:183
 hmdcidealtracking.cc:184
 hmdcidealtracking.cc:185
 hmdcidealtracking.cc:186
 hmdcidealtracking.cc:187
 hmdcidealtracking.cc:188
 hmdcidealtracking.cc:189
 hmdcidealtracking.cc:190
 hmdcidealtracking.cc:191
 hmdcidealtracking.cc:192
 hmdcidealtracking.cc:193
 hmdcidealtracking.cc:194
 hmdcidealtracking.cc:195
 hmdcidealtracking.cc:196
 hmdcidealtracking.cc:197
 hmdcidealtracking.cc:198
 hmdcidealtracking.cc:199
 hmdcidealtracking.cc:200
 hmdcidealtracking.cc:201
 hmdcidealtracking.cc:202
 hmdcidealtracking.cc:203
 hmdcidealtracking.cc:204
 hmdcidealtracking.cc:205
 hmdcidealtracking.cc:206
 hmdcidealtracking.cc:207
 hmdcidealtracking.cc:208
 hmdcidealtracking.cc:209
 hmdcidealtracking.cc:210
 hmdcidealtracking.cc:211
 hmdcidealtracking.cc:212
 hmdcidealtracking.cc:213
 hmdcidealtracking.cc:214
 hmdcidealtracking.cc:215
 hmdcidealtracking.cc:216
 hmdcidealtracking.cc:217
 hmdcidealtracking.cc:218
 hmdcidealtracking.cc:219
 hmdcidealtracking.cc:220
 hmdcidealtracking.cc:221
 hmdcidealtracking.cc:222
 hmdcidealtracking.cc:223
 hmdcidealtracking.cc:224
 hmdcidealtracking.cc:225
 hmdcidealtracking.cc:226
 hmdcidealtracking.cc:227
 hmdcidealtracking.cc:228
 hmdcidealtracking.cc:229
 hmdcidealtracking.cc:230
 hmdcidealtracking.cc:231
 hmdcidealtracking.cc:232
 hmdcidealtracking.cc:233
 hmdcidealtracking.cc:234
 hmdcidealtracking.cc:235
 hmdcidealtracking.cc:236
 hmdcidealtracking.cc:237
 hmdcidealtracking.cc:238
 hmdcidealtracking.cc:239
 hmdcidealtracking.cc:240
 hmdcidealtracking.cc:241
 hmdcidealtracking.cc:242
 hmdcidealtracking.cc:243
 hmdcidealtracking.cc:244
 hmdcidealtracking.cc:245
 hmdcidealtracking.cc:246
 hmdcidealtracking.cc:247
 hmdcidealtracking.cc:248
 hmdcidealtracking.cc:249
 hmdcidealtracking.cc:250
 hmdcidealtracking.cc:251
 hmdcidealtracking.cc:252
 hmdcidealtracking.cc:253
 hmdcidealtracking.cc:254
 hmdcidealtracking.cc:255
 hmdcidealtracking.cc:256
 hmdcidealtracking.cc:257
 hmdcidealtracking.cc:258
 hmdcidealtracking.cc:259
 hmdcidealtracking.cc:260
 hmdcidealtracking.cc:261
 hmdcidealtracking.cc:262
 hmdcidealtracking.cc:263
 hmdcidealtracking.cc:264
 hmdcidealtracking.cc:265
 hmdcidealtracking.cc:266
 hmdcidealtracking.cc:267
 hmdcidealtracking.cc:268
 hmdcidealtracking.cc:269
 hmdcidealtracking.cc:270
 hmdcidealtracking.cc:271
 hmdcidealtracking.cc:272
 hmdcidealtracking.cc:273
 hmdcidealtracking.cc:274
 hmdcidealtracking.cc:275
 hmdcidealtracking.cc:276
 hmdcidealtracking.cc:277
 hmdcidealtracking.cc:278
 hmdcidealtracking.cc:279
 hmdcidealtracking.cc:280
 hmdcidealtracking.cc:281
 hmdcidealtracking.cc:282
 hmdcidealtracking.cc:283
 hmdcidealtracking.cc:284
 hmdcidealtracking.cc:285
 hmdcidealtracking.cc:286
 hmdcidealtracking.cc:287
 hmdcidealtracking.cc:288
 hmdcidealtracking.cc:289
 hmdcidealtracking.cc:290
 hmdcidealtracking.cc:291
 hmdcidealtracking.cc:292
 hmdcidealtracking.cc:293
 hmdcidealtracking.cc:294
 hmdcidealtracking.cc:295
 hmdcidealtracking.cc:296
 hmdcidealtracking.cc:297
 hmdcidealtracking.cc:298
 hmdcidealtracking.cc:299
 hmdcidealtracking.cc:300
 hmdcidealtracking.cc:301
 hmdcidealtracking.cc:302
 hmdcidealtracking.cc:303
 hmdcidealtracking.cc:304
 hmdcidealtracking.cc:305
 hmdcidealtracking.cc:306
 hmdcidealtracking.cc:307
 hmdcidealtracking.cc:308
 hmdcidealtracking.cc:309
 hmdcidealtracking.cc:310
 hmdcidealtracking.cc:311
 hmdcidealtracking.cc:312
 hmdcidealtracking.cc:313
 hmdcidealtracking.cc:314
 hmdcidealtracking.cc:315
 hmdcidealtracking.cc:316
 hmdcidealtracking.cc:317
 hmdcidealtracking.cc:318
 hmdcidealtracking.cc:319
 hmdcidealtracking.cc:320
 hmdcidealtracking.cc:321
 hmdcidealtracking.cc:322
 hmdcidealtracking.cc:323
 hmdcidealtracking.cc:324
 hmdcidealtracking.cc:325
 hmdcidealtracking.cc:326
 hmdcidealtracking.cc:327
 hmdcidealtracking.cc:328
 hmdcidealtracking.cc:329
 hmdcidealtracking.cc:330
 hmdcidealtracking.cc:331
 hmdcidealtracking.cc:332
 hmdcidealtracking.cc:333
 hmdcidealtracking.cc:334
 hmdcidealtracking.cc:335
 hmdcidealtracking.cc:336
 hmdcidealtracking.cc:337
 hmdcidealtracking.cc:338
 hmdcidealtracking.cc:339
 hmdcidealtracking.cc:340
 hmdcidealtracking.cc:341
 hmdcidealtracking.cc:342
 hmdcidealtracking.cc:343
 hmdcidealtracking.cc:344
 hmdcidealtracking.cc:345
 hmdcidealtracking.cc:346
 hmdcidealtracking.cc:347
 hmdcidealtracking.cc:348
 hmdcidealtracking.cc:349
 hmdcidealtracking.cc:350
 hmdcidealtracking.cc:351
 hmdcidealtracking.cc:352
 hmdcidealtracking.cc:353
 hmdcidealtracking.cc:354
 hmdcidealtracking.cc:355
 hmdcidealtracking.cc:356
 hmdcidealtracking.cc:357
 hmdcidealtracking.cc:358
 hmdcidealtracking.cc:359
 hmdcidealtracking.cc:360
 hmdcidealtracking.cc:361
 hmdcidealtracking.cc:362
 hmdcidealtracking.cc:363
 hmdcidealtracking.cc:364
 hmdcidealtracking.cc:365
 hmdcidealtracking.cc:366
 hmdcidealtracking.cc:367
 hmdcidealtracking.cc:368
 hmdcidealtracking.cc:369
 hmdcidealtracking.cc:370
 hmdcidealtracking.cc:371
 hmdcidealtracking.cc:372
 hmdcidealtracking.cc:373
 hmdcidealtracking.cc:374
 hmdcidealtracking.cc:375
 hmdcidealtracking.cc:376
 hmdcidealtracking.cc:377
 hmdcidealtracking.cc:378
 hmdcidealtracking.cc:379
 hmdcidealtracking.cc:380
 hmdcidealtracking.cc:381
 hmdcidealtracking.cc:382
 hmdcidealtracking.cc:383
 hmdcidealtracking.cc:384
 hmdcidealtracking.cc:385
 hmdcidealtracking.cc:386
 hmdcidealtracking.cc:387
 hmdcidealtracking.cc:388
 hmdcidealtracking.cc:389
 hmdcidealtracking.cc:390
 hmdcidealtracking.cc:391
 hmdcidealtracking.cc:392
 hmdcidealtracking.cc:393
 hmdcidealtracking.cc:394
 hmdcidealtracking.cc:395
 hmdcidealtracking.cc:396
 hmdcidealtracking.cc:397
 hmdcidealtracking.cc:398
 hmdcidealtracking.cc:399
 hmdcidealtracking.cc:400
 hmdcidealtracking.cc:401
 hmdcidealtracking.cc:402
 hmdcidealtracking.cc:403
 hmdcidealtracking.cc:404
 hmdcidealtracking.cc:405
 hmdcidealtracking.cc:406
 hmdcidealtracking.cc:407
 hmdcidealtracking.cc:408
 hmdcidealtracking.cc:409
 hmdcidealtracking.cc:410
 hmdcidealtracking.cc:411
 hmdcidealtracking.cc:412
 hmdcidealtracking.cc:413
 hmdcidealtracking.cc:414
 hmdcidealtracking.cc:415
 hmdcidealtracking.cc:416
 hmdcidealtracking.cc:417
 hmdcidealtracking.cc:418
 hmdcidealtracking.cc:419
 hmdcidealtracking.cc:420
 hmdcidealtracking.cc:421
 hmdcidealtracking.cc:422
 hmdcidealtracking.cc:423
 hmdcidealtracking.cc:424
 hmdcidealtracking.cc:425
 hmdcidealtracking.cc:426
 hmdcidealtracking.cc:427
 hmdcidealtracking.cc:428
 hmdcidealtracking.cc:429
 hmdcidealtracking.cc:430
 hmdcidealtracking.cc:431
 hmdcidealtracking.cc:432
 hmdcidealtracking.cc:433
 hmdcidealtracking.cc:434
 hmdcidealtracking.cc:435
 hmdcidealtracking.cc:436
 hmdcidealtracking.cc:437
 hmdcidealtracking.cc:438
 hmdcidealtracking.cc:439
 hmdcidealtracking.cc:440
 hmdcidealtracking.cc:441
 hmdcidealtracking.cc:442
 hmdcidealtracking.cc:443
 hmdcidealtracking.cc:444
 hmdcidealtracking.cc:445
 hmdcidealtracking.cc:446
 hmdcidealtracking.cc:447
 hmdcidealtracking.cc:448
 hmdcidealtracking.cc:449
 hmdcidealtracking.cc:450
 hmdcidealtracking.cc:451
 hmdcidealtracking.cc:452
 hmdcidealtracking.cc:453
 hmdcidealtracking.cc:454
 hmdcidealtracking.cc:455
 hmdcidealtracking.cc:456
 hmdcidealtracking.cc:457
 hmdcidealtracking.cc:458
 hmdcidealtracking.cc:459
 hmdcidealtracking.cc:460
 hmdcidealtracking.cc:461
 hmdcidealtracking.cc:462
 hmdcidealtracking.cc:463
 hmdcidealtracking.cc:464
 hmdcidealtracking.cc:465
 hmdcidealtracking.cc:466
 hmdcidealtracking.cc:467
 hmdcidealtracking.cc:468
 hmdcidealtracking.cc:469
 hmdcidealtracking.cc:470
 hmdcidealtracking.cc:471
 hmdcidealtracking.cc:472
 hmdcidealtracking.cc:473
 hmdcidealtracking.cc:474
 hmdcidealtracking.cc:475
 hmdcidealtracking.cc:476
 hmdcidealtracking.cc:477
 hmdcidealtracking.cc:478
 hmdcidealtracking.cc:479
 hmdcidealtracking.cc:480
 hmdcidealtracking.cc:481
 hmdcidealtracking.cc:482
 hmdcidealtracking.cc:483
 hmdcidealtracking.cc:484
 hmdcidealtracking.cc:485
 hmdcidealtracking.cc:486
 hmdcidealtracking.cc:487
 hmdcidealtracking.cc:488
 hmdcidealtracking.cc:489
 hmdcidealtracking.cc:490
 hmdcidealtracking.cc:491
 hmdcidealtracking.cc:492
 hmdcidealtracking.cc:493
 hmdcidealtracking.cc:494
 hmdcidealtracking.cc:495
 hmdcidealtracking.cc:496
 hmdcidealtracking.cc:497
 hmdcidealtracking.cc:498
 hmdcidealtracking.cc:499
 hmdcidealtracking.cc:500
 hmdcidealtracking.cc:501
 hmdcidealtracking.cc:502
 hmdcidealtracking.cc:503
 hmdcidealtracking.cc:504
 hmdcidealtracking.cc:505
 hmdcidealtracking.cc:506
 hmdcidealtracking.cc:507
 hmdcidealtracking.cc:508
 hmdcidealtracking.cc:509
 hmdcidealtracking.cc:510
 hmdcidealtracking.cc:511
 hmdcidealtracking.cc:512
 hmdcidealtracking.cc:513
 hmdcidealtracking.cc:514
 hmdcidealtracking.cc:515
 hmdcidealtracking.cc:516
 hmdcidealtracking.cc:517