ROOT logo
//*--- Author : G.Agakichiev
//*--- Modified: 23.01.07 V.Pechenov
//*--- Modified: 16.06.2005 by V.Pechenov
//*--- Modified: 21.07.2003 by V.Pechenov
//*--- Modified: 28.07.2002 by V.Pechenov
//*--- Modified: 07.05.2002 by V.Pechenov

using namespace std;
#include "hmdctrackfitter.h"
#include "hdebug.h"
#include "hades.h"
#include "hevent.h"
#include "hmdctrackfitpar.h"
#include "hruntimedb.h"
#include "hmdcsizescells.h"
#include "hgeomvector.h"
#include "hmdcgetcontainers.h"
#include "hmdclistcells.h"
#include "hmdcwirefitsim.h"
#include "hmdcclusfitsim.h"
#include "hmdcclussim.h"
#include "hmdctrackdset.h"
#include "hmdcdigitpar.h"

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////////////
// 
// HMdcTrackFitInOut
//
// Service class for for Dubna track piece fitters 
//
//
// HMdcTrackFitter
//
// Base class for Dubna track piece fitters
//
//////////////////////////////////////////////////////////////////////////////

ClassImp(HMdcTrackFitInOut)
ClassImp(HMdcTrackFitter)

HMdcTrackFitInOut::HMdcTrackFitInOut(void) {
  fSizesCells=0;
  setDefaultFitParam();
  useRndbPar = kTRUE;
}

Bool_t HMdcTrackFitInOut::init(void) {
  // parameters:
  version=HMdcTrackDSet::getFitVersion();
  if(version==0) {
    Warning("init","track fit version 0 is not supported more, version 1 will used");
    version=1;
  }
  if(!useRndbPar) fitPar = 0;
  else            fitPar = (HMdcTrackFitPar*)gHades->getRuntimeDb()->getContainer("MdcTrackFitPar");
  fprint = HMdcTrackDSet::fPrint();
  HMdcGetContainers* fGetCont = HMdcGetContainers::getObject();

  fDriftTimePar = HMdcDriftTimePar::getObject();
  HMdcWireData::setDriftTimePar(fDriftTimePar);
  wireOffsetFlag=HMdcTrackDSet::getUseWireOffset();
  if(wireOffsetFlag) {
    fDigitPar=(HMdcDigitPar*)gHades->getRuntimeDb()->getContainer("MdcDigitPar");
    if(!fDigitPar) {
      Error("init:","Zero pointer for HMdcDigitPar recieved!");
      return kFALSE;
    }
  } else fDigitPar=0;
  
  fSizesCells=HMdcSizesCells::getObject();
  if (!fSizesCells) {
    Error("init","HMdcSizesCells is absent");
    return kFALSE;
  }
  
  // categoryes:
  geantFlag=HMdcGetContainers::isGeant();
  if(geantFlag && HMdcTrackDSet::fNTuple()) {
    fGeantKineCat = fGetCont->getCatGeantKine();
    fGeantMdcCat  = fGetCont->getCatGeantMdc();
  } else {
    fGeantKineCat = 0;
    fGeantMdcCat  = 0;
  }
  fCalCat = fGetCont->getCatMdcCal1();
  if (!fCalCat) return kFALSE;
  if(HMdcTrackDSet::fNTuple()) {
    fClusFitCat = fGetCont->getCatMdcClusFit(kTRUE);
    fWireFitCat = fGetCont->getCatMdcWireFit(kTRUE);
    if(!fClusFitCat || !fWireFitCat) return kFALSE;
  } else {
    fClusFitCat = 0;
    fWireFitCat = 0;
  }
  locClusFit.set(1,0);
  locWireFit.set(1,0);
  loc.set(4,0,0,0,0);
  return kTRUE;
}

Bool_t HMdcTrackFitInOut::reinit(void) {
  if(!fSizesCells->initContainer())   return kFALSE;
  if(!fDriftTimePar->initContainer()) return kFALSE;
  for(Int_t sec=0; sec<6; sec++) {
    HMdcSizesCellsSec& fSCSec=(*fSizesCells)[sec];
    for(Int_t mod=0; mod<4; mod++)
        fSCModAr[sec][mod]=(fSizesCells->modStatus(sec,mod)) ? &fSCSec[mod] : 0;
  }
  if( fitPar ) {
    if( !HMdcGetContainers::isInited(fitPar) ) return kFALSE;
    else {
      if(useRtdbTofFlag) tofFlag = fitPar->getTofFlag();
      cutWeight     = fitPar->getCutWeight     ();
      if(useRtdbTScFlag) doTargScan = fitPar->getDoTargScan();

      minTimeOffset = fitPar->getMinTimeOffset ();
      maxTimeOffset = fitPar->getMaxTimeOffset ();
      minCellsNum   = fitPar->getMinCellsNum   ();
      chi2CutFlag   = fitPar->getChi2CutFlag   ();
      totalChi2Cut  = fitPar->getTotalChi2Cut  ();
      chi2PerNdfCut = fitPar->getChi2PerNdfCut ();

      if(useRtdbTFlag) useTukeyFlag = fitPar->getUseTukeyFlag();
      cnWs          = fitPar->getCnWs          ();
      cn2s          = fitPar->getCn2s          ();
      cn4s          = fitPar->getCn4s          ();
      cn2s          = cn4s*cn4s/cnWs;               //No need to keep it RTDB
      minSig2       = fitPar->getMinSig2       ();
      maxNFilterIter= fitPar->getMaxNFilterIter();
      minWeight     = fitPar->getMinWeight     ();
      maxChi2       = fitPar->getMaxChi2       ();

      minTOffsetIter= fitPar->getMinTOffsetIter();

      funCt1        = fitPar->getFunCt1        ();
      stepD1        = fitPar->getStepD1        ();
      funCt2        = fitPar->getFunCt2        ();
      stepD2        = fitPar->getStepD2        ();
      stepD3        = fitPar->getStepD3        ();
    }
  }
  if(wireOffsetFlag) {
    if( !HMdcGetContainers::isInited(fDigitPar) ) return kFALSE;
    signalSpeed=fDigitPar->getSignalSpeed();
  } else signalSpeed=0.;
  return kTRUE;
}

void HMdcTrackFitInOut::setDefaultFitParam(void) {
  // Default parameters of track fitter setting
  // If it calls by user Rtdb fit parameters will not used.
  useRndbPar     = kFALSE;
  
  fprint         = kFALSE;     
  printStartEv   = 0;
  nEventPrint    = 1000000000; 

  version        = 1;
  geantFlag      = kFALSE;
  wireOffsetFlag = 0;
  signalSpeed    = 0.005;
  cutWeight      = 0.01;
  useRtdbTofFlag = kTRUE;
  tofFlag        = 3;
  doTargScan     = kTRUE;
  calcInitValue  = HMdcTrackDSet::getCalcInitValueFlag();
  
  minTimeOffset  = -30.;       // Time offset cut
  maxTimeOffset  = 60.;        // -/-
  minCellsNum    = 5;
  
  chi2CutFlag    = kTRUE;      // kTRUE - do cut for funct., else for chi2/ndf
  totalChi2Cut   = 300.;       // default value for funct. cut
  chi2PerNdfCut  = 50.;        // default value for chi2/ndf cut
  
  // Tukey weight constants:
  useTukeyFlag   = kTRUE;
  useRtdbTFlag   = kTRUE;
  useRtdbTScFlag = kTRUE;
  cnWs           = 6.4516;    //2.54*2.54;
  cn4s           = 10.6276;   //3.26*3.26;
  cn2s           = cn4s*cn4s/cnWs; //17.5561;   //4.19*4.19;
  minSig2        = 2.5*2.5;
  tukeyScale     = 1.;
  maxNFilterIter = 4;
  minWeight      = 0.5;              // wt[time]=(wt[time]<minWeight) ? 0.:1.;
  maxChi2        = 25.; /*36.;6.0*/; // wt[time]=(chi2[time]>maxChi2) ? 0.:1.;
  
  minTOffsetIter = -50.; // if(timeOffset<minTOffsetIter) timeOffset=minTOffsetIter
  
  // Fit parameters for derivatives calc.:
  funCt1 = 500.;        // if(fun0 < funCt1)
  stepD1 = 0.0001;      //               stepD = stepD1;
  funCt2 = 10000.0;     // else if(fun0 < funCt2)
  stepD2 = 0.001;       //                stepD = stepD2;
  stepD3 = 0.01;        // else stepD = stepD3;
  
  // For alignment check:
  for(Int_t s=0;s<6;s++) for(Int_t m=0;m<4;m++) for(Int_t l=0;l<6;l++) exclLay[s][m][l] = kFALSE;
}

void HMdcTrackFitInOut::setNEventsPrint(Int_t start,Int_t nev) {
  printStartEv = start;
  nEventPrint  = nev;
}

void HMdcTrackFitInOut::setTukeyConstants(Double_t cw,Double_t c2,Double_t c4) {
  // Setting of tukey weights constants:
  // if     (chi2<cnWs*sig2) weight=(1-(chi2/(cn4s*sig2))^2)^2
  // else if(chi2<cn2s*sig2) weight=(1- chi2/(cn2s*sig2)   )^2
  // else weight=0.                                        
  cnWs = cw*cw;
  cn4s = c4*c4;
  cn2s = cn4s*cn4s/cnWs; //  cn2s = c2*c2;
}

void HMdcTrackFitInOut::getTukeyConstants(Double_t& cw,Double_t& c2,
    Double_t& c4) const {
  cw = sqrt(cnWs);
  c2 = sqrt(cn2s);
  c4 = sqrt(cn4s);
}
   
HMdcWireFit* HMdcTrackFitInOut::getNewWireFitSlot(Int_t* indWireFit) {
  TObject* fWireFit=fWireFitCat->getNewSlot(locWireFit,indWireFit);
  if(!fWireFit) {
    Warning("getNewWireFitSlot","No slot HMdcWireFit available");
    return 0;
  }
  if(geantFlag) return new(fWireFit) HMdcWireFitSim;
  else return new(fWireFit) HMdcWireFit;
}

HMdcClusFit* HMdcTrackFitInOut::getNewClusFitSlot(Int_t* indClusFit) {
  TObject* fClusFit=fClusFitCat->getNewSlot(locClusFit,indClusFit);
  if(!fClusFit) {
    Warning("getNewClusFitSlot","No slot HMdcClusFit available");
    return 0;
  }
  if(geantFlag) return new(fClusFit) HMdcClusFitSim;
  else return new(fClusFit) HMdcClusFit;
}

Double_t HMdcTrackFitInOut::getStepDer(Double_t funct) const {
  return (funct<funCt1) ? stepD1:((funct<funCt2) ? stepD2:stepD3);
}

void HMdcTrackFitInOut::setPrintFlag(Int_t currentEvent) {
  fprint = currentEvent>=printStartEv && currentEvent<printStartEv+nEventPrint;
}

void HMdcTrackFitInOut::setChi2PerNdfCut(Double_t cut) {
  chi2CutFlag   = kFALSE;
  chi2PerNdfCut = cut;
}

void HMdcTrackFitInOut::setTotalChi2Cut(Double_t cut) {
  chi2CutFlag  = kTRUE;
  totalChi2Cut = cut;
}

void HMdcTrackFitInOut::excludeLayer(UInt_t s,UInt_t m,UInt_t l) {
  if(s<6 && m<4 && l<6) exclLay[s][m][l] = kTRUE;
}

void HMdcTrackFitInOut::excludeModule(UInt_t s,UInt_t m) {
  if(s<6 && m<4) for(UInt_t l=0;l<6;l++) exclLay[s][m][l] = kTRUE;
}

Bool_t HMdcTrackFitInOut::isLayerExcluded(Int_t s,Int_t m,Int_t l) const {
  return s<6 && m<4 && l<6 ? exclLay[s][m][l] : kFALSE;
}

//============================================================================

HMdcTrackFitter::HMdcTrackFitter(HMdcTrackFitInOut* fIO) {
  fitInOut=fIO;
  init();
}

void HMdcTrackFitter::init(void) {
  fprint      = fitInOut->getPrintFlag();
  tofFlag     = fitInOut->getTofFlag();
  wires.setPrintFlag(fprint);
  wires.setTrackFitInOut(fitInOut);
}

void HMdcTrackFitter::setPrintFlag(Bool_t prnt)        {
  fprint=prnt;
  wires.setPrintFlag(fprint);
}

Bool_t HMdcTrackFitter::fillListHits(HMdcClus* cl1,HMdcClus* cl2) {
  segIndex=-1;
  indClusFit=-1; //??? mozhet v drugoe mesto?
  if(!wires.fillListHits(cl1,cl2)) return kFALSE;
  setPlanes();
  return kTRUE;
}

Bool_t HMdcTrackFitter::fillListHits(HMdcClus* cl1,HMdcClus* cl2,HMdcClus* cl3,HMdcClus* cl4,
                                     HMdcClus* cl5,HMdcClus* cl6,HMdcClus* cl7,HMdcClus* cl8) {
  // Cosmic two sectors data
  segIndex=-1;
  indClusFit=-1; //??? mozhet v drugoe mesto?
  if( !wires.fillListHits(cl1,cl2,cl3,cl4,cl5,cl6,cl7,cl8) ) return kFALSE;
  setPlanes();
  return kTRUE;
}

Bool_t HMdcTrackFitter::fillListHits(HMdcEvntListCells* store,HMdcClus* clus1,HMdcClus* clus2) {
  segIndex=-1;
  indClusFit=-1; //??? mozhet v drugoe mesto?
  if(!wires.fillListHits(store,clus1,clus2)) return kFALSE;
  setPlanes();  
  return kTRUE;
}

Bool_t HMdcTrackFitter::fillListHits(HMdcEvntListCells* store) {
  segIndex=-1;
  indClusFit=-1; //??? mozhet v drugoe mesto?
  if(!wires.fillListHits(store)) return kFALSE;
  setPlanes();  
  return kTRUE;
}

void HMdcTrackFitter::setPlanes(void) {
  Int_t sec = wires.getSector();
  HMdcSizesCellsMod** fSCModAr = fitInOut->getSCellsModArr(sec);
//  Int_t nClTimes=wires.getNDriftTimes();
  Int_t nClTimes = wires.getNDrTmFirstSec();
  initParam.setFirstPlane(&((*(fSCModAr[wires[0].getModule()]))[0]));
  initParam.setSecondPlane(&((*(fSCModAr[wires[nClTimes-1].getModule()]))[5]));
  initParam.setCoorSys(sec);
}

Bool_t HMdcTrackFitter::fillClusFitCont(void) {
  HMdcClusFit* fClusFit=fitInOut->getNewClusFitSlot(&indClusFit);
  if(!fClusFit) return kFALSE;
  fClusFit->setFitStatus(fitStatus);
  finalParam.fillClusFit(fClusFit);
  fClusFit->setExitFlag(exitFlag);
  wires.calcDistanceSign(finalParam);
  wires.fillClusFitSim(fClusFit,finalParam);
  wires.fillClusFitAndWireFit(fClusFit);       // must be after fillClusFitSim
  return kTRUE;
}

Bool_t HMdcTrackFitter::fitCluster(Int_t fittingMod) {
  if(wires.getNCellsInInput(fittingMod) < 5) return kFALSE;
  wires.setHitStatM1toP1();         // if(hitStatus==-1) hitStatus=1  ???
  wires.subtractWireOffset(initParam);
  
  // CalcInitValueFlag = 1:
  if(HMdcTrackDSet::getCalcInitValueFlag()==1) wires.calcInitialValue(initParam);
  
  wires.fillLookupTableForDer(initParam);
  fitStatus  = fit(fittingMod);
  
  // CalcInitValueFlag = 2:
  if(HMdcTrackDSet::getCalcInitValueFlag()==2 && wires.getNWiresInFit()<30) {
    if(!fitStatus) refitCluster(fittingMod);              // Fit is not accepted
    else {                                                // Fit is accepted
      Int_t nInputLayers  = wires.getInputListCells().getNLayers();
      Int_t nFittedLayers = wires.getOutputListCells().getNLayers();
      if(nInputLayers-nFittedLayers >= 3) {
        refitCluster(fittingMod);
        nFittedLayers = wires.getOutputListCells().getNLayers();
      }
    }
  }
  
  if(fitInOut->getClusFitCat() && HMdcTrackDSet::fNTuple()) fillClusFitCont();
  return fitStatus;
}

void HMdcTrackFitter::refitCluster(Int_t fittingMod) {
  if(wires.calcInitialValue(initParam)) {
    wires.reinitWtSt();
    fitStatus = fit(fittingMod);
  }
}

Bool_t HMdcTrackFitter::fit(Int_t fittingMod) {
  Int_t iter = 0;
  while(kTRUE) {
    Int_t    exit   = minimize(iter++);
    Double_t delW   = wires.testFitResult();
    Int_t    nCells = wires.getNCellsInOutput(fittingMod);
    if( delW<0.5 || nCells<6 ) {
      if(exit == 0) return kFALSE;
      if(delW > 0.)
        if(finalParam.calcChi2PerDF(wires.getNumOfGoodWires())<0. || !testChi2Cut()) return kFALSE;
      if(finalParam.testParameters(fitInOut->getMinTimeOffset(),fitInOut->getMaxTimeOffset()) && 
         nCells >= fitInOut->getMinCellsNum()) return kTRUE;
      break;
    }
    if(fprint) printf("TestFit: num.of deleted cells=%.1f, refit this!\n",delW);
  }
  return kFALSE;
}

Bool_t HMdcTrackFitter::testChi2Cut(void) {
  if(fitInOut->getChi2CutFlag()) {
         if(finalParam.functional()<fitInOut->getTotalChi2Cut() ) return kTRUE;
  } else if(finalParam.getChi2()   <fitInOut->getChi2PerNdfCut()) return kTRUE;
  return kFALSE;
}

void HMdcTrackFitter::setRegionOfWires(Int_t mod) {
  wires.setRegionOfWires(mod);
}

Bool_t HMdcTrackFitter::setClustAndFill(HMdcClus* cl1, HMdcClus* cl2) {
  if(fprint != fitInOut->getPrintFlag()) setPrintFlag(fitInOut->getPrintFlag());
  if(fprint) {
    cl1->print();
    if(cl2) cl2->print();
  }
  if(!fillListHits(cl1,cl2)) return kFALSE;
  initParam.setParam(cl1->getXTarg(),cl1->getYTarg(),cl1->getZTarg(),
                     cl1->getX(),    cl1->getY(),    cl1->getZ());
  return kTRUE;
}

Bool_t HMdcTrackFitter::setClustAndFill(HMdcClus* cl1,HMdcClus* cl2,HMdcClus* cl3,HMdcClus* cl4,
                                        HMdcClus* cl5,HMdcClus* cl6,HMdcClus* cl7,HMdcClus* cl8) {
  // Cosmic two sectors data
  if(fprint != fitInOut->getPrintFlag()) setPrintFlag(fitInOut->getPrintFlag());
  if(fprint) {
    cl1->print();
    if(cl2 != NULL) cl2->print();
    if(cl3 != NULL) cl3->print();
    if(cl4 != NULL) cl4->print();
    if(cl5 != NULL) cl5->print();
    if(cl6 != NULL) cl6->print();
    if(cl7 != NULL) cl7->print();
    if(cl8 != NULL) cl8->print();
  }
  Int_t nSecs = 2;
  if(cl5 != NULL) nSecs = 3;
  if(cl7 != NULL) nSecs = 4;
  initParam.setNMods(nSecs); //setTwoSecData();
  finalParam.setNMods(nSecs); //setTwoSecData();
  if(!fillListHits(cl1,cl2,cl3,cl4,cl5,cl6,cl7,cl8)) return kFALSE;
  initParam.setParam(cl1->getXTarg(),cl1->getYTarg(),cl1->getZTarg(),
                     cl1->getX(),    cl1->getY(),    cl1->getZ());
  return kTRUE;
}

Bool_t HMdcTrackFitter::setClustAndFill(HMdcEvntListCells* store,
					Double_t x1, Double_t y1, Double_t z1,
					Double_t x2, Double_t y2, Double_t z2) {
  if(fprint != fitInOut->getPrintFlag()) setPrintFlag(fitInOut->getPrintFlag());
  if(fprint) printf("x1=%f  y1=%f z1=%f   x2=%f y2=%f z2=%f \n",x1,y1,z1,x2,y2,z2);
  if(!fillListHits(store)) return kFALSE;
  initParam.setParam(x1, y1, z1, x2, y2, z2);
  wires.setXYZClust(x2, y2, z2);
  return kTRUE;
}

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