ROOT logo

// from ROOT
#include "TMath.h"
#include "TRotation.h"
#include "TVector3.h"

// from hydra
#include "hkalgeomtools.h"
#include "hkalmatrixtools.h"
#include "hkaltracksite.h"
#include "hkaltrackstate.h"

#include <iostream>
using namespace std;
#include <cstdlib>

ClassImp(HKalTrackSite)

//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////////////////////////////////////
//
// A track site stores information about a measurement hit and parameters of
// the Kalman filter track states (prediction, filtering, smoothing, inverse filtering)
// for this hit.
// The hit object for a site may be replaced with the setHit(const HKalMdcHit &newhit)
// function.
// The site provides read/write access to the state vectors and the matrices for all
// track states via the setState* functions.
// The dimension of the measurement vector and track state vector must be defined
// when building the object and may not be changed later on.
// Track states can be stored in two coordinate systems: a system common for
// all measurement sites (usually sector coordinate) and coordinates defined by a
// virtual layer. The virtual layer has to be defined with the setHitVirtPlane()
// function.
// The functions transVirtLayToSec() and transSecToVirtLay() calculate and store
// the track state vectors and covariance matrices in the other coordinate system.
// The virtual layer coordinate system is used for drift chamber wire hits where
// the measurement point does not lie on the measurement layer.
//
//-----------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////


//  -----------------------------------
//  Ctors and Dtor
//  -----------------------------------

HKalTrackSite::HKalTrackSite(Int_t measDim, Int_t stateDimSec, Int_t stateDimVirtLay)
    : TObject(), bActive(kTRUE), effErrMat(measDim, measDim), effMeasVec(measDim) {
    // Creates a dummy hit and track states.
    // measDim:  dimension of measurement vector.
    // stateDimSec: dimension of the track state vectors in the sector coordinate system.
    // stateDimVirtLay: dimension  of the track state vectors in the virtual layer coordinate system.

    Int_t nCoordSys = 2;
    trackStates = new HKalTrackState**[nCoordSys];
    for(Int_t i = 0; i < nCoordSys; i++) {
        trackStates[i] = new HKalTrackState*[kNumKalStates];
    }

    for(Int_t stateType = 0; stateType < kNumKalStates; stateType++) {
        trackStates[kSecCoord][stateType] = new HKalTrackState((Kalman::kalFilterTypes)stateType, measDim, stateDimSec);
    }

    for(Int_t stateType = 0; stateType < kNumKalStates; stateType++) {
        trackStates[kLayCoord][stateType] = new HKalTrackState((Kalman::kalFilterTypes)stateType, measDim, stateDimVirtLay);
    }

    hits = new TObjArray();
    hits->Add(new HKalMdcHit(measDim)); // add a dummy hit to site
}

HKalTrackSite::~HKalTrackSite() {
    delete hits;
    delete [] trackStates;
}

//  -----------------------------------
//  Implementation of private methods
//  -----------------------------------

HKalMdcHit* HKalTrackSite::getHitPtr(Int_t idx) {
    // Get hit at index idx that this site contains.

    if(idx >= hits->GetEntries() || idx < 0 || hits->GetEntries() == 0) {
        Error("getHit()", Form("No hit at index %i. Only %i hits stored. Returning first hit object.", idx, hits->GetEntries()));
        return (HKalMdcHit*)hits->At(0);
    } else {
        return (HKalMdcHit*)hits->At(idx);
    }
}

void HKalTrackSite::transformHit(const TRotation &transMat) {
    // Transform the measurement hit coordinates and layer vectors
    // using the rotation matrix transMat.

    for(Int_t i = 0; i < hits->GetLast() + 1; i++) {
        getHitPtr(i)->transformHit(transMat);
    }
    getHitPtr()->transformLayer(transMat);
}

void HKalTrackSite::transformStates(const TRotation &transMat) {
    // Transform the track state vectors using the rotation matrix transMat.
    // Since information about the measurement layer is needed, make sure
    // the hit has not been transformed yet.

    for(Int_t stateType = 0; stateType < kNumKalStates; stateType++) {
	if(getHitType() == Kalman::kSegHit) {
	    trackStates[kSecCoord][stateType]->transform(transMat, getHitPtr(0)->getMeasLayer());
	}
	if(getHitType() == Kalman::kWireHit) {
	    trackStates[kSecCoord][stateType]->transform(transMat, getHitPtr(0)->getVirtPlane());
	}
    }
}

//  -----------------------------------
//  Implementation of public methods
//  -----------------------------------

void HKalTrackSite::addHit(HKalMdcHit *newhit) {
    // Add a new hit to this site.
    hits->Add(newhit);
}

void HKalTrackSite::calcJacLayToSec(TMatrixD &jac, const TVectorD &svLay, const HKalPlane &plane) const {
    // Track states can be stored in two coordinate systems:
    // the sector coordinate system common for all sites and a local
    // coordinate system for this site defined by a virtual plane.
    // This calculated the Jacobian matrix for the transformation
    // function from virtual layer to sector coordinates.
    //
    // Output:
    // jac:   Jacobian matrix
    //
    // Input:
    // svSec: State vector in virtual layer coordinates.
    // plane: Virtual layer.

    Int_t secDim = getStateDim(kSecCoord);
    Int_t layDim = getStateDim(kLayCoord);
    Int_t nRows = jac.GetNrows();
    Int_t nCols = jac.GetNcols();
    if(nRows != secDim || nCols != layDim) {
        jac.ResizeTo(secDim, layDim);
        ::Warning("calcJacobianFromLayerToSector()", Form("Output parameter for Jacobian matrix had to be resized from %ix%i to %ix%i.", nRows, nCols, secDim, layDim));
    }

#if kalDebug > 0
    if(svLay.GetNrows() != layDim) {
        ::Error("calcJacobianFromLayerToSector()", Form("Input state vector has dimension %i, but needs to be %i.", svLay.GetNrows(), layDim));
        return;
    }
#endif

    const TVector3 &u = plane.getAxisU();
    const TVector3 &v = plane.getAxisV();
    const TVector3 &w = plane.getNormal();

    // State vector in sector coordinate system: (x,y,tx,ty,qp,z).
    // State vector in layer  coordinate system: (u,v,tu,tv,qp).
    // Layer coordinate system is defined by an origin vector O,
    // two orthogonal Axis U and V on the layer and a normal vector W.
    // All axis are given in sector coordinate system.

    // Transformation from layer to sector:
    // Calculate position in sector coordinates (x,y,z) from layer coordinates:
    // P = O + u*U + v*V
    // direction in sector coordinates:
    // A = 1/norm(W + tu*U + tv*V) * (W + tu*U + tv*V)
    // tx = A.x() / A.z()
    // ty = A.y() / A.z()

    // jac = d(x,y,tx,ty,qp,z) / d(u,v,tu,tv,qp)
    // row index:    state vector parameter in sector coordinates
    // column index: state vector parameter in layer coordinates

    Double_t tu      = svLay(kIdxTanPhi);
    Double_t tv      = svLay(kIdxTanTheta);
    TVector3 dir     = tu*u + tv*v + w;      // non normalized direction from layer state vector.
    Double_t dirz2   = dir.Z() * dir.Z();

    jac.Zero();

    jac(kIdxX0, kIdxX0) = u.X(); // dx/du
    jac(kIdxY0, kIdxX0) = u.Y(); // dy/du

    jac(kIdxX0, kIdxY0) = v.X(); // dx/dv
    jac(kIdxY0, kIdxY0) = v.Y(); // dy/dv

    if(secDim > 5) {
        jac(kIdxZ0, kIdxX0) = u.Z(); // dz/du
        jac(kIdxZ0, kIdxY0) = v.Z(); // dz/dv
    }

    jac(kIdxTanPhi,   kIdxTanPhi)   = (tv*u.X()*v.Z() + u.X()*w.Z() - tv*u.Z()*v.X() - u.Z()*w.X()) / dirz2; // dtx/dtu
    jac(kIdxTanPhi,   kIdxTanTheta) = (tu*u.Z()*v.X() + v.X()*w.Z() - tu*u.X()*v.Z() - v.Z()*w.X()) / dirz2; // dtx/dtv
    jac(kIdxTanTheta, kIdxTanPhi)   = (tv*u.y()*v.Z() + u.Y()*w.Z() - tv*u.Z()*v.Y() - u.Z()*w.Y()) / dirz2; // dty/dtu
    jac(kIdxTanTheta, kIdxTanTheta) = (tu*u.Z()*v.Y() + v.Y()*w.Z() - tu*u.Y()*v.Z() - v.Z()*w.Y()) / dirz2; // dty/dtv

    jac(kIdxQP,       kIdxQP)       = 1.;
}

void HKalTrackSite::calcJacSecToLay(TMatrixD &jac, const TVectorD &svSec, const HKalPlane &plane) const {
    // Track states can be stored in two coordinate systems:
    // the sector coordinate system common for all sites and a local
    // coordinate system for this site defined by a virtual plane.
    // This calculated the Jacobian matrix for the transformation
    // function from sector to virtual layer coordinates.
    //
    // Output:
    // jac:   Jacobian matrix
    //
    // Input:
    // svSec: State vector in sector coordinates.
    // plane: Virtual layer.

    Int_t secDim = getStateDim(kSecCoord);
    Int_t layDim = getStateDim(kLayCoord);
    Int_t nRows = jac.GetNrows();
    Int_t nCols = jac.GetNcols();
    if(nRows != layDim || nCols != secDim) {
        jac.ResizeTo(layDim, secDim);
        ::Warning("calcJacobianFromLayerToSector()", Form("Output parameter for Jacobian matrix had to be resized from %ix%i to %ix%i.", nRows, nCols, layDim, secDim));
    }

#if kalDebug > 0
    if(svSec.GetNrows() != secDim) {
        ::Error("calcJacobianFromSectorToLayer()", Form("Input state vector has dimension %i, but needs to be %i", svSec.GetNrows(), secDim));
        return;
    }
#endif

    const TVector3 &u = plane.getAxisU();
    const TVector3 &v = plane.getAxisV();
    const TVector3 &w = plane.getNormal();

    // State vector in sector coordinate system: (x,y,tx,ty,qp).
    // State vector in layer  coordinate system: (u,v,tu,tv,qp).
    // Layer coordinate system is defined by an origin vector O,
    // two orthogonal Axis U and V on the layer and a normal vector W.
    // All axis are given in sector coordinate system.

    // Transformation from sector to layer:
    // position on layer:
    // u = (P - O) * U
    // v = (P - O) * V
    // direction on layer:
    // tu = (A * U) / (A * W)
    // tv = (A * V) / (A * W)
    // P = (x,y,z) - the position vector in sector coordinate system
    // with A = 1/sqrt(1 + tx^2 + ty^2) * (tx, ty, 1)^T the normalized direction vector in the sector coordinate system

    // jac = d(u,v,tu,tv,qp) / d(x,y,tx,ty,qp,z)
    // row index:    state vector parameter in layer  coordinates
    // column index: state vector parameter in sector coordinates

    TVector3 dir;
    Double_t tx = svSec(kIdxTanPhi);
    Double_t ty = svSec(kIdxTanTheta);
    dir.SetXYZ(tx, ty, 1.);

    Double_t aw  = dir * w;
    Double_t aw2 = aw * aw;

    jac.Zero();

    jac(kIdxX0, kIdxX0) = u.X(); // du/dx
    jac(kIdxX0, kIdxY0) = u.Y(); // du/dy
    jac(kIdxY0, kIdxX0) = v.X(); // dv/dx
    jac(kIdxY0, kIdxY0) = v.Y(); // dv/dy

    if(secDim > 5) {
        jac(kIdxX0, kIdxZ0) = u.Z(); // du/dz
        jac(kIdxY0, kIdxZ0) = v.Z(); // dv/dz
    }

    jac(kIdxTanPhi,   kIdxTanPhi)   = (ty*u.X()*w.Y() + u.X()*w.Z() - ty*u.Y()*w.X() - u.Z()*w.X()) / aw2; // dtu/dtx
    jac(kIdxTanPhi,   kIdxTanTheta) = (tx*u.Y()*w.X() + u.Y()*w.Z() - tx*u.X()*w.Y() - u.Z()*w.Y()) / aw2; // dtu/dty
    jac(kIdxTanTheta, kIdxTanPhi)   = (ty*v.X()*w.Y() + v.X()*w.Z() - ty*v.Y()*w.X() - v.Z()*w.X()) / aw2; // dtv/dtx
    jac(kIdxTanTheta, kIdxTanTheta) = (tx*v.Y()*w.X() + v.Y()*w.Z() - tx*v.X()*w.Y() - v.Z()*w.Y()) / aw2; // dtv/dty

    jac(kIdxQP,       kIdxQP)       = 1.;
}


void HKalTrackSite::clearHits() {
    hits->Delete();
    effMeasVec.Zero();
    effErrMat.Zero();
    bActive = kTRUE;
}

void HKalTrackSite::sortHits() {
    hits->Sort();
}

void HKalTrackSite::print(const Option_t *opt) const {
    // Prints information about the hit and track states for this site.
    // opt: Determines what information about the object will be printed.
    // If opt contains:
    // "Hit": print information about hit's measurement coordinates and layer
    // "Pred": print state vector and used matrices of the predicted state
    // "Filt": print state vector and used matrices of the filtered state
    // "Smoo": print state vector and used matrices of the smoothed state
    // "Inv":  print state vector and used matrices of the inverse filtered state
    // If opt is empty all of the above will be printed.
    // Only the state vector and covariance matrix are printed for all states.
    // The content of unused matrices will not be printed:
    // The propagator and process noise matrices are always stored in the filtered state.
    // The projector matrix is stored in class HKalSystem.
    // idx: Index of hit object in site.

    cout<<"**** Print content of site ****"<<endl;
    TString stropt(opt);
    if(stropt.Contains("Hit", TString::kIgnoreCase)  || stropt.IsNull()) {
        for(Int_t i = 0; i < getNcompetitors(); i++) {
            cout<<"Printing hit number "<<i<<" in site."<<endl;
            getHit(i).print("Hit");
        }
    }
    if(stropt.Contains("Pred", TString::kIgnoreCase) || stropt.IsNull()) {
        trackStates[kSecCoord][kPredicted]  ->print("SFCQ");
    }
    if(stropt.Contains("Filt", TString::kIgnoreCase) || stropt.IsNull()) {
        trackStates[kSecCoord][kFiltered]   ->print("SC");
    }
    if(stropt.Contains("Smoo", TString::kIgnoreCase) || stropt.IsNull()) {
        trackStates[kSecCoord][kSmoothed]   ->print("SC");
    }
    if(stropt.Contains("Inv", TString::kIgnoreCase)  || stropt.IsNull()) {
        trackStates[kSecCoord][kInvFiltered]->print("SC");
    }
    cout<<"**** End print of site ****"<<endl;
}

void HKalTrackSite::transform(const TRotation &transMat) {
    // Transform the track state vectors and measurement hit coordinates
    // and the hit's measurement layer using the rotation matrix transMat.

#if kalDebug > 1
    if(transMat.IsIdentity()) {
        Warning("transform()", "Rotation matrix for coordinate transformation not set.");
    }
#endif
    // Track states must be transformed before the hit!
    transformStates(transMat);
    transformHit(transMat);
}

void HKalTrackSite::transVirtLayToSec(Kalman::kalFilterTypes stateType,
                                      Int_t iHit,
				      Bool_t bCovUD) {
    // Track states can be stored in two coordinate systems:
    // the sector coordinate system common for all sites and a local
    // coordinate system for this site defined by a virtual plane.
    // This functions calculates and stores the track state and
    // covariance matrix in virtual layer coordinates from sector.
    //
    // Input:
    // stateType: state to transform (kPredicted, kFiltered, kSmoothed, kInvFiltered)
    // iHit:      index of hit stored in site
    // bCovUD:    set to true if using the UD filter.

    Int_t secDim = getStateDim();
    Int_t layDim = getStateDim(kLayCoord);
    const HKalPlane &virtPlane = getHitVirtPlane(iHit);
    const TVectorD  &svLay     = getStateVec(stateType, kLayCoord);

    TVectorD svSec(secDim);
    HKalTrackState::transformFromLayerToSector(svSec, svLay, virtPlane);
    setStateVec(stateType, svSec, kSecCoord);

    TMatrixD jacLaySec(secDim, layDim);
    calcJacLayToSec(jacLaySec, svLay, virtPlane);
    TMatrixD jacLaySecTrans = TMatrixD(TMatrixD::kTransposed, jacLaySec);

    const TMatrixD &covLay = getStateCovMat(stateType, kLayCoord);

    if(bCovUD) {
        TMatrixD U(layDim, layDim);
        TMatrixD D(layDim, layDim);
        HKalMatrixTools::resolveUD(U, D, covLay);

        TMatrixD covLayUD = U * D * TMatrixD(TMatrixD::kTransposed, U);
        TMatrixD covSec = jacLaySec * covLayUD * jacLaySecTrans;
        if(!covSec.IsSymmetric()) {
            HKalMatrixTools::makeSymmetric(covSec);
        }
        HKalMatrixTools::decomposeUD(covSec);
        setStateCovMat(stateType, covSec, kSecCoord);
    } else {

        TMatrixD covSec = jacLaySec * covLay * jacLaySecTrans;
        setStateCovMat(stateType, covSec, kSecCoord);
    }
}

void HKalTrackSite::transSecToVirtLay(Kalman::kalFilterTypes stateType,
                                      Int_t iHit,
				      Bool_t bCovUD) {
    // Track states can be stored in two coordinate systems:
    // the sector coordinate system common for all sites and a local
    // coordinate system for this site defined by a virtual plane.
    // This functions calculates and stores the track state and
    // covariance matrix in sector coordinates from virtual layer.
    //
    // Input:
    // stateType: state to transform (predicted, filtered, etc.)
    // iHit:      index of hit stored in site
    // bCovUD:    set to true if using the UD filter.

    Int_t secDim = getStateDim();
    Int_t layDim = getStateDim(kLayCoord);
    const HKalPlane &virtPlane = getHitVirtPlane(iHit);
    const TVectorD  &svSec     = getStateVec(stateType, kSecCoord);

    TVectorD svLay(layDim);
    HKalTrackState::transformFromSectorToLayer(svLay, svSec, virtPlane);
    setStateVec(stateType, svLay, kLayCoord);

    TMatrixD jacSecLay(layDim, secDim);
    calcJacSecToLay(jacSecLay, svSec, virtPlane);
    TMatrixD jacSecLayTrans = TMatrixD(TMatrixD::kTransposed, jacSecLay);

    const TMatrixD &covSec = getStateCovMat(stateType, kSecCoord);

    if(bCovUD) {
        TMatrixD U(secDim, secDim);
        TMatrixD D(secDim, secDim);
        HKalMatrixTools::resolveUD(U, D, covSec);

        TMatrixD covSecUD = U * D * TMatrixD(TMatrixD::kTransposed, U);
        TMatrixD covLay = jacSecLay * covSecUD * jacSecLayTrans;
        if(!covLay.IsSymmetric()) {
            HKalMatrixTools::makeSymmetric(covLay);
        }
        HKalMatrixTools::decomposeUD(covLay);
        setStateCovMat(stateType, covLay, kLayCoord);
    } else {
        TMatrixD covLay = jacSecLay * covSec * jacSecLayTrans;
        if(!covLay.IsSymmetric()) {
            HKalMatrixTools::makeSymmetric(covLay);
        }
        setStateCovMat(stateType, covLay, kLayCoord);
    }

}

TMatrixD const& HKalTrackSite::getErrMat(Int_t idx) const {
    // Return the measurement covariance matrix.
    //
    // idx: The index of the hit stored in this measurement site.
    //      -1 will return the effective covariance which is
    //      used for the annealing filter. This matrix is a weighted
    //      mean of the measurement errors of all competing
    //      hits and must be calculated by calling the calcEffErrMat()
    //      function beforehand.

    if(idx < 0) {

#if kalDebug > 0
        if(getHitsTotalWeight() > 0. && effErrMat.NonZeros() == 0) {
            Warning("getErrMat()", "Effective measurement covariance is zero.");
            effErrMat.Print();
        }
#endif

        return effErrMat;
    }
    return getHit(idx).getErrMat();
}

HKalMdcHit const& HKalTrackSite::getHit(Int_t idx) const {
    // Get hit at index idx that this site contains.

    if(idx >= hits->GetEntries() || idx < 0 || hits->GetEntries() == 0) {
        Error("getHit()", Form("No hit at index %i. %i hits are stored.", idx, hits->GetEntries()));
        return (const HKalMdcHit&) (* (HKalMdcHit*)hits->At(0));
    } else {
        return (const HKalMdcHit&) (* (HKalMdcHit*)hits->At(idx));
    }
}

Double_t HKalTrackSite::getHitsTotalWeight() const {
    // Returns the sum of the weights from all hits in this site.

    Double_t totalWeight = 0.;
    for(Int_t i = 0; i < getNcompetitors(); i++) {
        totalWeight += getHit(i).getWeight();
    }
    return totalWeight;
}

TVectorD const& HKalTrackSite::getHitVec(Int_t idx) const {
    // Return the hit vector (measurement vector).
    //
    // idx: The index of the hit stored in this measurement site.
    //      -1 will return the effective measurement which is
    //      used for the annealing filter. The effective measurement
    //      is a weighted mean of the measurements of all competing
    //      hits and must be calculated by calling the calcEffMeasVec()
    //      function beforehand.

    if(idx < 0) {

#if kalDebug > 0
        if(getHitsTotalWeight() > 0. && effMeasVec.NonZeros() == 0) {
            Warning("getHitVec()", "Effective measurement vector is zero.");
        }
#endif

        return effMeasVec;
    }
    return getHit(idx).getHitVec();
}

void HKalTrackSite::setNdafs(Int_t n) {
    // Change number of DAF iterations.

    for(Int_t i = 0; i < getNcompetitors(); i++ ) {
        getHitPtr(i)->setNdafs(n);
    }
}

void HKalTrackSite::getPosAndDirFromState(TVector3 &pos, TVector3 &dir, kalFilterTypes stateType) const {
    // Extracts a position and direction vector from a track state's parameters.
    //
    // Output:
    // pos:       returns the hit coordinate vector
    // dir:       returns the track direction vector
    // Input:
    // stateType: track state type (kPredicted, kFiltered, kSmoothed, kInvFiltered)

    if(getHitType() == Kalman::kWireHit) {
	const HKalPlane &plane = getHit().getVirtPlane();
	trackStates[kSecCoord][stateType]->calcPosAndDirAtPlane(pos, dir, plane);
    } else {
	const HKalPlane &plane = getHit().getMeasLayer();
	trackStates[kSecCoord][stateType]->calcPosAndDirAtPlane(pos, dir, plane);
    }
}

void HKalTrackSite::setEffErrMat(const TMatrixD &errMat) {
#if kalDebug > 0
    if(errMat.GetNrows() != getMeasDim() || errMat.GetNcols() != getMeasDim()) {
        Warning("setEffErrMat()", Form("Measurement vector is %i-dimensional. New effective error matrix is %ix%i.",
                                       errMat.GetNrows(), errMat.GetNcols(), getMeasDim()));
    } else {
        effErrMat = errMat;
    }
#else
    effErrMat = errMat;
#endif
}

void HKalTrackSite::setEffMeasVec(const TVectorD &measVec) {
#if kalDebug > 0
    if(measVec.GetNrows() != getMeasDim()) {
        Warning("setEffMeasVec()", Form("New effective measurement vector is %i-dimensional, but must be %i-dimensional.",
                                        measVec.GetNrows(), getMeasDim()));
    } else {
        effMeasVec = measVec;
    }
#else
    effMeasVec = measVec;
#endif
}

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