ROOT logo
#include "hmdcsizescells.h"

#include "hkaldafsinglewire.h"


//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////////////////////////////////////
//
// DAF for wire hits. Does not allow competition between hits.
// See doc for HKalIFilter.
//-----------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////

ClassImp (HKalDafSingleWire)

//  -----------------------------------
//  Implementation of protected methods
//  -----------------------------------

Bool_t HKalDafSingleWire::calcEffErrMat(Int_t iSite, Int_t iWire) const {
    // Calculates an effective measurement error matrix from the measurement
    // errors of all hits in this site.
    // Used for the annealing filter.
    // Effective measurement error covariance:
    // V = [ sum(p_i * G_i) ]^-1
    // p_i: weight of hit i
    // G_i: inverse measurement error matrix of hit i

    HKalTrackSite *site = getSite(iSite);
    if(!site) {
	return kFALSE;
    }

    TMatrixD effErrMat(getMeasDim(), getMeasDim());
    Double_t lmt = 100. * numeric_limits<Double_t>::epsilon();
    // Calculate the weighted mean of the inverse measurement error
    // covariances.
    for(Int_t i = iWire*2; i <= iWire*2+1; i++) {
        Double_t w = site->getHitWeight(i);
        if(w < lmt) w = 1.e-10; // avoid numerical problems due to inversion.
        effErrMat += w * TMatrixD(TMatrixD::kInverted, site->getErrMat(i));
    }
    Double_t det = 0.;
    effErrMat.Invert(&det);
    site->setEffErrMat(effErrMat);

    return kTRUE;
}

Bool_t HKalDafSingleWire::calcEffMeasVec(Int_t iSite, Int_t iWire) const {
    // Calculates an effective measurement vector from the measurement
    // of all hits in this site and the effective measurement error matrix.
    // Used for the annealing filter.
    //
    // Effective measurement vector:
    // m_eff = V * sum(p_i * G_i * m_i)
    // V:   effective measurement covariance matrix
    // p_i: weight of hit i
    // G_i: inverse measurement error matrix of hit i
    // m_i: measurement vector of hit i
    //
    // Effective measurement error covariance:
    // V = [ sum(p_i * G_i) ]^-1

    HKalTrackSite *site = getSite(iSite);
    if(!site) {
	return kFALSE;
    }

    if(!calcEffErrMat(iSite, 0)) {
        return kFALSE;
    }

    TVectorD effMeasVec(getMeasDim());
    const TMatrixD &effErrMat = site->getEffErrMat();

#if dafDebug > 2
    cout<<"Calculating effective measurement"<<endl;
#endif

    for(Int_t i = iWire*2; i <= iWire*2+1; i++) {
	effMeasVec += site->getHitWeight(i) *
	    TMatrixD(TMatrixD::kInverted, site->getErrMat(i)) *
	    site->getHitVec(i);

#if dafDebug > 2
	cout<<"Weight of hit "<<i<<": "<<site->getHitWeight(i)
	    <<", drift radius "<<(site->getHitVec(i))(0)<<endl;
#endif
    }
    effMeasVec = effErrMat * effMeasVec;

#if dafDebug > 2
    cout<<"Effective measurement vector"<<endl;
    effMeasVec.Print();
    cout<<"Effective measurement error matrix"<<endl;
    effErrMat.Print();
#endif

    site->setEffMeasVec(effMeasVec);

    return kTRUE;
}


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

HKalDafSingleWire::HKalDafSingleWire(Int_t n, Int_t measDim, Int_t stateDim,
			 HMdcTrackGField *fMap, Double_t fpol)
    : HKalFiltWire(n, measDim, stateDim, fMap, fpol) {

    const Int_t nDafs = 5;
    Double_t T[nDafs] = { 81., 9., 4., 1., 1. };
    setDafPars(9., &T[0], nDafs);
    setWireNr(0); // This class only handles one wire measurement.
}

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

Bool_t HKalDafSingleWire::fitTrack(const TObjArray &hits, const TVectorD &iniSv,
				   const TMatrixD &iniCovMat, Int_t pId) {
    // Runs the Kalman filter over a set of measurement hits.
    // Returns false if the Kalman filter encountered problems during
    // track fitting or the chi^2 is too high.
    //
    // Input:
    // hits:        the array with the measurement hits. Elements must be of
    //              class HKalMdcHit.
    // iniStateVec: initial track state that the filter will use.
    // iniCovMat:   initial covariance matrix that the filter will use.
    // pId:         Geant particle id.

#if dafDebug > 1
    cout<<"******************************"<<endl;
    cout<<"**** Fit track number "<<getTrackNum()<<" ****"<<endl;
    cout<<"******************************"<<endl;
#endif

    newTrack(hits, iniSv, iniCovMat, pId);

    Int_t iFromSite, iToSite;
    if(getDirection() == kIterForward) {
        iFromSite = 0;
        iToSite   = getNsites() - 1;
    } else {
        iFromSite = getNsites() - 1;
        iToSite   = 0;
    }

    Bool_t bTrackAccepted = kTRUE;

    const Int_t nDafs = dafT.GetSize(); // Number of DAF iterations.

    //? Check why UD-filter is not working with DAF.
    if(getFilterMethod() == Kalman::kKalUD) {
        setFilterMethod(Kalman::kKalJoseph);
	Warning("fitWithDaf()",
		"Cannot use UD-filter together with DAF. Switching to Joseph-stabilization.");
    }

    // Array that stores weights (assignment probabilities) of competing hits.
    // Maximum possible competitors at each layer is 4: two measurements plus
    // left/right ambiguity for each measurement.
    const Int_t maxHitsPerSite = 4;

    for(Int_t iSite = 0; iSite < getNsites(); iSite++) {
	if(!calcEffMeasVec(iSite, 0)) {
	    if(getPrintErr()) {
		Error("fitTrack()",
		      Form("Could not calculate effective measurement for site %i",
			   iSite));
	    }
            bTrackAccepted = kFALSE;
	    return kFALSE;
	}
    }


    for(Int_t iDaf = 0; iDaf < nDafs; iDaf++) {

#if dafDebug > 1
        cout<<"********************************************"<<endl;
	cout<<"**** DAF iteration "<< iDaf<<" with temperature "
	    <<dafT[iDaf]<<" ****"<<endl;
        cout<<"********************************************"<<endl;
#endif

	// In each iteration do Kalman prediction/filter steps and then
	// smooth back.
        setTrackChi2(0.);
        setTrackLength(0.);

        HKalTrackSite *fromSite = getSite(iFromSite);
        if(!fromSite) {
            return kFALSE;
        }

	bTrackAccepted &= runFilter(iFromSite, iToSite);

        smooth();

        for(Int_t iSite = 0; iSite < getNsites(); iSite++) {
            HKalTrackSite *site = getSite(iSite);
            Double_t weightNorm = 0.;

#if dafDebug > 1
            cout<<"Running DAF for site "<<iSite<<endl;
#endif

	    for(Int_t iHit = 0; iHit < site->getNcompetitors(); iHit++) {
                setWireNr(iHit/2);
                const TVectorD &measVec = site->getHitVec(iHit);
                TVectorD smooMeasVec(getMeasDim());
		calcMeasVecFromState(smooMeasVec, site, Kalman::kSmoothed,
				     Kalman::kSecCoord);

#if dafDebug > 2
		cout<<"Updating measurement "<<iHit<<" of "
		    <<site->getNcompetitors()<<endl;
                cout<<"Measurement vector: "<<endl;
                measVec.Print();
                cout<<"Expected measurement from smoothing: "<<endl;
                smooMeasVec.Print();
#endif

                // Residual r
		TVectorD  residual     = measVec - smooMeasVec;
                // r^T
		TMatrixD  residualTrans(1, getMeasDim(),
					residual.GetMatrixArray());
                const TMatrixD &errMat = site->getErrMat(iHit);                      // Measurement error covariance V
#if kalDebug > 0
                if(errMat.NonZeros() == 0) {
		    Error("fitWithDaf()",
			  Form("Measurement error matrix of hit %i is not set.",
			       iHit));
                }
#endif
                // G = V^-1
		TMatrixD  invErrMat    = TMatrixD(TMatrixD::kInverted, errMat);

		// Normalization of hit's chi2 distribution:
		// 1 / ((2*pi)^n/2 * sqrt(T * det(V)))
		Double_t  normChi2     =
		    1./(TMath::Power(2.*TMath::Pi(),(Double_t)getMeasDim()/2.)*
			TMath::Sqrt(dafT[iDaf] * errMat.Determinant()));

		// Standardized distance between smoothed track state and
		// measurement vector:
                //        chi2         =  r^T          *(V_k)^-1 *r
                Double_t  chi2         = (residualTrans*invErrMat*residual)(0);

#if dafDebug > 2
                cout<<"Error matrix: "<<endl;
                errMat.Print();
                cout<<"Hit's chi2: "<<chi2<<endl;
#endif

                site->setHitChi2(chi2, iHit);

                // Normalization for hit's weight recalculation:
		// sum( normchi2 * exp(-chi2/(2T)) +
		// normchi2 * exp(-chi2cut/(2T))
		weightNorm            +=
		    normChi2 * TMath::Exp(- chi2       / (2. * dafT[iDaf]));
		weightNorm            +=
		    normChi2 * TMath::Exp(- dafChi2Cut / (2. * dafT[iDaf]));
            }

            // Recalculate weight of each hit.
            for(Int_t iHit = 0; iHit < site->getNcompetitors(); iHit++) {
                const TMatrixD &errMat = site->getErrMat(iHit);
                // New weight of hit.
                // 1 / ((2*pi)^n/2 * sqrt(T * det(V))) * exp(-chi2/(2T)) / weightNorm
		Double_t normChi2      =
		    1./(TMath::Power(2.*TMath::Pi(), (Double_t)getMeasDim()/2.)*
			TMath::Sqrt(dafT[iDaf] * errMat.Determinant()));
		Double_t hitWeight     =
		    normChi2 * TMath::Exp(-site->getHitChi2(iHit) /
					  (2. * dafT[iDaf])) / weightNorm;
                if(iHit > maxHitsPerSite - 1) {
                    if(getPrintErr()) {
			Error("fitTrack()",
			      Form("Site %i has more than %i competing hits.",
				   iSite, maxHitsPerSite));
                    }
                    break;
                }

#if dafDebug > 2
		cout<<"Updating weight of hit "<<iHit<<" out of "
		    <<site->getNcompetitors()<<" from site "<<iSite<<
		    "old weight "<<site->getHitWeight(iHit)<<", new weight "
		    <<hitWeight<<endl;
#endif

		site->setHitWeight(hitWeight, iHit);
                site->setHitWeightHist(hitWeight, iDaf, iHit);
	    }

	    if(!calcEffMeasVec(iSite, 0)) {
		if(getPrintErr()) {
		    Error("fitTrack()",
			  Form("Could not calculate effective measurement for site %i", iSite));
		}
		bTrackAccepted = kFALSE;
		return kFALSE;
	    }
	}
    }

#if dafDebug > 1
        cout<<"**** Finished with Deterministic Annealing Filter ****"<<endl;
#endif


    // Transform hit and state vectors from track back to sector coordinates.
    if(getRotation() == Kalman::kVarRot) {
        transformFromTrackToSector();
    }

    setTrackLengthAtLastMdc(getTrackLength());

#if dafDebug > 1
    if(bTrackAccepted) {
        cout<<"**** Fitted track ****"<<endl;
    } else {
        cout<<"**** Errors during track fitting ****"<<endl;
    }
#endif

    if(!bTrackAccepted) setChi2(-1.F);

    return bTrackAccepted;
}

void HKalDafSingleWire::setDafPars(Double_t chi2cut, const Double_t *T, Int_t n) {
    // Set parameters for the deterministic annealing filter.
    //
    // input:
    // chi2cut: Cut-off parameter.
    // T:       Array with annealing factors (temperatures).
    // n:       Number of annealing factors.

    dafChi2Cut = chi2cut;
    dafT.Set(n, &T[0]);

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

TMatrixD const& HKalDafSingleWire::getHitErrMat(HKalTrackSite* const site) const {
    // Returns the effective measurement error of site.
    //
    // Input:
    // site: measurement site.

    return site->getEffErrMat();
}

TVectorD const& HKalDafSingleWire::getHitVec(HKalTrackSite* const site) const {
    // Returns the effective measurement vector of measurement site.
    //
    // Input:
    // site: measurement site.

    return site->getEffMeasVec();
}

Double_t HKalDafSingleWire::getNdf() const {
    // Returns number degrees of freedom, i.e. number of experimental points
    // minus number of parameters that are estimated.

    Double_t w = 0.;
    for(Int_t iSite = 0; iSite < getNsites(); iSite++) {
	HKalTrackSite *site = getSite(iSite);
	if(!site) {
	    Error("getNdf()", Form("Site %i not found.", iSite));
	    continue;
	}
	for(Int_t iHit = 0; iHit < site->getNcompetitors(); iHit++) {
	    w += site->getHitWeight(iHit);
	}
    }
    return (w * getMeasDim() - getStateDim());
}

void HKalDafSingleWire::updateSites(const TObjArray &hits) {
    // Replace sites of the Kalman system with new hits.
    // hits: array with new measurement hits. Must be of class HKalMdcHit.

    for(Int_t i = 0; i < getNmaxSites(); i++) {
        getSite(i)->clearHits();
        getSite(i)->setActive(kTRUE);
    }

    Int_t iHit  = 0;
    Int_t iSite = 0;

    while(iHit < hits.GetEntries() - 1) {
#if kalDebug > 0
        if(!hits.At(iHit)->InheritsFrom("HKalMdcHit")) {
	    Error("updateSites()",
		  Form("Object at index %i in hits array is of class %s. Expected class is HKalMdcHit.",
		       iHit, hits.At(iHit)->ClassName()));
            exit(1);
        }
#endif

	HKalMdcHit *hit     = (HKalMdcHit*)hits.At(iHit);

	// Skip hits from the same layer.
	if(iHit > 0) {
	    HKalMdcHit *prevhit = (HKalMdcHit*)hits.At(iHit - 1);
	    if(hit->areCompetitors(*hit, *prevhit)) {
		iHit++;
                continue;
	    }
	}

	// Add second hit with "negative" drift time. The sign of the
	// drift time represents that.
        HKalMdcHit *hit2    = new HKalMdcHit(*hit);
	hit2->setDriftTime(hit->getDriftTime() * (-1.),
			   hit->getDriftTimeErr());
        TVectorD hitVec2 = hit->getHitVec();
        hitVec2 *= -1.;
        hit2->setHitAndErr(hitVec2, hit->getErrVec());
        Double_t w = hit->getWeight();
        hit ->setWeight(w / 2.);
        hit2->setWeight(w / 2.);

	if(iSite >= 0 && iSite < getNmaxSites()) {
	    HKalTrackSite *site = getSite(iSite);
	    site->addHit(hit);
	    site->addHit(hit2);
	} else {
	    Error("updateSites()",
		  Form("Attempt to access site %i out of %i",
		       iSite, getNmaxSites()-1));
            return;
	}

        iSite++;
        iHit++;
    }

    // Add last hit in array to a site.
    HKalMdcHit *lastHit = (HKalMdcHit*)hits.At(hits.GetEntries()-1);

    HKalMdcHit *hit2    = new HKalMdcHit(*lastHit);
    hit2->setDriftTime(lastHit->getDriftTime() * (-1.),
		       lastHit->getDriftTimeErr());
    TVectorD hitVec2 = lastHit->getHitVec();
    hitVec2 *= -1.;
    hit2->setHitAndErr(hitVec2, lastHit->getErrVec());
    Double_t w = lastHit->getWeight();
    lastHit->setWeight(w / 2.);
    hit2   ->setWeight(w / 2.);

    // Don't store competing hits.
    if(hits.GetEntries() > 1) {
        HKalMdcHit *secondLastHit = (HKalMdcHit*)hits.At(hits.GetEntries()-2);
	if(!lastHit->areCompetitors(*lastHit, *secondLastHit)) {
	    if(iSite >= 0 && iSite < getNmaxSites()) {
		HKalTrackSite *site = getSite(iSite);
		site->addHit(lastHit);
		site->addHit(hit2);
		iSite++;
	    } else {
		Error("updateSites()",
		      Form("Attempt to access site %i out of %i",
			   iSite, getNmaxSites()-1));
	    }
        }
    } else {
	if(iSite >= 0 && iSite < getNmaxSites()) {
	    HKalTrackSite *site = getSite(iSite);
	    site->addHit(lastHit);
	    site->addHit(hit2);
	    iSite++;
	} else {
	    Error("updateSites()",
		  Form("Attempt to access site %i out of %i",
		       iSite, getNsites()-1));
	}
    }

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