ROOT logo
//*-- Author : A.Sadovsky <sadovski@fz-rossendorf.de> (04.11.2004); Special thanks to A.Ivashkin, V.Pechenov and A.Rustamov
//*-- Last modified : 10/08/2005 by Ilse Koenig
//*-- Last modified : 22/01/2010 by A. Rustamov

#include <iostream>
#include "hrktrackBF2.h"
#include "hrktrackB.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hdetector.h"
#include "hiterator.h"
#include "hcategory.h"
#include "hmdctrkcand.h"
#include "hmdcgetcontainers.h"
#include "hrungekutta.h"
#include "hmetamatch2.h"
#include "htofcluster.h"
#include "htofclustersim.h"
#include "hgeomvolume.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hmdcgeompar.h"
#include "htofgeompar.h"
#include "hshowergeometry.h"
#include "hemcgeompar.h"
#include "hspecgeompar.h"
#include "tofdef.h"
#include "hmdcseg.h"
#include "hmdchit.h"
#include "showerdef.h"
#include "emcdef.h"
#include "hmdctrackgfieldpar.h"
#include "hmatrixcategory.h"
#include "hgeomtransform.h"
#include "hmdctrackddef.h"
#include "hmdctrackgdef.h"
#include "hmdctrackgspline.h"
#include "hgeomvector.h"
#include "hsplinetrack.h"
#include "hmagnetpar.h"
#include "hshowerhitsim.h"
#include "hemcclustersim.h"
#include "hmdcsizescells.h"
#include "hrpccluster.h"
#include "rpcdef.h"
#include "hrpcgeompar.h"
#include "hmetamatchpar.h"

using namespace std;

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////////////////////////
//
// This class implements Runge Kutta method of momentum calculation
// into Hydra framework. Output is compartible with General Tracking Scheme
// User valuable output is HRKTrackB class in a ROOT tree
// Now it works with all 4 MDCs present
//
/////////////////////////////////////////////////////////////////////////////

ClassImp(HRKTrackBF2)

HRKTrackBF2::HRKTrackBF2() {
  // DUMMY constructor:
  // Initial momentum is taken as a self guess (mode=0)
  mode=0;
  clear();
}


HRKTrackBF2::HRKTrackBF2(const Text_t *name, Short_t m) : HReconstructor(name,name) {
  // Mode m = {0,1,2} Take initial momentum from: 0-self guess, 2-from SplineTrack
  mode=m;
  if(mode==1) {
    Error("HRKTrackBF2","mode=%i is not supported any more!",mode);
    mode = 2;
  }
  clear();
}

void HRKTrackBF2::clear() 
{
  fMatchPar       = NULL;
  pMagnet         = NULL;
  field           = NULL;
  fieldFactor     = -1000.;
  fSpecGeomPar    = NULL;
  fGetCont        = NULL;
  fTofGeometry    = NULL;
  fRpcGeometry    = NULL;
  fShowerGeometry = NULL;
  fEmcGeometry    = NULL;
  fCatMetaMatch   = NULL;
  fMetaMatchIter  = NULL;
  fCatMdcTrkCand  = NULL;
  fCatRpcCluster  = NULL;
  fCatMdcSeg      = NULL;
  fCatMdcHit      = NULL;
  fSplineTrack    = NULL;
  fCatKine        = NULL;
  fCatShower      = NULL;
  fCatEmc         = NULL;
  fCatTof         = NULL;
  fCatTofCluster  = NULL;
  fCatRKTrack     = NULL;
  pMetaMatch      = NULL;
  pMdcTrkCand     = NULL;
  pSplineTrack    = NULL;
  pTofCluster     = NULL;
  pShowerHit      = NULL;
  pEmcCluster     = NULL;
  pRungeKutta     = NULL;
  pMdcSeg1        = NULL;
  pMdcSeg2        = NULL;

  qualityRpc      = -1.;
  qualityShower   = -1.;
  qualityTof      = -1.;




  for(Int_t i = 0; i < 3; ++i)
    {
      pTofHit[i] = NULL;
    }

  for(Int_t m = 0;m < 4; m++)
    {
      for(Int_t s = 0;s < 6; s++)
	{
	  mdcInstalled[m][s]=kFALSE;
	}
    }
}

HRKTrackBF2::~HRKTrackBF2() {
  // destructor
  if (pRungeKutta) {
    delete pRungeKutta;
    pRungeKutta=0;
  }
  HMdcSizesCells::deleteCont();
}


Bool_t HRKTrackBF2::init(){

// sets pointers to all categories and the parameter containers
  if (gHades) {
    HRuntimeDb *rtdb=gHades->getRuntimeDb();
    HSpectrometer *spec=gHades->getSetup();
    HEvent *event=gHades->getCurrentEvent();
    if (!event) return kFALSE;

    field=(HMdcTrackGFieldPar*)(rtdb->getContainer("MdcTrackGFieldPar"));
    fSpecGeomPar=(HSpecGeomPar*)(rtdb->getContainer("SpecGeomPar"));
    pMagnet=(HMagnetPar*)( rtdb->getContainer("MagnetPar"));
    fGetCont=HMdcGetContainers::getObject();
    pMSizesCells = HMdcSizesCells::getObject();

    // TOF-geometry-for-metaEnergy loss calculation
    if (spec->getDetector("Tof")) { // has the user set up a TOF?
      fTofGeometry = (HTofGeomPar *)rtdb->getContainer("TofGeomPar");
    }
    // Shower-geometry-for-metaEnergy loss calculation
    if (spec->getDetector("Shower")) {
      fShowerGeometry = (HShowerGeometry *)rtdb->getContainer("ShowerGeometry");
    }
 
    // Emc-geometry
    if (spec->getDetector("Emc")) {
      fEmcGeometry = (HEmcGeomPar *)rtdb->getContainer("EmcGeomPar");
    }
    
    if (spec->getDetector("Rpc"))
    {
      fRpcGeometry   = (HRpcGeomPar*)rtdb->getContainer("RpcGeomPar");
    }

    fMatchPar=(HMetaMatchPar*)rtdb->getContainer("MetaMatchPar");
    
    // Categories
    fCatMetaMatch=event->getCategory(catMetaMatch);
    if (!fCatMetaMatch) return kFALSE;
    fMetaMatchIter=(HIterator*)fCatMetaMatch->MakeIterator();
    if (!fMetaMatchIter) return kFALSE;
    fCatMdcTrkCand=event->getCategory(catMdcTrkCand);
    if (!fCatMdcTrkCand) return kFALSE;
    fCatMdcSeg=event->getCategory(catMdcSeg);
    if (!fCatMdcSeg) return kFALSE;
    fCatMdcHit=event->getCategory(catMdcHit);
   // if (!fCatMdcHit) return kFALSE;

    fCatRpcCluster = event->getCategory(catRpcCluster);
    if(!fCatRpcCluster) Warning("init","NO catRpcCluster in input! \n");
       

    // momentum guess if any
    if (mode==2) { //- use SplineTrack as initial guess for momentum
      fSplineTrack=event->getCategory(catSplineTrack);
      if (!fSplineTrack) {
        Error("init",
              "Spline is used as initial momentum guess, but was not initialized before Runge-Kutta");
        return kFALSE;
      }
    }
    
    //- META detectors part
    fCatTof=event->getCategory(catTofHit);
    if (!fCatTof) Warning("init","No catTofHit in input!");;
    fCatTofCluster=event->getCategory(catTofCluster);
    if (!fCatTofCluster) Warning("init","No catTofCluster in input!");

    fCatShower = event->getCategory(catShowerHit);
    fCatEmc    = event->getCategory(catEmcCluster);
    if(fCatShower == NULL && fCatEmc == NULL) {
	Warning("init","NO catShowerHit and catEmcCluster in input!");
    }

    //- Here we get category HRKTrackB to use it as an output in "execute()"
    fCatRKTrack=event->getCategory(catRKTrackB);
    if (!fCatRKTrack) {
      Int_t size[2]={6,8000};
      fCatRKTrack=new HMatrixCategory("HRKTrackB",2,size,0.5);
      if (fCatRKTrack) event->addCategory(catRKTrackB,fCatRKTrack,"RKTrackB");
    }
    return kTRUE;
  } // end if (gHades)
  return kFALSE;
}


Bool_t HRKTrackBF2::reinit()
{ //reinit
 
#warning will be changed: Anar
  // creates The Runge Kutta objects and sets the field and MDC geometry parameters
  // calculates norm vectors on TOF  modules
 
  if (!pRungeKutta) {
    pRungeKutta = new HRungeKutta();
  }
  if (pMagnet->hasChanged() || fieldFactor ==-1000) {
    fieldFactor=pMagnet->getScalingFactor();
    pRungeKutta->setField(field->getPointer(),fieldFactor);
  }

  if (!pMSizesCells->initContainer()) {
    Error("reinit()","HMdcSizesCells is not initialzed!");
    return kFALSE;
  }
  // Geometry transformation from module to sector coord system for MDCs
  HGeomTransform gtrMod2Sec;
  for(Int_t is=0; is<6; is++) {
    HMdcSizesCellsSec& fSCSec = (*pMSizesCells)[is];
    if(&fSCSec == 0) continue; // sector is not active
    secTrans[is]=*(fSCSec.getLabTrans());
    for(Int_t im=0; im<4; im++) {
      HMdcSizesCellsMod& fSCMod=fSCSec[im];
      if (&fSCMod) {
        gtrMod2Sec = *(fSCMod.getSecTrans());
        pRungeKutta->setMdcPosition(is,im,gtrMod2Sec);
        mdcInstalled[im][is]=kTRUE;
      }
    }
  }

  //Geometry of the TOF and TOFINO/SHOWER-Hit (needed by MetaEloss calculation)
  // (normale on each module in the sector coordinate system)
  
  if ( !fMatchPar ) return kFALSE;
   
  for(Int_t is=0; is<6; is++) {
    if (fRpcGeometry) {
      HModGeomPar *module = fRpcGeometry -> getModule(is,0);
      HGeomTransform modTrans( module -> getLabTransform());
      modTrans.transTo(secTrans[is]);

      rpcSM[is] = modTrans;

      HGeomVector r0_mod(0.0, 0.0, 0.0);
      centerRpc[is] = modTrans.transFrom(r0_mod);
      HGeomVector rz_mod(0.0, 0.0, 1.0);
      normVecRpc[is] = modTrans.transFrom(rz_mod) - centerRpc[is];
            
    }
    if (fShowerGeometry) {
      HGeomTransform modTrans(fShowerGeometry->getTransform(is));
      modTrans.transTo(secTrans[is]);
      
      showerSM[is] = modTrans;
      
      HGeomVector r0_mod(0.0, 0.0, 0.);
      HGeomVector rz_mod(0.0, 0.0, 1.);
      normVecShower[is] = modTrans.transFrom(rz_mod) - modTrans.transFrom(r0_mod);
    }
    
    if (fEmcGeometry) {
      HModGeomPar *pmodgeom = fEmcGeometry->getModule(is);
      HGeomTransform modTrans(pmodgeom->getLabTransform());
      
      modTrans.transTo(secTrans[is]);
      
      emcSM[is] = modTrans;
      
      HGeomVector r0_mod(0.0, 0.0, 0.);
      HGeomVector rz_mod(0.0, 0.0, 1.);
      normVecEmc[is] = modTrans.transFrom(rz_mod) - modTrans.transFrom(r0_mod);
    }
    
    if (fTofGeometry) {
      for(Int_t im=0; im<8; im++) {
        HModGeomPar *module = fTofGeometry->getModule(is,im);
        HGeomTransform modTrans(module->getLabTransform());
        modTrans.transTo(secTrans[is]);
	
        tofSM[is][im] = modTrans;	
	
        HGeomVector r0_mod(0.0, 0.0, 0.0);
        HGeomVector rz_mod(0.0, 0.0, 1.0);
        normVecTof[is][im] = modTrans.transFrom(rz_mod) - modTrans.transFrom(r0_mod);
      }
    }
  
  setMatchingParams(is);
  }
  
  return kTRUE;
}

void HRKTrackBF2::setMatchingParams(Int_t s)
{
    if(s>5||s<0) {
	Error("setMatchingParams()","s = %i out of range!",s);
        return;
    }
  ////RPC
  sigma2MdcInRpcX[s]    = fMatchPar -> getRpcSigmaXMdc(s)*fMatchPar -> getRpcSigmaXMdc(s);
  sigma2MdcInRpcY[s]    = fMatchPar -> getRpcSigmaYMdc(s)*fMatchPar -> getRpcSigmaYMdc(s);
  sRpcX[s]              = fMatchPar -> getRpcSigmaXOffset(s); //
  sRpcY[s]              = fMatchPar -> getRpcSigmaYOffset(s);
  quality2RPCCut[s]     = fMatchPar -> getRpcQualityCut(s)*fMatchPar -> getRpcQualityCut(s);
  ////SHOWER 
  sigma2MdcInShrX[s]    = fMatchPar -> getShowerSigmaXMdc(s)*fMatchPar -> getShowerSigmaXMdc(s);
  sigma2MdcInShrY[s]    = fMatchPar -> getShowerSigmaYMdc(s)*fMatchPar -> getShowerSigmaYMdc(s);
  sShowerX[s]           = fMatchPar -> getShowerSigmaXOffset(s); //
  sShowerY[s]           = fMatchPar -> getShowerSigmaYOffset(s);
  quality2SHOWERCut[s]  = fMatchPar -> getShowerQualityCut(s)*fMatchPar -> getShowerQualityCut(s);
  ////EMC 
  sigma2MdcInEmcX[s]    = fMatchPar -> getEmcSigmaXMdc(s)*fMatchPar -> getEmcSigmaXMdc(s);
  sigma2MdcInEmcY[s]    = fMatchPar -> getEmcSigmaYMdc(s)*fMatchPar -> getEmcSigmaYMdc(s);
  sEmcX[s]              = fMatchPar -> getEmcSigmaXOffset(s); //
  sEmcY[s]              = fMatchPar -> getEmcSigmaYOffset(s);
  quality2EMCCut[s]     = fMatchPar -> getEmcQualityCut(s)*fMatchPar -> getEmcQualityCut(s);
  //TOF
  sigma2TofX[s]         = fMatchPar -> getTofSigmaX(s)*fMatchPar -> getTofSigmaX(s);
  sigma2TofY[s]         = fMatchPar -> getTofSigmaY(s)*fMatchPar -> getTofSigmaY(s);
  sTofX[s]              = fMatchPar -> getTofSigmaXOffset(s); //
  sTofY[s]              = fMatchPar -> getTofSigmaYOffset(s);
  quality2TOFCut[s]     = fMatchPar -> getTofQualityCut(s)*fMatchPar -> getTofQualityCut(s);
}


Int_t HRKTrackBF2::execute()
{ //execute
  success = kTRUE;
  fMetaMatchIter->Reset();
  
  while ((pMetaMatch=(HMetaMatch2*)(fMetaMatchIter->Next()))!=0) 
  {
    sector = pMetaMatch->getSector();
    pMdcTrkCand = (HMdcTrkCand*)fCatMdcTrkCand -> getObject(pMetaMatch->getTrkCandInd());
    if(!pMdcTrkCand) { continue; }
    pMdcSeg1 = (HMdcSeg*)fCatMdcSeg -> getObject(pMdcTrkCand->getSeg1Ind());
    pMdcSeg2 = (HMdcSeg*)fCatMdcSeg -> getObject(pMdcTrkCand->getSeg2Ind());
    if (!pMdcSeg1 || !pMdcSeg2) { continue; }
    sectorloc.set(1,sector);
    // We calculate the initial point and direction for each segment.
    // This vector is used in Runge Kutta to calculate the hit points in each MDC plane.
    Double_t u1pos[3], u1dir[3], u2pos[3], u2dir[3];
    // we have to define if a missing hit point should be artificially
    // calculate to define at least 3 points for the RK algorithm. This
    // is done to keep the efficiency high (in special if the the MDC
    // cluster finder is running in "mixed mode").
    // The additional point will be always added in the inner MDC if this
    // chamber is in the setup as the influence of the magnetic field is
    // stronger in the outer chambers. In case the inner chamber is missing
    // in the setup the outer segment will be used.
    Bool_t doFakeHit=kFALSE;
    Int_t nHitsCheck[2]={0};
    if(pMdcSeg1->getHitInd(0)!=-1) nHitsCheck[0]++;
    if(pMdcSeg1->getHitInd(1)!=-1) nHitsCheck[0]++;
    if(pMdcSeg2->getHitInd(0)!=-1) nHitsCheck[1]++;
    if(pMdcSeg2->getHitInd(1)!=-1) nHitsCheck[1]++;
    

    if(mdcInstalled[0][pMdcSeg1->getSec()] &&
       mdcInstalled[1][pMdcSeg1->getSec()] &&
       nHitsCheck[0]==1 && nHitsCheck[1]==1)
    {   // if both inner chambers are installed
	// and the sum of inner and outer MDCHits is
        // equal 2
	doFakeHit=kTRUE;
    }
    Int_t nHits=calcPosDirFromSegment(pMdcSeg1,0,&u1pos[0],&u1dir[0],doFakeHit);    // inner segment

    if(nHits==1                            &&
       mdcInstalled[2][pMdcSeg2->getSec()] &&
       mdcInstalled[3][pMdcSeg2->getSec()] &&
       nHitsCheck[0]==1 && nHitsCheck[1]==1)
    {   // We could not fix the number of hits in inner segment.
	// Now we try for the outer segment. If both outer chambers
	// are installed and the sum of inner and outer MDCHits is
        // equal 2
	doFakeHit=kTRUE;
    }
    else {
	doFakeHit=kFALSE;
    }

    nHits     +=calcPosDirFromSegment(pMdcSeg2,1,&u2pos[0],&u2dir[0],doFakeHit);  // outer segment
    if (nHits<3) {
        Warning("execute()","Less than 3 points for RK detected. This should never happen!");
	continue;
    }

    Int_t splineTrackIndex=-1;
    momentumGuess=-1000000.0; //indicates the absence of initial guess
    pRK=-1000000.0;
    qRK=0;

    if (mode==2) {
      // Initial momentum guess from SplineTrack
      splineTrackIndex = pMetaMatch->getSplineInd();
      if (splineTrackIndex>=0) { 
        pSplineTrack = (HSplineTrack*)fSplineTrack->getObject(splineTrackIndex);
        pRK = pSplineTrack -> getP();
	qRK = pSplineTrack -> getPolarity();
      } else {
        Warning("execute()","SplineTrack did not provide information for RK");
      }
    }

    if (pRK>50.) {
      momentumGuess=qRK*pRK;
    } else if (pRK!=-1000000.0) {
	momentumGuess=qRK*50.;
    }

    // Now do Runge-Kutta momentum tracking and fitting with momentum guess as start value
    if (nHits == 4) {
	success = pRungeKutta->fit4Hits(u1pos,u1dir,u2pos,u2dir,multSig,sector,momentumGuess);
    } else {
	if (momentumGuess != -1000000.0) {
	    success = pRungeKutta->fit3Hits(u1pos,u1dir,u2pos,u2dir,multSig,sector,momentumGuess);
	} else {
	    //Runge Kutta does not work with MDC123 in case no initial guess was specified
	    Warning("execute()",
		    "HRKTrackF: MDC123 mode, but user did not provide momentum guess - RK failed!");
	    success = kFALSE; // this prevents from writing garbage into HRKTrackB
	}
    }

    if(fieldFactor==0.){ // NO FIELD CASE
        success = kTRUE;
	doMassStuff();

	fillData(pMdcSeg1,pMdcSeg2,pSplineTrack,indexRK);
	pMetaMatch -> setRungeKuttaInd((Short_t)indexRK);
        success = kFALSE;
	continue;
    }

    if (!success) {
      //fillData(pMdcSeg1,pMdcSeg2,pSplineTrack); //fill HRKTrack with the initial segment information
      fillData(pMdcSeg1,pMdcSeg2,pSplineTrack,indexRK);
      pMetaMatch -> setRungeKuttaInd((Short_t)indexRK);
      continue;
    }

    chiqRK=pRungeKutta->getChi2();
    pRK=pRungeKutta->getPfit();
    //cout<<"before spline pol "<<(Int_t)pSplineTrack->getPolarity()<<" spline p "<<pSplineTrack->getP()<<" pRK "<<pRK<<" qRK "<<qRK<<endl;
    if (pRK>0) {
      qRK=+1;
    } else {
      pRK*=-1.;
      qRK=-1;
    }
    //cout<<"after  spline pol "<<(Int_t)pSplineTrack->getPolarity()<<" spline p "<<pSplineTrack->getP()<<" pRK "<<pRK<<" qRK "<<qRK<<endl;
    if (pRK>10000.) pRK=10000.0;

    // Now propogate it till vertex
    pRungeKutta->traceToVertex(pMSizesCells);
    // Now we take into account META information if any
    if ( !doMassStuff() )
      {
        //cout<<"after domass"<<endl;
        tof          = -1.0;
        trackLength  = -1.0;
        beta         = -1.0;
        mass2        = -1.0;
        metaeloss    = -1.0;
        RKxyzMETA[0] = -1.0;
        RKxyzMETA[1] = -1.0;
        RKxyzMETA[2] = -1.0;
	pRungeKutta -> traceToMETA(centerRpc[sector],normVecRpc[sector]);
	fillData(pMdcSeg1,pMdcSeg2,pSplineTrack,indexRK);
        pMetaMatch -> setRungeKuttaInd((Short_t)indexRK);
      }
    
  }
  
  return 0;
}


Bool_t HRKTrackBF2::doMassStuff()
{

  Bool_t isMatched = kFALSE;
  if( pMetaMatch -> getSystem() == -1) return kFALSE;
  
  if( pMetaMatch -> getNRpcClusters() )
    {
      isMatched = kTRUE;
      matchWithRpc();
    }
  if( fShowerGeometry!=NULL && pMetaMatch -> getNShrHits() )
    {
      isMatched = kTRUE;
      matchWithShower();
    }
  else if(fEmcGeometry!=NULL && pMetaMatch -> getNEmcClusters() )
    {
      isMatched = kTRUE;
      matchWithEmc();
    }
  if ( pMetaMatch -> getNTofHits() )
    {
      isMatched = kTRUE;
      matchWithTof();
    }
  if(!isMatched) return kFALSE;
  return kTRUE;
}


void HRKTrackBF2::matchWithRpc()
{

  metaNormVec = normVecRpc[sector];
  transMetaSM = rpcSM[sector];
  
  for(UChar_t n = 0; n < pMetaMatch -> getNRpcClusters(); ++n )
    {
      indRpc = pMetaMatch -> getRpcClstInd(n);
      if( indRpc < 0 )
	{
	  Warning("matchWithRpc","Rpc index is < 0, DISASTER!");
	  continue;
	}
      pRpc = (HRpcCluster*)fCatRpcCluster -> getObject(indRpc);
      if(!pRpc)
	{
	  Warning("matchWithRpc","Pointer to Rpc is NULL, DISASTER!");
	  continue;
	}
      
      tof       =       pRpc -> getTof();
      metaeloss =       pRpc -> getCharge();  
      xTof      =       pRpc -> getXSec();
      yTof      =       pRpc -> getYSec();
      zTof      =       pRpc -> getZSec();
      zMod      =       0; // will be checked later
      
      pointMeta.setXYZ(xTof,yTof,zTof);
      
      qualityRpc    = pMetaMatch -> getRpcClstQuality(n);
      RKxyzMETA[0]  = pMetaMatch -> getRpcClstDX(n);
      RKxyzMETA[1]  = pMetaMatch -> getRpcClstDY(n);
      RKxyzMETA[2]  = 0.;

      calcBeta(zMod,0);
      HRKTrackB* pRK = fillData(pMdcSeg1,pMdcSeg2,pSplineTrack,indexRK);
      pRK->setRpcClustInd(indRpc);

      pMetaMatch -> setRungeKuttaIndRpcClst(n, (Short_t)indexRK);
    }
}

void HRKTrackBF2::matchWithShower()
  {

    if(!fCatShower) return;

    metaNormVec = normVecShower[sector];
    transMetaSM = showerSM[sector];

    for(UChar_t n = 0; n < pMetaMatch -> getNShrHits(); ++n )
      {
	indShower = pMetaMatch -> getShowerHitInd(n);
	if( indShower < 0 )
	  {
	    Warning("matchWithShower","Index of shower is < 0, DISASTER!");
	    continue;
	  }
	
	pShowerHit = (HShowerHit*)fCatShower -> getObject(indShower);
	
	if(!pShowerHit)
	  {
	    Warning("matchWithShower","Pointer to Shower is NULL, DISASTER!");
	    continue;
	  }
	 
	tof          = -1.0;
        beta         = -1.0;
        mass2        = -1.0;
        metaeloss    = -1.0;
	pShowerHit -> getLabXYZ(&xTof,&yTof,&zTof);
	pointMeta.setXYZ(xTof,yTof,zTof);
	pointMeta = secTrans[sector].transTo(pointMeta);
        zMod         =  pShowerHit-> getZ();

	qualityShower = pMetaMatch -> getShowerHitQuality(n);
	RKxyzMETA[0]  = pMetaMatch -> getShowerHitDX(n);
	RKxyzMETA[1]  = pMetaMatch -> getShowerHitDY(n);
	RKxyzMETA[2]  = 0.;

	calcBeta(zMod,1, kFALSE);
	HRKTrackB* pRK = fillData(pMdcSeg1,pMdcSeg2,pSplineTrack,indexRK);
        pRK->setShowerHitInd(indShower);
	pMetaMatch -> setRungeKuttaIndShowerHit(n,(Short_t)indexRK);
      }
  }

void HRKTrackBF2::matchWithEmc()
  {

    if(!fCatEmc) return;

    metaNormVec = normVecEmc[sector];
    transMetaSM = emcSM[sector];

    for(UChar_t n = 0; n < pMetaMatch -> getNEmcClusters(); ++n )
      {
	indEmc = pMetaMatch -> getEmcClusterInd(n);
	if( indEmc < 0 )
	  {
	    Warning("matchWithEmc","Index of Emc is < 0, DISASTER!");
	    continue;
	  }
	
	pEmcCluster = (HEmcCluster*)fCatEmc -> getObject(indEmc);
	
	if(!pEmcCluster)
	  {
	    Warning("matchWithEmc","Pointer to Emc is NULL, DISASTER!");
	    continue;
	  }
	 
	tof          = pEmcCluster->getTime();
        beta         = -1.0;
        mass2        = -1.0;
        metaeloss    = -1.0;
	pEmcCluster -> getXYZLab(xTof,yTof,zTof);
	pointMeta.setXYZ(xTof,yTof,zTof);
	pointMeta = secTrans[sector].transTo(pointMeta);
        zMod         =  0.; //pEmcCluster-> getZ();

	qualityEmc    = pMetaMatch -> getEmcClusterQuality(n);
	RKxyzMETA[0]  = pMetaMatch -> getEmcClusterDX(n);
	RKxyzMETA[1]  = pMetaMatch -> getEmcClusterDY(n);
	RKxyzMETA[2]  = 0.;


	calcBeta(zMod,3, kTRUE);   //kTRUE); -time will be used !!!!!!!!!!!!!!?????????????????
	HRKTrackB* pRK = fillData(pMdcSeg1,pMdcSeg2,pSplineTrack,indexRK);
        pRK->setShowerHitInd(indEmc);                 //setEmcClusterInd(indEmc);
	pMetaMatch -> setRungeKuttaIndEmcCluster(n,(Short_t)indexRK);
      }
  }

void HRKTrackBF2::calcBeta(Float_t zMod, Int_t mode, Bool_t option)
{ 
    if(fieldFactor==0.) { // NO FIELD CASE

       HMdcSizesCellsSec& fSCSec=(*pMSizesCells)[sector];
       const HGeomVector& target=fSCSec.getTargetMiddlePoint();
       HGeomVector distance = pointMeta - target;
       trackLength = distance.length();

       beta        = 1.0e6*trackLength/tof/TMath::C();
       mass2       = 1.0e6;
       chiqRK      = 1.;
       // dx,dy,quality values are copied from MetaMatch2 before

       return;

    }

  pRungeKutta -> traceToMETA(pointMeta, metaNormVec);
  HGeomVector localMeta1(pRungeKutta -> getXtrackOnMETA(),
			 pRungeKutta -> getYtrackOnMETA(),
			 pRungeKutta -> getZtrackOnMETA());
  HGeomVector localMeta2(pointMeta);
  localMeta1 = transMetaSM.transTo(localMeta1);
  localMeta2 = transMetaSM.transTo(localMeta2);
  
  HGeomVector shiftz(0.,0.,zMod);
  localMeta2 -= shiftz;
 
  HGeomVector localMeta = localMeta2 - localMeta1;
  RKxyzMETA[0] = localMeta.getX();
  RKxyzMETA[1] = localMeta.getY();
  RKxyzMETA[2] = localMeta.getZ();
  
  qualityRpc = qualityShower = qualityTof = -1.;
  
  if(mode == 0) //rpc
  {
   dXrms2    =  pRpc -> getXRMS();
   dYrms2    =  pRpc -> getYRMS(); 
   dX        =  localMeta.getX() - sRpcX[sector];
   dY        =  localMeta.getY() - sRpcY[sector];
   qualityRpc = getQuality(dX,dY,dXrms2*dXrms2 + sigma2MdcInRpcX[sector],dYrms2*dYrms2 + sigma2MdcInRpcY[sector]);
  }
  
  else if (mode == 1) //shower
  {
   dXrms2  = pShowerHit -> getSigmaX();
   dYrms2  = pShowerHit -> getSigmaY();
   dX      = localMeta.getX() - sShowerX[sector];
   dY      = localMeta.getY() - sShowerY[sector];
   qualityShower  = getQuality(dX, dY,dXrms2*dXrms2 + sigma2MdcInShrX[sector],dYrms2*dYrms2 + sigma2MdcInShrY[sector]);
     
  }
  
  else if(mode == 2)             //tof
  {
   dX = localMeta.getX() - sTofX[sector];
   dY = localMeta.getY() - sTofY[sector];
   qualityTof =  getQuality(dX, dY, sigma2TofX[sector], sigma2TofY[sector]);
  }
    
  else if (mode == 3) //emc
  {
   dXrms2  = pEmcCluster -> getSigmaXMod();
   dYrms2  = pEmcCluster -> getSigmaYMod();
   dX      = localMeta.getX() - sEmcX[sector];
   dY      = localMeta.getY() - sEmcY[sector];
   qualityEmc = getQuality(dX, dY,dXrms2*dXrms2 + sigma2MdcInEmcX[sector],dYrms2*dYrms2 + sigma2MdcInEmcY[sector]);
     
  }

  else 
  {
   Warning("calcBeta", "This option does not exist");
  }
  
  
  trackLength = pRungeKutta->getTrackLength();
  if(option)
    {
      beta        = 1.0e6*trackLength/tof/TMath::C(); 
      mass2       = pRK*pRK*(1-beta*beta)/beta/beta;
    }
}

Float_t HRKTrackBF2::getQuality(Float_t dx, Float_t dy, Float_t s2x, Float_t s2y)
{

  return sqrt(dx*dx/s2x + dy*dy/s2y);
}

void HRKTrackBF2::matchWithTof()
  {
    for(UChar_t n = 0; n < pMetaMatch -> getNTofHits(); ++n )
      {
	indTof[0]  = pMetaMatch -> getTofHit1Ind(n);
	indTof[1]  = pMetaMatch -> getTofHit2Ind(n);
	indTof[2]  = pMetaMatch -> getTofClstInd(n);
	
	
	for(Int_t i = 0; i < 3; ++i )
	  {
	    if( indTof[i] < 0 ) continue;
	      
		if (i == 2)
		  pTofHit[i] = (HTofHit*)fCatTofCluster->getObject(indTof[i]);
		else
		  pTofHit[i] = (HTofHit*)fCatTof->getObject(indTof[i]);
		if( !pTofHit[i] )
		  {
		    Warning("matchWithTof","Pointer to Tof is NULL, DISASTER!");
		    continue;
		  }
		
		metaNormVec = normVecTof[sector][(Int_t)pTofHit[i] -> getModule()];
		transMetaSM = tofSM[sector][(Int_t)pTofHit[i] -> getModule()];
		
		tof = pTofHit[i] -> getTof();
		metaeloss = pTofHit[i] -> getEdep();
		pTofHit[i] -> getXYZLab(xTof, yTof, zTof);
		pointMeta.setXYZ(xTof,yTof,zTof);
		pointMeta = secTrans[sector].transTo(pointMeta);
		zMod = 0;

		if( i == 2){

		    qualityTof    = pMetaMatch -> getTofClstQuality(n);
		    RKxyzMETA[0]  = pMetaMatch -> getTofClstDX(n);
		    RKxyzMETA[1]  = pMetaMatch -> getTofClstDY(n);

		} else if (i == 1){

		    qualityTof    = pMetaMatch -> getTofHit2Quality(n);
		    RKxyzMETA[0]  = pMetaMatch -> getTofHit2DX(n);
		    RKxyzMETA[1]  = pMetaMatch -> getTofHit2DY(n);

		}  else {

		    qualityTof    = pMetaMatch -> getTofHit1Quality(n);
		    RKxyzMETA[0]  = pMetaMatch -> getTofHit1DX(n);
		    RKxyzMETA[1]  = pMetaMatch -> getTofHit1DY(n);

		}

		RKxyzMETA[2]  = 0.;

		calcBeta(zMod,2);
		HRKTrackB* pRK = fillData(pMdcSeg1,pMdcSeg2,pSplineTrack,indexRK);
	        if( i == 0)      { pRK->setTofHitInd  (indTof[0]); pMetaMatch -> setRungeKuttaIndTofHit1(n, (Short_t)indexRK); }
		else if( i == 1) { pRK->setTofHitInd  (indTof[1]); pMetaMatch -> setRungeKuttaIndTofHit2(n, (Short_t)indexRK); }
		else             { pRK->setTofClustInd(indTof[2]); pMetaMatch -> setRungeKuttaIndTofClst(n, (Short_t)indexRK); }
	  }
      }
    
    
  }


Int_t HRKTrackBF2::calcPosDirFromSegment(HMdcSeg* pSeg,Int_t ioseg, Double_t* pos, Double_t* dir, Bool_t flag) {
  // calculates the initial point and direction from a MDC track segment
  // If a hit index in the outer segment is -1, the error is set to -1.
  // This hit will then be discarded in Runge Kutta. For not fitted outer
  // segments, the hits get larger errors. 
  Int_t index[2]={pSeg->getHitInd(0),pSeg->getHitInd(1)};
  Int_t nHits=2;
  if (ioseg==0) {                         // inner segment
    for (Int_t i=0;i<2;i++) {
      if (index[i]==-1 && flag==kFALSE) { // missing hit
        multSig[2*i] = multSig[2*i+1] = -1.;
        nHits--;
      } else multSig[2*i] = multSig[2*i+1] = 1.;
    }
  } else {                                // outer segment
    for (Int_t i=0;i<2;i++) {
      if (index[i]==-1) {                 // missing hit
	  if (flag==kFALSE) {             // normal mode
	      multSig[4+2*i] = multSig[4+2*i+1] = -1.;
	      nHits--;
	  } else {                        // create fake hit
              if(pSeg->getChi2()>=0) multSig[4+2*i] = multSig[4+2*i+1] = 1.;
              else                   multSig[4+2*i] = multSig[4+2*i+1] = 5.;
	  }

      } else if (pSeg->getChi2()>=0) {    // fitted single hit
	  multSig[4+2*i] = multSig[4+2*i+1] = 1.;
      } else {                            // not fitted single hit
	  multSig[4+2*i] = multSig[4+2*i+1] = 5.;
      }
    }
  }
  if (nHits>0) {
    Double_t hpi=TMath::Pi()/2.;
    pos[0] = pSeg->getR()*cos(pSeg->getPhi()+hpi); // 1st-tracklet's initial point
    pos[1] = pSeg->getR()*sin(pSeg->getPhi()+hpi);
    pos[2] = pSeg->getZ();
    dir[0] = cos(pSeg->getPhi())*sin(pSeg->getTheta()); // 1st-tracklet's direction
    dir[1] = sin(pSeg->getPhi())*sin(pSeg->getTheta());
    dir[2] = cos(pSeg->getTheta());
  }
  return nHits;
}


HRKTrackB* HRKTrackBF2::fillData(HMdcSeg* segment1,HMdcSeg* segment2,HSplineTrack* spline, Int_t &indexRK) 
{
  // fills the Runge Kutta track object
  TObject* slot=0;
  HRKTrackB* rkt=0;
  //Int_t indexRK;
  slot=fCatRKTrack->getNewSlot(sectorloc,&indexRK);
  if (!slot) {
    Error("fillData","No slot available");
  } else {
      //----------------------------------------------------------------------
     // #warning locally changed isRungeKuttaAccepted. Has to be removed when meaning of isSplineAccepted is changed
      // work arround : function setRungeKuttaInd() sets
      // isAccepted=kTRUE no matter what it was set by TofClusterF.
      // So, this depends on the order of tasks
      // metamatch -> splinetask -> tofcluster -> RK
      //Bool_t isAccepted=kTRUE;
      //if(pMetaMatch->getSplineInd()>-1){
	  // spline object already exists isSplineAccepted()
	  // should be always true if there is no overlap in
	  // TOF/TOFINO and the TofClustF runs in front of RK
	//  isAccepted=pMetaMatch->isSplineAccepted();
      //}
    //  pMetaMatch->setRungeKuttaInd(indexRK); // add index in METAMATCH
      // work arround : set is accepted to old flag
      // Should work, no matter if TofClusterF runs berfore of not
      //if(isAccepted==kFALSE) pMetaMatch->unsetRungeKuttaAccept();
      //----------------------------------------------------------------------
    rkt=new(slot) HRKTrackB;
    rkt->setSector(sector);
////    rkt->setShowerHitInd(pMetaMatch->getShowerHitInd());
////    rkt->setTofHitInd(pMetaMatch->getTofHitInd());
    rkt->setZ(    segment1->getZ()     ,segment1->getErrZ()     );
    rkt->setR(    segment1->getR()     ,segment1->getErrR()     );
    rkt->setTheta(segment1->getTheta() ,segment1->getErrTheta() );
    rkt->setPhi(  segment1->getPhi()   ,segment1->getErrPhi()   );
    rkt->setP(pRK,0.);
    rkt->setPolarity(qRK);
    rkt->setTof(tof);
    rkt->setMetaEloss(metaeloss);
    rkt->setTarDist(spline->getTarDist());
    rkt->setIOMatching(spline->getIOMatching());

    if (success) {
      rkt->setChiq(chiqRK);

    if(fieldFactor==0.) { // NO FIELD CASE
      rkt->setZSeg1RK(segment1->getZ());
      rkt->setRSeg1RK(segment1->getR());
      rkt->setThetaSeg1RK(segment1->getTheta());
      rkt->setPhiSeg1RK(segment1->getPhi());
      rkt->setZSeg2RK(segment2->getZ());
      rkt->setRSeg2RK(segment2->getR());
      rkt->setThetaSeg2RK(segment2->getTheta());
      rkt->setPhiSeg2RK(segment2->getPhi());
    } else {
      rkt->setZSeg1RK(pRungeKutta->getZSeg1());
      rkt->setRSeg1RK(pRungeKutta->getRSeg1());
      rkt->setThetaSeg1RK(pRungeKutta->getThetaSeg1());
      rkt->setPhiSeg1RK(pRungeKutta->getPhiSeg1());
      rkt->setZSeg2RK(pRungeKutta->getZSeg2());
      rkt->setRSeg2RK(pRungeKutta->getRSeg2());
      rkt->setThetaSeg2RK(pRungeKutta->getThetaSeg2());
      rkt->setPhiSeg2RK(pRungeKutta->getPhiSeg2());
    }

      rkt->setTofDist(trackLength);
      rkt->setBeta(beta);
      rkt->setMass2(mass2, 0.);
      rkt->setMETAdx(RKxyzMETA[0]);
      rkt->setMETAdy(RKxyzMETA[1]);
      rkt->setMETAdz(RKxyzMETA[2]);
      rkt->setQualityRpc(qualityRpc);
      if(fCatShower != NULL) rkt->setQualityShower(qualityShower);
      else                   rkt->setQualityShower(qualityEmc);
      rkt->setQualityTof(qualityTof);
    } else {
      //something failed, or momentum reconstruction was not even called
      rkt->setZSeg1RK(segment1->getZ());
      rkt->setRSeg1RK(segment1->getR());
      rkt->setThetaSeg1RK(segment1->getTheta());
      rkt->setPhiSeg1RK(segment1->getPhi());
      rkt->setZSeg2RK(segment2->getZ());
      rkt->setRSeg2RK(segment2->getR());
      rkt->setThetaSeg2RK(segment2->getTheta());
      rkt->setPhiSeg2RK(segment2->getPhi());
      rkt->setTofDist(spline->getTofDist());
      rkt->setBeta(   spline->getBeta());
      rkt->setMass2(  spline->getMass2(), 0.);
    }
  }
  return rkt;
}
 hrktrackBF2.cc:1
 hrktrackBF2.cc:2
 hrktrackBF2.cc:3
 hrktrackBF2.cc:4
 hrktrackBF2.cc:5
 hrktrackBF2.cc:6
 hrktrackBF2.cc:7
 hrktrackBF2.cc:8
 hrktrackBF2.cc:9
 hrktrackBF2.cc:10
 hrktrackBF2.cc:11
 hrktrackBF2.cc:12
 hrktrackBF2.cc:13
 hrktrackBF2.cc:14
 hrktrackBF2.cc:15
 hrktrackBF2.cc:16
 hrktrackBF2.cc:17
 hrktrackBF2.cc:18
 hrktrackBF2.cc:19
 hrktrackBF2.cc:20
 hrktrackBF2.cc:21
 hrktrackBF2.cc:22
 hrktrackBF2.cc:23
 hrktrackBF2.cc:24
 hrktrackBF2.cc:25
 hrktrackBF2.cc:26
 hrktrackBF2.cc:27
 hrktrackBF2.cc:28
 hrktrackBF2.cc:29
 hrktrackBF2.cc:30
 hrktrackBF2.cc:31
 hrktrackBF2.cc:32
 hrktrackBF2.cc:33
 hrktrackBF2.cc:34
 hrktrackBF2.cc:35
 hrktrackBF2.cc:36
 hrktrackBF2.cc:37
 hrktrackBF2.cc:38
 hrktrackBF2.cc:39
 hrktrackBF2.cc:40
 hrktrackBF2.cc:41
 hrktrackBF2.cc:42
 hrktrackBF2.cc:43
 hrktrackBF2.cc:44
 hrktrackBF2.cc:45
 hrktrackBF2.cc:46
 hrktrackBF2.cc:47
 hrktrackBF2.cc:48
 hrktrackBF2.cc:49
 hrktrackBF2.cc:50
 hrktrackBF2.cc:51
 hrktrackBF2.cc:52
 hrktrackBF2.cc:53
 hrktrackBF2.cc:54
 hrktrackBF2.cc:55
 hrktrackBF2.cc:56
 hrktrackBF2.cc:57
 hrktrackBF2.cc:58
 hrktrackBF2.cc:59
 hrktrackBF2.cc:60
 hrktrackBF2.cc:61
 hrktrackBF2.cc:62
 hrktrackBF2.cc:63
 hrktrackBF2.cc:64
 hrktrackBF2.cc:65
 hrktrackBF2.cc:66
 hrktrackBF2.cc:67
 hrktrackBF2.cc:68
 hrktrackBF2.cc:69
 hrktrackBF2.cc:70
 hrktrackBF2.cc:71
 hrktrackBF2.cc:72
 hrktrackBF2.cc:73
 hrktrackBF2.cc:74
 hrktrackBF2.cc:75
 hrktrackBF2.cc:76
 hrktrackBF2.cc:77
 hrktrackBF2.cc:78
 hrktrackBF2.cc:79
 hrktrackBF2.cc:80
 hrktrackBF2.cc:81
 hrktrackBF2.cc:82
 hrktrackBF2.cc:83
 hrktrackBF2.cc:84
 hrktrackBF2.cc:85
 hrktrackBF2.cc:86
 hrktrackBF2.cc:87
 hrktrackBF2.cc:88
 hrktrackBF2.cc:89
 hrktrackBF2.cc:90
 hrktrackBF2.cc:91
 hrktrackBF2.cc:92
 hrktrackBF2.cc:93
 hrktrackBF2.cc:94
 hrktrackBF2.cc:95
 hrktrackBF2.cc:96
 hrktrackBF2.cc:97
 hrktrackBF2.cc:98
 hrktrackBF2.cc:99
 hrktrackBF2.cc:100
 hrktrackBF2.cc:101
 hrktrackBF2.cc:102
 hrktrackBF2.cc:103
 hrktrackBF2.cc:104
 hrktrackBF2.cc:105
 hrktrackBF2.cc:106
 hrktrackBF2.cc:107
 hrktrackBF2.cc:108
 hrktrackBF2.cc:109
 hrktrackBF2.cc:110
 hrktrackBF2.cc:111
 hrktrackBF2.cc:112
 hrktrackBF2.cc:113
 hrktrackBF2.cc:114
 hrktrackBF2.cc:115
 hrktrackBF2.cc:116
 hrktrackBF2.cc:117
 hrktrackBF2.cc:118
 hrktrackBF2.cc:119
 hrktrackBF2.cc:120
 hrktrackBF2.cc:121
 hrktrackBF2.cc:122
 hrktrackBF2.cc:123
 hrktrackBF2.cc:124
 hrktrackBF2.cc:125
 hrktrackBF2.cc:126
 hrktrackBF2.cc:127
 hrktrackBF2.cc:128
 hrktrackBF2.cc:129
 hrktrackBF2.cc:130
 hrktrackBF2.cc:131
 hrktrackBF2.cc:132
 hrktrackBF2.cc:133
 hrktrackBF2.cc:134
 hrktrackBF2.cc:135
 hrktrackBF2.cc:136
 hrktrackBF2.cc:137
 hrktrackBF2.cc:138
 hrktrackBF2.cc:139
 hrktrackBF2.cc:140
 hrktrackBF2.cc:141
 hrktrackBF2.cc:142
 hrktrackBF2.cc:143
 hrktrackBF2.cc:144
 hrktrackBF2.cc:145
 hrktrackBF2.cc:146
 hrktrackBF2.cc:147
 hrktrackBF2.cc:148
 hrktrackBF2.cc:149
 hrktrackBF2.cc:150
 hrktrackBF2.cc:151
 hrktrackBF2.cc:152
 hrktrackBF2.cc:153
 hrktrackBF2.cc:154
 hrktrackBF2.cc:155
 hrktrackBF2.cc:156
 hrktrackBF2.cc:157
 hrktrackBF2.cc:158
 hrktrackBF2.cc:159
 hrktrackBF2.cc:160
 hrktrackBF2.cc:161
 hrktrackBF2.cc:162
 hrktrackBF2.cc:163
 hrktrackBF2.cc:164
 hrktrackBF2.cc:165
 hrktrackBF2.cc:166
 hrktrackBF2.cc:167
 hrktrackBF2.cc:168
 hrktrackBF2.cc:169
 hrktrackBF2.cc:170
 hrktrackBF2.cc:171
 hrktrackBF2.cc:172
 hrktrackBF2.cc:173
 hrktrackBF2.cc:174
 hrktrackBF2.cc:175
 hrktrackBF2.cc:176
 hrktrackBF2.cc:177
 hrktrackBF2.cc:178
 hrktrackBF2.cc:179
 hrktrackBF2.cc:180
 hrktrackBF2.cc:181
 hrktrackBF2.cc:182
 hrktrackBF2.cc:183
 hrktrackBF2.cc:184
 hrktrackBF2.cc:185
 hrktrackBF2.cc:186
 hrktrackBF2.cc:187
 hrktrackBF2.cc:188
 hrktrackBF2.cc:189
 hrktrackBF2.cc:190
 hrktrackBF2.cc:191
 hrktrackBF2.cc:192
 hrktrackBF2.cc:193
 hrktrackBF2.cc:194
 hrktrackBF2.cc:195
 hrktrackBF2.cc:196
 hrktrackBF2.cc:197
 hrktrackBF2.cc:198
 hrktrackBF2.cc:199
 hrktrackBF2.cc:200
 hrktrackBF2.cc:201
 hrktrackBF2.cc:202
 hrktrackBF2.cc:203
 hrktrackBF2.cc:204
 hrktrackBF2.cc:205
 hrktrackBF2.cc:206
 hrktrackBF2.cc:207
 hrktrackBF2.cc:208
 hrktrackBF2.cc:209
 hrktrackBF2.cc:210
 hrktrackBF2.cc:211
 hrktrackBF2.cc:212
 hrktrackBF2.cc:213
 hrktrackBF2.cc:214
 hrktrackBF2.cc:215
 hrktrackBF2.cc:216
 hrktrackBF2.cc:217
 hrktrackBF2.cc:218
 hrktrackBF2.cc:219
 hrktrackBF2.cc:220
 hrktrackBF2.cc:221
 hrktrackBF2.cc:222
 hrktrackBF2.cc:223
 hrktrackBF2.cc:224
 hrktrackBF2.cc:225
 hrktrackBF2.cc:226
 hrktrackBF2.cc:227
 hrktrackBF2.cc:228
 hrktrackBF2.cc:229
 hrktrackBF2.cc:230
 hrktrackBF2.cc:231
 hrktrackBF2.cc:232
 hrktrackBF2.cc:233
 hrktrackBF2.cc:234
 hrktrackBF2.cc:235
 hrktrackBF2.cc:236
 hrktrackBF2.cc:237
 hrktrackBF2.cc:238
 hrktrackBF2.cc:239
 hrktrackBF2.cc:240
 hrktrackBF2.cc:241
 hrktrackBF2.cc:242
 hrktrackBF2.cc:243
 hrktrackBF2.cc:244
 hrktrackBF2.cc:245
 hrktrackBF2.cc:246
 hrktrackBF2.cc:247
 hrktrackBF2.cc:248
 hrktrackBF2.cc:249
 hrktrackBF2.cc:250
 hrktrackBF2.cc:251
 hrktrackBF2.cc:252
 hrktrackBF2.cc:253
 hrktrackBF2.cc:254
 hrktrackBF2.cc:255
 hrktrackBF2.cc:256
 hrktrackBF2.cc:257
 hrktrackBF2.cc:258
 hrktrackBF2.cc:259
 hrktrackBF2.cc:260
 hrktrackBF2.cc:261
 hrktrackBF2.cc:262
 hrktrackBF2.cc:263
 hrktrackBF2.cc:264
 hrktrackBF2.cc:265
 hrktrackBF2.cc:266
 hrktrackBF2.cc:267
 hrktrackBF2.cc:268
 hrktrackBF2.cc:269
 hrktrackBF2.cc:270
 hrktrackBF2.cc:271
 hrktrackBF2.cc:272
 hrktrackBF2.cc:273
 hrktrackBF2.cc:274
 hrktrackBF2.cc:275
 hrktrackBF2.cc:276
 hrktrackBF2.cc:277
 hrktrackBF2.cc:278
 hrktrackBF2.cc:279
 hrktrackBF2.cc:280
 hrktrackBF2.cc:281
 hrktrackBF2.cc:282
 hrktrackBF2.cc:283
 hrktrackBF2.cc:284
 hrktrackBF2.cc:285
 hrktrackBF2.cc:286
 hrktrackBF2.cc:287
 hrktrackBF2.cc:288
 hrktrackBF2.cc:289
 hrktrackBF2.cc:290
 hrktrackBF2.cc:291
 hrktrackBF2.cc:292
 hrktrackBF2.cc:293
 hrktrackBF2.cc:294
 hrktrackBF2.cc:295
 hrktrackBF2.cc:296
 hrktrackBF2.cc:297
 hrktrackBF2.cc:298
 hrktrackBF2.cc:299
 hrktrackBF2.cc:300
 hrktrackBF2.cc:301
 hrktrackBF2.cc:302
 hrktrackBF2.cc:303
 hrktrackBF2.cc:304
 hrktrackBF2.cc:305
 hrktrackBF2.cc:306
 hrktrackBF2.cc:307
 hrktrackBF2.cc:308
 hrktrackBF2.cc:309
 hrktrackBF2.cc:310
 hrktrackBF2.cc:311
 hrktrackBF2.cc:312
 hrktrackBF2.cc:313
 hrktrackBF2.cc:314
 hrktrackBF2.cc:315
 hrktrackBF2.cc:316
 hrktrackBF2.cc:317
 hrktrackBF2.cc:318
 hrktrackBF2.cc:319
 hrktrackBF2.cc:320
 hrktrackBF2.cc:321
 hrktrackBF2.cc:322
 hrktrackBF2.cc:323
 hrktrackBF2.cc:324
 hrktrackBF2.cc:325
 hrktrackBF2.cc:326
 hrktrackBF2.cc:327
 hrktrackBF2.cc:328
 hrktrackBF2.cc:329
 hrktrackBF2.cc:330
 hrktrackBF2.cc:331
 hrktrackBF2.cc:332
 hrktrackBF2.cc:333
 hrktrackBF2.cc:334
 hrktrackBF2.cc:335
 hrktrackBF2.cc:336
 hrktrackBF2.cc:337
 hrktrackBF2.cc:338
 hrktrackBF2.cc:339
 hrktrackBF2.cc:340
 hrktrackBF2.cc:341
 hrktrackBF2.cc:342
 hrktrackBF2.cc:343
 hrktrackBF2.cc:344
 hrktrackBF2.cc:345
 hrktrackBF2.cc:346
 hrktrackBF2.cc:347
 hrktrackBF2.cc:348
 hrktrackBF2.cc:349
 hrktrackBF2.cc:350
 hrktrackBF2.cc:351
 hrktrackBF2.cc:352
 hrktrackBF2.cc:353
 hrktrackBF2.cc:354
 hrktrackBF2.cc:355
 hrktrackBF2.cc:356
 hrktrackBF2.cc:357
 hrktrackBF2.cc:358
 hrktrackBF2.cc:359
 hrktrackBF2.cc:360
 hrktrackBF2.cc:361
 hrktrackBF2.cc:362
 hrktrackBF2.cc:363
 hrktrackBF2.cc:364
 hrktrackBF2.cc:365
 hrktrackBF2.cc:366
 hrktrackBF2.cc:367
 hrktrackBF2.cc:368
 hrktrackBF2.cc:369
 hrktrackBF2.cc:370
 hrktrackBF2.cc:371
 hrktrackBF2.cc:372
 hrktrackBF2.cc:373
 hrktrackBF2.cc:374
 hrktrackBF2.cc:375
 hrktrackBF2.cc:376
 hrktrackBF2.cc:377
 hrktrackBF2.cc:378
 hrktrackBF2.cc:379
 hrktrackBF2.cc:380
 hrktrackBF2.cc:381
 hrktrackBF2.cc:382
 hrktrackBF2.cc:383
 hrktrackBF2.cc:384
 hrktrackBF2.cc:385
 hrktrackBF2.cc:386
 hrktrackBF2.cc:387
 hrktrackBF2.cc:388
 hrktrackBF2.cc:389
 hrktrackBF2.cc:390
 hrktrackBF2.cc:391
 hrktrackBF2.cc:392
 hrktrackBF2.cc:393
 hrktrackBF2.cc:394
 hrktrackBF2.cc:395
 hrktrackBF2.cc:396
 hrktrackBF2.cc:397
 hrktrackBF2.cc:398
 hrktrackBF2.cc:399
 hrktrackBF2.cc:400
 hrktrackBF2.cc:401
 hrktrackBF2.cc:402
 hrktrackBF2.cc:403
 hrktrackBF2.cc:404
 hrktrackBF2.cc:405
 hrktrackBF2.cc:406
 hrktrackBF2.cc:407
 hrktrackBF2.cc:408
 hrktrackBF2.cc:409
 hrktrackBF2.cc:410
 hrktrackBF2.cc:411
 hrktrackBF2.cc:412
 hrktrackBF2.cc:413
 hrktrackBF2.cc:414
 hrktrackBF2.cc:415
 hrktrackBF2.cc:416
 hrktrackBF2.cc:417
 hrktrackBF2.cc:418
 hrktrackBF2.cc:419
 hrktrackBF2.cc:420
 hrktrackBF2.cc:421
 hrktrackBF2.cc:422
 hrktrackBF2.cc:423
 hrktrackBF2.cc:424
 hrktrackBF2.cc:425
 hrktrackBF2.cc:426
 hrktrackBF2.cc:427
 hrktrackBF2.cc:428
 hrktrackBF2.cc:429
 hrktrackBF2.cc:430
 hrktrackBF2.cc:431
 hrktrackBF2.cc:432
 hrktrackBF2.cc:433
 hrktrackBF2.cc:434
 hrktrackBF2.cc:435
 hrktrackBF2.cc:436
 hrktrackBF2.cc:437
 hrktrackBF2.cc:438
 hrktrackBF2.cc:439
 hrktrackBF2.cc:440
 hrktrackBF2.cc:441
 hrktrackBF2.cc:442
 hrktrackBF2.cc:443
 hrktrackBF2.cc:444
 hrktrackBF2.cc:445
 hrktrackBF2.cc:446
 hrktrackBF2.cc:447
 hrktrackBF2.cc:448
 hrktrackBF2.cc:449
 hrktrackBF2.cc:450
 hrktrackBF2.cc:451
 hrktrackBF2.cc:452
 hrktrackBF2.cc:453
 hrktrackBF2.cc:454
 hrktrackBF2.cc:455
 hrktrackBF2.cc:456
 hrktrackBF2.cc:457
 hrktrackBF2.cc:458
 hrktrackBF2.cc:459
 hrktrackBF2.cc:460
 hrktrackBF2.cc:461
 hrktrackBF2.cc:462
 hrktrackBF2.cc:463
 hrktrackBF2.cc:464
 hrktrackBF2.cc:465
 hrktrackBF2.cc:466
 hrktrackBF2.cc:467
 hrktrackBF2.cc:468
 hrktrackBF2.cc:469
 hrktrackBF2.cc:470
 hrktrackBF2.cc:471
 hrktrackBF2.cc:472
 hrktrackBF2.cc:473
 hrktrackBF2.cc:474
 hrktrackBF2.cc:475
 hrktrackBF2.cc:476
 hrktrackBF2.cc:477
 hrktrackBF2.cc:478
 hrktrackBF2.cc:479
 hrktrackBF2.cc:480
 hrktrackBF2.cc:481
 hrktrackBF2.cc:482
 hrktrackBF2.cc:483
 hrktrackBF2.cc:484
 hrktrackBF2.cc:485
 hrktrackBF2.cc:486
 hrktrackBF2.cc:487
 hrktrackBF2.cc:488
 hrktrackBF2.cc:489
 hrktrackBF2.cc:490
 hrktrackBF2.cc:491
 hrktrackBF2.cc:492
 hrktrackBF2.cc:493
 hrktrackBF2.cc:494
 hrktrackBF2.cc:495
 hrktrackBF2.cc:496
 hrktrackBF2.cc:497
 hrktrackBF2.cc:498
 hrktrackBF2.cc:499
 hrktrackBF2.cc:500
 hrktrackBF2.cc:501
 hrktrackBF2.cc:502
 hrktrackBF2.cc:503
 hrktrackBF2.cc:504
 hrktrackBF2.cc:505
 hrktrackBF2.cc:506
 hrktrackBF2.cc:507
 hrktrackBF2.cc:508
 hrktrackBF2.cc:509
 hrktrackBF2.cc:510
 hrktrackBF2.cc:511
 hrktrackBF2.cc:512
 hrktrackBF2.cc:513
 hrktrackBF2.cc:514
 hrktrackBF2.cc:515
 hrktrackBF2.cc:516
 hrktrackBF2.cc:517
 hrktrackBF2.cc:518
 hrktrackBF2.cc:519
 hrktrackBF2.cc:520
 hrktrackBF2.cc:521
 hrktrackBF2.cc:522
 hrktrackBF2.cc:523
 hrktrackBF2.cc:524
 hrktrackBF2.cc:525
 hrktrackBF2.cc:526
 hrktrackBF2.cc:527
 hrktrackBF2.cc:528
 hrktrackBF2.cc:529
 hrktrackBF2.cc:530
 hrktrackBF2.cc:531
 hrktrackBF2.cc:532
 hrktrackBF2.cc:533
 hrktrackBF2.cc:534
 hrktrackBF2.cc:535
 hrktrackBF2.cc:536
 hrktrackBF2.cc:537
 hrktrackBF2.cc:538
 hrktrackBF2.cc:539
 hrktrackBF2.cc:540
 hrktrackBF2.cc:541
 hrktrackBF2.cc:542
 hrktrackBF2.cc:543
 hrktrackBF2.cc:544
 hrktrackBF2.cc:545
 hrktrackBF2.cc:546
 hrktrackBF2.cc:547
 hrktrackBF2.cc:548
 hrktrackBF2.cc:549
 hrktrackBF2.cc:550
 hrktrackBF2.cc:551
 hrktrackBF2.cc:552
 hrktrackBF2.cc:553
 hrktrackBF2.cc:554
 hrktrackBF2.cc:555
 hrktrackBF2.cc:556
 hrktrackBF2.cc:557
 hrktrackBF2.cc:558
 hrktrackBF2.cc:559
 hrktrackBF2.cc:560
 hrktrackBF2.cc:561
 hrktrackBF2.cc:562
 hrktrackBF2.cc:563
 hrktrackBF2.cc:564
 hrktrackBF2.cc:565
 hrktrackBF2.cc:566
 hrktrackBF2.cc:567
 hrktrackBF2.cc:568
 hrktrackBF2.cc:569
 hrktrackBF2.cc:570
 hrktrackBF2.cc:571
 hrktrackBF2.cc:572
 hrktrackBF2.cc:573
 hrktrackBF2.cc:574
 hrktrackBF2.cc:575
 hrktrackBF2.cc:576
 hrktrackBF2.cc:577
 hrktrackBF2.cc:578
 hrktrackBF2.cc:579
 hrktrackBF2.cc:580
 hrktrackBF2.cc:581
 hrktrackBF2.cc:582
 hrktrackBF2.cc:583
 hrktrackBF2.cc:584
 hrktrackBF2.cc:585
 hrktrackBF2.cc:586
 hrktrackBF2.cc:587
 hrktrackBF2.cc:588
 hrktrackBF2.cc:589
 hrktrackBF2.cc:590
 hrktrackBF2.cc:591
 hrktrackBF2.cc:592
 hrktrackBF2.cc:593
 hrktrackBF2.cc:594
 hrktrackBF2.cc:595
 hrktrackBF2.cc:596
 hrktrackBF2.cc:597
 hrktrackBF2.cc:598
 hrktrackBF2.cc:599
 hrktrackBF2.cc:600
 hrktrackBF2.cc:601
 hrktrackBF2.cc:602
 hrktrackBF2.cc:603
 hrktrackBF2.cc:604
 hrktrackBF2.cc:605
 hrktrackBF2.cc:606
 hrktrackBF2.cc:607
 hrktrackBF2.cc:608
 hrktrackBF2.cc:609
 hrktrackBF2.cc:610
 hrktrackBF2.cc:611
 hrktrackBF2.cc:612
 hrktrackBF2.cc:613
 hrktrackBF2.cc:614
 hrktrackBF2.cc:615
 hrktrackBF2.cc:616
 hrktrackBF2.cc:617
 hrktrackBF2.cc:618
 hrktrackBF2.cc:619
 hrktrackBF2.cc:620
 hrktrackBF2.cc:621
 hrktrackBF2.cc:622
 hrktrackBF2.cc:623
 hrktrackBF2.cc:624
 hrktrackBF2.cc:625
 hrktrackBF2.cc:626
 hrktrackBF2.cc:627
 hrktrackBF2.cc:628
 hrktrackBF2.cc:629
 hrktrackBF2.cc:630
 hrktrackBF2.cc:631
 hrktrackBF2.cc:632
 hrktrackBF2.cc:633
 hrktrackBF2.cc:634
 hrktrackBF2.cc:635
 hrktrackBF2.cc:636
 hrktrackBF2.cc:637
 hrktrackBF2.cc:638
 hrktrackBF2.cc:639
 hrktrackBF2.cc:640
 hrktrackBF2.cc:641
 hrktrackBF2.cc:642
 hrktrackBF2.cc:643
 hrktrackBF2.cc:644
 hrktrackBF2.cc:645
 hrktrackBF2.cc:646
 hrktrackBF2.cc:647
 hrktrackBF2.cc:648
 hrktrackBF2.cc:649
 hrktrackBF2.cc:650
 hrktrackBF2.cc:651
 hrktrackBF2.cc:652
 hrktrackBF2.cc:653
 hrktrackBF2.cc:654
 hrktrackBF2.cc:655
 hrktrackBF2.cc:656
 hrktrackBF2.cc:657
 hrktrackBF2.cc:658
 hrktrackBF2.cc:659
 hrktrackBF2.cc:660
 hrktrackBF2.cc:661
 hrktrackBF2.cc:662
 hrktrackBF2.cc:663
 hrktrackBF2.cc:664
 hrktrackBF2.cc:665
 hrktrackBF2.cc:666
 hrktrackBF2.cc:667
 hrktrackBF2.cc:668
 hrktrackBF2.cc:669
 hrktrackBF2.cc:670
 hrktrackBF2.cc:671
 hrktrackBF2.cc:672
 hrktrackBF2.cc:673
 hrktrackBF2.cc:674
 hrktrackBF2.cc:675
 hrktrackBF2.cc:676
 hrktrackBF2.cc:677
 hrktrackBF2.cc:678
 hrktrackBF2.cc:679
 hrktrackBF2.cc:680
 hrktrackBF2.cc:681
 hrktrackBF2.cc:682
 hrktrackBF2.cc:683
 hrktrackBF2.cc:684
 hrktrackBF2.cc:685
 hrktrackBF2.cc:686
 hrktrackBF2.cc:687
 hrktrackBF2.cc:688
 hrktrackBF2.cc:689
 hrktrackBF2.cc:690
 hrktrackBF2.cc:691
 hrktrackBF2.cc:692
 hrktrackBF2.cc:693
 hrktrackBF2.cc:694
 hrktrackBF2.cc:695
 hrktrackBF2.cc:696
 hrktrackBF2.cc:697
 hrktrackBF2.cc:698
 hrktrackBF2.cc:699
 hrktrackBF2.cc:700
 hrktrackBF2.cc:701
 hrktrackBF2.cc:702
 hrktrackBF2.cc:703
 hrktrackBF2.cc:704
 hrktrackBF2.cc:705
 hrktrackBF2.cc:706
 hrktrackBF2.cc:707
 hrktrackBF2.cc:708
 hrktrackBF2.cc:709
 hrktrackBF2.cc:710
 hrktrackBF2.cc:711
 hrktrackBF2.cc:712
 hrktrackBF2.cc:713
 hrktrackBF2.cc:714
 hrktrackBF2.cc:715
 hrktrackBF2.cc:716
 hrktrackBF2.cc:717
 hrktrackBF2.cc:718
 hrktrackBF2.cc:719
 hrktrackBF2.cc:720
 hrktrackBF2.cc:721
 hrktrackBF2.cc:722
 hrktrackBF2.cc:723
 hrktrackBF2.cc:724
 hrktrackBF2.cc:725
 hrktrackBF2.cc:726
 hrktrackBF2.cc:727
 hrktrackBF2.cc:728
 hrktrackBF2.cc:729
 hrktrackBF2.cc:730
 hrktrackBF2.cc:731
 hrktrackBF2.cc:732
 hrktrackBF2.cc:733
 hrktrackBF2.cc:734
 hrktrackBF2.cc:735
 hrktrackBF2.cc:736
 hrktrackBF2.cc:737
 hrktrackBF2.cc:738
 hrktrackBF2.cc:739
 hrktrackBF2.cc:740
 hrktrackBF2.cc:741
 hrktrackBF2.cc:742
 hrktrackBF2.cc:743
 hrktrackBF2.cc:744
 hrktrackBF2.cc:745
 hrktrackBF2.cc:746
 hrktrackBF2.cc:747
 hrktrackBF2.cc:748
 hrktrackBF2.cc:749
 hrktrackBF2.cc:750
 hrktrackBF2.cc:751
 hrktrackBF2.cc:752
 hrktrackBF2.cc:753
 hrktrackBF2.cc:754
 hrktrackBF2.cc:755
 hrktrackBF2.cc:756
 hrktrackBF2.cc:757
 hrktrackBF2.cc:758
 hrktrackBF2.cc:759
 hrktrackBF2.cc:760
 hrktrackBF2.cc:761
 hrktrackBF2.cc:762
 hrktrackBF2.cc:763
 hrktrackBF2.cc:764
 hrktrackBF2.cc:765
 hrktrackBF2.cc:766
 hrktrackBF2.cc:767
 hrktrackBF2.cc:768
 hrktrackBF2.cc:769
 hrktrackBF2.cc:770
 hrktrackBF2.cc:771
 hrktrackBF2.cc:772
 hrktrackBF2.cc:773
 hrktrackBF2.cc:774
 hrktrackBF2.cc:775
 hrktrackBF2.cc:776
 hrktrackBF2.cc:777
 hrktrackBF2.cc:778
 hrktrackBF2.cc:779
 hrktrackBF2.cc:780
 hrktrackBF2.cc:781
 hrktrackBF2.cc:782
 hrktrackBF2.cc:783
 hrktrackBF2.cc:784
 hrktrackBF2.cc:785
 hrktrackBF2.cc:786
 hrktrackBF2.cc:787
 hrktrackBF2.cc:788
 hrktrackBF2.cc:789
 hrktrackBF2.cc:790
 hrktrackBF2.cc:791
 hrktrackBF2.cc:792
 hrktrackBF2.cc:793
 hrktrackBF2.cc:794
 hrktrackBF2.cc:795
 hrktrackBF2.cc:796
 hrktrackBF2.cc:797
 hrktrackBF2.cc:798
 hrktrackBF2.cc:799
 hrktrackBF2.cc:800
 hrktrackBF2.cc:801
 hrktrackBF2.cc:802
 hrktrackBF2.cc:803
 hrktrackBF2.cc:804
 hrktrackBF2.cc:805
 hrktrackBF2.cc:806
 hrktrackBF2.cc:807
 hrktrackBF2.cc:808
 hrktrackBF2.cc:809
 hrktrackBF2.cc:810
 hrktrackBF2.cc:811
 hrktrackBF2.cc:812
 hrktrackBF2.cc:813
 hrktrackBF2.cc:814
 hrktrackBF2.cc:815
 hrktrackBF2.cc:816
 hrktrackBF2.cc:817
 hrktrackBF2.cc:818
 hrktrackBF2.cc:819
 hrktrackBF2.cc:820
 hrktrackBF2.cc:821
 hrktrackBF2.cc:822
 hrktrackBF2.cc:823
 hrktrackBF2.cc:824
 hrktrackBF2.cc:825
 hrktrackBF2.cc:826
 hrktrackBF2.cc:827
 hrktrackBF2.cc:828
 hrktrackBF2.cc:829
 hrktrackBF2.cc:830
 hrktrackBF2.cc:831
 hrktrackBF2.cc:832
 hrktrackBF2.cc:833
 hrktrackBF2.cc:834
 hrktrackBF2.cc:835
 hrktrackBF2.cc:836
 hrktrackBF2.cc:837
 hrktrackBF2.cc:838
 hrktrackBF2.cc:839
 hrktrackBF2.cc:840
 hrktrackBF2.cc:841
 hrktrackBF2.cc:842
 hrktrackBF2.cc:843
 hrktrackBF2.cc:844
 hrktrackBF2.cc:845
 hrktrackBF2.cc:846
 hrktrackBF2.cc:847
 hrktrackBF2.cc:848
 hrktrackBF2.cc:849
 hrktrackBF2.cc:850
 hrktrackBF2.cc:851
 hrktrackBF2.cc:852
 hrktrackBF2.cc:853
 hrktrackBF2.cc:854
 hrktrackBF2.cc:855
 hrktrackBF2.cc:856
 hrktrackBF2.cc:857
 hrktrackBF2.cc:858
 hrktrackBF2.cc:859
 hrktrackBF2.cc:860
 hrktrackBF2.cc:861
 hrktrackBF2.cc:862
 hrktrackBF2.cc:863
 hrktrackBF2.cc:864
 hrktrackBF2.cc:865
 hrktrackBF2.cc:866
 hrktrackBF2.cc:867
 hrktrackBF2.cc:868
 hrktrackBF2.cc:869
 hrktrackBF2.cc:870
 hrktrackBF2.cc:871
 hrktrackBF2.cc:872
 hrktrackBF2.cc:873
 hrktrackBF2.cc:874
 hrktrackBF2.cc:875
 hrktrackBF2.cc:876
 hrktrackBF2.cc:877
 hrktrackBF2.cc:878
 hrktrackBF2.cc:879
 hrktrackBF2.cc:880
 hrktrackBF2.cc:881
 hrktrackBF2.cc:882
 hrktrackBF2.cc:883
 hrktrackBF2.cc:884
 hrktrackBF2.cc:885
 hrktrackBF2.cc:886
 hrktrackBF2.cc:887
 hrktrackBF2.cc:888
 hrktrackBF2.cc:889
 hrktrackBF2.cc:890
 hrktrackBF2.cc:891
 hrktrackBF2.cc:892
 hrktrackBF2.cc:893
 hrktrackBF2.cc:894
 hrktrackBF2.cc:895
 hrktrackBF2.cc:896
 hrktrackBF2.cc:897
 hrktrackBF2.cc:898
 hrktrackBF2.cc:899
 hrktrackBF2.cc:900
 hrktrackBF2.cc:901
 hrktrackBF2.cc:902
 hrktrackBF2.cc:903
 hrktrackBF2.cc:904
 hrktrackBF2.cc:905
 hrktrackBF2.cc:906
 hrktrackBF2.cc:907
 hrktrackBF2.cc:908
 hrktrackBF2.cc:909
 hrktrackBF2.cc:910
 hrktrackBF2.cc:911
 hrktrackBF2.cc:912
 hrktrackBF2.cc:913
 hrktrackBF2.cc:914
 hrktrackBF2.cc:915
 hrktrackBF2.cc:916
 hrktrackBF2.cc:917
 hrktrackBF2.cc:918
 hrktrackBF2.cc:919
 hrktrackBF2.cc:920
 hrktrackBF2.cc:921
 hrktrackBF2.cc:922
 hrktrackBF2.cc:923
 hrktrackBF2.cc:924
 hrktrackBF2.cc:925
 hrktrackBF2.cc:926
 hrktrackBF2.cc:927
 hrktrackBF2.cc:928
 hrktrackBF2.cc:929
 hrktrackBF2.cc:930
 hrktrackBF2.cc:931
 hrktrackBF2.cc:932
 hrktrackBF2.cc:933
 hrktrackBF2.cc:934
 hrktrackBF2.cc:935
 hrktrackBF2.cc:936
 hrktrackBF2.cc:937
 hrktrackBF2.cc:938
 hrktrackBF2.cc:939
 hrktrackBF2.cc:940
 hrktrackBF2.cc:941
 hrktrackBF2.cc:942
 hrktrackBF2.cc:943
 hrktrackBF2.cc:944
 hrktrackBF2.cc:945
 hrktrackBF2.cc:946
 hrktrackBF2.cc:947
 hrktrackBF2.cc:948
 hrktrackBF2.cc:949
 hrktrackBF2.cc:950
 hrktrackBF2.cc:951
 hrktrackBF2.cc:952
 hrktrackBF2.cc:953
 hrktrackBF2.cc:954
 hrktrackBF2.cc:955
 hrktrackBF2.cc:956
 hrktrackBF2.cc:957
 hrktrackBF2.cc:958
 hrktrackBF2.cc:959
 hrktrackBF2.cc:960
 hrktrackBF2.cc:961
 hrktrackBF2.cc:962
 hrktrackBF2.cc:963
 hrktrackBF2.cc:964
 hrktrackBF2.cc:965
 hrktrackBF2.cc:966
 hrktrackBF2.cc:967
 hrktrackBF2.cc:968
 hrktrackBF2.cc:969
 hrktrackBF2.cc:970
 hrktrackBF2.cc:971
 hrktrackBF2.cc:972
 hrktrackBF2.cc:973
 hrktrackBF2.cc:974
 hrktrackBF2.cc:975
 hrktrackBF2.cc:976
 hrktrackBF2.cc:977
 hrktrackBF2.cc:978
 hrktrackBF2.cc:979
 hrktrackBF2.cc:980
 hrktrackBF2.cc:981
 hrktrackBF2.cc:982
 hrktrackBF2.cc:983