ROOT logo
// : Author  J.Markert

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
//
// HMdcTrackingEff
//
// This class fills two ntuples for single lepton tracks and pairs to estimate
// the tracking efficiency in simulation.
// This tasks needs as input GeantKine, GeantTof, GeantShower ,HMdcTrkCand, HMdcSegSim,
// HMdcTrkCandIdeal and HMdcSegIdeal categories. The MdcTaskSet and HMdcIdealTracking
// with setup of paralle output categories has to run in front to fill the categories.
//
// In the following the variables of the ntuples are described.
//----------------------------------
// SINGLE
// single[0] =evNr
//
// GEANT KINE information
// single[1] =sector    (from inner MdcSegIdeal)
// single[2] =ptrk      (parent Track number)
// single[3] =genInfo   GEANT generator
// single[4] =genInfo1  GEANT generator
// single[5] =genInfo2  GEANT generator
// single[6] =gID       GEANT particle ID
// single[7] =mom       GEANT momentum
// single[8] =vx        GEANT vertex
// single[9] =vy        GEANT vertex
// single[10]=vz        GEANT vertex

// inner SEG from ideal tracking
// single[11]=rId_1
// single[12]=z_1
// single[13]=thetaId_1 degree!
// single[14]=PhiId_1   degree!
// single[15]=nWId1_1   number of wires in first  module of inner seg
// single[16]=nWId2_1   number of wires in second module of inner seg

// outer SEG from ideal tracking
// single[17]=rId_2
// single[18]=zId_2
// single[19]=thetaId_2 degree!
// single[20]=PhiId_2   degree!
// single[21]=nWId1_2   number of wires in first  module of outer seg
// single[22]=nWId2_2   number of wires in first  module of outer seg

// inner SEG  from reconstruction
// single[23]=r_1
// single[24]=z_1
// single[25]=theta_1
// single[26]=Phi_1
// single[27]=nW1_1
// single[28]=nW2_1

// outer SEG  from reconstruction
// single[29]=r_2
// single[30]=z_2
// single[31]=theta_2
// single[32]=Phi_2
// single[33]=nW1_2
// single[34]=nW2_2
// single[35]=chi2_1;    // chi2 from inner segment
// single[36]=chi2_2;    // chi2 from outer segment
// single[37]=foundPair; // 0 : not part of reconstructed pair , 1: part of pair
// single[38]=nTracks;   // number of ideal tracks per event
// single[39]=meta;      // 0: hit in GeantShower,
//                          1: hit in GeantTof,
//                         -1: no Geant meta hit,
//                         -2: hit in GeantShower in other sector than MdcSeg
//                         -3: hit in GeantTof in other sector than MdcSeg
//
//------------------------------------------------
//
// PAIRS
// The variables are analog to the above besides
// the fact that two particles have to indexed
//
// pairs[0] =evNr
//
// GEANT KINE particel 1
// pairs[1] =sector_1
// pairs[2] =ptrk_1
// pairs[3] =genInfo_1
// pairs[4] =genInfo1_1
// pairs[5] =genInfo2_1
// pairs[6] =gID_1
// pairs[7] =mom_1
// pairs[8] =vx_1
// pairs[9] =vy_1
// pairs[10]=vz_1
//
// inner SEG from IDEAL tracking for particle 1
// pairs[11]=rId_1_1
// pairs[12]=z_1_1
// pairs[13]=thetaId_1_1
// pairs[14]=PhiId_1_1
// pairs[15]=nWId1_1_1
// pairs[16]=nWId2_1_1
//
// outer SEG from IDEAL tracking for particle 1
// pairs[17]=rId_2_1
// pairs[18]=zId_2_1
// pairs[19]=thetaId_2_1
// pairs[20]=PhiId_2_1
// pairs[21]=nWId1_2_1
// pairs[22]=nWId2_2_1
//
// inner SEG  from reconstruction for particle 1
// pairs[23]=r_1_1
// pairs[24]=z_1_1
// pairs[25]=theta_1_1
// pairs[26]=Phi_1_1
// pairs[27]=nW1_1_1
// pairs[28]=nW2_1_1
//
// outer SEG  from reconstruction for particle 1
// pairs[29]=r_2_1
// pairs[30]=z_2_1
// pairs[31]=theta_2_1
// pairs[32]=Phi_2_1
// pairs[33]=nW1_2_1
// pairs[34]=nW2_2_1
// pairs[35]=chi2_1_1;
// pairs[36]=chi2_2_1;
//
// GEANT KINE particle 2
// pairs[37]=sector_2
// pairs[38]=ptrk_2
// pairs[39]=genInfo_2
// pairs[49]=genInfo1_2
// pairs[41]=genInfo2_2
// pairs[42]=gID_2
// pairs[43]=mom_2
// pairs[44]=vx_2
// pairs[45]=vy_2
// pairs[46]=vz_2
//
// inner SEG from IDEAL tracking for particle 2
// pairs[47]=rId_1_2
// pairs[48]=z_1_2
// pairs[49]=thetaId_1_2
// pairs[50]=PhiId_1_2
// pairs[51]=nWId1_1_2
// pairs[52]=nWId2_1_2
//
// outer SEG from IDEAL tracking for particle 2
// pairs[53]=rId_2_2
// pairs[54]=zId_2_2
// pairs[55]=thetaId_2_2
// pairs[56]=PhiId_2_2
// pairs[57]=nWId1_2_2
// pairs[58]=nWId2_2_2

// inner SEG from reconstruction for particle 2
// pairs[59]=r_1_2
// pairs[60]=z_1_2
// pairs[61]=theta_1_2
// pairs[62]=Phi_1_2
// pairs[63]=nW1_1_2
// pairs[64]=nW2_1_2
//
// outer SEG from reconstruction for particle 2
// pairs[65]=r_2_2
// pairs[66]=z_2_2
// pairs[67]=theta_2_2
// pairs[68]=Phi_2_2
// pairs[69]=nW1_2_2
// pairs[70]=nW2_2_2
//
// pairs[71]=chi2_1_2;
// pairs[72]=chi2_2_2;
//
// pairs[73]=nTracks;      number of tracks per event
// pairs[74]=meta_1;       meta hit for particle 1 (see description above)
// pairs[75]=meta_2;       meta hit for particle 2
// pairs[76]=openingAngle; opening angle of the pair  (degree)
// pairs[77]=invM;         invariant Mass of the pair (Mev/c2)
// pairs[78]=pt;           transvers mom for pair
// pairs[79]=rapidity;
// pairs[80]=gPairPhi     phi   of pair in degree (Geant)
// pairs[81]=gPairTheta   theta of pair in degree (Geant)

// pairs[82]=openingAngle_segId
// pairs[83]=invM_segId;
// pairs[84]=pt_segId;
// pairs[85]=rapidity_segId;
// pairs[86]=pairPhi_segId    phi   of pair in degree (ideal segment)
// pairs[87]=pairTheta_segId  theta of pair in degree (ideal segment)

// pairs[88]=openingAngle_seg
// pairs[89]=invM_seg;
// pairs[90]=pt_seg;
// pairs[91]=rapidity_seg;
// pairs[92]=pairPhi_seg      phi   of pair in degree (segment)
// pairs[93]=pairTheta_seg    theta of pair in degree (segment)

// pairs[94]=gphi_1;      phi in degree sector coord. (geant) inner seg track1
// pairs[95]=gtheta_1;    theta in degree sector coord. (geant) inner seg track1
// pairs[96]=gphi_2;      phi in degree sector coord. (geant) inner seg track2
// pairs[97]=gtheta_2;    theta in degree sector coord. (geant) inner seg track2
//
///////////////////////////////////////////////////////////////////////////////
using namespace std;
#include "hmdctrackingeff.h"
#include "hmdcdef.h"
#include "hgeantdef.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hevent.h"
#include "hcategory.h"

#include "hmatrixcategory.h"
#include "hlinearcategory.h"
#include "hmdcsegsim.h"
#include "hmdcidealclasses.h"
#include "hmdctrkcand.h"
#include "hgeantkine.h"
#include "hgeantshower.h"
#include "hgeanttof.h"
#include "hphysicsconstants.h"

#include <iostream> 
#include <iomanip>
#include <stdlib.h>
#include "TDirectory.h"
#include "TNtuple.h"
#include "TStopwatch.h"
#include "TLorentzVector.h"

ClassImp(HMdcTrackingEff)

HMdcTrackingEff::HMdcTrackingEff(void) {
    // Default constructor calls the function setParContainers().
    initVariables();
}

HMdcTrackingEff::HMdcTrackingEff(const Text_t* name,const Text_t* title)
:  HReconstructor(name,title)
{
    // Constructor calls the constructor of class HReconstructor with the name
    // and the title as arguments. It also calls the function setParContainers().
    initVariables();
}

HMdcTrackingEff::~HMdcTrackingEff(void) {
  // destructor deletes the iterator
}
void HMdcTrackingEff::initVariables()
{
    // init of all variables

    offsetSeg1Kine=nEvnt;                        //! starting index in data word for particle 1 (kine)
    offsetSeg2Kine=nEvnt+nKine+nSeg+nChi2;       //! starting index in data word for particle 2 (kine)
    offsetSeg1    =nEvnt+nKine;                  //! starting index in data word for seg1       (seg)
    offsetSeg2    =nEvnt+nKine+nSeg+nChi2+nKine; //! starting index in data word for seg2       (seg)
    offsetChi2    =nSeg;                         //! starting index in data word for chi2 relative to seg

    offsetPair    =nEvnt+nKine+nSeg+nChi2+nKine+nSeg+nChi2; //! starting index in data word for pair   infos
    offsetSingle  =nEvnt+nKine+nSeg+nChi2;                  //! starting index in data word for single infos

    resetIndexTable(indexTable,maxTrks);
    fNameRoot="ntuple_tracking_eff.root";
}

void HMdcTrackingEff::setOutputRoot(TString fname)
{
    // Sets rootfile output of HMdcTrackinEf where ntuples were written.
    //
    fNameRoot="";
    if(fname.CompareTo("")!=0) fNameRoot = fname;
    else {
        Warning("setOutputRoot()","Empty string for filename recieved, will use ntuple_tracking_eff.root instead");
	fNameRoot ="ntuple_tracking_eff.root";
    }
}

Bool_t HMdcTrackingEff::init(void)
{

    catmHMdcTrkCand=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcTrkCand);
    if (!catmHMdcTrkCand) {
	Error("init()","No MdcTrkCand cat available!");
	exit(1);
    } else iterTrkCand=(TIterator*)catmHMdcTrkCand->MakeIterator();

    catmHMdcTrkCandIdeal=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcTrkCandIdeal);
    if (!catmHMdcTrkCandIdeal) {
	Error("init()","No MdcTrkCandIdeal cat available!");
	exit(1);
    } else iterTrkCandIdeal=(TIterator*)catmHMdcTrkCandIdeal->MakeIterator();

    catmHMdcSegSim=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcSeg);
    if (!catmHMdcSegSim) {
	Error("init()","No MdcSegSim cat available!");
	exit(1);
    }

    catmHMdcSegIdeal=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catMdcSegIdeal);
    if (!catmHMdcSegIdeal) {
	Error("init()","No MdcSegIdeal cat available!");
	exit(1);
    }

    catlHGeantKine=(HLinearCategory*)gHades->getCurrentEvent()->getCategory(catGeantKine);
    if (!catlHGeantKine) {
	Error("init()","No GeantKine cat available!");
	exit(1);
    }

    catmHGeantShower=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catShowerGeantRaw);
    if (!catmHGeantShower) {
	Error("init()","No GeantShower cat available!");
	exit(1);
    }  iterGeantShower=(TIterator*)catmHGeantShower->MakeIterator();

    catmHGeantTof=(HMatrixCategory*)gHades->getCurrentEvent()->getCategory(catTofGeantRaw);
    if (!catmHGeantTof) {
	Error("init()","No GeantShower cat available!");
	exit(1);
    }  iterGeantTof=(TIterator*)catmHGeantTof->MakeIterator();




    out=new TFile(fNameRoot.Data(),"RECREATE");
    out->cd();
    single=new TNtuple("single","single","evNr:sector:ptrk:genInfo:genInfo1:genInfo2:gID:mom:vx:vy:vz:"
		       "rId_1:zId_1:thetaId_1:phiId_1:nWId1_1:nWId2_1:"
		       "rId_2:zId_2:thetaId_2:phiId_2:nWId1_2:nWId2_2:"
		       "r_1:z_1:theta_1:phi_1:nW1_1:nW2_1:"
		       "r_2:z_2:theta_2:phi_2:nW1_2:nW2_2:"
		       "chi2_1:chi2_2:foundPair:nTracks:meta");

    pairs=new TNtuple("pairs","pairs","evNr:"
		      "sector_1:ptrk_1:genInfo_1:genInfo1_1:genInfo2_1:gID_1:mom_1:vx_1:vy_1:vz_1:"
		      "rId_1_1:zId_1_1:thetaId_1_1:phiId_1_1:nWId1_1_1:nWId2_1_1:"
		      "rId_2_1:zId_2_1:thetaId_2_1:phiId_2_1:nWId1_2_1:nWId2_2_1:"
		      "r_1_1:z_1_1:theta_1_1:phi_1_1:nW1_1_1:nW2_1_1:"
		      "r_2_1:z_2_1:theta_2_1:phi_2_1:nW1_2_1:nW2_2_1:"
		      "chi2_1_1:chi2_2_1:"
		      "sector_2:ptrk_2:genInfo_2:genInfo1_2:genInfo2_2:gID_2:mom_2:vx_2:vy_2:vz_2:"
		      "rId_1_2:zId_1_2:thetaId_1_2:phiId_1_2:nWId1_1_2:nWId2_1_2:"
		      "rId_2_2:zId_2_2:thetaId_2_2:phiId_2_2:nWId1_2_2:nWId2_2_2:"
		      "r_1_2:z_1_2:theta_1_2:phi_1_2:nW1_1_2:nW2_1_2:"
		      "r_2_2:z_2_2:theta_2_2:phi_2_2:nW1_2_2:nW2_2_2:"
		      "chi2_1_2:chi2_2_2:"
		      "nTracks:meta_1:meta_2:"
		      "openingAngle:invM:pt:rapidity:pairPhi:pairTheta:"
		      "openingAngle_segId:invM_segId:pt_segId:rapidity_segId:pairPhi_segId:pairTheta_segId:"
		      "openingAngle_seg:invM_seg:pt_seg:rapidity_seg:pairPhi_seg:pairTheta_seg:"
		      "gphi_1:gtheta_1:gphi_2:gtheta_2");


    fActive=kTRUE;
    return kTRUE;
}
void HMdcTrackingEff::getSegPointers(Int_t* iSId_1,HMdcSegSim** pSId_1,
				     HMdcTrkCand* trkCandIdeal,
				     HMatrixCategory* catmHMdcSegIdeal,
				     Int_t mode)
{
    // get pointer to segments and index values for TrkCand
    // mode ==0 both segments are done
    // mode ==1 inner segment is done + indseg2=-2

    iSId_1[0]=trkCandIdeal->getSeg1Ind();
    iSId_1[1]=trkCandIdeal->getSeg2Ind();

    for(Int_t iseg=0;iseg<2;iseg++)
    {
	if(iSId_1[iseg]!=-1)
	{
	    pSId_1[iseg]=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iSId_1[iseg]);
	}  else pSId_1[iseg]=0;
    }
    if(mode==1)
    {
	// looking just for inner segment
        pSId_1[1] =0;
	iSId_1[1] =-2;
    }
}
HGeantKine* HMdcTrackingEff::getKineInfo(Int_t trkNr,Int_t& parentTrk,Int_t& gID,
					 Float_t& generatorInfo,
					 Float_t& generatorInfo1,
					 Float_t& generatorInfo2,
					 HLinearCategory* catlHGeantKine)
{
    // retrieves the Geant ID, parentTrack , generatorInfo,
    // generatorInfo1 and generatorInfo2 for Geant track trkNr
    HGeantKine* kine=(HGeantKine*)catlHGeantKine->getObject(trkNr-1);
    gID=kine->getID();
    kine->getGenerator(generatorInfo,generatorInfo1,generatorInfo2);
    parentTrk=kine->getParentTrack();
    return kine;
}
Bool_t HMdcTrackingEff::sameTrkSegments(Int_t trkNr,HMdcSegSim** pSeg,Int_t mode)
{
    // checks if the Geant trkNr of inner and outer segment is the same
    // mode==0 both segments are checked
    // mode==1 inner segment is checked
    if(mode==0)
    {
	if(!pSeg[0] || !pSeg[1])
	{
	    Error("sameTrkSegments()","Zero pointer in mode 0 : %p %p !",pSeg[0],pSeg[1]);
            exit(1);
	}
	if(trkNr==pSeg[0]->getTrack(0)&&
	   trkNr==pSeg[1]->getTrack(0)) {return kTRUE ;}
	else                            {return kFALSE;}
    }else{

	if(!pSeg[0])
	{
	    Error("sameTrkSegments()","Zero pointer in mode 1 : %p !",pSeg[0]);
            exit(1);
	}
        if(trkNr==pSeg[0]->getTrack(0)) {return kTRUE ;}
	else                            {return kFALSE;}
    }
}

HMdcTrkCand* HMdcTrackingEff::findSameRealCand(Int_t trkNr,Int_t* iSeg,HMdcSegSim** pSeg,
					       TIterator* iterTrkCand,
					       HMatrixCategory* catmHMdcTrkCand,
					       HMatrixCategory* catmHMdcSeg,
					       HLinearCategory* catlHGeantKine)
{
    // checks if the Geant trkNr of inner and outer segment is the same
    // if only inner segment is available only this is checked
    // if both segments are there both are checked
    // a loop over all candidates is performed
    // if the match of outer segment in all candidates fails
    // the first object of trkCand is used
    // if no match is found 0 is returned.
    // the indexes of both segments are stored in iSeg. indseg==-1 means
    // the segment has not been found. indseg==-2 says thare have been
    // candidates, but none of them mathed the trk number.

    HMdcTrkCand* trkCnd=0;

    iSeg[0]=iSeg[1]=-999;
    pSeg[0]=pSeg[1]= 0;

    Bool_t found=kFALSE;
    iterTrkCand->Reset();
    while ( (trkCnd=(HMdcTrkCand*)iterTrkCand->Next()) != 0 )
    {
	Int_t nOuterSeg=trkCnd->getNCandForSeg1();

	if(nOuterSeg==-1)
	{   // this is not the first object , skip it!
	    continue;
	}
	getSegPointers(iSeg,pSeg,trkCnd,catmHMdcSeg,1);
	if(!sameTrkSegments(trkNr,pSeg,1)) continue; // inner segment does not match track number!
        
	if(nOuterSeg==0)
	{
	    //-------------------------------------------------------------------
	    // no outer segments:
	    found=kTRUE;
	    break; // go out of outer while loop
            //-------------------------------------------------------------------
	}
	else
	{
            //-------------------------------------------------------------------
	    // up to here the inner segment is matched,
	    // but we have more than 1 outer candidate:
	    // loop over all candidates to match the track.
	    // if no outer candidate is matched the first
	    // object will be used.

	    Int_t  nextObjInd=0;
            Bool_t foundOuter=kFALSE;

	    HMdcTrkCand* pTrkCnd=trkCnd;
	    while (nextObjInd>=0)
	    {
		// Next HMdcTrkCand object
		nextObjInd = pTrkCnd->getNextCandInd();
		if(nextObjInd>=0)
		{
		    pTrkCnd = (HMdcTrkCand*)catmHMdcTrkCand->getObject(nextObjInd);
		    getSegPointers(iSeg,pSeg,pTrkCnd,catmHMdcSeg);
	  
		    if(sameTrkSegments(trkNr,pSeg))
		    {   // matched inner and outer segment found
                        found     =kTRUE;
			foundOuter=kTRUE;
                        trkCnd    =pTrkCnd;
			break; // go out of inner while loop
		    }
		    else
		    {
			found     =kFALSE;
			foundOuter=kFALSE;
		    }
		}
	    }
            if(foundOuter==kTRUE) break; // go out of outer while loop
	    if(foundOuter==kFALSE)
	    { // inner segment found but no outer match
              // in this case we take the first object
		getSegPointers(iSeg,pSeg,trkCnd,catmHMdcSeg,1);
                found=kTRUE;
                break;
	    }
            //-------------------------------------------------------------------
	}
    }
    if(found==kFALSE)
    {
	trkCnd =0;
	iSeg[0]=iSeg[1]=-999;
	pSeg[0]=pSeg[1]= 0;
    }

    return trkCnd;
}
TString HMdcTrackingEff::getProcessString(Float_t generatorInfo1_1)
{
    // decodes the generatorinfo1 into a string for printing

    TString info="Unknown process ";
    if     (generatorInfo1_1==7051) info="pi0 dalitz";
    else if(generatorInfo1_1==7001) info="conversion";
    else if(generatorInfo1_1==17051)info="eta dalitz";
    else if(generatorInfo1_1==34051)info="delta dalitz";
    else if(generatorInfo1_1==41)   info="rho direct";
    else if(generatorInfo1_1==52051)info="omega dalitz";
    else if(generatorInfo1_1==52)   info="omega direct";
    else   info+=generatorInfo1_1;
    return info;
}
Bool_t HMdcTrackingEff::sameDecay(Int_t parenttrk_1,Int_t parenttrk_2,
				  Float_t generatorInfo1_1,Float_t generatorInfo1_2,
				  Float_t generatorInfo2_1,Float_t generatorInfo2_2)
{
    // checks if a lepton track comes from
    // the same source
    if(parenttrk_1 == 0 &&
       parenttrk_2 == 0 &&
       generatorInfo1_1 == generatorInfo1_2 &&
       generatorInfo2_1 == generatorInfo2_2 )
    {
	return kTRUE;
    }
    else
    {
	return kFALSE;
    }
}
void HMdcTrackingEff::resetIndexTable(Int_t* indexTable,Int_t n)
{
    // resets the first n slots of indextable
    if(n>maxTrks) n=maxTrks;
    for(Int_t ii=0;ii<sizeInd*n;ii++)
    {
	indexTable[ii]=-99;
    }
}
Bool_t HMdcTrackingEff::fillIndexTable(Int_t* indexTable,Int_t& track_ct,
				       Int_t trkNrId_1,
				       Int_t* indSegId_1,
				       Int_t* indSeg_1,
				       HLinearCategory* catlHGeantKine)
{
    // fills the index table for track track_ct
    // the maxium number of tracks is maxTrks.
    // the tracks are stored in format
    // indexTable[track_ct*sizeInd+xi]=varx where xi=0-sizeInd and varx are the
    // values in the following table:
    // indKine, indSeg1_id, indSeg2_id, indSeg1, indSeg2, indUsed
    // 0        1           2           3        4        5
    // parentTrk, geantInfo, geantInfo1, geantInfo2
    // 6          7          8           9


    if(track_ct<maxTrks)
    {
        //-------------------------------------------------------------
	// check for Double_t filling
        Bool_t found=kFALSE;
	for(Int_t i=0;i<track_ct;i++)
	{
	    if(indexTable[i*sizeInd+3]==indSeg_1[0]&&indSeg_1[0]>=0)
	    {
		Warning("fillIndexTable()","Same candidate put twice! Skipping!");
                found=kTRUE;
		break;
	    }
	}
	if(!found)
	{
	    //--------------------------------------------------------------
	    Int_t pTrk,gID;
	    Float_t Info,Info1,Info2;
	    getKineInfo(trkNrId_1,pTrk,gID,Info,Info1,Info2,catlHGeantKine);

	    indexTable[track_ct*sizeInd+0]=trkNrId_1;
	    indexTable[track_ct*sizeInd+1]=indSegId_1[0];
	    indexTable[track_ct*sizeInd+2]=indSegId_1[1];
	    indexTable[track_ct*sizeInd+3]=indSeg_1[0];
	    indexTable[track_ct*sizeInd+4]=indSeg_1[1];
	    indexTable[track_ct*sizeInd+5]=0;

	    indexTable[track_ct*sizeInd+6]=pTrk;
	    indexTable[track_ct*sizeInd+7]=(Int_t)Info;
	    indexTable[track_ct*sizeInd+8]=(Int_t)Info1;
	    indexTable[track_ct*sizeInd+9]=(Int_t)Info2;

	    track_ct++; // count up slot number

	} else return kFALSE;
    }else{
	Warning("fillIndexTable()","Number of Tracks larger than maxTrks! skipped!!");
	return kFALSE;
    }
    return kTRUE;
}


void HMdcTrackingEff::printIndexTable(Int_t* indexTable,Int_t track_ct)
{
    // prints one slot track_ct to the screen
    if(track_ct<maxTrks)
    {

	cout<<"trkNr "    <<indexTable[track_ct*sizeInd+0]<<endl;
	cout<<"\t s1_id " <<indexTable[track_ct*sizeInd+1]<<endl;
	cout<<"\t s2_id " <<indexTable[track_ct*sizeInd+2]<<endl;
	cout<<"\t s1    " <<indexTable[track_ct*sizeInd+3]<<endl;
	cout<<"\t s2    " <<indexTable[track_ct*sizeInd+4]<<endl;
	cout<<"\t used  " <<indexTable[track_ct*sizeInd+5]<<endl;
	cout<<"\t pTrk  " <<indexTable[track_ct*sizeInd+6]<<endl;
	cout<<"\t I     " <<indexTable[track_ct*sizeInd+7]<<endl;
	cout<<"\t I1    " <<indexTable[track_ct*sizeInd+8]<<endl;
	cout<<"\t I2    " <<indexTable[track_ct*sizeInd+9]<<endl;

    }else{
	Warning("fillPrintTable()","Number of Tracks larger than maxTrks! skipped!!");
    }
}

Int_t HMdcTrackingEff::findPartner(Int_t* iT,Int_t size,Int_t i)
{
    // returns the slot in indexTable which contains a partner track
    // to track i from the same decay (pair)
    // if nothing is found -1 is returned
    // the found tracks are marked in the table as used
    // self combinations are rejected.
    if(size<maxTrks)
    {
	for(Int_t j=0;j<size;j++)
	{
	    if(iT[i*sizeInd+5]==1  ||iT[j*sizeInd+5]==1  ) continue; // already used combinations
	    if(iT[i*sizeInd+6]==-99||iT[j*sizeInd+6]==-99) continue; // not filled slots
	    if(i==j)                                       continue; // don't combine the same tracks

	    if(sameDecay(iT[i*sizeInd+6],iT[j*sizeInd+6],
			 iT[i*sizeInd+8],iT[j*sizeInd+8],
			 iT[i*sizeInd+9],iT[j*sizeInd+9]))
	    {
		// mark the tracks as used
		iT[i*sizeInd+5]=1;
		iT[j*sizeInd+5]=1;
		return j;
	    }
	}
    }else{
	Warning("findPartner()","Number of Tracks larger than maxTrks! skipped!!");
    }
    return -1;
}
Bool_t HMdcTrackingEff::hasPartner(Int_t* iT,Int_t size,Int_t i)
{
    // checks if track has been used in pair
    if(size<maxTrks)
    {
	if(iT[i*sizeInd+5]==1) return kTRUE;
	else return kFALSE;
    }else{
	Warning("hasPartner()","Number of Tracks larger than maxTrks! skipped!!");
    }
    return kFALSE;
}

void HMdcTrackingEff::fillSegData(Int_t ind,Int_t* iT,Float_t* data,Int_t offset,
				  HMatrixCategory* catmHMdcSegIdeal,
				  HMatrixCategory* catmHMdcSegSim)
{
    // indKine, indSeg1_id, indSeg2_id, indSeg1, indSeg2, indUsed
    // 0        1           2           3        4        5
    // parentTrk, geantInfo, geantInfo1, geantInfo2
    // 6          7          8           9
    HMdcSegSim* seg=0;
    if(iT[ind*sizeInd+1]>=0)
    {
	seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iT[ind*sizeInd+1]);
	data[offset+0]=seg->getRprime();
	data[offset+1]=seg->getRprime();
	data[offset+2]=seg->getTheta()*TMath::RadToDeg();
	data[offset+3]=seg->getPhi()  *TMath::RadToDeg();
	data[offset+4]=seg->getSumWires(0);
	data[offset+5]=seg->getSumWires(1);
    }
    if(iT[ind*sizeInd+2]>=0)
    {
	seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iT[ind*sizeInd+2]);
	data[offset+6] =seg->getRprime();
	data[offset+7] =seg->getRprime();
	data[offset+8] =seg->getTheta()*TMath::RadToDeg();
	data[offset+9] =seg->getPhi()  *TMath::RadToDeg();
	data[offset+sizeInd]=seg->getSumWires(0);
	data[offset+11]=seg->getSumWires(1);
    }
    if(iT[ind*sizeInd+3]>=0)
    {
	seg=(HMdcSegSim*)catmHMdcSegSim->getObject(iT[ind*sizeInd+3]);
	data[offset+12]=seg->getRprime();
	data[offset+13]=seg->getRprime();
	data[offset+14]=seg->getTheta()*TMath::RadToDeg();
	data[offset+15]=seg->getPhi()  *TMath::RadToDeg();
	data[offset+16]=seg->getSumWires(0);
	data[offset+17]=seg->getSumWires(1);

        data[offset+offsetChi2+0]=seg->getChi2();
    }
    if(iT[ind*sizeInd+4]>=0)
    {
	seg=(HMdcSegSim*)catmHMdcSegSim->getObject(iT[ind*sizeInd+4]);
	data[offset+18]=seg->getRprime();
	data[offset+19]=seg->getRprime();
	data[offset+20]=seg->getTheta()*TMath::RadToDeg();
	data[offset+21]=seg->getPhi()  *TMath::RadToDeg();
	data[offset+22]=seg->getSumWires(0);
	data[offset+23]=seg->getSumWires(1);

	data[offset+offsetChi2+1]=seg->getChi2();
    }
}
void HMdcTrackingEff::fillKineData(Int_t& sec,Int_t ind,Int_t* iT,Float_t* data,Int_t offset,
				   HMatrixCategory* catmHMdcSegIdeal,
				   HLinearCategory* catlHGeantKine)
{
     // indKine, indSeg1_id, indSeg2_id, indSeg1, indSeg2, indUsed
    // 0        1           2           3        4        5
    // parentTrk, geantInfo, geantInfo1, geantInfo2
    // 6          7          8           9
    HGeantKine* kine=0;
    HMdcSegSim* seg=0;
    seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(iT[ind*sizeInd+1]);

    if(iT[ind*sizeInd+0]>=0&&seg)
    {
        sec=seg->getSec();

	Int_t pTrk,gID;
	Float_t Info,Info1,Info2;
	kine=getKineInfo(iT[ind*sizeInd+0],pTrk,gID,Info,Info1,Info2,catlHGeantKine);
	Float_t vx,vy,vz;
        kine->getVertex(vx,vy,vz);
	data[offset+0]=seg->getSec();
	data[offset+1]=pTrk;
	data[offset+2]=Info;
        data[offset+3]=Info1;
        data[offset+4]=Info2;
        data[offset+5]=gID;
        data[offset+6]=kine->getTotalMomentum();
        data[offset+7]=vx;
        data[offset+8]=vy;
        data[offset+9]=vz;

        

    }else{
	Warning("fillKineData()","Segment Pointer 0 or kine index <0 !");
    }
}
Int_t HMdcTrackingEff::findGeantMeta(Int_t trkNr,Int_t sector,
				     TIterator* iterGeantTof,
				     HMatrixCategory* catmHGeantTof,
				     TIterator* iterGeantShower,
				     HMatrixCategory* catmHGeantShower)
{
    // search meta (shower and meta) for the same Geant track
    // in sector sector.
    // return codes:
    // -1 if nothing has been found
    // -2 if showerhit has been found in other sector
    // -3 if tofhit has been found in other sector
    // 0 if hit has been found in shower (system 0)
    // 1 if hit has been found in tof    (system 1)

    HGeantShower* showerhit;
    iterGeantShower->Reset();
    while ( (showerhit=(HGeantShower*)iterGeantShower->Next()) != 0 )
    {
        if(showerhit->getTrack() !=trkNr)  continue; // find same track
        if(showerhit->getSector()==sector) return 0; // if track was found in same sector
        else return -2;                              // no match in same sector
    }
    HGeantTof* tofhit;
    iterGeantTof->Reset();
    while ( (tofhit=(HGeantTof*)iterGeantTof->Next()) != 0 )
    {
        if(tofhit->getTrack() !=trkNr)  continue;   // find same track
        if(tofhit->getSector()==sector) return 1;   // if track was found in same sector
        else return -3;                             // no match in same sector
    }

    return -1;
}

void HMdcTrackingEff::fillNTuple(Int_t evNr,Int_t* indexTable,Int_t size,
				 HMatrixCategory* catmHMdcSegSim,
				 HMatrixCategory* catmHMdcSegIdeal,
				 HLinearCategory* catlHGeantKine,
				 TIterator* iterGeantTof,
				 HMatrixCategory* catmHGeantTof,
				 TIterator* iterGeantShower,
				 HMatrixCategory* catmHGeantShower,
				 TNtuple* single,TNtuple* pairs)
{
    resetDataArray();

    TLorentzVector vL1;
    TLorentzVector vL2;

    TLorentzVector vL1_segId;
    TLorentzVector vL2_segId;
    TLorentzVector vL1_seg;
    TLorentzVector vL2_seg;

    TVector3 v1;
    TVector3 v2;

    Int_t sec_1,sec_2;
    if(size<maxTrks)
    {
	for(Int_t i=0;i<size;i++)
	{
	    Int_t j=findPartner(indexTable,size,i);
	    if(j!=-1)
	    {
		dPairs[0]=evNr;

		fillKineData(sec_1,i,indexTable,dPairs,offsetSeg1Kine,catmHMdcSegIdeal,catlHGeantKine);
		fillSegData (      i,indexTable,dPairs,offsetSeg1    ,catmHMdcSegIdeal,catmHMdcSegSim);
                fillKineData(sec_2,j,indexTable,dPairs,offsetSeg2Kine,catmHMdcSegIdeal,catlHGeantKine);
		fillSegData (      j,indexTable,dPairs,offsetSeg2    ,catmHMdcSegIdeal,catmHMdcSegSim);

		Float_t gphi_1,gphi_2,gtheta_1,gtheta_2;

		HGeantKine* kine;
                kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[i*sizeInd+0]-1);
		fillVectorFromKine(vL1,i);

		kineToSegPhiThetaDeg(kine,gtheta_1,gphi_1);

		if(indexTable[i*sizeInd+1]>=0&&indexTable[j*sizeInd+1]>=0)
		{
		    fillVectorFromSeg(vL1_segId,i,0);
		}
                if(indexTable[i*sizeInd+3]>=0&&indexTable[j*sizeInd+3]>=0)
		{
                    fillVectorFromSeg(vL1_seg,i,1);
		}

		kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[j*sizeInd+0]-1);

		fillVectorFromKine(vL2,j);

		kineToSegPhiThetaDeg(kine,gtheta_2,gphi_2);

		if(indexTable[i*sizeInd+1]>=0&&indexTable[j*sizeInd+1]>=0)
		{
		    fillVectorFromSeg(vL2_segId,j,0);
		}

		if(indexTable[i*sizeInd+3]>=0&&indexTable[j*sizeInd+3]>=0)
		{
		    fillVectorFromSeg(vL2_seg,j,1);
		}

                TLorentzVector dilep      = vL1       + vL2;
                TLorentzVector dilep_segId= vL1_segId + vL2_segId;
                TLorentzVector dilep_seg  = vL1_seg   + vL2_seg;

                dPairs[offsetPair+0] =size;
                dPairs[offsetPair+1] =findGeantMeta(indexTable[i*sizeInd+0],sec_1,iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower);
                dPairs[offsetPair+2] =findGeantMeta(indexTable[j*sizeInd+0],sec_2,iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower);
		dPairs[offsetPair+3] =vL2.Angle(vL1.Vect())*TMath::RadToDeg();
                dPairs[offsetPair+4] =dilep.M();
		dPairs[offsetPair+5] =dilep.Pt();
                dPairs[offsetPair+6] =dilep.Rapidity();
                dPairs[offsetPair+7] =pairPhiToLabDeg(dilep.Phi());
                dPairs[offsetPair+8] =pairThetaToLabDeg(dilep.Theta());

		if(indexTable[i*sizeInd+1]>=0&&indexTable[j*sizeInd+1]>=0)
		{
		    dPairs[offsetPair+9] =vL2_segId.Angle(vL1_segId.Vect())*TMath::RadToDeg();
		    dPairs[offsetPair+10]=dilep_segId.M();
		    dPairs[offsetPair+11]=dilep_segId.Pt();
		    dPairs[offsetPair+12]=dilep_segId.Rapidity();
		    dPairs[offsetPair+13]=pairPhiToLabDeg(dilep_segId.Phi());
		    dPairs[offsetPair+14]=pairThetaToLabDeg(dilep_segId.Theta());
		}
		if(indexTable[i*sizeInd+3]>=0&&indexTable[j*sizeInd+3]>=0)
		{
		    dPairs[offsetPair+15]=vL2_seg.Angle(vL1_seg.Vect())*TMath::RadToDeg();
		    dPairs[offsetPair+16]=dilep_seg.M();
		    dPairs[offsetPair+17]=dilep_seg.Pt();
		    dPairs[offsetPair+18]=dilep_seg.Rapidity();
		    dPairs[offsetPair+19]=pairPhiToLabDeg(dilep_seg.Phi());
		    dPairs[offsetPair+20]=pairThetaToLabDeg(dilep_seg.Theta());
		}
		dPairs[offsetPair+21]=gphi_1;
                dPairs[offsetPair+22]=gtheta_1;
                dPairs[offsetPair+23]=gphi_2;
                dPairs[offsetPair+24]=gtheta_2;

                pairs->Fill(dPairs);
	    }
            dSingle[0]=evNr;
	    fillKineData(sec_1,i,indexTable,dSingle,offsetSeg1Kine,catmHMdcSegIdeal,catlHGeantKine);
            fillSegData (      i,indexTable,dSingle,offsetSeg1    ,catmHMdcSegIdeal,catmHMdcSegSim);
	    if(hasPartner(indexTable,size,i))dSingle[offsetSingle+0]=1;
            else                             dSingle[offsetSingle+0]=0;
            dSingle[offsetSingle+1]=size;
	    dSingle[offsetSingle+2]=findGeantMeta(indexTable[i*sizeInd+0],sec_1,iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower);

	    single->Fill(dSingle);

	}
    }else{
	Warning("fillNTuple()","Number of Tracks larger than maxTrks! skipped !");
    }
}

void  HMdcTrackingEff::fillVectorFromSeg(TLorentzVector& v, Int_t slot,Int_t type)
{
    // fills vector v with one leg of a pair from slot in indextable with segment information
    // type has to be 0 (segment from ideal tracking) or 1 (segments from reconstruction)
    if(type==0||type==1)
    {
	HMdcSegSim* seg=0;
	Int_t off=type*2;
	if(type==0)seg=(HMdcSegSim*)catmHMdcSegIdeal->getObject(indexTable[slot*sizeInd+1+off]);
	if(type==1)seg=(HMdcSegSim*)catmHMdcSegSim  ->getObject(indexTable[slot*sizeInd+1+off]);
	HGeantKine* kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[slot*sizeInd+0]-1);
	Int_t sec     =seg->getSec();
	Float_t theta =seg->getTheta();
	Float_t phi   =getLabPhiDeg(sec,seg->getPhi())*TMath::DegToRad();
	Float_t totmom=kine->getTotalMomentum();
	v.SetXYZM(totmom * TMath::Sin(theta) * TMath::Cos(phi),
		  totmom * TMath::Sin(theta) * TMath::Sin(phi),
		  totmom * TMath::Cos(theta),HPhysicsConstants::mass(kine->getID()));
    }else
    {
	Error("fillVectorFromSeg()","Wrong type, should be 0 or 1!");
        exit(1);
    }
}
void  HMdcTrackingEff::fillVectorFromKine(TLorentzVector& v, Int_t slot)
{
    // fills vector v with one leg of a pair from slot in indextable with kine information

    Float_t xmom,ymom,zmom;
    HGeantKine* kine=(HGeantKine*)catlHGeantKine->getObject(indexTable[slot*sizeInd+0]-1);

    kine->getMomentum(xmom,ymom,zmom);
    Double_t mass  =HPhysicsConstants::mass(kine->getID());
    Double_t energy=TMath::Sqrt(mass*mass + xmom*xmom + ymom*ymom + zmom*zmom);
    v.SetPxPyPzE(xmom,ymom,zmom,energy);
}
void HMdcTrackingEff::kineToSegPhiThetaDeg(HGeantKine* kine,Float_t& theta,Float_t& phi)
{
    // Convert geant mom to MDC phi/theta angle in degree
    Float_t xmom,ymom,zmom,mom;
    kine->getMomentum(xmom,ymom,zmom);
    mom   =kine->getTotalMomentum();
    theta = (mom>0.) ? (TMath::RadToDeg() * TMath::Abs(TMath::ACos(zmom / mom))) : 0.;
    phi   = TMath::RadToDeg() * TMath::ATan2( ymom, xmom);
    if (phi < 0.) phi += 360.;
    phi=fmod(phi,60.f)+60.;

}
Float_t  HMdcTrackingEff::pairPhiToLabDeg(Float_t phi)
{
    // Convert phi from TLorentzVector to phi Lab in degree
    phi   = TMath::RadToDeg() * phi;
    if (phi < 0.) phi += 360.;
    return phi;
}
Float_t  HMdcTrackingEff::pairThetaToLabDeg(Float_t theta)
{
    // Convert theta from TLorentzVector to theta Lab in degree
    theta   = TMath::Abs((TMath::RadToDeg() * theta));
    return theta;
}
Float_t HMdcTrackingEff::getLabPhiDeg(Int_t sector, Float_t phi)
{
    // Convert MDC phi angle to the lab coordinate system  and degree

    phi = TMath::RadToDeg() * phi;

    switch(sector)
    {
        case 0:
            break;

        case 1:
        case 2:
        case 3:
        case 4:
            phi += 60.0 * sector;
            break;

        default:
            phi -= 60.0f;
            break;
    }

    return phi;
}
Float_t HMdcTrackingEff::getThetaPairDeg(TLorentzVector& v)
{
    // transform theta of vector to lab system and degree
    return TMath::RadToDeg() * v.Theta();
}

// -----------------------------------------------------------------------------

Float_t HMdcTrackingEff::getPhiPairDeg(TLorentzVector& v)
{
    // transform phi of vector to lab system and degree
    Float_t phi;
    if((phi = TMath::RadToDeg() * v.Phi()) < 0.0)  phi += 360.0;

    return phi;
}
Bool_t HMdcTrackingEff::finalize(void)
{
    out->cd();
    single->Write();
    pairs->Write();
    out->Save();
    out->Close();
    return kTRUE;
}

Int_t HMdcTrackingEff::execute()
{
    Int_t track_ct=0;
    //-------------------------------------
    resetIndexTable(indexTable,track_ct);
    track_ct=0;

    HMdcTrkCandIdeal* trkCandIdeal=0;


    iterTrkCandIdeal->Reset();
    while ( (trkCandIdeal=(HMdcTrkCandIdeal*)iterTrkCandIdeal->Next()) != 0 )
    {
	Int_t nOuterSeg=trkCandIdeal->getNCandForSeg1();
        
	if(nOuterSeg==-1)
	{
	    // not first object ,skip it!
	    continue;
	}
	if(nOuterSeg==0)
	{
            // no outer segment available
            // nothing special has to be done
	}
        else
	{
	    // first object of list of matched candidates (only inner seg)
	    // To get the combination with outer seg one has to go to next object
	    // In case the outer segment is missing this part is skipped (nOuterSeg==0)
	    Int_t nextObjInd = trkCandIdeal->getNextCandInd();
	    trkCandIdeal     = (HMdcTrkCandIdeal*)catmHMdcTrkCandIdeal->getObject(nextObjInd);
	    if(!trkCandIdeal)
	    {
		Error("tracking()","Zero pointer for trkCandIdeal retrieved!");
		exit(1);
	    }
	}
	getSegPointers(indSegId,pSegId,trkCandIdeal,catmHMdcSegIdeal);
	trkNrId=pSegId[0]->getTrack(0); // both segments have the same track
	findSameRealCand(trkNrId,indSeg,pSeg,iterTrkCand,catmHMdcTrkCand,catmHMdcSegSim,catlHGeantKine);
	fillIndexTable(indexTable,track_ct,trkNrId,indSegId,indSeg,catlHGeantKine);
    }
    fillNTuple(gHades->getEventCounter(),indexTable,track_ct,catmHMdcSegSim,catmHMdcSegIdeal,catlHGeantKine,
	       iterGeantTof,catmHGeantTof,iterGeantShower,catmHGeantShower,single,pairs);
    return 0;
}

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