ROOT logo
//*-- Author : V.Pechenov
//*-- Modified : 07.05.2002 by V.Pechenov
//*-- Modified : 17.01.2002 by V.Pechenov
//*-- Modified : 12.05.2001 by V.Pechenov

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////
// HMdcTrackFinder
//
// The program for candidates to tracks finding.
//
// Using:
// Put in task list task:
// HMdcTrackFinder* trackFinder;
// ...
// tasks->connect((trackFinder=new HMdcTrackFinder("MdcTrackD","MdcTrackD",
//                                     isCoilOff,typeClustFinder)),"...");
//
// isCoilOff=kTRUE(kFULSE) - The current in coil is turn off(on) for this run(s).
// typeClustFinder=1(0) - type of the work of cluster finder
//
// The parameters isCoilOff and typeClustFinder define the type
// of the work of cluster finder (default values of isCoilOff
// and typeClustFinder are kFALSE and 0):
//
//    isCoilOff=kTRUE - the tracks in all MDC will finded to respect of target.
//    isCoilOff=kFALSE - the tracks in MDC1 & MDC2 will finded to respect
//      of target. In MDC3 & MDC4 - to respect of the the point on kick plane.
//
//    typeClustFinder=0 - the tracks will finded in segment or sector
//      (needs in a alignment of MDC's).
//
// 1. isCoilOff=kTRUE, typeClustFinder=1:
//      The tracks will be searched in each MDC (1-4) independently
// 2. isCoilOff=kTRUE, typeClustFinder=0:
//      The tracks will be searched in all MDC of sector together to
//    respect of target (needs an alignment of MDC's).
// 3. isCoilOff=kFALSE, typeClustFinder=1:
//      The tracks will be searched in MDC1, MDC2 (segment 1) independently,
//      in MDC3, MDC4 (segment 2) together.
// 4. isCoilOff=kFALSE, typeClustFinder=0:
//      The tracks will be searched in MDC1, MDC2 (segment 1) together
//      (needs an alignment of MDC's).
// 5. isCoilOff=kFALSE, typeClustFinder=2:
//      The tracks will be searched in MDC1, MDC2 (segment 1) together
//      and after it in MDC1, MDC2 (segment 1) independently.
// For isCoilOff=kFALSE the program needs HKickPlane parameters
//
// The member function
// trackFinder->setNLayers(nLayers);
// set the number of woring planes in MDC's
// Int_t nLayers[6][4]={ {3,6,6,6}, {6,6,6,6}, {6,6,6,6},
//                       {4,6,6,6}, {6,6,6,6}, {5,6,6,6} };
//
//
// The output of the program is container HMdcClus.
// For writing of HMdcClus to ROOT file use function:
// trackFinder->setPersitency(kTRUE);
//                           (put this line in macros befor makeTree()!)
//
// HMdcClusterToHit task copy the HMdcClus data to HMdcHit and HMdcSeg
//
// The HMdcHit and HMdcSeg containers are filled by HMdc12Fit task.
//
//////////////////////////////////////////////////////////////////////

#include "hevent.h"
#include "hmdctrackfinder.h"
#include "hmdctrackddef.h"
#include "hiterator.h"
#include "hcategory.h"
#include "hmdcgetcontainers.h"
#include "hmdcclussim.h"
#include "hmdclookuptb.h"
#include "hmdc34clfinder.h"
#include "hmdctrackdset.h"
#include "hmdclistcells.h"
#include "hmdcgeanttrack.h"
#include "hmdcclusmetamatch.h"
#include "hmdcsegsim.h"

HMdcTrackFinder::HMdcTrackFinder(Bool_t isCOff, Int_t typeClFn) {
  HMdcTrackDSet::setMdcTrackFinder(isCOff,typeClFn);
  setParContainers();
}

HMdcTrackFinder::HMdcTrackFinder(const Text_t *name, const Text_t *title,
     Bool_t isCOff, Int_t typeClFn) : HReconstructor(name,title) {
  HMdcTrackDSet::setMdcTrackFinder(isCOff,typeClFn);
  setParContainers();
}

HMdcTrackFinder::HMdcTrackFinder(void) {
  setParContainers();
}

HMdcTrackFinder::HMdcTrackFinder(const Text_t *name, const Text_t *title) :
    HReconstructor(name,title) {
  setParContainers();
}

HMdcTrackFinder::~HMdcTrackFinder() {
  HMdcEvntListCells::deleteCont();
  HMdcGeantEvent::deleteCont();
  HMdcLookUpTb::deleteCont();
  HMdc34ClFinder::deleteCont();
  HMdcTrackDSet::clearPTrackFinder();
  if(iterClus) {
    delete iterClus;
    iterClus = 0;
  }
  if(pClusMetaMatch != NULL) delete pClusMetaMatch;
  pClusMetaMatch = NULL;
}

void HMdcTrackFinder::setParContainers() {
  HMdcTrackDSet::setTrackFinder(this);
  isClustToHit    = kFALSE;
  event           = NULL;
  isMdcLCellsOwn  = kFALSE;
  geantEvent      = NULL;
  isGeantEventOwn = kFALSE;
  prntSt          = kFALSE;
  isInitialised   = kFALSE;
  fLookUpTb       = NULL;
  p34ClFinder     = NULL;
  level4[0]       = 0;
  level5[0]       = 0;
  level4[1]       = 0;
  level5[1]       = 0;
  fClusCat        = NULL;
  iterClus        = NULL;
  fSegCat         = NULL;
  perMdcClus      = kFALSE;
//  nBinXS1         = 319;  //!!!!!!!!!!!!319!
//  nBinYS1         = -1;   // If <=1 nBinYS1 will be calculated from nBinXS1
  pClusMetaMatch  = NULL;
  tarSFinderOnly  = kFALSE;
  locClus.set(2,0,0);
  locNewCl.set(3,0,0,0);
  for(Int_t s=0;s<6;++s) for(Int_t m=0;m<4;++m) numLayers[s][m] = 0;
}

Bool_t HMdcTrackFinder::init(void) {
  if(event == 0)      event      = HMdcEvntListCells::getObject(isMdcLCellsOwn);
  if(geantEvent == 0) geantEvent = HMdcGeantEvent::getObject(isGeantEventOwn);
  
  fClusCat = HMdcGetContainers::getObject()->getCatMdcClus(kTRUE);
  if( !fClusCat ) return kFALSE;
  fClusCat->setPersistency(perMdcClus);
  iterClus = (HIterator *)fClusCat->MakeIterator();

  fLookUpTb = HMdcLookUpTb::getObject();

  p34ClFinder = HMdcTrackDSet::isCoilOff() ? NULL : HMdc34ClFinder::getObject();
  isClustToHit  = HMdcTrackDSet::getMdcClusterToHit() != NULL;
  if(geantEvent!=NULL && isClustToHit) {
    fSegCat = gHades->getCurrentEvent()->getCategory(catMdcSeg);
  } else fSegCat = NULL;

  if( !initMetaMatch() ) return kFALSE;
  return kTRUE;
}

Bool_t HMdcTrackFinder::initMetaMatch(void) {
  if(p34ClFinder == NULL) return kTRUE;
  Bool_t fillMMPlot;       // fill plots in ClustMetaMatch
  Bool_t doMetaMatch = HMdcTrackDSet::doMetaMatching(fillMMPlot);
  if( !doMetaMatch ) return kTRUE;
  if(pClusMetaMatch == NULL) {
    pClusMetaMatch = new HMdcClusMetaMatch;
    if(!pClusMetaMatch->init()) return kFALSE;
    p34ClFinder->doMetaMatch(pClusMetaMatch);
  }
  if(fillMMPlot) pClusMetaMatch->setFillPlotsFlag();
  return kTRUE;
}

Bool_t HMdcTrackFinder::reinit(void) {
  if(pClusMetaMatch!=NULL && !pClusMetaMatch->reinit()) return kFALSE;
  
  fLookUpTb->setIsCoilOffFlag(HMdcTrackDSet::isCoilOff());
  Int_t typeClFinder = HMdcTrackDSet::getClFinderType();
  fLookUpTb->setTypeClFinder(typeClFinder);
  if(!fLookUpTb->initContainer()) return kFALSE;
  
  if( p34ClFinder && !p34ClFinder->initContainer(*event) ) return kFALSE;
  if( isInitialised ) return kTRUE;
  
  // Parameters from HMdcTrackDSet:
  for(Int_t s=0;s<6;++s) for(Int_t m=0;m<4;++m) numLayers[s][m] = HMdcTrackDSet::getNLayersInMod(s,m);
  level4[0] = HMdcTrackDSet::getLevel4(0);
  level5[0] = HMdcTrackDSet::getLevel5(0);
  level4[1] = HMdcTrackDSet::getLevel4(1);
  level5[1] = HMdcTrackDSet::getLevel5(1);
  Int_t nModsF = (HMdcTrackDSet::isCoilOff()) ? 4:2;
  
  for(Int_t sec=0; sec<6; sec++) {
    HMdcLookUpTbSec* pLookUpTbSec=&((*fLookUpTb)[sec]);
    for(Int_t mod=0; mod<nModsF; mod++) {
      HMdcLookUpTbMod* pLookUpTbMod = pLookUpTbSec ? &((*pLookUpTbSec)[mod]) : NULL;
      if( pLookUpTbMod ) pLookUpTbMod->setNLayers(numLayers[sec][mod]);
      else numLayers[sec][mod] = 0;
    }
    HMdc34ClFinderSec* p34ClFinderSec = p34ClFinder ? &((*p34ClFinder)[sec]) : NULL;
    if(p34ClFinderSec) p34ClFinderSec->setTypeClFinder(typeClFinder);
    for(Int_t mod=nModsF; mod<4; mod++) {
      if(p34ClFinderSec==NULL || (&((*p34ClFinderSec)[mod]))==0) numLayers[sec][mod] = 0;
    }
  }
  isInitialised = kTRUE;
  if(!prntSt) printStatus();
  return kTRUE;
}

void HMdcTrackFinder::setPersistency(Bool_t perCl) {
  perMdcClus=perCl;
  if(fClusCat) fClusCat->setPersistency(perMdcClus);
}


Int_t HMdcTrackFinder::execute(void) {
  Int_t nFiredWires = 0;
  if(isMdcLCellsOwn) {
    event->clear();
    nFiredWires = event->collectWires();
  } else nFiredWires = event->getNCells();
  if(isGeantEventOwn) geantEvent->collectTracks(); // MUST be after collectWires()!
  if(nFiredWires<3) return 0;                      // MUST be after collectTracks()!
 
  calcClFndrLevel();             // Cluster finder levels determination
  
  Int_t numcl = clFndrBeforField(); // Cl.finder in MDCI-II/all(without mag.field)
  if(numcl<0) return 0;  // No reconstruction for this event

  if(pClusMetaMatch != NULL) pClusMetaMatch->collectMetaHits();

  if(p34ClFinder != NULL) {              // Track finder in MDCIII-IV (with mag.field)
    p34ClFinder->clear();
    setMod34Levels();
    if(isClustToHit) numcl += findOuterSegClusters();
  }
  if(geantEvent && isClustToHit) sortTracksInClusters(); //otherwise 12Fit do it
  return 0;
}

void HMdcTrackFinder::calcClFndrLevel(void) {
  // Cluster finder levels determination:
  for(Int_t sec=0; sec<6; sec++) {
    Int_t* levelSec = clFndrLevel[sec];
    for(Int_t mod=0; mod<4; mod++) {
      levelSec[mod] = numLayers[sec][mod];
      if( levelSec[mod]>0 ) {
        Int_t occup=((*event)[sec][mod].getNCells()*6)/levelSec[mod];
	if( occup <= level5[mod/2] ) levelSec[mod]--;
	if( occup <= level4[mod/2] ) levelSec[mod]--;
	if( occup < 3 && HMdcTrackDSet::getClFinderType()==0) levelSec[mod]=3;
        if( levelSec[mod]<3 ) levelSec[mod]=3;
        
        if( HMdcTrackDSet::getClFinderType()==2 && mod>1) {
          if(numLayers[sec][mod]<4) {
            levelSec[mod]=numLayers[sec][mod]-1;
            if(levelSec[mod]<0) levelSec[mod]=0;
          }
        }
      }
    }
  }
}

Int_t HMdcTrackFinder::clFndrBeforField(void) {
  // Track finder in MDCI-II or all MDC's without mag.field
  fLookUpTb->clear();
  
  fLookUpTb->calcTdcDrDist();

  Int_t verTar = fLookUpTb->findVertex();
  if(verTar == -100) return -1; // No reconstruction for this event
//   if(verTar >= 0 && geantEvent != NULL) { //!dlya vodorodnoy misheni ne idet!
//     Int_t gntTar = geantEvent->getTargetNum();
//     if(gntTar != verTar) { // Print ...............
//       Int_t *vertexStat  = fLookUpTb->getVertexStat();
//       Int_t  nVertexPnts = fLookUpTb->getNVertexPnts();
//       printf("GeantTarget=%2i ReconstructedTarget=%2i G-R=%3i: ",gntTar,verTar,vertexStat[gntTar+1]-vertexStat[verTar+1]);
//       for(Int_t nt=0;nt<nVertexPnts;nt++) {
//         printf(" %4i",vertexStat[nt]);
//         if(gntTar+1 == nt) printf("G");
//         else if(verTar+1 == nt) printf("R");
//         else printf(" ");
//       }
//       printf("\n");
//     }
//   }
  if( tarSFinderOnly ) return 0;
  
  Int_t numcl = 0;
  for(Int_t sec=0; sec<6; sec++) if(&(*fLookUpTb)[sec] != NULL)
      numcl += (*fLookUpTb)[sec].findClusters(clFndrLevel[sec]);
  return numcl;
}

void HMdcTrackFinder::setMod34Levels(void) {  
  for(Int_t sec=0; sec<6; sec++) {
    HMdc34ClFinderSec &fSec = (*p34ClFinder)[sec];
    if( (&fSec) == NULL ) continue;
    fSec.resetCounter();
    fSec.setMinBin(clFndrLevel[sec]);
  }
}

Int_t HMdcTrackFinder::findOuterSegClusters(void) {
  // This function is used if segment fitter is not used.
  Int_t numcl=0;
  iterClus->Reset();
  for(Int_t sec=0; sec<6; sec++) {
    HMdc34ClFinderSec &fSec = (*p34ClFinder)[sec];
    if( !(&fSec) ) continue;
    if(fSec.notEnoughWires()) continue;
    locClus[0]=sec;
    iterClus->gotoLocation(locClus);
    HMdcClus* clus;
    while ((clus=(HMdcClus *)iterClus->Next())!=0) {
      Int_t typeClFn = clus->getTypeClFinder();
      Int_t mod      = clus->getMod();
      if(typeClFn == 1) {
        if(HMdcTrackDSet::getModForSeg1() != mod) continue;
      } else if(typeClFn==2 && mod>=0) {
        //                                           mixFitCut for fit!
        if(clus->getNLayersMod(mod^1)<HMdcTrackDSet::getMixClusCut()) continue;
      }
      numcl+=fSec.findClustersSeg2(clus);
    }
  }
  return numcl;
}

void HMdcTrackFinder::sortTracksInClusters(void) {
  // For isClustToHit == kTRUE only!
  // Soting geant track information in clusters and segments:
  Bool_t isSetted[5];
  iterClus->Reset();
  HMdcClusSim* pClusSim;
  while ((pClusSim=(HMdcClusSim*)iterClus->Next())!=0) {
    pClusSim->sortTrListByContr();
    Int_t segInd = pClusSim->getSegIndex();
    if(segInd<0) continue;
    HMdcSegSim* pSegSim = (HMdcSegSim*)(fSegCat->getObject(segInd));
    if(pSegSim == NULL) {
      Error("execute","Pointer to HMdcSeg object eq.0! (HMdcSeg index=%i)",segInd);
      continue;
    }
    if(pSegSim->getSumWires() == pClusSim->getNCells()) { // No wires removed
      pSegSim->setNTracks(pClusSim->getNTracks(),pClusSim->getNNotFakeTracks(),
                          pClusSim->getIOSegMatchingStatus());
      pSegSim->setTrackInf(pClusSim->getTrackList(),pClusSim->getNumWires(),
                           pClusSim->getNDigiTimes(),pClusSim->getTrackStatus());
    } else {
      Int_t nClTracks  = pClusSim->getNTracks();
      Int_t nSegTracks = pSegSim->getNTracks();
      for(Int_t i=0;i<nSegTracks;i++) isSetted[i] = kFALSE;
      for(Int_t nc=0;nc<nClTracks;nc++) {
        Int_t   track    = pClusSim->getTrack(nc);
        Short_t nTimes   = pClusSim->getNTimesInTrack(nc);
        UChar_t nDigiTms = pClusSim->getNDigiTimesInTrack(nc);
        for(Int_t ns=0;ns<nSegTracks;ns++) if(pSegSim->getTrack(ns) == track) {
          if(isSetted[ns]) continue;
          if(nDigiTms != pSegSim->getNDigiTimes(ns)) continue;
          if(nTimes   <  pSegSim->getNTimes(ns)) continue;
          pSegSim->setTrackStatus(ns,pClusSim->getTrackStatus(nc));
          isSetted[ns]=kTRUE;
          break;
        }
      }
      pSegSim->sortTrListByContr();
    }
  }
}

void HMdcTrackFinder::setNLayers(Int_t *lst) {
  HMdcTrackDSet::setTrFnNLayers(lst);
  for(Int_t sec=0; sec<6; sec++) for(Int_t mod=0; mod<4; mod++) {
    Int_t modInd = sec*4+mod;
    if(lst[modInd]>3 && lst[modInd]<=6) numLayers[sec][mod] = lst[modInd];
  }
}

void HMdcTrackFinder::setLevel(Int_t l4s1, Int_t l5s1, Int_t l4s2, Int_t l5s2) {
  HMdcTrackDSet::setTrFnLevel(l4s1,l5s1,l4s2,l5s2);
  level4[0]=l4s1; 
  level5[0]=l5s1; 
  level4[1]=l4s2; 
  level5[1]=l5s2;
}

void HMdcTrackFinder::setLevelSeg1(Int_t l4, Int_t l5) {
  HMdcTrackDSet::setTrFnSegLevel(0,l4,l5);
  level4[0]=l4; 
  level5[0]=l5;
}

void HMdcTrackFinder::setLevelSeg2(Int_t l4, Int_t l5) {
  HMdcTrackDSet::setTrFnSegLevel(1,l4,l5);
  level4[1]=l4; 
  level5[1]=l5;
}

void HMdcTrackFinder::printStatus(void) {
  // prints the parameters to the screen
  Int_t *l = &numLayers[0][0];
  Bool_t isInited = kFALSE;
  for(Int_t i=0; i<24&&!isInited; i++) if(l[i]>0) isInited = kTRUE;
  if( !isInited ) return;
  const Char_t* hCoil ="0 = MagnetOn,  1 = MagnetOff";
  const Char_t* hType ="0 = combined chamber clusters, 1 = single cham. cl., 2 = mixed cl.(0+1)";
  const Char_t* hLevS1="max. occupancy of MDC for level of cl.finding 4 & 5 layers";
  const Char_t* hLevS2="max. occupancy of MDC for level of cl.finding 4 & 5 layers";
  printf("--------------------------------------------------------------------------------------------\n");
  printf("HMdcTrackFinderSetup:\n");
  printf("MagnetStatus    =  %i :  %s\n",HMdcTrackDSet::isCoilOff(),hCoil);
  printf("ClustFinderType =  %i :  %s\n",HMdcTrackDSet::getClFinderType(),hType);
  printf("LevelsSegment1  =  %i,%i  : %s\n",level4[0],level5[0],hLevS1);
  printf("LevelsSegment2  =  %i,%i  : %s\n",level4[1],level5[1],hLevS2);
  printf("NumLayersPerMod = {{%i,%i,%i,%i},\n",l[ 0],l[ 1],l[ 2],l[ 3]);
  printf("                   {%i,%i,%i,%i},\n",l[ 4],l[ 5],l[ 6],l[ 7]);
  printf("                   {%i,%i,%i,%i},\n",l[ 8],l[ 9],l[10],l[11]);
  printf("                   {%i,%i,%i,%i},\n",l[12],l[13],l[14],l[15]);
  printf("                   {%i,%i,%i,%i},\n",l[16],l[17],l[18],l[19]);
  printf("                   {%i,%i,%i,%i}}\n",l[20],l[21],l[22],l[23]);
  printf ("--------------------------------------------------------------------------------------------\n");
  prntSt = kTRUE;
}

ClassImp(HMdcTrackFinder)
 hmdctrackfinder.cc:1
 hmdctrackfinder.cc:2
 hmdctrackfinder.cc:3
 hmdctrackfinder.cc:4
 hmdctrackfinder.cc:5
 hmdctrackfinder.cc:6
 hmdctrackfinder.cc:7
 hmdctrackfinder.cc:8
 hmdctrackfinder.cc:9
 hmdctrackfinder.cc:10
 hmdctrackfinder.cc:11
 hmdctrackfinder.cc:12
 hmdctrackfinder.cc:13
 hmdctrackfinder.cc:14
 hmdctrackfinder.cc:15
 hmdctrackfinder.cc:16
 hmdctrackfinder.cc:17
 hmdctrackfinder.cc:18
 hmdctrackfinder.cc:19
 hmdctrackfinder.cc:20
 hmdctrackfinder.cc:21
 hmdctrackfinder.cc:22
 hmdctrackfinder.cc:23
 hmdctrackfinder.cc:24
 hmdctrackfinder.cc:25
 hmdctrackfinder.cc:26
 hmdctrackfinder.cc:27
 hmdctrackfinder.cc:28
 hmdctrackfinder.cc:29
 hmdctrackfinder.cc:30
 hmdctrackfinder.cc:31
 hmdctrackfinder.cc:32
 hmdctrackfinder.cc:33
 hmdctrackfinder.cc:34
 hmdctrackfinder.cc:35
 hmdctrackfinder.cc:36
 hmdctrackfinder.cc:37
 hmdctrackfinder.cc:38
 hmdctrackfinder.cc:39
 hmdctrackfinder.cc:40
 hmdctrackfinder.cc:41
 hmdctrackfinder.cc:42
 hmdctrackfinder.cc:43
 hmdctrackfinder.cc:44
 hmdctrackfinder.cc:45
 hmdctrackfinder.cc:46
 hmdctrackfinder.cc:47
 hmdctrackfinder.cc:48
 hmdctrackfinder.cc:49
 hmdctrackfinder.cc:50
 hmdctrackfinder.cc:51
 hmdctrackfinder.cc:52
 hmdctrackfinder.cc:53
 hmdctrackfinder.cc:54
 hmdctrackfinder.cc:55
 hmdctrackfinder.cc:56
 hmdctrackfinder.cc:57
 hmdctrackfinder.cc:58
 hmdctrackfinder.cc:59
 hmdctrackfinder.cc:60
 hmdctrackfinder.cc:61
 hmdctrackfinder.cc:62
 hmdctrackfinder.cc:63
 hmdctrackfinder.cc:64
 hmdctrackfinder.cc:65
 hmdctrackfinder.cc:66
 hmdctrackfinder.cc:67
 hmdctrackfinder.cc:68
 hmdctrackfinder.cc:69
 hmdctrackfinder.cc:70
 hmdctrackfinder.cc:71
 hmdctrackfinder.cc:72
 hmdctrackfinder.cc:73
 hmdctrackfinder.cc:74
 hmdctrackfinder.cc:75
 hmdctrackfinder.cc:76
 hmdctrackfinder.cc:77
 hmdctrackfinder.cc:78
 hmdctrackfinder.cc:79
 hmdctrackfinder.cc:80
 hmdctrackfinder.cc:81
 hmdctrackfinder.cc:82
 hmdctrackfinder.cc:83
 hmdctrackfinder.cc:84
 hmdctrackfinder.cc:85
 hmdctrackfinder.cc:86
 hmdctrackfinder.cc:87
 hmdctrackfinder.cc:88
 hmdctrackfinder.cc:89
 hmdctrackfinder.cc:90
 hmdctrackfinder.cc:91
 hmdctrackfinder.cc:92
 hmdctrackfinder.cc:93
 hmdctrackfinder.cc:94
 hmdctrackfinder.cc:95
 hmdctrackfinder.cc:96
 hmdctrackfinder.cc:97
 hmdctrackfinder.cc:98
 hmdctrackfinder.cc:99
 hmdctrackfinder.cc:100
 hmdctrackfinder.cc:101
 hmdctrackfinder.cc:102
 hmdctrackfinder.cc:103
 hmdctrackfinder.cc:104
 hmdctrackfinder.cc:105
 hmdctrackfinder.cc:106
 hmdctrackfinder.cc:107
 hmdctrackfinder.cc:108
 hmdctrackfinder.cc:109
 hmdctrackfinder.cc:110
 hmdctrackfinder.cc:111
 hmdctrackfinder.cc:112
 hmdctrackfinder.cc:113
 hmdctrackfinder.cc:114
 hmdctrackfinder.cc:115
 hmdctrackfinder.cc:116
 hmdctrackfinder.cc:117
 hmdctrackfinder.cc:118
 hmdctrackfinder.cc:119
 hmdctrackfinder.cc:120
 hmdctrackfinder.cc:121
 hmdctrackfinder.cc:122
 hmdctrackfinder.cc:123
 hmdctrackfinder.cc:124
 hmdctrackfinder.cc:125
 hmdctrackfinder.cc:126
 hmdctrackfinder.cc:127
 hmdctrackfinder.cc:128
 hmdctrackfinder.cc:129
 hmdctrackfinder.cc:130
 hmdctrackfinder.cc:131
 hmdctrackfinder.cc:132
 hmdctrackfinder.cc:133
 hmdctrackfinder.cc:134
 hmdctrackfinder.cc:135
 hmdctrackfinder.cc:136
 hmdctrackfinder.cc:137
 hmdctrackfinder.cc:138
 hmdctrackfinder.cc:139
 hmdctrackfinder.cc:140
 hmdctrackfinder.cc:141
 hmdctrackfinder.cc:142
 hmdctrackfinder.cc:143
 hmdctrackfinder.cc:144
 hmdctrackfinder.cc:145
 hmdctrackfinder.cc:146
 hmdctrackfinder.cc:147
 hmdctrackfinder.cc:148
 hmdctrackfinder.cc:149
 hmdctrackfinder.cc:150
 hmdctrackfinder.cc:151
 hmdctrackfinder.cc:152
 hmdctrackfinder.cc:153
 hmdctrackfinder.cc:154
 hmdctrackfinder.cc:155
 hmdctrackfinder.cc:156
 hmdctrackfinder.cc:157
 hmdctrackfinder.cc:158
 hmdctrackfinder.cc:159
 hmdctrackfinder.cc:160
 hmdctrackfinder.cc:161
 hmdctrackfinder.cc:162
 hmdctrackfinder.cc:163
 hmdctrackfinder.cc:164
 hmdctrackfinder.cc:165
 hmdctrackfinder.cc:166
 hmdctrackfinder.cc:167
 hmdctrackfinder.cc:168
 hmdctrackfinder.cc:169
 hmdctrackfinder.cc:170
 hmdctrackfinder.cc:171
 hmdctrackfinder.cc:172
 hmdctrackfinder.cc:173
 hmdctrackfinder.cc:174
 hmdctrackfinder.cc:175
 hmdctrackfinder.cc:176
 hmdctrackfinder.cc:177
 hmdctrackfinder.cc:178
 hmdctrackfinder.cc:179
 hmdctrackfinder.cc:180
 hmdctrackfinder.cc:181
 hmdctrackfinder.cc:182
 hmdctrackfinder.cc:183
 hmdctrackfinder.cc:184
 hmdctrackfinder.cc:185
 hmdctrackfinder.cc:186
 hmdctrackfinder.cc:187
 hmdctrackfinder.cc:188
 hmdctrackfinder.cc:189
 hmdctrackfinder.cc:190
 hmdctrackfinder.cc:191
 hmdctrackfinder.cc:192
 hmdctrackfinder.cc:193
 hmdctrackfinder.cc:194
 hmdctrackfinder.cc:195
 hmdctrackfinder.cc:196
 hmdctrackfinder.cc:197
 hmdctrackfinder.cc:198
 hmdctrackfinder.cc:199
 hmdctrackfinder.cc:200
 hmdctrackfinder.cc:201
 hmdctrackfinder.cc:202
 hmdctrackfinder.cc:203
 hmdctrackfinder.cc:204
 hmdctrackfinder.cc:205
 hmdctrackfinder.cc:206
 hmdctrackfinder.cc:207
 hmdctrackfinder.cc:208
 hmdctrackfinder.cc:209
 hmdctrackfinder.cc:210
 hmdctrackfinder.cc:211
 hmdctrackfinder.cc:212
 hmdctrackfinder.cc:213
 hmdctrackfinder.cc:214
 hmdctrackfinder.cc:215
 hmdctrackfinder.cc:216
 hmdctrackfinder.cc:217
 hmdctrackfinder.cc:218
 hmdctrackfinder.cc:219
 hmdctrackfinder.cc:220
 hmdctrackfinder.cc:221
 hmdctrackfinder.cc:222
 hmdctrackfinder.cc:223
 hmdctrackfinder.cc:224
 hmdctrackfinder.cc:225
 hmdctrackfinder.cc:226
 hmdctrackfinder.cc:227
 hmdctrackfinder.cc:228
 hmdctrackfinder.cc:229
 hmdctrackfinder.cc:230
 hmdctrackfinder.cc:231
 hmdctrackfinder.cc:232
 hmdctrackfinder.cc:233
 hmdctrackfinder.cc:234
 hmdctrackfinder.cc:235
 hmdctrackfinder.cc:236
 hmdctrackfinder.cc:237
 hmdctrackfinder.cc:238
 hmdctrackfinder.cc:239
 hmdctrackfinder.cc:240
 hmdctrackfinder.cc:241
 hmdctrackfinder.cc:242
 hmdctrackfinder.cc:243
 hmdctrackfinder.cc:244
 hmdctrackfinder.cc:245
 hmdctrackfinder.cc:246
 hmdctrackfinder.cc:247
 hmdctrackfinder.cc:248
 hmdctrackfinder.cc:249
 hmdctrackfinder.cc:250
 hmdctrackfinder.cc:251
 hmdctrackfinder.cc:252
 hmdctrackfinder.cc:253
 hmdctrackfinder.cc:254
 hmdctrackfinder.cc:255
 hmdctrackfinder.cc:256
 hmdctrackfinder.cc:257
 hmdctrackfinder.cc:258
 hmdctrackfinder.cc:259
 hmdctrackfinder.cc:260
 hmdctrackfinder.cc:261
 hmdctrackfinder.cc:262
 hmdctrackfinder.cc:263
 hmdctrackfinder.cc:264
 hmdctrackfinder.cc:265
 hmdctrackfinder.cc:266
 hmdctrackfinder.cc:267
 hmdctrackfinder.cc:268
 hmdctrackfinder.cc:269
 hmdctrackfinder.cc:270
 hmdctrackfinder.cc:271
 hmdctrackfinder.cc:272
 hmdctrackfinder.cc:273
 hmdctrackfinder.cc:274
 hmdctrackfinder.cc:275
 hmdctrackfinder.cc:276
 hmdctrackfinder.cc:277
 hmdctrackfinder.cc:278
 hmdctrackfinder.cc:279
 hmdctrackfinder.cc:280
 hmdctrackfinder.cc:281
 hmdctrackfinder.cc:282
 hmdctrackfinder.cc:283
 hmdctrackfinder.cc:284
 hmdctrackfinder.cc:285
 hmdctrackfinder.cc:286
 hmdctrackfinder.cc:287
 hmdctrackfinder.cc:288
 hmdctrackfinder.cc:289
 hmdctrackfinder.cc:290
 hmdctrackfinder.cc:291
 hmdctrackfinder.cc:292
 hmdctrackfinder.cc:293
 hmdctrackfinder.cc:294
 hmdctrackfinder.cc:295
 hmdctrackfinder.cc:296
 hmdctrackfinder.cc:297
 hmdctrackfinder.cc:298
 hmdctrackfinder.cc:299
 hmdctrackfinder.cc:300
 hmdctrackfinder.cc:301
 hmdctrackfinder.cc:302
 hmdctrackfinder.cc:303
 hmdctrackfinder.cc:304
 hmdctrackfinder.cc:305
 hmdctrackfinder.cc:306
 hmdctrackfinder.cc:307
 hmdctrackfinder.cc:308
 hmdctrackfinder.cc:309
 hmdctrackfinder.cc:310
 hmdctrackfinder.cc:311
 hmdctrackfinder.cc:312
 hmdctrackfinder.cc:313
 hmdctrackfinder.cc:314
 hmdctrackfinder.cc:315
 hmdctrackfinder.cc:316
 hmdctrackfinder.cc:317
 hmdctrackfinder.cc:318
 hmdctrackfinder.cc:319
 hmdctrackfinder.cc:320
 hmdctrackfinder.cc:321
 hmdctrackfinder.cc:322
 hmdctrackfinder.cc:323
 hmdctrackfinder.cc:324
 hmdctrackfinder.cc:325
 hmdctrackfinder.cc:326
 hmdctrackfinder.cc:327
 hmdctrackfinder.cc:328
 hmdctrackfinder.cc:329
 hmdctrackfinder.cc:330
 hmdctrackfinder.cc:331
 hmdctrackfinder.cc:332
 hmdctrackfinder.cc:333
 hmdctrackfinder.cc:334
 hmdctrackfinder.cc:335
 hmdctrackfinder.cc:336
 hmdctrackfinder.cc:337
 hmdctrackfinder.cc:338
 hmdctrackfinder.cc:339
 hmdctrackfinder.cc:340
 hmdctrackfinder.cc:341
 hmdctrackfinder.cc:342
 hmdctrackfinder.cc:343
 hmdctrackfinder.cc:344
 hmdctrackfinder.cc:345
 hmdctrackfinder.cc:346
 hmdctrackfinder.cc:347
 hmdctrackfinder.cc:348
 hmdctrackfinder.cc:349
 hmdctrackfinder.cc:350
 hmdctrackfinder.cc:351
 hmdctrackfinder.cc:352
 hmdctrackfinder.cc:353
 hmdctrackfinder.cc:354
 hmdctrackfinder.cc:355
 hmdctrackfinder.cc:356
 hmdctrackfinder.cc:357
 hmdctrackfinder.cc:358
 hmdctrackfinder.cc:359
 hmdctrackfinder.cc:360
 hmdctrackfinder.cc:361
 hmdctrackfinder.cc:362
 hmdctrackfinder.cc:363
 hmdctrackfinder.cc:364
 hmdctrackfinder.cc:365
 hmdctrackfinder.cc:366
 hmdctrackfinder.cc:367
 hmdctrackfinder.cc:368
 hmdctrackfinder.cc:369
 hmdctrackfinder.cc:370
 hmdctrackfinder.cc:371
 hmdctrackfinder.cc:372
 hmdctrackfinder.cc:373
 hmdctrackfinder.cc:374
 hmdctrackfinder.cc:375
 hmdctrackfinder.cc:376
 hmdctrackfinder.cc:377
 hmdctrackfinder.cc:378
 hmdctrackfinder.cc:379
 hmdctrackfinder.cc:380
 hmdctrackfinder.cc:381
 hmdctrackfinder.cc:382
 hmdctrackfinder.cc:383
 hmdctrackfinder.cc:384
 hmdctrackfinder.cc:385
 hmdctrackfinder.cc:386
 hmdctrackfinder.cc:387
 hmdctrackfinder.cc:388
 hmdctrackfinder.cc:389
 hmdctrackfinder.cc:390
 hmdctrackfinder.cc:391
 hmdctrackfinder.cc:392
 hmdctrackfinder.cc:393
 hmdctrackfinder.cc:394
 hmdctrackfinder.cc:395
 hmdctrackfinder.cc:396
 hmdctrackfinder.cc:397
 hmdctrackfinder.cc:398
 hmdctrackfinder.cc:399
 hmdctrackfinder.cc:400
 hmdctrackfinder.cc:401
 hmdctrackfinder.cc:402
 hmdctrackfinder.cc:403
 hmdctrackfinder.cc:404
 hmdctrackfinder.cc:405
 hmdctrackfinder.cc:406
 hmdctrackfinder.cc:407
 hmdctrackfinder.cc:408
 hmdctrackfinder.cc:409
 hmdctrackfinder.cc:410
 hmdctrackfinder.cc:411
 hmdctrackfinder.cc:412
 hmdctrackfinder.cc:413
 hmdctrackfinder.cc:414
 hmdctrackfinder.cc:415
 hmdctrackfinder.cc:416
 hmdctrackfinder.cc:417
 hmdctrackfinder.cc:418
 hmdctrackfinder.cc:419
 hmdctrackfinder.cc:420
 hmdctrackfinder.cc:421
 hmdctrackfinder.cc:422
 hmdctrackfinder.cc:423
 hmdctrackfinder.cc:424
 hmdctrackfinder.cc:425
 hmdctrackfinder.cc:426
 hmdctrackfinder.cc:427
 hmdctrackfinder.cc:428
 hmdctrackfinder.cc:429
 hmdctrackfinder.cc:430
 hmdctrackfinder.cc:431
 hmdctrackfinder.cc:432
 hmdctrackfinder.cc:433