ROOT logo

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

// from hydra
#include "hphysicsconstants.h"
#include "hkalgeomtools.h"
#include "hkalmdcmeaslayer.h"
#include "hkalrungekutta.h"
#include "hkaltrackstate.h"

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

ClassImp(HKalRungeKutta)

//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////////////////////////////////////
//
// This is the track propagator for the Kalman filter. Propagation is done
// with the Runge-Kutta method. Track state updates are done like in CBM, also see:
// S. Gorbunov and I. Kisel,
// An analytic formula for track extrapolation in an inhomogeneous magnetic field.
// CBM-SOFT-note-2005-001, 18 March 2005
// http://www-linux.gsi.de/~ikisel/reco/CBM/DOC-2005-Mar-212-1.pdf
//
// Before doing track propagation, a pointer to the magnetic field map must
// be set using the function
// setFieldMap(HMdcTrackGField *fpField, Double_t fpol).
//
// The main function is propagateToPlane() that will propagate the track
// to a target plane and calculate the track state vector at that plane and
// the propagator matrix. It will return a boolean indicating whether
// problems were encountered during the Runge-Kutta stepping, like for example
// unrealistically hight track state parameters.
//
// All the points and B-field vectors may be stored in two arrays for
// debugging purposes or graphics output if that option has been enabled with
// setFillPointsArrays(kTRUE).
// The functions getPointsTrack() and getFieldTrack() will return these arrays.
// Each array element is a TVector3 object.
//
// The class also offers functions to calculate the material budget in each
// step (calcMaterialProperties()), the effects of multiple scattering
// (calcProcNoise()) and energy loss (calcEnergyLoss()).
//
//-----------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////


HKalRungeKutta::HKalRungeKutta() : TObject(), magField(0.,0.,0.) {
    // Constructor that sets variables. It is still neccessary to set the field
    // map pointer with
    // setFieldMap(HMdcTrackGField *fpField, Double_t fpol)
    // before Runge-Kutta propation can be used.

    //? Eventually these parameters should be stored in a parameter container!
    initialStepSize = 50.;
    stepSizeDec     = 0.75;
    stepSizeInc     = 1.25;
    maxStepSize     = 200.;
    minStepSize     = 2.;
    minPrecision    = 2.e-04;
    maxPrecision    = 2.e-05;
    maxNumSteps     = 1000;
    maxNumStepsPCA  = 10;
    maxDist         = .1;

    minLengthCalcQ  = 0.01;

    maxTan     = 6.; // tan(6) <=> 80 degrees
    maxPos     = 5.e4;
    maxPropMat = 1.e6;
    minMom     = 20.;

    bFillPointArrays = kFALSE;
    bRotBfield       = kFALSE;
    bPrintErr        = kTRUE;
    bPrintWarn       = kTRUE;
    bElossErr        = kFALSE;
    bPrintElossErr   = kTRUE;
    bConstField      = kFALSE;
    bDoMS            = kTRUE;
    bDoDEDX          = kTRUE;
}

HKalRungeKutta::~HKalRungeKutta() {
}

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

Double_t HKalRungeKutta::calcEnergyLoss(TMatrixD &fProc, TVectorD &stateVec, Double_t length, Double_t qp,
                                        Double_t Z, Double_t ZoverA, Double_t density, Double_t radLength,
                                        Double_t exciteEner, Int_t pid) {
    // Calculates energy loss due to bremsstrahlung and ionization.
    // Radiation loss is done for electrons/positrons only.
    // Only yields proper results if particle charge is +/- 1.
    // Return value is energy loss in MeV/particle charge.
    //
    // Input and output:
    // fProc:      Process noise matrix. Contribution of energy loss will be added.
    // stateVec:   track state vector before energy loss. q/p of state will be modified.
    //
    // Input:
    // length:     track length in mm
    // qp:         charge/momentum before energy loss in MeV/c
    // Z:          atomic number.
    // ZoverA:     atomic number / atomic mass of passed material
    // density:    density of passed material in g/mm^3
    // radLength:  radiation length of passed material in mm
    // exciteEner: mean excitation energy of passed material in MeV
    // pid:        Geant particle ID.

#ifdef kalDebug
    Int_t rows = fProc.GetNrows();
    Int_t cols = fProc.GetNcols();
    Int_t sdim = stateVec.GetNrows();
    if(rows < sdim || cols < sdim) {
        if(bPrintErr) {
            Error("calcEnergyLoss()", Form("Process noise matrix is %ix%i, but must be at least %ix%i matrix.", rows, cols, sdim, sdim));
        }
        return 0.;
    }
    rows = stateVec.GetNrows();
    if(rows < sdim) {
        if(bPrintErr) {
            Error("calcEnergyLoss()", Form("State vector has dimension of %i, but must have at least %ix.", cols, sdim));
        }
        return 0.;
    }
#endif

    // Energy loss due to radiation and ionization. Let
    // E' = particle energy including energy loss due to radiation and ionization.
    // E  = particle energy without energy loss.
    // delta(E) = energy loss
    //
    // E' = E - delta(E)
    //    = E * (1 - delta(E)/E)
    // E'/E = 1 - delta(E)/E

    Bool_t bIsLepton = (pid == HPhysicsConstants::pid("e+") || pid == HPhysicsConstants::pid("e-"));

    Double_t mass = HPhysicsConstants::mass(pid);
    Double_t q    = (Double_t)HPhysicsConstants::charge(pid);
    Double_t p    = q / qp;
    Double_t beta = 1. / TMath::Sqrt(1. + mass*mass / (p*p));

    Double_t ElossRad = 0.;
    Double_t ElossIon = 0.;

    // Particle is an electron or positron.
    if(bIsLepton) {
        // Radiation loss for electrons/positrons.
        ElossRad = calcRadLoss(fProc, length, mass, qp, radLength);
        if(direction == kIterBackward) {
            ElossRad *= -1.;
        }

        // Critical energy for gases:
        // E_c = 710 MeV / (Z + 0.92)
        // From "Passage of particles through matter", Particle Data Group, 2009
        Double_t eCritical = 710. / (Z + 0.92);
        if(p < eCritical) {
            ElossIon = length * calcDEDXIonLepton(qp, ZoverA, density, exciteEner, pid);
        }
    } else { // Energy loss for heavy particles.
        // Energy loss due to ionization.
        ElossIon = length * calcDEDXBetheBloch(beta, mass, ZoverA, density, exciteEner, q);
    }
    if(direction == kIterBackward) {
        ElossIon *= -1.;
    }

    Double_t Eloss = ElossRad + ElossIon; // delta(E)

    // Correction of particle energy is:
    // E' = E + delta(E)
    //    = E * (1 + delta(E)/E)
    if(bIsLepton) {
        // For electrons: E ~ p
        // p' = p * (1 + delta(E)/p)
        // Track state parameter change is:
        // q/p' = q/p / (1 + delta(E)/p)
        stateVec(kIdxQP) = qp / (1. +  Eloss / p);
    } else {
        // E' = E + delta(E)
        // E'^2 = E^2 + 2*E*delta(E) + delta(E)^2
        // p'^2 + m^2 = p^2 + m^2 + 2*E*delta(E) + delta(E)^2
        // p'^2 = p^2 + 2*E*delta(E) + delta(E)^2
        Double_t p2 = p * p;
	Double_t E = TMath::Sqrt(p2 + mass*mass);
        Double_t pnew = TMath::Sqrt(p2 + 2.*E*Eloss + Eloss*Eloss);
        if(pnew > 0.) {
            stateVec(kIdxQP) = q / pnew;
        } else {
            if(bPrintErr && bPrintElossErr) { // Print only once.
                Error("calcEnergyLoss()", "Calculated energy loss is higher than particle momentum.");
            }
            Eloss = 0.;
            bElossErr      = kTRUE;
            bPrintElossErr = kFALSE;
        }
    }

    return Eloss;
}


Double_t HKalRungeKutta::calcDEDXBetheBloch(Double_t beta, Double_t mass, Double_t ZoverA,
                                            Double_t density, Double_t exciteEner, Double_t z) {
    // Returns the ionization energy loss for thin materials with Bethe-Bloch formula.
    // - dE/dx = K/A * Z * z^2 / beta^2 * (0.5 * ln(2*me*beta^2*gamma^2*T_max/I^2) - beta^2)
    // T_max = (2*me*beta^2*gamma^2) / (1 + 2*gamma*me/mass + me^2/mass^2)
    //
    // beta:       v/c of particle
    // mass:       mass of the particle in MeV/c^2 traversing through the material
    // ZoverA:     atomic number / atomic mass of passed material
    // density:    density of passed material in g/mm^3
    // exciteEner: mean excitation energy of passed material in MeV
    // z:          atomic number of particle

    Double_t me         = HPhysicsConstants::mass("e-"); // electron mass in MeV/c^2
    Double_t K          = 0.307075 * 100.;               // in MeV*mm^2/g for A = 1 g/mol

    Double_t Krho       = K * density;
    Double_t beta2      = beta*beta;
    Double_t gamma      = 1./TMath::Sqrt(1 - beta2);
    Double_t betagamma  = beta * gamma;
    Double_t betagamma2 = betagamma * betagamma;

    if(betagamma < 0.1 || betagamma > 1000.) {
        if(bPrintErr && bPrintElossErr) { // Print only once.
            Error("calcDXDXBetheBloch()",
                  Form("beta*gamma of particle is %f. Bethe-Bloch formula is only good for values between 0.1 and 1000.", betagamma));
        }
        bElossErr      = kTRUE;
        bPrintElossErr = kFALSE;
        return 0.;
    }
    // Maximum kinetic energy that can be imparted on a free electron in a single collision.
    Double_t tmax = (2. * me * betagamma2) / (1 + 2*gamma*me/mass + (me*me)/(mass*mass));

    return (-((Krho * z*z * ZoverA) / beta2)
            * (0.5 * TMath::Log((2. * me * betagamma2 * tmax)/(exciteEner*exciteEner)) - beta2));
}

Double_t HKalRungeKutta::calcDEDXIonLepton(Double_t qp, Double_t ZoverA, Double_t density,
                                           Double_t exciteEner, Int_t pid) const {
    // Calculates energy loss dE/dx in MeV/mm due to ionization for relativistic electrons/positrons.
    //
    // For formula used, see:
    // Track fitting with energy loss
    // Stampfer, Regler and Fruehwirth
    // Computer Physics Communication 79 (1994), 157-164
    //
    // qp:         particle charge divided by momentum
    // ZoverA:     atomic number / atomic mass of passed material
    // density:    density of material in g/mm^3
    // exciteEner: mean excitation energy in MeV
    // pid:        Geant particle id (2 = positron, 3 = electron)

    if(!(pid == HPhysicsConstants::pid("e+") || pid == HPhysicsConstants::pid("e-"))) {
        Warning("calcDEDXIonLepton()", Form("Can only use this function for electrons or positrons. Pid is %i.", pid));
        return 0.;
    }

    Double_t de       = 5.0989 * 1.e-23;                 // 4*pi*re*me*c^2 in MeV * mm^2 with re = classical electron radius
    Double_t avogadro = TMath::Na();                     // Avogadro constant in 1/mol
    Double_t ne       = ZoverA * avogadro * density;     // electron density
    Double_t me       = HPhysicsConstants::mass("e-");   // electron mass in MeV/c^2
    // gamma = E/m
    Double_t E        = 1. / TMath::Abs(qp);             // Energy for relativistic electrons.
    Double_t gamma    = E / me;                          // Relativistic gamma-factor.

    // Formula is slightly different for electrons and positrons.
    // Factors for positrons:
    Double_t gammaFac = 4.;
    Double_t corr     = 2.;
    if(pid == HPhysicsConstants::pid("e-")) { // particle is electron
        gammaFac = 3.;
        corr     = 1.95;
    }

    Double_t dedx = 0.5 * de * ne * (2 * TMath::Log(2*me/exciteEner) + gammaFac * TMath::Log(gamma) - corr);
    return (- dedx);
}

Double_t HKalRungeKutta::calcRadLoss(TMatrixD &fProc, Double_t length, Double_t mass, Double_t qp,
                                     Double_t radLength) const {
    // Calculates energy loss due to bremsstrahlung for electrons with Bethe-Heitler formula.
    // Sign will be negative if propagating in forward direction, i.e. particle looses energy.
    //
    // Input and Output:
    // fProc:     process noise matrix (will be modified)
    //
    // Input:
    // length:    track length in mm
    // mass:      particle mass in MeV/c^2
    // qp:        charge/momentum before energy loss in MeV/c
    // radLength: radiation length of material in mm.

    if(mass != HPhysicsConstants::mass("e-")) {
        if(bPrintWarn) {
            Warning("calcRadLoss()", Form("Particle with mass is %f MeV not an electron/positron.", mass));
        }
        return 0.;
    }

    Double_t t = length / radLength; // t := l/xr. Track length in units of radiation length.

    // Bethe and Heitler formula:
    // - dE/dx = E / xr
    // Integrating yields:
    // E' = E * exp(-t)
    // E'/E = exp(-t)
    // with t := l/xr
    // l = track length
    // xr = radiation length

    // delta(E) = E' - E
    //          = E * (E'/E - 1)
    //          = (E'/E - 1) / qp since E ~ p for electrons
    Double_t ElossRad = (TMath::Exp(-t) - 1.) / TMath::Abs(qp);

    // The variance of E'/E as done in:
    // D. Stampfer, M. Regler and R. Fruehwirth,
    // Track fitting with energy loss.
    // Comp. Phys. Commun. 79 (1994) 157-164
    // http://www-linux.gsi.de/~ikisel/reco/Methods/Fruehwirth-FittingWithEnergyLoss-CPC79-1994.pdf
    Double_t varElossRadFac = TMath::Exp(- t * TMath::Log(3.) / TMath::Log(2.)) - TMath::Exp(-2. * t);

    // Update process noise.
    fProc(kIdxQP, kIdxQP) += qp * qp * varElossRadFac;

    return ElossRad;
}


TVector3 HKalRungeKutta::calcFieldIntegral() const {
    // Calculates the field integral (Tm) by numerical integration
    // along the stepping points :  | sum over i  x(i+1)-x(i) x B(i) |
    // where x and B are position and field vectors.
    // setFillPointArrays(kTRUE) has to set before call propagate
    // to fill the point and field arrays which are needed for
    // the calculation.

    TVector3 bdl;
    if(!bFillPointArrays) {
        Warning("calcFieldIntegral()", "Stepping point arrays not filled. Cannot calculate field integral.");
        return bdl;
    }
    Int_t n = pointsTrack.GetEntries() - 1;
    for(Int_t i = 0; i < n ; i++){
        TVector3& x1 = (*(TVector3*)pointsTrack.At(i    ));
        TVector3& x2 = (*(TVector3*)pointsTrack.At(i + 1));
        TVector3& B  = (*(TVector3*)fieldTrack .At(i    ));
        TVector3 l   = (x2 - x1);
        bdl += l.Cross(B);
    }
    return bdl * 0.001; // mm -> m
}

void HKalRungeKutta::calcField_mm(const TVector3& xv, TVector3& btos, Double_t fpol) const {
    // Calculate B-field (T) in x,y,z (mm).
    //
    // Output:
    // btos: field vector at position xv in Tesla.
    //
    // Input:
    // xv:   return field at this position vector. Coordinates must be in mm.
    // fpol: field scaling factor * polarity.

    if(bConstField) {
        btos.SetXYZ(magField.X(), magField.Y(), magField.Z());

    } else {
        static Double_t abtos[3];
        static Double_t axv  [3];
        axv[0] = xv.X() * 0.1;  // convert to cm
        axv[1] = xv.Y() * 0.1;
        axv[2] = xv.Z() * 0.1;

#ifdef kalDebug
        if(!fieldMap) {
            Error("calcField_mm()", "Pointer to field map not set.");
            exit(1);
        }
#endif

        fieldMap->calcField(axv,abtos,fpol);

        btos.SetX(abtos[0]);
        btos.SetY(abtos[1]);
	btos.SetZ(abtos[2]);
    }
}

void HKalRungeKutta::calcField_mm(Double_t* xv, Double_t* btos, Double_t fpol) const {
    // Calculate B-field (T) in x,y,z (mm).
    //
    // Output:
    // btos: field vector at position xv in Tesla.
    //
    // Input:
    // xv:   return field at this position vector. Coordinates must be in mm.
    // fpol: field scaling factor * polarity.

    if(bConstField) {
        btos[0] = magField.X();
        btos[1] = magField.Y();
        btos[2] = magField.Z();
    } else {
        static Double_t axv  [3];
        axv[0] = xv[0] * 0.1;  // convert to cm
        axv[1] = xv[1] * 0.1;
        axv[2] = xv[2] * 0.1;

#ifdef kalDebug
        if(!fieldMap) {
            Error("calcField_mm()", "Pointer to field map not set.");
            exit(1);
        }
#endif

        fieldMap->calcField(axv,btos,fpol);
    }
}

Bool_t HKalRungeKutta::calcMaterialProperties(Double_t &A, Double_t &Z, Double_t &density, Double_t &radLength, Double_t &exciteEner,
                                              const TVector3 &posFrom, const TVector3 &posTo,
                                              const HKalMdcMeasLayer &layerFrom, const HKalMdcMeasLayer &layerTo) const {
    // Calculates material budget for a Runge-Kutta step between two points.
    //
    // Output:
    // A:          mass number of mixture of passed material.
    // Z:          atomic number of mixture of passed material.
    // density:    density of mixture of passed material in g/mm^3.
    // radLength:  radiation length of mixture of passed material in mm.
    // exciteEner: mean excitation energy of mixture of passed material in MeV.
    //
    // Input:
    // posFrom:    position of track before the Runge-Kutta step.
    // posTo:      position of track after the Runge-Kutta step.
    // layerFrom:  measurement layer at posFrom.
    // layerTo:    measurement layer at posTo.

#if rkDebug > 3
    cout<<"Calculating material properties."<<endl;
    cout<<"Track is between mdc sec "<<layerFrom.getSector()<<" / mod "<<layerFrom.getModule()<<" / lay "<<layerFrom.getLayer()
        <<" and mdc sec "<<layerTo.getSector()  <<" / "<<layerTo.getModule()  <<" / "<<layerTo.getLayer()  <<endl;
#endif

    Int_t dirsign = 1.;
    if(direction == kIterBackward) {
        dirsign = -1.;
    }

    // Track direction.
    TVector3 dir(dirsign * (posTo - posFrom).Unit());

    // Track length.
    Double_t length = (posTo - posFrom).Mag();

    // Cosines of intersection angles of direction with the planes.
    Double_t angleFromStart = TMath::Cos(dir.Angle(layerFrom.getNormal()));
    Double_t angleToEnd     = TMath::Cos(dir.Angle(layerTo.getNormal()));

    // Distance of the start point of the RK step to its closest mdc layer.
    Double_t distFromStart = dirsign * layerFrom.signedDistanceToPlane(posFrom) / angleFromStart;
    // Distance of the end point of the RK step to its closest mdc layer.
    Double_t distToEnd     = dirsign * layerTo  .signedDistanceToPlane(posTo)   / angleToEnd;

    // Distance from the cathode layer (located in the midle of the layer
    // to the boundary of this mdc module.
    Double_t distFromModBound = layerFrom.getDistToModBound( direction) / angleFromStart;
    Double_t distToModBound   = layerTo  .getDistToModBound(!direction) / angleToEnd;

    // Calculate fractions of the track where the particle has been inside
    // and outside the layers.
    Double_t fracInsideFrom = 0.;
    Double_t fracInsideTo   = 0.;

    // Track stayed in the same module.
    if(layerFrom.getModule() == layerTo.getModule()) {
        fracInsideFrom = 1.;
        fracInsideTo   = 0.;
#if rkDebug > 3
        cout<<"Track in the same module."<<endl;
#endif
    } else {
        if(layerFrom.isInsideMod(posFrom)) {
            // Track stayed inside an mdc.
            if(layerFrom.isInsideMod(posTo)) {
                fracInsideFrom = 1.;
#if rkDebug > 3
                cout<<"Start and end points are inside the source layer."<<endl;
#endif
            } else {
                // Track started inside an mdc and ended inside the next mdc.
                if(layerTo.isInsideMod(posTo)) {
                    fracInsideFrom = (distFromModBound - distFromStart) / length;
                    fracInsideTo   = (distToModBound   + distToEnd)  / length;
#if rkDebug > 3
                    cout<<"Start point inside source layer, end point inside target layer."<<endl;
#endif
                } else {
                    // Track started inside an mdc and ended outside of this mdc.
                    fracInsideFrom = (distFromModBound - distFromStart) / length;
#if rkDebug > 3
                    cout<<"Start point inside source layer, end point outside layer."<<endl;
                    cout<<"Distance to module boundary: "<<distFromModBound<<", distance track start point to middle of source layer: "<<distFromStart<<", track length: "<<length<<endl;
                    cout<<"sec/mod/lay layer from: "<<layerFrom.getSector()<<" / "<<layerFrom.getModule()<<" / "<<layerFrom.getLayer()<<endl;
                    cout<<"sec/mod/lay layer to  : "<<layerTo.getSector()  <<" / "<<layerTo.getModule()  <<" / "<<layerTo.getLayer()  <<endl;
#endif
                }
            }
        } else {
            if(layerTo.isInsideMod(posTo)) {
                // Track stayed in an mdc.
                if(layerTo.isInsideMod(posFrom)) {
                    fracInsideTo = 1.;
#if rkDebug > 3
                    cout<<"Start and end points lie inside target layer."<<endl;
#endif
                } else {
                    // Track started outside of an mdc and ended inside of an mdc.
                    fracInsideTo = (distToModBound + distToEnd) / length;
#if rkDebug > 3
                    cout<<"Start point outside and end point is inside target layer."<<fracInsideTo<<endl;
                    cout<<"Distance to module boundary: "<<distToModBound<<", distance track end point to middle of target layer: "<<distToEnd<<", track length: "<<length<<endl;
                    cout<<"sec/mod/lay layer from: "<<layerFrom.getSector()<<" / "<<layerFrom.getModule()<<" / "<<layerFrom.getLayer()<<endl;
                    cout<<"sec/mod/lay layer to  : "<<layerTo.getSector()  <<" / "<<layerTo.getModule()  <<" / "<<layerTo.getLayer()  <<endl;
#endif
                }
            }
        }
    }

    Double_t fracOutside = 1. - fracInsideTo - fracInsideFrom;

#if rkDebug > 3
    cout<<"Length fraction inside start layer "<<fracInsideFrom<<", inside end layer "<<fracInsideTo
        <<", outside both layers "<<fracOutside<<endl;
#endif

    Double_t prec = 1.e-5;
    if(TMath::Abs(fracInsideFrom + fracInsideTo + fracOutside ) > 1.F + prec
       || (fracInsideFrom + fracInsideTo + fracOutside < -prec)
       || fracInsideFrom > 1.F + prec || fracInsideTo > 1.F + prec || fracOutside > 1.F + prec
       || fracInsideFrom < -prec || fracInsideTo < -prec || fracOutside < -prec) {
        if(bPrintWarn) {
            Warning("calcMaterialProperties()", "Track length fractions do not sum up to 1.");
            Warning("", Form("Fraction inside source layer: %f, inside target layer: %f, outside layers: %f"
                             , fracInsideFrom, fracInsideTo, fracOutside));
        }
        // Attempt to approximate fractions in order to continue with valid numbers.
        // Round calculated fractions to nearest integers.
        if(TMath::Nint(fracInsideFrom) == 1) {
            fracOutside    = 0.;
            fracInsideFrom = 1.;
            fracInsideTo   = 0.;
        } else {
            if(TMath::Nint(fracInsideTo) == 1) {
                fracOutside    = 0.;
                fracInsideFrom = 0.;
                fracInsideTo   = 1.;
            } else {
                fracOutside    = 1.;
                fracInsideFrom = 0.;
                fracInsideTo   = 0.;
            }
        }
    }

    // Make a mixture of passed material.
    HKalMixture mat("Passed material for an RK step.", "rkstep", 3);
    Float_t w[3];    // mass fractions to be calculated
    Float_t vol[3];  // volume fractions
    vol[0] = fracInsideFrom;
    vol[1] = fracInsideTo;
    vol[2] = fracOutside;
    Float_t rho[3]; // densities of passed materials
    rho[0] = layerFrom.getDensity(1);
    rho[1] = layerTo.getDensity(1);
    rho[2] = layerTo.getDensity(0);
    mat.calcMassFracFromVolFrac(w, 3, rho, vol);

    // Calculate properties of material mixture.
    mat.defineElement(0, layerFrom.getA(1), layerFrom.getZ(1), layerFrom.getDensity(1), layerFrom.getExcitationEnergy(1), layerFrom.getRadLength(1), w[0]);
    mat.defineElement(1, layerTo  .getA(1), layerTo  .getZ(1), layerTo  .getDensity(1), layerTo  .getExcitationEnergy(1), layerTo  .getRadLength(1), w[1]);
    mat.defineElement(2, layerTo  .getA(0), layerTo  .getZ(0), layerTo  .getDensity(0), layerTo  .getExcitationEnergy(0), layerTo  .getRadLength(0), w[2]);
    mat.calcMixture();

    A          = mat.GetA();
    Z          = mat.GetZ();
    density    = mat.GetDensity();
    exciteEner = mat.GetExciteEner();
    radLength  = mat.GetRadLength();

#if rkDebug > 3
    cout<<"Properties of passed material: "<<endl;
    mat.print();
#endif

    return kTRUE;
}

void HKalRungeKutta::calcMultScat(TMatrixD &fProc, const TVectorD &stateVec,
                                  Double_t length, Double_t radLength, Double_t beta, Int_t pid) const {
    // Add multiple scattering to the process noise covariance.
    //
    // Input and output:
    // fProc:     Process noise covariance. Contribution of multiple scattering is added to this matrix.
    //
    // Input:
    // stateVec:  Track state vector at start of an RK step.
    // length:    Track length in mm.
    // radLength: Radiation length of passed material in mm.
    // beta:      v/c of particle.
    // pid:       Geant particle ID.

    Double_t tx = stateVec(kIdxTanPhi);
    Double_t ty = stateVec(kIdxTanTheta);
    Double_t t  = 1. + tx*tx + ty*ty;

    // 1/beta^2
    Double_t beta2Inv = 1. / (beta*beta);

    // 1/momentum^2
    Double_t mom2Inv  = TMath::Power(stateVec(kIdxQP) / (Double_t)HPhysicsConstants::charge(pid), 2);

    // Squared scatter angle cms2.
    // cms = 13.6 MeV / (beta * c * p) * sqrt(l/X0) * (1 + 0.038 * ln(l/X0))
    // with l/X0 = length of particle track in units of radiation length.
    Double_t lx0 = length / radLength;
    Double_t cms2 = (13.6 * 13.6 * beta2Inv * mom2Inv * lx0 * TMath::Power((1 + .038 * TMath::Log(lx0)),2));

    // Update process noise.
    fProc(kIdxTanPhi  , kIdxTanPhi)   += (1 + tx*tx) * t * cms2;
    fProc(kIdxTanTheta, kIdxTanTheta) += (1 + ty*ty) * t * cms2;
    fProc(kIdxTanPhi  , kIdxTanTheta) += tx * ty     * t * cms2;
    fProc(kIdxTanTheta, kIdxTanPhi)    = fProc(kIdxTanPhi, kIdxTanTheta); // matrix is symmetric
}

void HKalRungeKutta::clear() {
    // Resets error flags and clears arrays that store points/field along the trajectory.
    // Call this every time when fitting a new track.

    pointsTrack.Clear();
    fieldTrack.Clear();

    trackOk        = kTRUE;
    bElossErr      = kFALSE;
    bPrintElossErr = kTRUE;
}

Bool_t HKalRungeKutta::checkPropMat(TMatrixD &fProp) const {
    // Check propagator matrix for INFs/NaNs or too large entries.

    Bool_t matOk = kTRUE;
    TMatrixD fPropIn = fProp;

    for(Int_t iRow = 0; iRow < fProp.GetNrows(); iRow++) {
        for(Int_t iCol = 0; iCol < fProp.GetNcols(); iCol++) {
            Double_t elem = fProp(iRow, iCol);
            if(TMath::Abs(elem) > maxPropMat || elem == numeric_limits<Double_t>::infinity() || TMath::IsNaN(elem)) {
                if(elem >= 0.) {
                    fProp(iRow, iCol) = maxPropMat;
                } else {
                    fProp(iRow, iCol) = - maxPropMat;
                }
                matOk = kFALSE;
            }
        }
    }

    if(!matOk && bPrintWarn) {
        Warning("checkPropMat()", "Some elements in propagator matrix are too large or invalid.");
        fPropIn.Print();
    }

    return matOk;
}

Bool_t HKalRungeKutta::checkTrack(TVectorD &stateVec) const {
    // Reduces values in the state vector that have become too large to avoid
    // overflows or underflows and print a warning.
    // Returns whether track parameters have been reduced or not as a boolean.
    //
    // sv: 5-dimensional track state vector. May be modified in case of errors.

    Bool_t noerr = kTRUE;
    TVectorD stateVecIn = stateVec;

    if(TMath::IsNaN(stateVec(kIdxX0))) {
        if(bPrintErr) {
            Error("checkTrack()", "X-position in state vector is a NaN.");
        }
        stateVec(kIdxX0) = maxPos;
        noerr = kFALSE;
    }
    if(TMath::IsNaN(stateVec(kIdxY0))) {
        if(bPrintErr) {
            Error("checkTrack()", "Y-position in state vector is a NaN.");
        }
        stateVec(kIdxY0) = maxPos;
        noerr = kFALSE;
    }
    if(TMath::IsNaN(stateVec(kIdxTanPhi))) {
        if(bPrintErr) {
            Error("checkTrack()", "State parameter tx is a NaN.");
        }
        stateVec(kIdxTanPhi) = maxTan;
        noerr = kFALSE;
    }
    if(TMath::IsNaN(stateVec(kIdxTanTheta))) {
        if(bPrintErr) {
            Error("checkTrack()", "State parameter ty is a NaN.");
        }
        stateVec(kIdxTanTheta) = maxTan;
        noerr = kFALSE;
    }
    if(TMath::IsNaN(stateVec(kIdxQP))) {
        if(bPrintErr) {
            Error("checkTrack()", "State parameter q/p is a NaN.");
        }
        stateVec(kIdxQP) = minMom;
        noerr = kFALSE;
    }

    if(stateVec(kIdxTanPhi) > maxTan) {
        stateVec(kIdxTanPhi) = maxTan;
        noerr = kFALSE;
    }
    if(stateVec(kIdxTanTheta) > maxTan) {
        stateVec(kIdxTanTheta) = maxTan;
        noerr = kFALSE;
    }
    if(stateVec(kIdxTanPhi) < -maxTan) {
        stateVec(kIdxTanPhi) = -maxTan;
        noerr = kFALSE;
    }
    if(stateVec(kIdxTanTheta) < -maxTan) {
        stateVec(kIdxTanTheta) = -maxTan;
        noerr = kFALSE;
    }
    if(stateVec(kIdxX0) > maxPos) {
        stateVec(kIdxX0) = maxPos;
        noerr = kFALSE;
    }
    if(stateVec(kIdxX0) < -maxPos) {
        stateVec(kIdxX0) = -maxPos;
        noerr = kFALSE;
    }
    if(stateVec(kIdxY0) > maxPos) {
        stateVec(kIdxY0) = maxPos;
        noerr = kFALSE;
    }
    if(stateVec(kIdxY0) < -maxPos) {
        stateVec(kIdxY0) = -maxPos;
        noerr = kFALSE;
    }

    if(!noerr) {
        if(bPrintWarn) {
            Warning("checkTrack()", "Track parameters are too large/small or invalid.");
        }
    }

    if(TMath::Abs(1/stateVec(kIdxQP)) < minMom) {
        if(stateVec(kIdxQP) > 0.) {
            stateVec(kIdxQP) =   1. / minMom;
        } else {
            stateVec(kIdxQP) = - 1. / minMom;
        }
        noerr = kFALSE;
        if(bPrintWarn) {
            Warning("checkTrack()", Form("Track momentum smaller than %f MeV", minMom));
        }
    }

    if(!noerr && bPrintWarn) {
        stateVecIn.Print();
    }

    return noerr;
}

Bool_t HKalRungeKutta::propagateToPlane(TMatrixD &fProp, TMatrixD &fProc, TVectorD &stateVecTo,
                                        const TVectorD &stateVecFrom,
                                        const HKalPlane &planeFrom, const HKalPlane &planeTo,
                                        const HKalMdcMeasLayer &measLayFrom, const HKalMdcMeasLayer &measLayTo,
                                        Int_t pid, Bool_t propDir, Bool_t bCalcJac) {
    // Propagate a particle trajectory to a plane using a 4th order Runge-Kutta.
    // Returns true if no errors were encountered during track propagation.
    //
    // Output:
    // fProp:         Propagator matrix.
    // fProc:         Process noise matrix with contributions of multiple scattering and energy loss.
    // stateVecTo:    Track state vector (x,y,tx,ty,q/p) at target plane.
    //
    // Input:
    // stateVecFrom:  Track state vector at (x,y,tx,ty,q/p) at source plane.
    // planeFrom:     Plane to propagate from.
    // planeTo:       Plane to propagate to.
    // measLayerFrom: Detector element in which the track is currently in. Used to calculate passed materials.
    // measLayerTo:   Detector element the track will move to. Used to calculate passed materials.
    // pid:           Geant particle ID. Needed for process noise calculations.
    // propDir:       propagation direction kIterForward or kIterBackward.
    // bCalcJac:      Calculate the propagator matrix.

    bElossErr      = kFALSE;
    trackOk        = kTRUE;
    direction      = propDir; // forward/backward
    trackLength    = 0.;
    stepLength     = 0.;
    energyLoss     = 0.;
    jstep          = 0;

    Double_t mass  = HPhysicsConstants::mass(pid);

    stateVecTo     = stateVecFrom;

    fProp.UnitMatrix();
    fProc.Zero();

    TVectorD stateVecPreStep(stateVecTo.GetNrows());
    TVector3 posPreStep;
    TVector3 posAt;
    if(!HKalTrackState::calcPosAtPlane(posAt, planeFrom, stateVecFrom)) {
        // Should not happen unless plane is parallel to xy-plane.
        if(bPrintErr) {
            Error("propagateToPlane()", "Could not extract a position vector from track state.");
        }
        return kFALSE;
    }
    trackPosAtZ = posAt.z();

    Double_t sd = planeTo.signedDistanceToPlane(posAt);
    if((sd > 0. && propDir == kIterForward) || (sd < 0. && propDir == kIterBackward)) {
        if(TMath::Abs(sd) > 1.e-3) {
	    if(bPrintErr) {
		Error("propagateToPlane()", Form("Track was already past the target plane before propagation by %f.", sd));
	    }
            return kFALSE;
        } else {
	    if(bPrintWarn) {
		Warning("propagateToPlane()", Form("Track was already past the target plane before propagation by %f.", sd));
	    }
            return kTRUE;
        }
    }

    Double_t step     = initialStepSize;
    Double_t nextStep = step;
    Double_t stepFac  = 1.;
    Bool_t doNextStep = kTRUE;

    // Reduce step size if too close to the target plane.
    TVector3 dirAt;
    HKalTrackState::calcDir(dirAt, stateVecFrom);
    TVector3 pointIntersect;
    if(!planeTo.findIntersection(pointIntersect, posAt, dirAt)) {
        if(bPrintErr) {
            Error("propagateToPlane()", "Track is parallel to target plane.");
        }
        return kFALSE;
    }

    Double_t d = HKalGeomTools::distance2Points(posAt, pointIntersect);
    if(d < step) {
        step     = d;
        nextStep = step;
    }

    // Steps are taken in z-direction. Compensate for track inclination.
    Double_t stepz = step * dirAt.Z();

    TMatrixD DFstep(fProp.GetNrows(), fProp.GetNcols());

#if rkDebug > 1
    cout<<"***************************"<<endl;
    cout<<"**** START RUNGE-KUTTA ****"<<endl;
    cout<<"***************************"<<endl;
#endif

#if rkDebug > 2
    cout<<"Propagate from plane in sector "<<measLayFrom.getSector()<<", module "<<measLayFrom.getModule()<<", layer "<<measLayFrom.getLayer()
        <<" to plane in sector "<<measLayTo.getSector()<<", module "<<measLayTo.getModule()<<", layer "<<measLayTo.getLayer()<<endl;

    cout<<"RK input sv: "<<endl;
    stateVecFrom.Print();

    cout<<"distance to source meas layer "<<measLayFrom.signedDistanceToPlane(posAt)<<
        ", distance to target meas layer "<<measLayTo.signedDistanceToPlane(posAt)<<endl;
    cout<<"distance to source plane "     <<planeFrom.signedDistanceToPlane(posAt)<<
        ", distance to target plane "     <<planeTo.signedDistanceToPlane(posAt)<<endl;
#endif

    // --------------------------
    // Begin Runge-Kutta stepping.

    while (d >= maxDist && doNextStep && jstep < maxNumSteps && step) {

        // Store some properties before stepping.
        posPreStep.SetXYZ(stateVecTo(kIdxX0), stateVecTo(kIdxY0), trackPosAtZ);
        stateVecPreStep = stateVecTo;

        // Calculate step size in z-direction.
        TVector3 dirAt;
        HKalTrackState::calcDir(dirAt, stateVecTo);
        stepz = step * dirAt.z();

        stepFac = rkSingleStep(stateVecTo, DFstep, stepz, bCalcJac); // do one step

        posAt.SetXYZ(stateVecTo(kIdxX0), stateVecTo(kIdxY0), trackPosAtZ);
        Double_t sd = planeTo.signedDistanceToPlane(posAt);

#if rkDebug > 1
        cout<<"**** Do single step "<<jstep<<" ****"<<endl;
#endif
#if rkDebug > 2
        cout<<"Step size = "<<stepz<<endl;
        cout<<"Remaining distance to target plane: "<<sd<<endl;
        cout<<"State vector after step "<<jstep<<":"<<endl;
        stateVecTo.Print();
#endif

        Double_t prec = 1.e-6;
        if(((sd > 0. + prec) && propDir == kIterForward) || ((sd < 0. - prec) && propDir == kIterBackward)) {
            // Track went past target plane during propagtion. Repeating last step with reduced step size.
            step       *= stepSizeDec;
            nextStep   *= stepSizeDec;
            stateVecTo  = stateVecPreStep;
            trackPosAtZ = posPreStep.Z();
            posAt.SetXYZ(posPreStep.X(), posPreStep.Y(), posPreStep.Z());
            trackLength -= stepLength;
            continue;
        }

        // After each Runge-Kutta step i the covariance matrix C_i would have to be
        // transported with the propagator matrix F_i:
        // C_1 = F_1 * C_0   * F_1^T
        // C_2 = F_2 * C_1   * F_2^T
        // ...
        // C_n = F_n * C_n-1 * F_n^T
        // This can be transformed to:
        // C_n = F_n * ... * F_2 * F_1 * C_0 * F_1^T * F_2^T * ... * F_n^T
        //     =             F         * C_0 *         F^T

        fProp = DFstep * fProp; // update propagator

        // -----------------------------
        //  Process Noise and Energy Loss

        if((bDoMS || bDoDEDX) && stepLength > minLengthCalcQ) {
            // Track inclination = sqrt(1 + tx^2 + ty^2).
            Double_t trackIncl = TMath::Sqrt(1. + stateVecPreStep(kIdxTanPhi)*stateVecPreStep(kIdxTanPhi) + stateVecPreStep(kIdxTanTheta)*stateVecPreStep(kIdxTanTheta));

            // Total step length = step length in z direction * track inclination.
            stepLength = stepz * trackIncl;

            Double_t beta = 1. / TMath::Sqrt(1. + mass*mass * stateVecPreStep(kIdxQP)*stateVecPreStep(kIdxQP));

            // Properties of passed material.
            Double_t A, Z, density, radLength, exciteEner;
            if(calcMaterialProperties(A, Z, density, radLength, exciteEner, posPreStep, posAt, measLayFrom, measLayTo)) {
                if(bDoMS) {
                    calcMultScat(fProc, stateVecPreStep, stepLength, radLength, beta, pid);
                }

                if(bDoDEDX) {
                    energyLoss += calcEnergyLoss(fProc, stateVecTo, stepLength, stateVecPreStep(kIdxQP), Z, Z/A, density, radLength, exciteEner, pid);
                }
            } else {
                if(bPrintErr) {
                    Error("propagateToPlane()", "Could not calculate process noise.");
                }
            }
        }

        //  End Process Noise and Energy Loss
        // ----------------------------------

        // Decide if more steps must be done and calculate new step size.
        // -----------
        HKalTrackState::calcDir(dirAt, stateVecTo);
        if(!planeTo.findIntersection(pointIntersect, posAt, dirAt)) {
            trackOk = kFALSE;
            if(bPrintErr) {
                Error("propagateToPlane()", "No intersection with target plane found.");
            }
        }
        d = HKalGeomTools::distance2Points(posAt, pointIntersect);

        if (step < nextStep) {  // last step was rest step to chamber
            if (stepFac < 1.) nextStep = step * stepFac;
        } else {
            nextStep *= stepFac;
        }

        if (d > nextStep || d < maxDist) step = nextStep;
        else step = d;

        if(direction == kIterForward) {
            if(posAt.z() < pointIntersect.z()) { doNextStep = kTRUE; }
            else { doNextStep = kFALSE; }
        } else {
            if(posAt.z() > pointIntersect.z()) { doNextStep = kTRUE; }
            else { doNextStep = kFALSE; }
        }
        // -----------

#if rkDebug > 1
        cout<<"**** End single step. step: "<<jstep<<", z: "<<trackPosAtZ<<", size of next step: "<<nextStep<<" ****"<<endl;
#endif
    }

    // Done with Runge-Kutta stepping.
    // ------------------------------

    // To make sure the track position is on the target layer propagate to the target plane
    // using a straight line.
    stateVecPreStep = stateVecTo;
    posPreStep.SetXYZ(stateVecPreStep(kIdxX0), stateVecPreStep(kIdxY0), trackPosAtZ);

    if(!propagateStraightLine(stateVecTo, DFstep, trackPosAtZ, planeTo, propDir)) {
        trackOk = kFALSE;
        if(bPrintErr) {
            Error("propagateToPlane()", "Failed final propagation to target plane.");
        }
    }

    fProp = DFstep * fProp;

    // avoid too large/too small values
    if(!checkTrack(stateVecTo)) {
        trackOk = kFALSE;
        if(bPrintErr) {
            Error("propagateToPlane()", "Encountered nonsensical track parameters.");
        }
    }
    if(!checkPropMat(fProp)) {
        trackOk = kFALSE;
        if(bPrintErr) {
            Error("propagateToPlane()", "Encountered erroneous elements in covariance matrix.");
        }
    }

    // Energy loss and multiple scattering for straight line propagating.
    if((bDoDEDX || bDoMS) && stepLength > minLengthCalcQ) {
        Double_t A, Z, density, radLength, exciteEner;
        TVector3 posAt;
        HKalTrackState::calcPosAtPlane(posAt, planeTo, stateVecTo);
        Double_t beta = 1. / TMath::Sqrt(1. + mass*mass * stateVecPreStep(kIdxQP)*stateVecPreStep(kIdxQP));

        if(calcMaterialProperties(A, Z, density, radLength, exciteEner, posPreStep, posAt, measLayFrom, measLayTo)) {
            if(bDoMS) {
                calcMultScat(fProc, stateVecPreStep, stepLength, radLength, beta, pid);
            }

            if(bDoDEDX) {
                energyLoss += calcEnergyLoss(fProc, stateVecTo, stepLength, stateVecTo(kIdxQP), Z, Z/A, density, radLength, exciteEner, pid);
            }
        } else {
            if(bPrintErr) {
                Error("propagateToPlane()", "Could not calculate process noise.");
            }
        }
    }

    if(stateVecTo.GetNrows() == 6) {
        stateVecTo(kIdxZ0) = trackPosAtZ;
    }

    if(bPrintErr && bElossErr) {
        Error("propagateToPlane()", "Energy loss calculation failed.");
    }

#if rkDebug > 1
    cout<<"*************************"<<endl;
    cout<<"**** END RUNGE-KUTTA ****"<<endl;
    cout<<"*************************"<<endl;
#endif

    return (trackOk & !bElossErr);
}

void HKalRungeKutta::propagateStraightLine(TVectorD &stateVec, TMatrixD &fPropChange, Double_t &zPos, Double_t dz) {
    // Propagate the track state along a straight line in its current direction.
    // (x',y',z') = (x,y,z) + dz * (tx,ty,1)
    //
    // Output:
    // fPropChange: Change in propagator matrix.
    //
    // Input & output:
    // stateVec:    Current track state vector (x,y,tx,ty,qp).
    //
    // Input:
    // zPos:        Current z position of track.
    // dz:          Step length in z coordinate.

    Double_t tx = stateVec(kIdxTanPhi);
    Double_t ty = stateVec(kIdxTanTheta);

    // Update state vector.
    stateVec(kIdxX0) = stateVec(kIdxX0) + dz * tx;
    stateVec(kIdxY0) = stateVec(kIdxY0) + dz * ty;
    zPos             = zPos             + dz;
    trackPosAtZ      = zPos;
    if(stateVec.GetNrows() == 6) {
        stateVec(kIdxZ0) = trackPosAtZ;
    }

    // Update propagator matrix.
    fPropChange.UnitMatrix();

    fPropChange(kIdxX0, kIdxTanPhi)   = dz;
    fPropChange(kIdxY0, kIdxTanTheta) = dz;

    stepLength   = TMath::Abs(dz) * TMath::Sqrt(1. + tx*tx + ty*ty);
    trackLength += stepLength;

    //------------------------------------------------------------------------
    // For debugging + graphics purpose.
    if(bFillPointArrays) {
        TVector3 posAt  (stateVec(kIdxX0), stateVec(kIdxY0), trackPosAtZ);

	// only for the first time add
        if(pointsTrack.GetEntries() == 0) {
            // start point
            TVector3 posFrom(stateVec(kIdxX0) - dz * tx, stateVec(kIdxY0) - dz * ty, trackPosAtZ - dz);
            pointsTrack.Add(new TVector3(posFrom));
            fieldTrack.Add(new TVector3(0.,0.,0.));
        }

        pointsTrack.Add(new TVector3(posAt));
        fieldTrack.Add(new TVector3(0.,0.,0.));
    }
    //------------------------------------------------------------------------
}

Bool_t HKalRungeKutta::propagateStraightLine(TVectorD &stateVec, TMatrixD &fPropChange, Double_t &zPos, const HKalPlane &planeTo, Bool_t propDir) {
    // From the position and direction stored in the track state vector, propagate the track
    // to a target plane using a straight line. The track state and reference layer are updated
    // and the propagator matrix is calculated. The function returns the length of the straight line.
    // The class variable trackPosAtZ must contain the current z-value of the track.
    //
    // Output:
    // fPropChange: Change in propagator matrix
    //
    // Input and output:
    // stateVec:    Current Track state vector.
    // zPos:        Current z-position of track.
    //
    // Input:
    // planeTo:     Plane to propagate to.
    // propDir:     Propagation direction.

    stepLength = 0.;
    TVector3 pos(stateVec(kIdxX0), stateVec(kIdxY0), zPos);
    TVector3 dir;
    HKalTrackState::calcDir(dir, stateVec);
    TVector3 pointIntersect;
    planeTo.findIntersection(pointIntersect, pos, dir);
    Double_t dz = (pointIntersect.Z() - pos.Z());

#if rkDebug > 1
    cout<<"Final step using straight line. Signed distance to target layer = "<<planeTo.signedDistanceToPlane(pos)<<endl;
#endif

    if((dz > 0. && propDir == kIterForward) || (dz < 0. && propDir == kIterBackward)) {
        propagateStraightLine(stateVec, fPropChange, zPos, dz);
        stepLength = (pos - pointIntersect).Mag();
    } else {
        fPropChange.UnitMatrix();
        if(TMath::Abs(dz) > 0.001) {
            if(bPrintWarn) {
                Warning("propagateStraightLine()", Form("Track already past target plane by dz = %f.", TMath::Abs(dz)));
            }
            return kFALSE;
        }
    }
    return kTRUE;
}


Double_t HKalRungeKutta::rkSingleStep(TVectorD &stateVec, TMatrixD &fPropStep, Double_t stepSize, Bool_t bCalcJac) {
    // One step of track tracing from track state.
    //
    // Input and output:
    // stateVec:  Starting track parameters.
    // fPropStep: Change in propagator matrix for this step.
    //
    // Input:
    // totStep:   Step size.
    // bCalcJac:  Update the Jacobian (propagator matrix).


    const Int_t numPars = 4; // x, y, tx, ty

    // Convert the unit of Lorentz force from Newton to MeV/(c*s).
    // Lorentz force:
    // F = dp/dt = q * v x B
    // q in C, v in m/s, B in T
    // Unit conversion:
    // 1 N = 1 J/m
    //     = 10^6 * e / c  MeV/(c*s)
    //     = 10^9 * e / c  MeV/(c*s)  if c is in mm/s
    //
    // => F = dp/dt = kappa * q * v x B
    // q in e, v in mm/s, B in T
    const Double_t kappa = TMath::C() / 1.e9; // in MeV/(c * T * mm)

    //  Changes of state vector a by stepping in z direction:
    //  da/dz, a = (x, y, tx, ty, qp), z = stepping dir
    //  x'  = tx
    //  y'  = ty
    // tx'  = k * (tx * ty   * B[0] - (1 + tx2) * B[1] + ty * B[2])
    // ty'  = k * ((1 + ty2) * B[0] - txty      * B[1] - tx * B[2])
    //  k   = c * (q/p) * sqrt(1 + tx2 + ty2)

    // f    = f(z, a(z))
    // k1   = f(zn        , an)
    // k2   = f(zn + 1/2*h, an + 1/2*k1)
    // k3   = f(zn + 1/2*h, an + 1/2*k2)
    // k4   = f(zn + h    , an + k3)
    // fn+1 = fn + 1/6*k1 + 1/3*k2 + 1/3*k3 + 1/6*k4 + O(h^5)

    // Constants for RK stepping.
    static Double_t a[numPars] = { 0.0    , 0.5    , 0.5    , 1.0     };
    static Double_t b[numPars] = { 0.0    , 0.5    , 0.5    , 1.0     };
    static Double_t c[numPars] = { 1.0/6.0, 1.0/3.0, 1.0/3.0, 1.0/6.0 };

    // for rk stepping
    //Int_t step4;
    const Int_t rksteps = 4; // The 4 points used in Runge-Kutta stepping: start, 2 mid points and end
    const Int_t rkStart = 0;
    const Int_t rkMid1  = 1;
    const Int_t rkMid2  = 2;
    const Int_t rkEnd   = 3;

    // Change of track parameters in each step.
    // First index: step point (0 = start; 1,2 = mid, 3 = end), second index: state parameter.
    Double_t k[rksteps][numPars]; 

    // for propagator matrix
    Double_t F_tx[numPars], F_ty[numPars], F_tx_tx[numPars], F_ty_tx[numPars], F_tx_ty[numPars], F_ty_ty[numPars];
    Double_t F2_tx[numPars], F2_ty[numPars]; // @2tx/@z^2 and @2ty/@z^2

    //----------------------------------------------------------------
    Double_t est     = 0.; // error estimation
    Double_t stepFac = 1.;

    TVector3 B;                  // B-field
    Double_t h = stepSize;       // step size
    if(direction == kIterBackward) {
        h *= -1;                 // stepping in negative z-direction
    }
    Double_t half    = h * 0.5;  // half step interval for fourth order RK

    Double_t qp_in   = stateVec(kIdxQP);
    TVector3 posFrom = TVector3(stateVec(kIdxX0), stateVec(kIdxY0), trackPosAtZ);
    Double_t z_in    = posFrom.z();
    trackPosAtZ      = z_in;
    TVector3 posAt   = posFrom;

    Double_t hC      = h * kappa;

    // Input track state vector and state vector during stepping.
    Double_t sv_in[numPars], sv_step[numPars];
    sv_in[kIdxX0]       = stateVec(kIdxX0);
    sv_in[kIdxY0]       = stateVec(kIdxY0);
    sv_in[kIdxTanPhi]   = stateVec(kIdxTanPhi);
    sv_in[kIdxTanTheta] = stateVec(kIdxTanTheta);

    fPropStep.UnitMatrix();

    //------------------------------------------------------------------------
    //   Runge-Kutta step
    //
    Int_t istep;
    Int_t ipar;

    do {
        half  = h * 0.5;
        for (istep = 0; istep < rksteps; ++istep) {  // k1,k2,k3,k4  (k1=start, k2,k3 = half, k4=end of interval)
            for(ipar = 0; ipar < numPars; ++ipar) {  // 4 track parameters
                if(istep == 0) {
                    sv_step[ipar] = sv_in[ipar];     // in first step copy input track parameters (x,y,tx,ty)
                } else {
                    sv_step[ipar] = sv_in[ipar] + b[istep] * k[istep-1][ipar];     // do step
                }
            }
            trackPosAtZ = z_in + a[istep] * h; // move z along with track
            posAt.SetXYZ(sv_step[kIdxX0], sv_step[kIdxY0], trackPosAtZ ); // update z value for current position

            // rotate B-field vector
            if(bRotBfield) {
                TVector3 posAtSector = posAt;
                posAtSector.Transform(pRotMat->Inverse());
                calcField_mm(posAtSector, B, fieldScaleFact);
                B.Transform(*pRotMat);
            } else {
                calcField_mm(posAt, B, fieldScaleFact);
            }

            // Check if position or direction angles are too large.
            Bool_t svOk = kTRUE;
            if(sv_step[kIdxTanPhi] > maxTan) {
                sv_step[kIdxTanPhi] = maxTan;
                svOk = kFALSE;
            }
            if(sv_step[kIdxTanTheta] > maxTan) {
                sv_step[kIdxTanTheta] = maxTan;
                svOk = kFALSE;
            }
            if(sv_step[kIdxTanPhi] < -maxTan) {
                sv_step[kIdxTanPhi] = -maxTan;
                svOk = kFALSE;
            }
            if(sv_step[kIdxTanTheta] < -maxTan) {
                sv_step[kIdxTanTheta] = -maxTan;
                svOk = kFALSE;
            }
            if(sv_step[kIdxX0] > maxPos) {
                sv_step[kIdxX0] = maxPos;
                svOk = kFALSE;
            }
            if(sv_step[kIdxX0] < -maxPos) {
                sv_step[kIdxX0] = -maxPos;
                svOk = kFALSE;
            }
            if(sv_step[kIdxY0] > maxPos) {
                sv_step[kIdxY0] = maxPos;
                svOk = kFALSE;
            }
            if(sv_step[kIdxY0] < -maxPos) {
                sv_step[kIdxY0] = -maxPos;
                svOk = kFALSE;
            }
            if(!svOk) {
                if(bPrintWarn && trackOk) {
                    Warning("rkSingleStep()", "Bad elements in state vector.");
                }
                trackOk = kFALSE;
            }

            Double_t tx        = sv_step[kIdxTanPhi];
            Double_t ty        = sv_step[kIdxTanTheta];
            Double_t tx2       = tx * tx;
            Double_t ty2       = ty * ty;
            Double_t txty      = tx * ty;
            Double_t tx2ty21   = 1.0 + tx2 + ty2;

            Double_t I_tx2ty21 = 1.0 / tx2ty21 * qp_in;
            Double_t tx2ty2    = sqrt(tx2ty21);
                     tx2ty2   *= hC;
            Double_t tx2ty2qp  = tx2ty2 * qp_in;

            // for state propagation
            F_tx[istep] = ( txty        *B.x() - ( 1.0 + tx2 )*B.y() + ty*B.z()) * tx2ty2;    // h * @tx/@z / (qp) = h * tx' / (qp)
            F_ty[istep] = (( 1.0 + ty2 )*B.x() - txty         *B.y() - tx*B.z()) * tx2ty2;    // h * @ty/@z / (qp) = h * ty' / (qp)

            //cout<<"\n values for state propagation: "<<endl;
            //cout<<"F_tx[istep]    = (   txty        *B.x()    -    ( 1.0 + tx2 )*B.y()    +    ty*B.z()   ) *    tx2ty2"<<endl;
            //cout<< F_tx[istep]<<" = ( "<<txty       *B.x()<<" - "<<( 1.0 + tx2 )*B.y()<<" + "<<ty*B.z()<<") * "<<tx2ty2 <<endl;
            //cout<<"F_ty[istep]    = (    ( 1.0 + ty2 )*B.x()    -    txty         *B.y()    -    tx*B.z()   ) *    tx2ty2"<<endl;
            //cout<< F_ty[istep]<<" = ( "<<( 1.0 + ty2 )*B.x()<<" - "<<txty         *B.y()<<" - "<<tx*B.z()<<") * "<<tx2ty2 <<endl;

            //------------------------------------------------------------------------
            // for transport matrix
            F_tx_tx[istep] = F_tx[istep]*tx*I_tx2ty21 + ( ty*B.x()-2.0*tx*B.y() ) * tx2ty2qp; // h * @tx'/@tx
            F_tx_ty[istep] = F_tx[istep]*ty*I_tx2ty21 + ( tx*B.x()+B.z()        ) * tx2ty2qp; // h * @tx'/@ty
            F_ty_tx[istep] = F_ty[istep]*tx*I_tx2ty21 + (-ty*B.y()-B.z()        ) * tx2ty2qp; // h * @ty'/@tx
            F_ty_ty[istep] = F_ty[istep]*ty*I_tx2ty21 + ( 2.0*ty*B.x()-tx*B.y() ) * tx2ty2qp; // h * @ty'/@ty

            // Change of track parameters in each step.
            k[istep][kIdxX0]       = tx * h;              // dx
            k[istep][kIdxY0]       = ty * h;              // dy
            k[istep][kIdxTanPhi]   = F_tx[istep] * qp_in; // dtx
            k[istep][kIdxTanTheta] = F_ty[istep] * qp_in; // dty

            // h * @tx'/@z = h * (@tx/@dz)/@dz
            F2_tx[istep]   = qp_in *
                (tx*k[istep][kIdxTanPhi]/TMath::Sqrt(tx2ty21)*(txty*B.X() - (1. + tx2)*B.Y() + ty*B.Z())
                  + TMath::Sqrt(tx2ty21) *
                 (k[istep][kIdxTanPhi]*ty*B.X() + tx*k[istep][kIdxTanTheta]*B.X()
                  - 2.*tx*k[istep][kIdxTanPhi]*B.Y() + k[istep][kIdxTanTheta]*B.Z())
                );

            // h * @ty'/@z = h * (@ty/@dz)/@dz
            F2_ty[istep]   = qp_in *
                (ty*k[istep][kIdxTanTheta]/TMath::Sqrt(tx2ty21)*(( 1.0 + ty2 )*B.X() - txty*B.Y() - tx*B.Z())
                  + TMath::Sqrt(tx2ty21) *
                 (2.*ty*k[istep][kIdxTanTheta]*B.X() - k[istep][kIdxTanPhi]*ty*B.Y() - tx*k[istep][kIdxTanTheta]*B.Y()
                 - k[istep][kIdxTanPhi]*B.Z()));

        }  // end of Runge-Kutta steps
        //------------------------------------------------------------------------

        //------------------------------------------------------------------------
        // error estimation ala Geant
        est = 0.;

        est += fabs(k[rkStart][kIdxX0]       + k[rkEnd][kIdxX0]       - k[rkMid1][kIdxX0]       - k[rkMid2][kIdxX0])       * half;
        est += fabs(k[rkStart][kIdxY0]       + k[rkEnd][kIdxY0]       - k[rkMid1][kIdxY0]       - k[rkMid2][kIdxY0])       * half;
        est += fabs(k[rkStart][kIdxTanPhi]   + k[rkEnd][kIdxTanPhi]   - k[rkMid1][kIdxTanPhi]   - k[rkMid2][kIdxTanPhi])   * half;
        est += fabs(k[rkStart][kIdxTanTheta] + k[rkEnd][kIdxTanTheta] - k[rkMid1][kIdxTanTheta] - k[rkMid2][kIdxTanTheta]) * half;
        //------------------------------------------------------------------------

        if (est < minPrecision || h <= minStepSize || stepFac <= minStepSize) {
            // we found a step size with good precision
            jstep ++;
            break;
        } else {
            // precision not good enough. make smaller step
            stepFac *= stepSizeDec;
            h       *= stepSizeDec;
            hC       = h * kappa;

#if rkDebug > 2
            cout<<"Precision not good enough. Reducing step size to "<<h<<endl;
#endif
        }

    } while (jstep < maxNumSteps);

    if (est < maxPrecision && h < maxStepSize) {
        stepFac *= stepSizeInc;
    }

    //------------------------------------------------------------------------
    // set output track parameters
    for(ipar = 0; ipar < numPars; ++ ipar) {
        // yn+1        = yn         + 1/6*k1                    + 1/3*k2                  + 1/3*k3                  + 1/6*k4
        stateVec(ipar) = sv_in[ipar]+c[rkStart]*k[rkStart][ipar]+c[rkMid1]*k[rkMid1][ipar]+c[rkMid2]*k[rkMid2][ipar]+c[rkEnd]*k[rkEnd][ipar];
    }


    //------------------------------------------------------------------------
    // for debugging + graphics purpose
    if(bFillPointArrays) {
        TVector3 posSec;

        // only for the first time
        if(pointsTrack.GetEntries() == 0) {
            // start point
            calcField_mm(posFrom, B, fieldScaleFact);

            posSec = posFrom;
            if(bRotBfield) {
                posSec.Transform(pRotMat->Inverse());
            }
            pointsTrack.Add(new TVector3(posFrom));
            fieldTrack .Add(new TVector3(B));
        }

        posSec = posAt;
        if(bRotBfield) {
            posSec.Transform(pRotMat->Inverse());
        }
        calcField_mm(posAt, B, fieldScaleFact);

        pointsTrack.Add(new TVector3(posAt));
        fieldTrack .Add(new TVector3(B));
    }
    //------------------------------------------------------------------------

    stepLength = fabs(HKalGeomTools::distance2Points(posFrom, posAt));
    trackLength += stepLength;  // calculate track length

    if (est < maxPrecision && h < maxStepSize) {
        stepFac *= stepSizeInc;
    }

    if(!bCalcJac) {
        return stepFac;
    }

    //------------------------------------------------------------------------
    //
    //     Derivatives

    //     x  y tx ty qp
    //  x  0  5 10 15 20    J[ 0 ...] = da/dx       = 0,   1 = 1
    //  y  1  6 11 16 21    J[ 5 ...] = da/dy       = 0,   6 = 1
    // tx  2  7 12 17 22    J[10 ...] = da/dtx            12 = 1, 14 = 0
    // ty  3  8 13 18 23    J[15 ...] = da/dty            18 = 1, 19 = 0
    // qp  4  9 14 19 24    J[20 ...] = da/dqp            24 = 1
    //


    //------------------------------------------------------------------------
    //
    //     Derivatives    dx/dqp
    //

    // Update of Jacobian matrix for each step:
    // F_i = @a(zi)/@a(z0) =  @f(a,zi)/@a(zi) * (I + F_i-1 * (zi - z0)/dz) * dz
    //
    // z0      : starting z position
    // zi      : z position after step i = (z0, z0 + 0.5*dz, z0 + 0.5*dz, z0 + dz)
    // dz      : step size
    // (zi - z0) / dz = (0, 0.5, 0.5, 1)
    //
    // F_i = @a(zi)/@a(z0) : Jacobian matrix of RK step i
    // f(a,zi) = @a(zi)/@zi: derivation of track state vector a at step i by z
    // E                   : unit matrix
    // a(zi)               : track state vector at step i
    // a(z0)               : initial track state vector

    // x0: contribution of the Unit matrix to Jacobian
    // x:  contribution of Jacobian from previous step
    Double_t x0[numPars], x[numPars];

    // Elements of the Jacobian matrix F_i of one step i for the derivation of one specific track parameter.
    Double_t k1[rksteps][numPars];

    x0[kIdxX0] = 0.0; x0[kIdxY0] = 0.0; x0[kIdxTanPhi] = 0.0; x0[kIdxTanTheta] = 0.0;

    //   Runge-Kutta step for derivatives dx/dqp

    for(istep = 0; istep < rksteps; ++ istep) {
        for(ipar = 0; ipar < numPars; ++ ipar) {
            if(istep == 0) {
                x[ipar] = x0[ipar];
            } else {
                x[ipar] = x0[ipar] + b[istep] * k1[istep-1][ipar];
            }
        }
        //     F_i(x, qp)       = @x'/@tx * F_(i-1)(tx,qp) * dz
        //                      = F_(i-1)(tx,qp) * dz
        k1[istep][kIdxX0]       = x[kIdxTanPhi]   * h;
        //     F_i(y, qp)       = @y'/@ty * F_(i-1)(ty,qp) * dz
        //                      = F_(i-1)(ty,qp) * dz
        k1[istep][kIdxY0]       = x[kIdxTanTheta] * h;
        //     F_i(tx, qp)      = @tx'/@qp    + @tx'/@tx * F_(i-1)(tx,qp) * dz + @tx'/@ty * F_(i-1)(ty,qp) * dz
        k1[istep][kIdxTanPhi]   = F_tx[istep] + F_tx_tx[istep] * x[kIdxTanPhi] + F_tx_ty[istep] * x[kIdxTanTheta];
        //     F_i(ty, qp)      = @ty'/@qp    + @ty'/@tx * F_(i-1)(tx,qp) * dz + @ty'/@ty * F_(i-1)(ty,qp) * dz
        k1[istep][kIdxTanTheta] = F_ty[istep] + F_ty_tx[istep] * x[kIdxTanPhi] + F_ty_ty[istep] * x[kIdxTanTheta];
    }  // end of Runge-Kutta steps for derivatives dx/dqp


    for (ipar = 0; ipar < numPars; ++ipar ) {
        fPropStep(ipar, kIdxQP) = x0[ipar] + c[rkStart]*k1[rkStart][ipar] + c[rkMid1]*k1[rkMid1][ipar]
                                           + c[rkMid2] *k1[rkMid2][ipar]  + c[rkEnd] *k1[rkEnd][ipar];
    }
    fPropStep(kIdxQP,kIdxQP) = 1.;
    //------------------------------------------------------------------------



    //------------------------------------------------------------------------
    //     Derivatives    dx/tx
    //

    x0[kIdxX0] = 0.0; x0[kIdxY0] = 0.0; x0[kIdxTanPhi] = 1.0; x0[kIdxTanTheta] = 0.0;

    //
    //   Runge-Kutta step for derivatives dx/dtx
    //

    for (istep = 0; istep < 4; ++ istep) {
        for(ipar = 0; ipar < numPars; ++ipar) {
            if(istep == 0) {
                x[ipar] = x0[ipar];
            } else if ( ipar != kIdxTanPhi ){
                x[ipar] = x0[ipar] + b[istep] * k1[istep-1][ipar];
            }
        }

        k1[istep][kIdxX0]       = x[kIdxTanPhi]   * h;
        k1[istep][kIdxY0]       = x[kIdxTanTheta] * h;
        //k1[istep][kIdxTanPhi] = F_tx_tx[istep] * x[kIdxTanPhi] + F_tx_ty[istep] * x[kIdxTanTheta]; // not needed
        k1[istep][kIdxTanTheta] = F_ty_tx[istep] * x[kIdxTanPhi] + F_ty_ty[istep] * x[kIdxTanTheta];
    }  // end of Runge-Kutta steps for derivatives dx/dtx

    for(ipar = 0; ipar < numPars; ++ipar ) {
        if(ipar != kIdxTanPhi) {
            fPropStep(ipar, kIdxTanPhi) = x0[ipar] + c[rkStart]*k1[rkStart][ipar] + c[rkMid1]*k1[rkMid1][ipar]
                                                   + c[rkMid2] *k1[rkMid2][ipar]  + c[rkEnd] *k1[rkEnd][ipar];
        }
    }
    //      end of derivatives dx/dtx
    fPropStep(kIdxTanPhi, kIdxTanTheta) = 1.;
    fPropStep(kIdxQP,     kIdxTanPhi)   = 0.;
    //------------------------------------------------------------------------

    //------------------------------------------------------------------------
    //     Derivatives    dx/ty
    //

    x0[kIdxX0] = 0.0; x0[kIdxY0] = 0.0; x0[kIdxTanPhi] = 0.0; x0[kIdxTanTheta] = 1.0;

    //
    //   Runge-Kutta step for derivatives dx/dty
    //

    for (istep = 0; istep < 4; ++ istep) {
        for(ipar = 0; ipar < numPars; ++ipar) {
            if(istep == 0) {
                x[ipar] = x0[ipar];           // ty fixed
            } else if(ipar != kIdxTanTheta) {
                x[ipar] = x0[ipar] + b[istep] * k1[istep-1][ipar];
                //x[ipar] = x0[ipar] + b[istep] * k1[istep*4-4+ipar];
            }
        }

        k1[istep][kIdxX0]         = x[kIdxTanPhi]   * h;
        k1[istep][kIdxY0]         = x[kIdxTanTheta] * h;
        k1[istep][kIdxTanPhi]     = F_tx_tx[istep] * x[kIdxTanPhi] + F_tx_ty[istep] * x[kIdxTanTheta];
        //k1[istep][kIdxTanTheta] = F_ty_tx[istep] * x[kIdxTanPhi] + F_ty_ty[istep] * x[kIdxTanTheta]; // not needed
    }  // end of Runge-Kutta steps for derivatives dx/dty

    for(ipar = 0; ipar < 3; ++ipar ) {
        fPropStep(ipar, kIdxTanTheta) = x0[ipar] + c[rkStart]*k1[rkStart][ipar] + c[rkMid1]*k1[rkMid1][ipar]
                                                 + c[rkMid2] *k1[rkMid2][ipar]  + c[rkEnd] *k1[rkEnd][ipar];
    }
    //      end of derivatives dx/dty
    fPropStep(kIdxTanTheta,kIdxTanTheta) = 1.;
    fPropStep(kIdxQP      ,kIdxTanTheta) = 0.;
    //------------------------------------------------------------------------

    //------------------------------------------------------------------------
    //
    //    derivatives dx/dx and dx/dy

    for(ipar = 0; ipar < numPars + 1; ipar++) {
        fPropStep(ipar, kIdxX0) = 0.;
        fPropStep(ipar, kIdxY0) = 0.;
    }
    fPropStep(kIdxX0, kIdxX0) = 1.;
    fPropStep(kIdxY0, kIdxY0) = 1.;


    // Propagator has entry for z-coordinate as well.

    if(fPropStep.GetNrows() == 6) {
        Double_t x0z[numPars+1], xz[numPars+1];

        Double_t k1z[rksteps][numPars+1];

        Int_t idxZ0 = 4;
        x0z[kIdxX0] = 0.; x0z[kIdxY0] = 0.; x0z[kIdxTanPhi] = 0.; x0z[kIdxTanTheta] = 0.; x0z[idxZ0] = 1.;

        for (istep = 0; istep < 4; ++ istep) {
            for(ipar = 0; ipar < numPars+1; ++ipar) {
                if(istep == 0) {
                    xz[ipar] = x0z[ipar];
                } else
                    xz[ipar] = x0z[ipar] + b[istep] * k1z[istep-1][ipar];
            }

            // @x'/@z = @tx/@z
            k1z[istep][kIdxX0]       = xz[kIdxTanPhi]   * h + F_tx[istep] * qp_in * xz[idxZ0];
            k1z[istep][kIdxY0]       = xz[kIdxTanTheta] * h + F_ty[istep] * qp_in * xz[idxZ0];
            k1z[istep][kIdxTanPhi]   = F_tx_ty[istep] * xz[kIdxTanPhi] + F_tx_ty[istep] * xz[kIdxTanTheta]
                + F2_tx[istep] * xz[idxZ0];
            k1z[istep][kIdxTanTheta] = F_ty_tx[istep] * xz[kIdxTanPhi] + F_ty_ty[istep] * xz[kIdxTanTheta]
                + F2_ty[istep] * xz[idxZ0];
            k1z[istep][idxZ0]        = 0.;
        }
        for (ipar = 0; ipar < numPars; ++ipar ) {
            fPropStep(ipar, kIdxZ0) = x0z[ipar] + c[rkStart]*k1z[rkStart][ipar] + c[rkMid1]*k1z[rkMid1][ipar]
                                                + c[rkMid2] *k1z[rkMid2][ipar]  + c[rkEnd] *k1z[rkEnd][ipar];
        }

        fPropStep(kIdxZ0, kIdxZ0) = 1.;
    }

    return stepFac;

}

void HKalRungeKutta::setRungeKuttaParams(Float_t initialStpSize,
					 Float_t stpSizeDec, Float_t stpSizeInc,
					 Float_t maxStpSize, Float_t minStpSize,
					 Float_t minPrec, Float_t maxPrec,
					 Int_t maxNumStps, Int_t maxNumStpsPCA,
					 Float_t maxDst, Double_t minLngthCalcQ) {

    initialStepSize = initialStpSize;
    stepSizeDec     = stpSizeDec;
    stepSizeInc     = stpSizeInc;
    maxStepSize     = maxStpSize;
    minStepSize     = minStpSize;
    minPrecision    = minPrec;
    maxPrecision    = maxPrec;
    maxNumSteps     = maxNumStps;
    maxNumStepsPCA  = maxNumStpsPCA;
    maxDist         = maxDst;
    minLengthCalcQ  = minLngthCalcQ;
}

 hkalrungekutta.cc:1
 hkalrungekutta.cc:2
 hkalrungekutta.cc:3
 hkalrungekutta.cc:4
 hkalrungekutta.cc:5
 hkalrungekutta.cc:6
 hkalrungekutta.cc:7
 hkalrungekutta.cc:8
 hkalrungekutta.cc:9
 hkalrungekutta.cc:10
 hkalrungekutta.cc:11
 hkalrungekutta.cc:12
 hkalrungekutta.cc:13
 hkalrungekutta.cc:14
 hkalrungekutta.cc:15
 hkalrungekutta.cc:16
 hkalrungekutta.cc:17
 hkalrungekutta.cc:18
 hkalrungekutta.cc:19
 hkalrungekutta.cc:20
 hkalrungekutta.cc:21
 hkalrungekutta.cc:22
 hkalrungekutta.cc:23
 hkalrungekutta.cc:24
 hkalrungekutta.cc:25
 hkalrungekutta.cc:26
 hkalrungekutta.cc:27
 hkalrungekutta.cc:28
 hkalrungekutta.cc:29
 hkalrungekutta.cc:30
 hkalrungekutta.cc:31
 hkalrungekutta.cc:32
 hkalrungekutta.cc:33
 hkalrungekutta.cc:34
 hkalrungekutta.cc:35
 hkalrungekutta.cc:36
 hkalrungekutta.cc:37
 hkalrungekutta.cc:38
 hkalrungekutta.cc:39
 hkalrungekutta.cc:40
 hkalrungekutta.cc:41
 hkalrungekutta.cc:42
 hkalrungekutta.cc:43
 hkalrungekutta.cc:44
 hkalrungekutta.cc:45
 hkalrungekutta.cc:46
 hkalrungekutta.cc:47
 hkalrungekutta.cc:48
 hkalrungekutta.cc:49
 hkalrungekutta.cc:50
 hkalrungekutta.cc:51
 hkalrungekutta.cc:52
 hkalrungekutta.cc:53
 hkalrungekutta.cc:54
 hkalrungekutta.cc:55
 hkalrungekutta.cc:56
 hkalrungekutta.cc:57
 hkalrungekutta.cc:58
 hkalrungekutta.cc:59
 hkalrungekutta.cc:60
 hkalrungekutta.cc:61
 hkalrungekutta.cc:62
 hkalrungekutta.cc:63
 hkalrungekutta.cc:64
 hkalrungekutta.cc:65
 hkalrungekutta.cc:66
 hkalrungekutta.cc:67
 hkalrungekutta.cc:68
 hkalrungekutta.cc:69
 hkalrungekutta.cc:70
 hkalrungekutta.cc:71
 hkalrungekutta.cc:72
 hkalrungekutta.cc:73
 hkalrungekutta.cc:74
 hkalrungekutta.cc:75
 hkalrungekutta.cc:76
 hkalrungekutta.cc:77
 hkalrungekutta.cc:78
 hkalrungekutta.cc:79
 hkalrungekutta.cc:80
 hkalrungekutta.cc:81
 hkalrungekutta.cc:82
 hkalrungekutta.cc:83
 hkalrungekutta.cc:84
 hkalrungekutta.cc:85
 hkalrungekutta.cc:86
 hkalrungekutta.cc:87
 hkalrungekutta.cc:88
 hkalrungekutta.cc:89
 hkalrungekutta.cc:90
 hkalrungekutta.cc:91
 hkalrungekutta.cc:92
 hkalrungekutta.cc:93
 hkalrungekutta.cc:94
 hkalrungekutta.cc:95
 hkalrungekutta.cc:96
 hkalrungekutta.cc:97
 hkalrungekutta.cc:98
 hkalrungekutta.cc:99
 hkalrungekutta.cc:100
 hkalrungekutta.cc:101
 hkalrungekutta.cc:102
 hkalrungekutta.cc:103
 hkalrungekutta.cc:104
 hkalrungekutta.cc:105
 hkalrungekutta.cc:106
 hkalrungekutta.cc:107
 hkalrungekutta.cc:108
 hkalrungekutta.cc:109
 hkalrungekutta.cc:110
 hkalrungekutta.cc:111
 hkalrungekutta.cc:112
 hkalrungekutta.cc:113
 hkalrungekutta.cc:114
 hkalrungekutta.cc:115
 hkalrungekutta.cc:116
 hkalrungekutta.cc:117
 hkalrungekutta.cc:118
 hkalrungekutta.cc:119
 hkalrungekutta.cc:120
 hkalrungekutta.cc:121
 hkalrungekutta.cc:122
 hkalrungekutta.cc:123
 hkalrungekutta.cc:124
 hkalrungekutta.cc:125
 hkalrungekutta.cc:126
 hkalrungekutta.cc:127
 hkalrungekutta.cc:128
 hkalrungekutta.cc:129
 hkalrungekutta.cc:130
 hkalrungekutta.cc:131
 hkalrungekutta.cc:132
 hkalrungekutta.cc:133
 hkalrungekutta.cc:134
 hkalrungekutta.cc:135
 hkalrungekutta.cc:136
 hkalrungekutta.cc:137
 hkalrungekutta.cc:138
 hkalrungekutta.cc:139
 hkalrungekutta.cc:140
 hkalrungekutta.cc:141
 hkalrungekutta.cc:142
 hkalrungekutta.cc:143
 hkalrungekutta.cc:144
 hkalrungekutta.cc:145
 hkalrungekutta.cc:146
 hkalrungekutta.cc:147
 hkalrungekutta.cc:148
 hkalrungekutta.cc:149
 hkalrungekutta.cc:150
 hkalrungekutta.cc:151
 hkalrungekutta.cc:152
 hkalrungekutta.cc:153
 hkalrungekutta.cc:154
 hkalrungekutta.cc:155
 hkalrungekutta.cc:156
 hkalrungekutta.cc:157
 hkalrungekutta.cc:158
 hkalrungekutta.cc:159
 hkalrungekutta.cc:160
 hkalrungekutta.cc:161
 hkalrungekutta.cc:162
 hkalrungekutta.cc:163
 hkalrungekutta.cc:164
 hkalrungekutta.cc:165
 hkalrungekutta.cc:166
 hkalrungekutta.cc:167
 hkalrungekutta.cc:168
 hkalrungekutta.cc:169
 hkalrungekutta.cc:170
 hkalrungekutta.cc:171
 hkalrungekutta.cc:172
 hkalrungekutta.cc:173
 hkalrungekutta.cc:174
 hkalrungekutta.cc:175
 hkalrungekutta.cc:176
 hkalrungekutta.cc:177
 hkalrungekutta.cc:178
 hkalrungekutta.cc:179
 hkalrungekutta.cc:180
 hkalrungekutta.cc:181
 hkalrungekutta.cc:182
 hkalrungekutta.cc:183
 hkalrungekutta.cc:184
 hkalrungekutta.cc:185
 hkalrungekutta.cc:186
 hkalrungekutta.cc:187
 hkalrungekutta.cc:188
 hkalrungekutta.cc:189
 hkalrungekutta.cc:190
 hkalrungekutta.cc:191
 hkalrungekutta.cc:192
 hkalrungekutta.cc:193
 hkalrungekutta.cc:194
 hkalrungekutta.cc:195
 hkalrungekutta.cc:196
 hkalrungekutta.cc:197
 hkalrungekutta.cc:198
 hkalrungekutta.cc:199
 hkalrungekutta.cc:200
 hkalrungekutta.cc:201
 hkalrungekutta.cc:202
 hkalrungekutta.cc:203
 hkalrungekutta.cc:204
 hkalrungekutta.cc:205
 hkalrungekutta.cc:206
 hkalrungekutta.cc:207
 hkalrungekutta.cc:208
 hkalrungekutta.cc:209
 hkalrungekutta.cc:210
 hkalrungekutta.cc:211
 hkalrungekutta.cc:212
 hkalrungekutta.cc:213
 hkalrungekutta.cc:214
 hkalrungekutta.cc:215
 hkalrungekutta.cc:216
 hkalrungekutta.cc:217
 hkalrungekutta.cc:218
 hkalrungekutta.cc:219
 hkalrungekutta.cc:220
 hkalrungekutta.cc:221
 hkalrungekutta.cc:222
 hkalrungekutta.cc:223
 hkalrungekutta.cc:224
 hkalrungekutta.cc:225
 hkalrungekutta.cc:226
 hkalrungekutta.cc:227
 hkalrungekutta.cc:228
 hkalrungekutta.cc:229
 hkalrungekutta.cc:230
 hkalrungekutta.cc:231
 hkalrungekutta.cc:232
 hkalrungekutta.cc:233
 hkalrungekutta.cc:234
 hkalrungekutta.cc:235
 hkalrungekutta.cc:236
 hkalrungekutta.cc:237
 hkalrungekutta.cc:238
 hkalrungekutta.cc:239
 hkalrungekutta.cc:240
 hkalrungekutta.cc:241
 hkalrungekutta.cc:242
 hkalrungekutta.cc:243
 hkalrungekutta.cc:244
 hkalrungekutta.cc:245
 hkalrungekutta.cc:246
 hkalrungekutta.cc:247
 hkalrungekutta.cc:248
 hkalrungekutta.cc:249
 hkalrungekutta.cc:250
 hkalrungekutta.cc:251
 hkalrungekutta.cc:252
 hkalrungekutta.cc:253
 hkalrungekutta.cc:254
 hkalrungekutta.cc:255
 hkalrungekutta.cc:256
 hkalrungekutta.cc:257
 hkalrungekutta.cc:258
 hkalrungekutta.cc:259
 hkalrungekutta.cc:260
 hkalrungekutta.cc:261
 hkalrungekutta.cc:262
 hkalrungekutta.cc:263
 hkalrungekutta.cc:264
 hkalrungekutta.cc:265
 hkalrungekutta.cc:266
 hkalrungekutta.cc:267
 hkalrungekutta.cc:268
 hkalrungekutta.cc:269
 hkalrungekutta.cc:270
 hkalrungekutta.cc:271
 hkalrungekutta.cc:272
 hkalrungekutta.cc:273
 hkalrungekutta.cc:274
 hkalrungekutta.cc:275
 hkalrungekutta.cc:276
 hkalrungekutta.cc:277
 hkalrungekutta.cc:278
 hkalrungekutta.cc:279
 hkalrungekutta.cc:280
 hkalrungekutta.cc:281
 hkalrungekutta.cc:282
 hkalrungekutta.cc:283
 hkalrungekutta.cc:284
 hkalrungekutta.cc:285
 hkalrungekutta.cc:286
 hkalrungekutta.cc:287
 hkalrungekutta.cc:288
 hkalrungekutta.cc:289
 hkalrungekutta.cc:290
 hkalrungekutta.cc:291
 hkalrungekutta.cc:292
 hkalrungekutta.cc:293
 hkalrungekutta.cc:294
 hkalrungekutta.cc:295
 hkalrungekutta.cc:296
 hkalrungekutta.cc:297
 hkalrungekutta.cc:298
 hkalrungekutta.cc:299
 hkalrungekutta.cc:300
 hkalrungekutta.cc:301
 hkalrungekutta.cc:302
 hkalrungekutta.cc:303
 hkalrungekutta.cc:304
 hkalrungekutta.cc:305
 hkalrungekutta.cc:306
 hkalrungekutta.cc:307
 hkalrungekutta.cc:308
 hkalrungekutta.cc:309
 hkalrungekutta.cc:310
 hkalrungekutta.cc:311
 hkalrungekutta.cc:312
 hkalrungekutta.cc:313
 hkalrungekutta.cc:314
 hkalrungekutta.cc:315
 hkalrungekutta.cc:316
 hkalrungekutta.cc:317
 hkalrungekutta.cc:318
 hkalrungekutta.cc:319
 hkalrungekutta.cc:320
 hkalrungekutta.cc:321
 hkalrungekutta.cc:322
 hkalrungekutta.cc:323
 hkalrungekutta.cc:324
 hkalrungekutta.cc:325
 hkalrungekutta.cc:326
 hkalrungekutta.cc:327
 hkalrungekutta.cc:328
 hkalrungekutta.cc:329
 hkalrungekutta.cc:330
 hkalrungekutta.cc:331
 hkalrungekutta.cc:332
 hkalrungekutta.cc:333
 hkalrungekutta.cc:334
 hkalrungekutta.cc:335
 hkalrungekutta.cc:336
 hkalrungekutta.cc:337
 hkalrungekutta.cc:338
 hkalrungekutta.cc:339
 hkalrungekutta.cc:340
 hkalrungekutta.cc:341
 hkalrungekutta.cc:342
 hkalrungekutta.cc:343
 hkalrungekutta.cc:344
 hkalrungekutta.cc:345
 hkalrungekutta.cc:346
 hkalrungekutta.cc:347
 hkalrungekutta.cc:348
 hkalrungekutta.cc:349
 hkalrungekutta.cc:350
 hkalrungekutta.cc:351
 hkalrungekutta.cc:352
 hkalrungekutta.cc:353
 hkalrungekutta.cc:354
 hkalrungekutta.cc:355
 hkalrungekutta.cc:356
 hkalrungekutta.cc:357
 hkalrungekutta.cc:358
 hkalrungekutta.cc:359
 hkalrungekutta.cc:360
 hkalrungekutta.cc:361
 hkalrungekutta.cc:362
 hkalrungekutta.cc:363
 hkalrungekutta.cc:364
 hkalrungekutta.cc:365
 hkalrungekutta.cc:366
 hkalrungekutta.cc:367
 hkalrungekutta.cc:368
 hkalrungekutta.cc:369
 hkalrungekutta.cc:370
 hkalrungekutta.cc:371
 hkalrungekutta.cc:372
 hkalrungekutta.cc:373
 hkalrungekutta.cc:374
 hkalrungekutta.cc:375
 hkalrungekutta.cc:376
 hkalrungekutta.cc:377
 hkalrungekutta.cc:378
 hkalrungekutta.cc:379
 hkalrungekutta.cc:380
 hkalrungekutta.cc:381
 hkalrungekutta.cc:382
 hkalrungekutta.cc:383
 hkalrungekutta.cc:384
 hkalrungekutta.cc:385
 hkalrungekutta.cc:386
 hkalrungekutta.cc:387
 hkalrungekutta.cc:388
 hkalrungekutta.cc:389
 hkalrungekutta.cc:390
 hkalrungekutta.cc:391
 hkalrungekutta.cc:392
 hkalrungekutta.cc:393
 hkalrungekutta.cc:394
 hkalrungekutta.cc:395
 hkalrungekutta.cc:396
 hkalrungekutta.cc:397
 hkalrungekutta.cc:398
 hkalrungekutta.cc:399
 hkalrungekutta.cc:400
 hkalrungekutta.cc:401
 hkalrungekutta.cc:402
 hkalrungekutta.cc:403
 hkalrungekutta.cc:404
 hkalrungekutta.cc:405
 hkalrungekutta.cc:406
 hkalrungekutta.cc:407
 hkalrungekutta.cc:408
 hkalrungekutta.cc:409
 hkalrungekutta.cc:410
 hkalrungekutta.cc:411
 hkalrungekutta.cc:412
 hkalrungekutta.cc:413
 hkalrungekutta.cc:414
 hkalrungekutta.cc:415
 hkalrungekutta.cc:416
 hkalrungekutta.cc:417
 hkalrungekutta.cc:418
 hkalrungekutta.cc:419
 hkalrungekutta.cc:420
 hkalrungekutta.cc:421
 hkalrungekutta.cc:422
 hkalrungekutta.cc:423
 hkalrungekutta.cc:424
 hkalrungekutta.cc:425
 hkalrungekutta.cc:426
 hkalrungekutta.cc:427
 hkalrungekutta.cc:428
 hkalrungekutta.cc:429
 hkalrungekutta.cc:430
 hkalrungekutta.cc:431
 hkalrungekutta.cc:432
 hkalrungekutta.cc:433
 hkalrungekutta.cc:434
 hkalrungekutta.cc:435
 hkalrungekutta.cc:436
 hkalrungekutta.cc:437
 hkalrungekutta.cc:438
 hkalrungekutta.cc:439
 hkalrungekutta.cc:440
 hkalrungekutta.cc:441
 hkalrungekutta.cc:442
 hkalrungekutta.cc:443
 hkalrungekutta.cc:444
 hkalrungekutta.cc:445
 hkalrungekutta.cc:446
 hkalrungekutta.cc:447
 hkalrungekutta.cc:448
 hkalrungekutta.cc:449
 hkalrungekutta.cc:450
 hkalrungekutta.cc:451
 hkalrungekutta.cc:452
 hkalrungekutta.cc:453
 hkalrungekutta.cc:454
 hkalrungekutta.cc:455
 hkalrungekutta.cc:456
 hkalrungekutta.cc:457
 hkalrungekutta.cc:458
 hkalrungekutta.cc:459
 hkalrungekutta.cc:460
 hkalrungekutta.cc:461
 hkalrungekutta.cc:462
 hkalrungekutta.cc:463
 hkalrungekutta.cc:464
 hkalrungekutta.cc:465
 hkalrungekutta.cc:466
 hkalrungekutta.cc:467
 hkalrungekutta.cc:468
 hkalrungekutta.cc:469
 hkalrungekutta.cc:470
 hkalrungekutta.cc:471
 hkalrungekutta.cc:472
 hkalrungekutta.cc:473
 hkalrungekutta.cc:474
 hkalrungekutta.cc:475
 hkalrungekutta.cc:476
 hkalrungekutta.cc:477
 hkalrungekutta.cc:478
 hkalrungekutta.cc:479
 hkalrungekutta.cc:480
 hkalrungekutta.cc:481
 hkalrungekutta.cc:482
 hkalrungekutta.cc:483
 hkalrungekutta.cc:484
 hkalrungekutta.cc:485
 hkalrungekutta.cc:486
 hkalrungekutta.cc:487
 hkalrungekutta.cc:488
 hkalrungekutta.cc:489
 hkalrungekutta.cc:490
 hkalrungekutta.cc:491
 hkalrungekutta.cc:492
 hkalrungekutta.cc:493
 hkalrungekutta.cc:494
 hkalrungekutta.cc:495
 hkalrungekutta.cc:496
 hkalrungekutta.cc:497
 hkalrungekutta.cc:498
 hkalrungekutta.cc:499
 hkalrungekutta.cc:500
 hkalrungekutta.cc:501
 hkalrungekutta.cc:502
 hkalrungekutta.cc:503
 hkalrungekutta.cc:504
 hkalrungekutta.cc:505
 hkalrungekutta.cc:506
 hkalrungekutta.cc:507
 hkalrungekutta.cc:508
 hkalrungekutta.cc:509
 hkalrungekutta.cc:510
 hkalrungekutta.cc:511
 hkalrungekutta.cc:512
 hkalrungekutta.cc:513
 hkalrungekutta.cc:514
 hkalrungekutta.cc:515
 hkalrungekutta.cc:516
 hkalrungekutta.cc:517
 hkalrungekutta.cc:518
 hkalrungekutta.cc:519
 hkalrungekutta.cc:520
 hkalrungekutta.cc:521
 hkalrungekutta.cc:522
 hkalrungekutta.cc:523
 hkalrungekutta.cc:524
 hkalrungekutta.cc:525
 hkalrungekutta.cc:526
 hkalrungekutta.cc:527
 hkalrungekutta.cc:528
 hkalrungekutta.cc:529
 hkalrungekutta.cc:530
 hkalrungekutta.cc:531
 hkalrungekutta.cc:532
 hkalrungekutta.cc:533
 hkalrungekutta.cc:534
 hkalrungekutta.cc:535
 hkalrungekutta.cc:536
 hkalrungekutta.cc:537
 hkalrungekutta.cc:538
 hkalrungekutta.cc:539
 hkalrungekutta.cc:540
 hkalrungekutta.cc:541
 hkalrungekutta.cc:542
 hkalrungekutta.cc:543
 hkalrungekutta.cc:544
 hkalrungekutta.cc:545
 hkalrungekutta.cc:546
 hkalrungekutta.cc:547
 hkalrungekutta.cc:548
 hkalrungekutta.cc:549
 hkalrungekutta.cc:550
 hkalrungekutta.cc:551
 hkalrungekutta.cc:552
 hkalrungekutta.cc:553
 hkalrungekutta.cc:554
 hkalrungekutta.cc:555
 hkalrungekutta.cc:556
 hkalrungekutta.cc:557
 hkalrungekutta.cc:558
 hkalrungekutta.cc:559
 hkalrungekutta.cc:560
 hkalrungekutta.cc:561
 hkalrungekutta.cc:562
 hkalrungekutta.cc:563
 hkalrungekutta.cc:564
 hkalrungekutta.cc:565
 hkalrungekutta.cc:566
 hkalrungekutta.cc:567
 hkalrungekutta.cc:568
 hkalrungekutta.cc:569
 hkalrungekutta.cc:570
 hkalrungekutta.cc:571
 hkalrungekutta.cc:572
 hkalrungekutta.cc:573
 hkalrungekutta.cc:574
 hkalrungekutta.cc:575
 hkalrungekutta.cc:576
 hkalrungekutta.cc:577
 hkalrungekutta.cc:578
 hkalrungekutta.cc:579
 hkalrungekutta.cc:580
 hkalrungekutta.cc:581
 hkalrungekutta.cc:582
 hkalrungekutta.cc:583
 hkalrungekutta.cc:584
 hkalrungekutta.cc:585
 hkalrungekutta.cc:586
 hkalrungekutta.cc:587
 hkalrungekutta.cc:588
 hkalrungekutta.cc:589
 hkalrungekutta.cc:590
 hkalrungekutta.cc:591
 hkalrungekutta.cc:592
 hkalrungekutta.cc:593
 hkalrungekutta.cc:594
 hkalrungekutta.cc:595
 hkalrungekutta.cc:596
 hkalrungekutta.cc:597
 hkalrungekutta.cc:598
 hkalrungekutta.cc:599
 hkalrungekutta.cc:600
 hkalrungekutta.cc:601
 hkalrungekutta.cc:602
 hkalrungekutta.cc:603
 hkalrungekutta.cc:604
 hkalrungekutta.cc:605
 hkalrungekutta.cc:606
 hkalrungekutta.cc:607
 hkalrungekutta.cc:608
 hkalrungekutta.cc:609
 hkalrungekutta.cc:610
 hkalrungekutta.cc:611
 hkalrungekutta.cc:612
 hkalrungekutta.cc:613
 hkalrungekutta.cc:614
 hkalrungekutta.cc:615
 hkalrungekutta.cc:616
 hkalrungekutta.cc:617
 hkalrungekutta.cc:618
 hkalrungekutta.cc:619
 hkalrungekutta.cc:620
 hkalrungekutta.cc:621
 hkalrungekutta.cc:622
 hkalrungekutta.cc:623
 hkalrungekutta.cc:624
 hkalrungekutta.cc:625
 hkalrungekutta.cc:626
 hkalrungekutta.cc:627
 hkalrungekutta.cc:628
 hkalrungekutta.cc:629
 hkalrungekutta.cc:630
 hkalrungekutta.cc:631
 hkalrungekutta.cc:632
 hkalrungekutta.cc:633
 hkalrungekutta.cc:634
 hkalrungekutta.cc:635
 hkalrungekutta.cc:636
 hkalrungekutta.cc:637
 hkalrungekutta.cc:638
 hkalrungekutta.cc:639
 hkalrungekutta.cc:640
 hkalrungekutta.cc:641
 hkalrungekutta.cc:642
 hkalrungekutta.cc:643
 hkalrungekutta.cc:644
 hkalrungekutta.cc:645
 hkalrungekutta.cc:646
 hkalrungekutta.cc:647
 hkalrungekutta.cc:648
 hkalrungekutta.cc:649
 hkalrungekutta.cc:650
 hkalrungekutta.cc:651
 hkalrungekutta.cc:652
 hkalrungekutta.cc:653
 hkalrungekutta.cc:654
 hkalrungekutta.cc:655
 hkalrungekutta.cc:656
 hkalrungekutta.cc:657
 hkalrungekutta.cc:658
 hkalrungekutta.cc:659
 hkalrungekutta.cc:660
 hkalrungekutta.cc:661
 hkalrungekutta.cc:662
 hkalrungekutta.cc:663
 hkalrungekutta.cc:664
 hkalrungekutta.cc:665
 hkalrungekutta.cc:666
 hkalrungekutta.cc:667
 hkalrungekutta.cc:668
 hkalrungekutta.cc:669
 hkalrungekutta.cc:670
 hkalrungekutta.cc:671
 hkalrungekutta.cc:672
 hkalrungekutta.cc:673
 hkalrungekutta.cc:674
 hkalrungekutta.cc:675
 hkalrungekutta.cc:676
 hkalrungekutta.cc:677
 hkalrungekutta.cc:678
 hkalrungekutta.cc:679
 hkalrungekutta.cc:680
 hkalrungekutta.cc:681
 hkalrungekutta.cc:682
 hkalrungekutta.cc:683
 hkalrungekutta.cc:684
 hkalrungekutta.cc:685
 hkalrungekutta.cc:686
 hkalrungekutta.cc:687
 hkalrungekutta.cc:688
 hkalrungekutta.cc:689
 hkalrungekutta.cc:690
 hkalrungekutta.cc:691
 hkalrungekutta.cc:692
 hkalrungekutta.cc:693
 hkalrungekutta.cc:694
 hkalrungekutta.cc:695
 hkalrungekutta.cc:696
 hkalrungekutta.cc:697
 hkalrungekutta.cc:698
 hkalrungekutta.cc:699
 hkalrungekutta.cc:700
 hkalrungekutta.cc:701
 hkalrungekutta.cc:702
 hkalrungekutta.cc:703
 hkalrungekutta.cc:704
 hkalrungekutta.cc:705
 hkalrungekutta.cc:706
 hkalrungekutta.cc:707
 hkalrungekutta.cc:708
 hkalrungekutta.cc:709
 hkalrungekutta.cc:710
 hkalrungekutta.cc:711
 hkalrungekutta.cc:712
 hkalrungekutta.cc:713
 hkalrungekutta.cc:714
 hkalrungekutta.cc:715
 hkalrungekutta.cc:716
 hkalrungekutta.cc:717
 hkalrungekutta.cc:718
 hkalrungekutta.cc:719
 hkalrungekutta.cc:720
 hkalrungekutta.cc:721
 hkalrungekutta.cc:722
 hkalrungekutta.cc:723
 hkalrungekutta.cc:724
 hkalrungekutta.cc:725
 hkalrungekutta.cc:726
 hkalrungekutta.cc:727
 hkalrungekutta.cc:728
 hkalrungekutta.cc:729
 hkalrungekutta.cc:730
 hkalrungekutta.cc:731
 hkalrungekutta.cc:732
 hkalrungekutta.cc:733
 hkalrungekutta.cc:734
 hkalrungekutta.cc:735
 hkalrungekutta.cc:736
 hkalrungekutta.cc:737
 hkalrungekutta.cc:738
 hkalrungekutta.cc:739
 hkalrungekutta.cc:740
 hkalrungekutta.cc:741
 hkalrungekutta.cc:742
 hkalrungekutta.cc:743
 hkalrungekutta.cc:744
 hkalrungekutta.cc:745
 hkalrungekutta.cc:746
 hkalrungekutta.cc:747
 hkalrungekutta.cc:748
 hkalrungekutta.cc:749
 hkalrungekutta.cc:750
 hkalrungekutta.cc:751
 hkalrungekutta.cc:752
 hkalrungekutta.cc:753
 hkalrungekutta.cc:754
 hkalrungekutta.cc:755
 hkalrungekutta.cc:756
 hkalrungekutta.cc:757
 hkalrungekutta.cc:758
 hkalrungekutta.cc:759
 hkalrungekutta.cc:760
 hkalrungekutta.cc:761
 hkalrungekutta.cc:762
 hkalrungekutta.cc:763
 hkalrungekutta.cc:764
 hkalrungekutta.cc:765
 hkalrungekutta.cc:766
 hkalrungekutta.cc:767
 hkalrungekutta.cc:768
 hkalrungekutta.cc:769
 hkalrungekutta.cc:770
 hkalrungekutta.cc:771
 hkalrungekutta.cc:772
 hkalrungekutta.cc:773
 hkalrungekutta.cc:774
 hkalrungekutta.cc:775
 hkalrungekutta.cc:776
 hkalrungekutta.cc:777
 hkalrungekutta.cc:778
 hkalrungekutta.cc:779
 hkalrungekutta.cc:780
 hkalrungekutta.cc:781
 hkalrungekutta.cc:782
 hkalrungekutta.cc:783
 hkalrungekutta.cc:784
 hkalrungekutta.cc:785
 hkalrungekutta.cc:786
 hkalrungekutta.cc:787
 hkalrungekutta.cc:788
 hkalrungekutta.cc:789
 hkalrungekutta.cc:790
 hkalrungekutta.cc:791
 hkalrungekutta.cc:792
 hkalrungekutta.cc:793
 hkalrungekutta.cc:794
 hkalrungekutta.cc:795
 hkalrungekutta.cc:796
 hkalrungekutta.cc:797
 hkalrungekutta.cc:798
 hkalrungekutta.cc:799
 hkalrungekutta.cc:800
 hkalrungekutta.cc:801
 hkalrungekutta.cc:802
 hkalrungekutta.cc:803
 hkalrungekutta.cc:804
 hkalrungekutta.cc:805
 hkalrungekutta.cc:806
 hkalrungekutta.cc:807
 hkalrungekutta.cc:808
 hkalrungekutta.cc:809
 hkalrungekutta.cc:810
 hkalrungekutta.cc:811
 hkalrungekutta.cc:812
 hkalrungekutta.cc:813
 hkalrungekutta.cc:814
 hkalrungekutta.cc:815
 hkalrungekutta.cc:816
 hkalrungekutta.cc:817
 hkalrungekutta.cc:818
 hkalrungekutta.cc:819
 hkalrungekutta.cc:820
 hkalrungekutta.cc:821
 hkalrungekutta.cc:822
 hkalrungekutta.cc:823
 hkalrungekutta.cc:824
 hkalrungekutta.cc:825
 hkalrungekutta.cc:826
 hkalrungekutta.cc:827
 hkalrungekutta.cc:828
 hkalrungekutta.cc:829
 hkalrungekutta.cc:830
 hkalrungekutta.cc:831
 hkalrungekutta.cc:832
 hkalrungekutta.cc:833
 hkalrungekutta.cc:834
 hkalrungekutta.cc:835
 hkalrungekutta.cc:836
 hkalrungekutta.cc:837
 hkalrungekutta.cc:838
 hkalrungekutta.cc:839
 hkalrungekutta.cc:840
 hkalrungekutta.cc:841
 hkalrungekutta.cc:842
 hkalrungekutta.cc:843
 hkalrungekutta.cc:844
 hkalrungekutta.cc:845
 hkalrungekutta.cc:846
 hkalrungekutta.cc:847
 hkalrungekutta.cc:848
 hkalrungekutta.cc:849
 hkalrungekutta.cc:850
 hkalrungekutta.cc:851
 hkalrungekutta.cc:852
 hkalrungekutta.cc:853
 hkalrungekutta.cc:854
 hkalrungekutta.cc:855
 hkalrungekutta.cc:856
 hkalrungekutta.cc:857
 hkalrungekutta.cc:858
 hkalrungekutta.cc:859
 hkalrungekutta.cc:860
 hkalrungekutta.cc:861
 hkalrungekutta.cc:862
 hkalrungekutta.cc:863
 hkalrungekutta.cc:864
 hkalrungekutta.cc:865
 hkalrungekutta.cc:866
 hkalrungekutta.cc:867
 hkalrungekutta.cc:868
 hkalrungekutta.cc:869
 hkalrungekutta.cc:870
 hkalrungekutta.cc:871
 hkalrungekutta.cc:872
 hkalrungekutta.cc:873
 hkalrungekutta.cc:874
 hkalrungekutta.cc:875
 hkalrungekutta.cc:876
 hkalrungekutta.cc:877
 hkalrungekutta.cc:878
 hkalrungekutta.cc:879
 hkalrungekutta.cc:880
 hkalrungekutta.cc:881
 hkalrungekutta.cc:882
 hkalrungekutta.cc:883
 hkalrungekutta.cc:884
 hkalrungekutta.cc:885
 hkalrungekutta.cc:886
 hkalrungekutta.cc:887
 hkalrungekutta.cc:888
 hkalrungekutta.cc:889
 hkalrungekutta.cc:890
 hkalrungekutta.cc:891
 hkalrungekutta.cc:892
 hkalrungekutta.cc:893
 hkalrungekutta.cc:894
 hkalrungekutta.cc:895
 hkalrungekutta.cc:896
 hkalrungekutta.cc:897
 hkalrungekutta.cc:898
 hkalrungekutta.cc:899
 hkalrungekutta.cc:900
 hkalrungekutta.cc:901
 hkalrungekutta.cc:902
 hkalrungekutta.cc:903
 hkalrungekutta.cc:904
 hkalrungekutta.cc:905
 hkalrungekutta.cc:906
 hkalrungekutta.cc:907
 hkalrungekutta.cc:908
 hkalrungekutta.cc:909
 hkalrungekutta.cc:910
 hkalrungekutta.cc:911
 hkalrungekutta.cc:912
 hkalrungekutta.cc:913
 hkalrungekutta.cc:914
 hkalrungekutta.cc:915
 hkalrungekutta.cc:916
 hkalrungekutta.cc:917
 hkalrungekutta.cc:918
 hkalrungekutta.cc:919
 hkalrungekutta.cc:920
 hkalrungekutta.cc:921
 hkalrungekutta.cc:922
 hkalrungekutta.cc:923
 hkalrungekutta.cc:924
 hkalrungekutta.cc:925
 hkalrungekutta.cc:926
 hkalrungekutta.cc:927
 hkalrungekutta.cc:928
 hkalrungekutta.cc:929
 hkalrungekutta.cc:930
 hkalrungekutta.cc:931
 hkalrungekutta.cc:932
 hkalrungekutta.cc:933
 hkalrungekutta.cc:934
 hkalrungekutta.cc:935
 hkalrungekutta.cc:936
 hkalrungekutta.cc:937
 hkalrungekutta.cc:938
 hkalrungekutta.cc:939
 hkalrungekutta.cc:940
 hkalrungekutta.cc:941
 hkalrungekutta.cc:942
 hkalrungekutta.cc:943
 hkalrungekutta.cc:944
 hkalrungekutta.cc:945
 hkalrungekutta.cc:946
 hkalrungekutta.cc:947
 hkalrungekutta.cc:948
 hkalrungekutta.cc:949
 hkalrungekutta.cc:950
 hkalrungekutta.cc:951
 hkalrungekutta.cc:952
 hkalrungekutta.cc:953
 hkalrungekutta.cc:954
 hkalrungekutta.cc:955
 hkalrungekutta.cc:956
 hkalrungekutta.cc:957
 hkalrungekutta.cc:958
 hkalrungekutta.cc:959
 hkalrungekutta.cc:960
 hkalrungekutta.cc:961
 hkalrungekutta.cc:962
 hkalrungekutta.cc:963
 hkalrungekutta.cc:964
 hkalrungekutta.cc:965
 hkalrungekutta.cc:966
 hkalrungekutta.cc:967
 hkalrungekutta.cc:968
 hkalrungekutta.cc:969
 hkalrungekutta.cc:970
 hkalrungekutta.cc:971
 hkalrungekutta.cc:972
 hkalrungekutta.cc:973
 hkalrungekutta.cc:974
 hkalrungekutta.cc:975
 hkalrungekutta.cc:976
 hkalrungekutta.cc:977
 hkalrungekutta.cc:978
 hkalrungekutta.cc:979
 hkalrungekutta.cc:980
 hkalrungekutta.cc:981
 hkalrungekutta.cc:982
 hkalrungekutta.cc:983
 hkalrungekutta.cc:984
 hkalrungekutta.cc:985
 hkalrungekutta.cc:986
 hkalrungekutta.cc:987
 hkalrungekutta.cc:988
 hkalrungekutta.cc:989
 hkalrungekutta.cc:990
 hkalrungekutta.cc:991
 hkalrungekutta.cc:992
 hkalrungekutta.cc:993
 hkalrungekutta.cc:994
 hkalrungekutta.cc:995
 hkalrungekutta.cc:996
 hkalrungekutta.cc:997
 hkalrungekutta.cc:998
 hkalrungekutta.cc:999
 hkalrungekutta.cc:1000
 hkalrungekutta.cc:1001
 hkalrungekutta.cc:1002
 hkalrungekutta.cc:1003
 hkalrungekutta.cc:1004
 hkalrungekutta.cc:1005
 hkalrungekutta.cc:1006
 hkalrungekutta.cc:1007
 hkalrungekutta.cc:1008
 hkalrungekutta.cc:1009
 hkalrungekutta.cc:1010
 hkalrungekutta.cc:1011
 hkalrungekutta.cc:1012
 hkalrungekutta.cc:1013
 hkalrungekutta.cc:1014
 hkalrungekutta.cc:1015
 hkalrungekutta.cc:1016
 hkalrungekutta.cc:1017
 hkalrungekutta.cc:1018
 hkalrungekutta.cc:1019
 hkalrungekutta.cc:1020
 hkalrungekutta.cc:1021
 hkalrungekutta.cc:1022
 hkalrungekutta.cc:1023
 hkalrungekutta.cc:1024
 hkalrungekutta.cc:1025
 hkalrungekutta.cc:1026
 hkalrungekutta.cc:1027
 hkalrungekutta.cc:1028
 hkalrungekutta.cc:1029
 hkalrungekutta.cc:1030
 hkalrungekutta.cc:1031
 hkalrungekutta.cc:1032
 hkalrungekutta.cc:1033
 hkalrungekutta.cc:1034
 hkalrungekutta.cc:1035
 hkalrungekutta.cc:1036
 hkalrungekutta.cc:1037
 hkalrungekutta.cc:1038
 hkalrungekutta.cc:1039
 hkalrungekutta.cc:1040
 hkalrungekutta.cc:1041
 hkalrungekutta.cc:1042
 hkalrungekutta.cc:1043
 hkalrungekutta.cc:1044
 hkalrungekutta.cc:1045
 hkalrungekutta.cc:1046
 hkalrungekutta.cc:1047
 hkalrungekutta.cc:1048
 hkalrungekutta.cc:1049
 hkalrungekutta.cc:1050
 hkalrungekutta.cc:1051
 hkalrungekutta.cc:1052
 hkalrungekutta.cc:1053
 hkalrungekutta.cc:1054
 hkalrungekutta.cc:1055
 hkalrungekutta.cc:1056
 hkalrungekutta.cc:1057
 hkalrungekutta.cc:1058
 hkalrungekutta.cc:1059
 hkalrungekutta.cc:1060
 hkalrungekutta.cc:1061
 hkalrungekutta.cc:1062
 hkalrungekutta.cc:1063
 hkalrungekutta.cc:1064
 hkalrungekutta.cc:1065
 hkalrungekutta.cc:1066
 hkalrungekutta.cc:1067
 hkalrungekutta.cc:1068
 hkalrungekutta.cc:1069
 hkalrungekutta.cc:1070
 hkalrungekutta.cc:1071
 hkalrungekutta.cc:1072
 hkalrungekutta.cc:1073
 hkalrungekutta.cc:1074
 hkalrungekutta.cc:1075
 hkalrungekutta.cc:1076
 hkalrungekutta.cc:1077
 hkalrungekutta.cc:1078
 hkalrungekutta.cc:1079
 hkalrungekutta.cc:1080
 hkalrungekutta.cc:1081
 hkalrungekutta.cc:1082
 hkalrungekutta.cc:1083
 hkalrungekutta.cc:1084
 hkalrungekutta.cc:1085
 hkalrungekutta.cc:1086
 hkalrungekutta.cc:1087
 hkalrungekutta.cc:1088
 hkalrungekutta.cc:1089
 hkalrungekutta.cc:1090
 hkalrungekutta.cc:1091
 hkalrungekutta.cc:1092
 hkalrungekutta.cc:1093
 hkalrungekutta.cc:1094
 hkalrungekutta.cc:1095
 hkalrungekutta.cc:1096
 hkalrungekutta.cc:1097
 hkalrungekutta.cc:1098
 hkalrungekutta.cc:1099
 hkalrungekutta.cc:1100
 hkalrungekutta.cc:1101
 hkalrungekutta.cc:1102
 hkalrungekutta.cc:1103
 hkalrungekutta.cc:1104
 hkalrungekutta.cc:1105
 hkalrungekutta.cc:1106
 hkalrungekutta.cc:1107
 hkalrungekutta.cc:1108
 hkalrungekutta.cc:1109
 hkalrungekutta.cc:1110
 hkalrungekutta.cc:1111
 hkalrungekutta.cc:1112
 hkalrungekutta.cc:1113
 hkalrungekutta.cc:1114
 hkalrungekutta.cc:1115
 hkalrungekutta.cc:1116
 hkalrungekutta.cc:1117
 hkalrungekutta.cc:1118
 hkalrungekutta.cc:1119
 hkalrungekutta.cc:1120
 hkalrungekutta.cc:1121
 hkalrungekutta.cc:1122
 hkalrungekutta.cc:1123
 hkalrungekutta.cc:1124
 hkalrungekutta.cc:1125
 hkalrungekutta.cc:1126
 hkalrungekutta.cc:1127
 hkalrungekutta.cc:1128
 hkalrungekutta.cc:1129
 hkalrungekutta.cc:1130
 hkalrungekutta.cc:1131
 hkalrungekutta.cc:1132
 hkalrungekutta.cc:1133
 hkalrungekutta.cc:1134
 hkalrungekutta.cc:1135
 hkalrungekutta.cc:1136
 hkalrungekutta.cc:1137
 hkalrungekutta.cc:1138
 hkalrungekutta.cc:1139
 hkalrungekutta.cc:1140
 hkalrungekutta.cc:1141
 hkalrungekutta.cc:1142
 hkalrungekutta.cc:1143
 hkalrungekutta.cc:1144
 hkalrungekutta.cc:1145
 hkalrungekutta.cc:1146
 hkalrungekutta.cc:1147
 hkalrungekutta.cc:1148
 hkalrungekutta.cc:1149
 hkalrungekutta.cc:1150
 hkalrungekutta.cc:1151
 hkalrungekutta.cc:1152
 hkalrungekutta.cc:1153
 hkalrungekutta.cc:1154
 hkalrungekutta.cc:1155
 hkalrungekutta.cc:1156
 hkalrungekutta.cc:1157
 hkalrungekutta.cc:1158
 hkalrungekutta.cc:1159
 hkalrungekutta.cc:1160
 hkalrungekutta.cc:1161
 hkalrungekutta.cc:1162
 hkalrungekutta.cc:1163
 hkalrungekutta.cc:1164
 hkalrungekutta.cc:1165
 hkalrungekutta.cc:1166
 hkalrungekutta.cc:1167
 hkalrungekutta.cc:1168
 hkalrungekutta.cc:1169
 hkalrungekutta.cc:1170
 hkalrungekutta.cc:1171
 hkalrungekutta.cc:1172
 hkalrungekutta.cc:1173
 hkalrungekutta.cc:1174
 hkalrungekutta.cc:1175
 hkalrungekutta.cc:1176
 hkalrungekutta.cc:1177
 hkalrungekutta.cc:1178
 hkalrungekutta.cc:1179
 hkalrungekutta.cc:1180
 hkalrungekutta.cc:1181
 hkalrungekutta.cc:1182
 hkalrungekutta.cc:1183
 hkalrungekutta.cc:1184
 hkalrungekutta.cc:1185
 hkalrungekutta.cc:1186
 hkalrungekutta.cc:1187
 hkalrungekutta.cc:1188
 hkalrungekutta.cc:1189
 hkalrungekutta.cc:1190
 hkalrungekutta.cc:1191
 hkalrungekutta.cc:1192
 hkalrungekutta.cc:1193
 hkalrungekutta.cc:1194
 hkalrungekutta.cc:1195
 hkalrungekutta.cc:1196
 hkalrungekutta.cc:1197
 hkalrungekutta.cc:1198
 hkalrungekutta.cc:1199
 hkalrungekutta.cc:1200
 hkalrungekutta.cc:1201
 hkalrungekutta.cc:1202
 hkalrungekutta.cc:1203
 hkalrungekutta.cc:1204
 hkalrungekutta.cc:1205
 hkalrungekutta.cc:1206
 hkalrungekutta.cc:1207
 hkalrungekutta.cc:1208
 hkalrungekutta.cc:1209
 hkalrungekutta.cc:1210
 hkalrungekutta.cc:1211
 hkalrungekutta.cc:1212
 hkalrungekutta.cc:1213
 hkalrungekutta.cc:1214
 hkalrungekutta.cc:1215
 hkalrungekutta.cc:1216
 hkalrungekutta.cc:1217
 hkalrungekutta.cc:1218
 hkalrungekutta.cc:1219
 hkalrungekutta.cc:1220
 hkalrungekutta.cc:1221
 hkalrungekutta.cc:1222
 hkalrungekutta.cc:1223
 hkalrungekutta.cc:1224
 hkalrungekutta.cc:1225
 hkalrungekutta.cc:1226
 hkalrungekutta.cc:1227
 hkalrungekutta.cc:1228
 hkalrungekutta.cc:1229
 hkalrungekutta.cc:1230
 hkalrungekutta.cc:1231
 hkalrungekutta.cc:1232
 hkalrungekutta.cc:1233
 hkalrungekutta.cc:1234
 hkalrungekutta.cc:1235
 hkalrungekutta.cc:1236
 hkalrungekutta.cc:1237
 hkalrungekutta.cc:1238
 hkalrungekutta.cc:1239
 hkalrungekutta.cc:1240
 hkalrungekutta.cc:1241
 hkalrungekutta.cc:1242
 hkalrungekutta.cc:1243
 hkalrungekutta.cc:1244
 hkalrungekutta.cc:1245
 hkalrungekutta.cc:1246
 hkalrungekutta.cc:1247
 hkalrungekutta.cc:1248
 hkalrungekutta.cc:1249
 hkalrungekutta.cc:1250
 hkalrungekutta.cc:1251
 hkalrungekutta.cc:1252
 hkalrungekutta.cc:1253
 hkalrungekutta.cc:1254
 hkalrungekutta.cc:1255
 hkalrungekutta.cc:1256
 hkalrungekutta.cc:1257
 hkalrungekutta.cc:1258
 hkalrungekutta.cc:1259
 hkalrungekutta.cc:1260
 hkalrungekutta.cc:1261
 hkalrungekutta.cc:1262
 hkalrungekutta.cc:1263
 hkalrungekutta.cc:1264
 hkalrungekutta.cc:1265
 hkalrungekutta.cc:1266
 hkalrungekutta.cc:1267
 hkalrungekutta.cc:1268
 hkalrungekutta.cc:1269
 hkalrungekutta.cc:1270
 hkalrungekutta.cc:1271
 hkalrungekutta.cc:1272
 hkalrungekutta.cc:1273
 hkalrungekutta.cc:1274
 hkalrungekutta.cc:1275
 hkalrungekutta.cc:1276
 hkalrungekutta.cc:1277
 hkalrungekutta.cc:1278
 hkalrungekutta.cc:1279
 hkalrungekutta.cc:1280
 hkalrungekutta.cc:1281
 hkalrungekutta.cc:1282
 hkalrungekutta.cc:1283
 hkalrungekutta.cc:1284
 hkalrungekutta.cc:1285
 hkalrungekutta.cc:1286
 hkalrungekutta.cc:1287
 hkalrungekutta.cc:1288
 hkalrungekutta.cc:1289
 hkalrungekutta.cc:1290
 hkalrungekutta.cc:1291
 hkalrungekutta.cc:1292
 hkalrungekutta.cc:1293
 hkalrungekutta.cc:1294
 hkalrungekutta.cc:1295
 hkalrungekutta.cc:1296
 hkalrungekutta.cc:1297
 hkalrungekutta.cc:1298
 hkalrungekutta.cc:1299
 hkalrungekutta.cc:1300
 hkalrungekutta.cc:1301
 hkalrungekutta.cc:1302
 hkalrungekutta.cc:1303
 hkalrungekutta.cc:1304
 hkalrungekutta.cc:1305
 hkalrungekutta.cc:1306
 hkalrungekutta.cc:1307
 hkalrungekutta.cc:1308
 hkalrungekutta.cc:1309
 hkalrungekutta.cc:1310
 hkalrungekutta.cc:1311
 hkalrungekutta.cc:1312
 hkalrungekutta.cc:1313
 hkalrungekutta.cc:1314
 hkalrungekutta.cc:1315
 hkalrungekutta.cc:1316
 hkalrungekutta.cc:1317
 hkalrungekutta.cc:1318
 hkalrungekutta.cc:1319
 hkalrungekutta.cc:1320
 hkalrungekutta.cc:1321
 hkalrungekutta.cc:1322
 hkalrungekutta.cc:1323
 hkalrungekutta.cc:1324
 hkalrungekutta.cc:1325
 hkalrungekutta.cc:1326
 hkalrungekutta.cc:1327
 hkalrungekutta.cc:1328
 hkalrungekutta.cc:1329
 hkalrungekutta.cc:1330
 hkalrungekutta.cc:1331
 hkalrungekutta.cc:1332
 hkalrungekutta.cc:1333
 hkalrungekutta.cc:1334
 hkalrungekutta.cc:1335
 hkalrungekutta.cc:1336
 hkalrungekutta.cc:1337
 hkalrungekutta.cc:1338
 hkalrungekutta.cc:1339
 hkalrungekutta.cc:1340
 hkalrungekutta.cc:1341
 hkalrungekutta.cc:1342
 hkalrungekutta.cc:1343
 hkalrungekutta.cc:1344
 hkalrungekutta.cc:1345
 hkalrungekutta.cc:1346
 hkalrungekutta.cc:1347
 hkalrungekutta.cc:1348
 hkalrungekutta.cc:1349
 hkalrungekutta.cc:1350
 hkalrungekutta.cc:1351
 hkalrungekutta.cc:1352
 hkalrungekutta.cc:1353
 hkalrungekutta.cc:1354
 hkalrungekutta.cc:1355
 hkalrungekutta.cc:1356
 hkalrungekutta.cc:1357
 hkalrungekutta.cc:1358
 hkalrungekutta.cc:1359
 hkalrungekutta.cc:1360
 hkalrungekutta.cc:1361
 hkalrungekutta.cc:1362
 hkalrungekutta.cc:1363
 hkalrungekutta.cc:1364
 hkalrungekutta.cc:1365
 hkalrungekutta.cc:1366
 hkalrungekutta.cc:1367
 hkalrungekutta.cc:1368
 hkalrungekutta.cc:1369
 hkalrungekutta.cc:1370
 hkalrungekutta.cc:1371
 hkalrungekutta.cc:1372
 hkalrungekutta.cc:1373
 hkalrungekutta.cc:1374
 hkalrungekutta.cc:1375
 hkalrungekutta.cc:1376
 hkalrungekutta.cc:1377
 hkalrungekutta.cc:1378
 hkalrungekutta.cc:1379
 hkalrungekutta.cc:1380
 hkalrungekutta.cc:1381
 hkalrungekutta.cc:1382
 hkalrungekutta.cc:1383
 hkalrungekutta.cc:1384
 hkalrungekutta.cc:1385
 hkalrungekutta.cc:1386
 hkalrungekutta.cc:1387
 hkalrungekutta.cc:1388
 hkalrungekutta.cc:1389
 hkalrungekutta.cc:1390
 hkalrungekutta.cc:1391
 hkalrungekutta.cc:1392
 hkalrungekutta.cc:1393
 hkalrungekutta.cc:1394
 hkalrungekutta.cc:1395
 hkalrungekutta.cc:1396
 hkalrungekutta.cc:1397
 hkalrungekutta.cc:1398
 hkalrungekutta.cc:1399
 hkalrungekutta.cc:1400
 hkalrungekutta.cc:1401
 hkalrungekutta.cc:1402
 hkalrungekutta.cc:1403
 hkalrungekutta.cc:1404
 hkalrungekutta.cc:1405
 hkalrungekutta.cc:1406
 hkalrungekutta.cc:1407
 hkalrungekutta.cc:1408
 hkalrungekutta.cc:1409
 hkalrungekutta.cc:1410
 hkalrungekutta.cc:1411
 hkalrungekutta.cc:1412
 hkalrungekutta.cc:1413
 hkalrungekutta.cc:1414
 hkalrungekutta.cc:1415
 hkalrungekutta.cc:1416
 hkalrungekutta.cc:1417
 hkalrungekutta.cc:1418
 hkalrungekutta.cc:1419
 hkalrungekutta.cc:1420
 hkalrungekutta.cc:1421
 hkalrungekutta.cc:1422
 hkalrungekutta.cc:1423
 hkalrungekutta.cc:1424
 hkalrungekutta.cc:1425
 hkalrungekutta.cc:1426
 hkalrungekutta.cc:1427
 hkalrungekutta.cc:1428
 hkalrungekutta.cc:1429
 hkalrungekutta.cc:1430
 hkalrungekutta.cc:1431
 hkalrungekutta.cc:1432
 hkalrungekutta.cc:1433
 hkalrungekutta.cc:1434
 hkalrungekutta.cc:1435
 hkalrungekutta.cc:1436
 hkalrungekutta.cc:1437
 hkalrungekutta.cc:1438
 hkalrungekutta.cc:1439
 hkalrungekutta.cc:1440
 hkalrungekutta.cc:1441
 hkalrungekutta.cc:1442
 hkalrungekutta.cc:1443
 hkalrungekutta.cc:1444
 hkalrungekutta.cc:1445
 hkalrungekutta.cc:1446
 hkalrungekutta.cc:1447
 hkalrungekutta.cc:1448
 hkalrungekutta.cc:1449
 hkalrungekutta.cc:1450
 hkalrungekutta.cc:1451
 hkalrungekutta.cc:1452
 hkalrungekutta.cc:1453
 hkalrungekutta.cc:1454
 hkalrungekutta.cc:1455
 hkalrungekutta.cc:1456
 hkalrungekutta.cc:1457
 hkalrungekutta.cc:1458
 hkalrungekutta.cc:1459
 hkalrungekutta.cc:1460
 hkalrungekutta.cc:1461
 hkalrungekutta.cc:1462
 hkalrungekutta.cc:1463
 hkalrungekutta.cc:1464
 hkalrungekutta.cc:1465
 hkalrungekutta.cc:1466
 hkalrungekutta.cc:1467
 hkalrungekutta.cc:1468
 hkalrungekutta.cc:1469
 hkalrungekutta.cc:1470
 hkalrungekutta.cc:1471
 hkalrungekutta.cc:1472
 hkalrungekutta.cc:1473
 hkalrungekutta.cc:1474
 hkalrungekutta.cc:1475
 hkalrungekutta.cc:1476
 hkalrungekutta.cc:1477
 hkalrungekutta.cc:1478
 hkalrungekutta.cc:1479
 hkalrungekutta.cc:1480
 hkalrungekutta.cc:1481
 hkalrungekutta.cc:1482
 hkalrungekutta.cc:1483
 hkalrungekutta.cc:1484
 hkalrungekutta.cc:1485
 hkalrungekutta.cc:1486
 hkalrungekutta.cc:1487
 hkalrungekutta.cc:1488
 hkalrungekutta.cc:1489
 hkalrungekutta.cc:1490
 hkalrungekutta.cc:1491
 hkalrungekutta.cc:1492
 hkalrungekutta.cc:1493
 hkalrungekutta.cc:1494
 hkalrungekutta.cc:1495
 hkalrungekutta.cc:1496
 hkalrungekutta.cc:1497
 hkalrungekutta.cc:1498
 hkalrungekutta.cc:1499
 hkalrungekutta.cc:1500
 hkalrungekutta.cc:1501
 hkalrungekutta.cc:1502
 hkalrungekutta.cc:1503
 hkalrungekutta.cc:1504
 hkalrungekutta.cc:1505
 hkalrungekutta.cc:1506
 hkalrungekutta.cc:1507
 hkalrungekutta.cc:1508
 hkalrungekutta.cc:1509
 hkalrungekutta.cc:1510
 hkalrungekutta.cc:1511
 hkalrungekutta.cc:1512
 hkalrungekutta.cc:1513
 hkalrungekutta.cc:1514
 hkalrungekutta.cc:1515
 hkalrungekutta.cc:1516
 hkalrungekutta.cc:1517
 hkalrungekutta.cc:1518
 hkalrungekutta.cc:1519
 hkalrungekutta.cc:1520
 hkalrungekutta.cc:1521
 hkalrungekutta.cc:1522
 hkalrungekutta.cc:1523
 hkalrungekutta.cc:1524
 hkalrungekutta.cc:1525
 hkalrungekutta.cc:1526
 hkalrungekutta.cc:1527
 hkalrungekutta.cc:1528
 hkalrungekutta.cc:1529
 hkalrungekutta.cc:1530
 hkalrungekutta.cc:1531
 hkalrungekutta.cc:1532
 hkalrungekutta.cc:1533
 hkalrungekutta.cc:1534
 hkalrungekutta.cc:1535
 hkalrungekutta.cc:1536
 hkalrungekutta.cc:1537
 hkalrungekutta.cc:1538
 hkalrungekutta.cc:1539
 hkalrungekutta.cc:1540
 hkalrungekutta.cc:1541
 hkalrungekutta.cc:1542
 hkalrungekutta.cc:1543
 hkalrungekutta.cc:1544
 hkalrungekutta.cc:1545
 hkalrungekutta.cc:1546
 hkalrungekutta.cc:1547
 hkalrungekutta.cc:1548
 hkalrungekutta.cc:1549
 hkalrungekutta.cc:1550
 hkalrungekutta.cc:1551
 hkalrungekutta.cc:1552
 hkalrungekutta.cc:1553
 hkalrungekutta.cc:1554
 hkalrungekutta.cc:1555
 hkalrungekutta.cc:1556
 hkalrungekutta.cc:1557
 hkalrungekutta.cc:1558
 hkalrungekutta.cc:1559
 hkalrungekutta.cc:1560
 hkalrungekutta.cc:1561
 hkalrungekutta.cc:1562
 hkalrungekutta.cc:1563
 hkalrungekutta.cc:1564
 hkalrungekutta.cc:1565
 hkalrungekutta.cc:1566
 hkalrungekutta.cc:1567
 hkalrungekutta.cc:1568
 hkalrungekutta.cc:1569
 hkalrungekutta.cc:1570
 hkalrungekutta.cc:1571
 hkalrungekutta.cc:1572
 hkalrungekutta.cc:1573
 hkalrungekutta.cc:1574
 hkalrungekutta.cc:1575
 hkalrungekutta.cc:1576
 hkalrungekutta.cc:1577
 hkalrungekutta.cc:1578
 hkalrungekutta.cc:1579
 hkalrungekutta.cc:1580
 hkalrungekutta.cc:1581
 hkalrungekutta.cc:1582
 hkalrungekutta.cc:1583
 hkalrungekutta.cc:1584
 hkalrungekutta.cc:1585
 hkalrungekutta.cc:1586
 hkalrungekutta.cc:1587
 hkalrungekutta.cc:1588
 hkalrungekutta.cc:1589
 hkalrungekutta.cc:1590
 hkalrungekutta.cc:1591
 hkalrungekutta.cc:1592
 hkalrungekutta.cc:1593
 hkalrungekutta.cc:1594
 hkalrungekutta.cc:1595
 hkalrungekutta.cc:1596
 hkalrungekutta.cc:1597
 hkalrungekutta.cc:1598
 hkalrungekutta.cc:1599
 hkalrungekutta.cc:1600
 hkalrungekutta.cc:1601
 hkalrungekutta.cc:1602
 hkalrungekutta.cc:1603
 hkalrungekutta.cc:1604
 hkalrungekutta.cc:1605
 hkalrungekutta.cc:1606
 hkalrungekutta.cc:1607
 hkalrungekutta.cc:1608
 hkalrungekutta.cc:1609
 hkalrungekutta.cc:1610
 hkalrungekutta.cc:1611
 hkalrungekutta.cc:1612
 hkalrungekutta.cc:1613
 hkalrungekutta.cc:1614
 hkalrungekutta.cc:1615
 hkalrungekutta.cc:1616
 hkalrungekutta.cc:1617
 hkalrungekutta.cc:1618
 hkalrungekutta.cc:1619
 hkalrungekutta.cc:1620
 hkalrungekutta.cc:1621
 hkalrungekutta.cc:1622
 hkalrungekutta.cc:1623
 hkalrungekutta.cc:1624
 hkalrungekutta.cc:1625
 hkalrungekutta.cc:1626
 hkalrungekutta.cc:1627
 hkalrungekutta.cc:1628
 hkalrungekutta.cc:1629
 hkalrungekutta.cc:1630
 hkalrungekutta.cc:1631
 hkalrungekutta.cc:1632
 hkalrungekutta.cc:1633
 hkalrungekutta.cc:1634
 hkalrungekutta.cc:1635
 hkalrungekutta.cc:1636
 hkalrungekutta.cc:1637
 hkalrungekutta.cc:1638
 hkalrungekutta.cc:1639
 hkalrungekutta.cc:1640
 hkalrungekutta.cc:1641
 hkalrungekutta.cc:1642
 hkalrungekutta.cc:1643
 hkalrungekutta.cc:1644
 hkalrungekutta.cc:1645
 hkalrungekutta.cc:1646
 hkalrungekutta.cc:1647
 hkalrungekutta.cc:1648
 hkalrungekutta.cc:1649
 hkalrungekutta.cc:1650
 hkalrungekutta.cc:1651
 hkalrungekutta.cc:1652
 hkalrungekutta.cc:1653
 hkalrungekutta.cc:1654
 hkalrungekutta.cc:1655
 hkalrungekutta.cc:1656
 hkalrungekutta.cc:1657
 hkalrungekutta.cc:1658
 hkalrungekutta.cc:1659
 hkalrungekutta.cc:1660
 hkalrungekutta.cc:1661
 hkalrungekutta.cc:1662
 hkalrungekutta.cc:1663
 hkalrungekutta.cc:1664
 hkalrungekutta.cc:1665
 hkalrungekutta.cc:1666
 hkalrungekutta.cc:1667
 hkalrungekutta.cc:1668
 hkalrungekutta.cc:1669
 hkalrungekutta.cc:1670
 hkalrungekutta.cc:1671
 hkalrungekutta.cc:1672
 hkalrungekutta.cc:1673
 hkalrungekutta.cc:1674
 hkalrungekutta.cc:1675
 hkalrungekutta.cc:1676
 hkalrungekutta.cc:1677
 hkalrungekutta.cc:1678
 hkalrungekutta.cc:1679
 hkalrungekutta.cc:1680
 hkalrungekutta.cc:1681
 hkalrungekutta.cc:1682
 hkalrungekutta.cc:1683
 hkalrungekutta.cc:1684
 hkalrungekutta.cc:1685
 hkalrungekutta.cc:1686
 hkalrungekutta.cc:1687
 hkalrungekutta.cc:1688
 hkalrungekutta.cc:1689
 hkalrungekutta.cc:1690
 hkalrungekutta.cc:1691
 hkalrungekutta.cc:1692
 hkalrungekutta.cc:1693
 hkalrungekutta.cc:1694
 hkalrungekutta.cc:1695
 hkalrungekutta.cc:1696
 hkalrungekutta.cc:1697
 hkalrungekutta.cc:1698
 hkalrungekutta.cc:1699
 hkalrungekutta.cc:1700