ROOT logo

// from ROOT
#include "TVector3.h"

// from hydra
#include "hades.h"
#include "hmdclayergeompar.h"
#include "hmdcsizescells.h"
#include "hruntimedb.h"

#include "hkaldef.h"
#include "hkaldetcradle.h"
#include "hkalgeomtools.h"
#include "hkalmdcmeaslayer.h"
#include "hmaterials.h"
#include "hkalmixture.h"

ClassImp(HKalDetCradle)

//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////////////////////////////////////
//
// A detector cradle is a container that stores the detector's measurement layers.
// The constructor HKalDetCradle(Int_t nLayInMdc) will automatically add
// Mdc layers to the cradle.
//
//-----------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////


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

HKalDetCradle::HKalDetCradle() {
    matsMdc      = NULL;
    matAir       = NULL;
    nLayersInMdc = 1;
}

HKalDetCradle::HKalDetCradle(Int_t nLayInMdc, const TObjArray *customMats) :
TObjArray(kNumSecs*kNumMdcs*nLayInMdc) {
    // Default contructor that adds Mdc layers to the cradle.
    // The Mdc layers will be added to the cradle in the following order:
    // 1. Sort by sector number (0..5)
    // 2. Sort by module number (0..3) in a sector
    // 3. Sort by layer number of module in sector
    // nLayInMdc: the number of mdc layers that should be added to each sector in a module.
    // customMats: Materials for MDCs and materials between MDCs. If empty
    //             standard materials will be used

    matsMdc    = new HKalMixture*[kNumMdcs];
    matAir     = NULL;
    nLayersInMdc = nLayInMdc;
    if(customMats) {
	if(customMats->GetEntries() == kNumMdcs+1) {
	    for(Int_t iMod = 0; iMod < kNumMdcs; iMod++) {
		HKalMixture *mat = dynamic_cast<HKalMixture*>(customMats->At(iMod));
		if(mat) {
		    matsMdc[iMod] = mat;
		} else {
		    Error("HKalDetCradle()",
			  Form("No material found for MDC %i", iMod));
		}
	    }
	    HKalMixture *mat = dynamic_cast<HKalMixture*>(customMats->At(kNumMdcs));
	    if(mat) {
		matAir = mat;
	    } else {
		Error("HKalDetCradle()",
		      Form("No object found at index %i", kNumMdcs));
	    }
	} else {
	    Error("HKalDetCradle()",
		  Form("Size of materials array is %i. Expected %i.",
		       customMats->GetEntries(), kNumMdcs));
	}
    } else {
	initMdcMaterials();
    }

    for(Int_t iSec = 0; iSec < kNumSecs; iSec++) {
        for(Int_t iMod = 0; iMod < kNumMdcs; iMod++) {
#if kalDebug > 0
            if(!HMdcSizesCells::getObject()) {
                Warning("HKalDetCradle(Int_t)", "HMdcSizesCells has not been initialized. Measurement layers not added to detector cradle.");
                break;
            }
#endif
            addMdcLayersToCradle(HMdcSizesCells::getObject(), iSec, iMod, nLayersInMdc);
        }
    }
}

HKalDetCradle::~HKalDetCradle() {
    delete [] matsMdc;
    delete matAir;
}

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

void HKalDetCradle::addMdcLayersToCradle(const HMdcSizesCells *fSizesCells,
					 Int_t sector, Int_t module, Int_t nLayers) {
    // Create a mdc detector with nLayers measurement layers. Each time the constructor
    // is called, a new set if KalMdcMeasLayer objects will be added to the TObjArray.
    // Module and sector identify the drift chamber.
    //
    // Input:
    // fSizesCells: object that can do coordinate transformation layer<->sector
    // sector:      the sector where this detector is located (needed for coordinate transformation)
    // module:      the module where this detector is located (needed for coordinate transformation)
    // nLayers:     number of layers in detector

    HRuntimeDb *rtdb = gHades->getRuntimeDb();

    HMdcLayerGeomPar *layerGeomPar = (HMdcLayerGeomPar*)rtdb->getContainer("MdcLayerGeomPar");

    for (Int_t layer = 0; layer < nLayers; layer++) {
        // A measurement vector is modeled as a plane. A plane is defined by
        // a point on the plane and a normal vector.
        // The Center of layer is the Null vector and the normal vector is (0,0,1)
        // in the layer coordinate system.
        // These vectors need to be transformed into sector coordinates.
#if kalDebug > 0
        if(!secOk(sector)) {
            Error("addMdcLayersToCradle()", Form("Invalid sector number: %i. Layers not added to cradle.", sector));
            break;
        }
        if(!modOk(module)) {
            Error("addMdcLayersToCradle()", Form("Invalid module number: %i. Layers not added to cradle.", module));
            break;
        }
        if(!fSizesCells) {
            Error("addMdcLayersToCradle()", "HMdcSizesCells is not initialized.");
        }
#endif

        Double_t x = 0.;
        Double_t y = 0.;
        Double_t z = 0.;

	if(nLayers == 1) {
	    HKalGeomTools::TransModuleToSector(x, y, z, sector, module);
            //((*fSizesCells)[sector][module]).transFrom(x,y,z); // transform to sector coordinate sys
        } else {
	    HKalGeomTools::TransLayerToSector(x, y, z, sector, module, layer);
            //((*fSizesCells)[sector][module][layer]).transFrom(x,y,z); // transform to sector coordinate sys
        }

	TVector3 vPlaneCenter(x, y, z);

        x = 0.;
        y = 0.;
        z = 1.;
        if(nLayers == 1) {
	    HKalGeomTools::TransModuleToSector(x, y, z, sector, module);
            //((*fSizesCells)[sector][module]).transFrom(x,y,z); // transform to sector coordinate system
        } else {
	    HKalGeomTools::TransLayerToSector(x, y, z, sector, module, layer);
            //((*fSizesCells)[sector][module][layer]).transFrom(x,y,z); // transform to sector coordinate sys
	}

        TVector3 vZ(x, y, z);
	TVector3 vPlaneNormal = vZ - vPlaneCenter;

        vPlaneNormal.Unit();

        // Choose the normal vector, so that the scalar product of the normal vector
        // and the point on the plane is positive.
        if(vPlaneCenter * vPlaneNormal < 0) {
            vPlaneNormal *= -1.;
        }

        HKalMdcMeasLayer *meas;
        HMdcLayerGeomParLay &layerGeomParLay = (HMdcLayerGeomParLay&)(*layerGeomPar)[sector][module][layer];
        Double_t layerThickness = layerGeomParLay.getCatDist();

        if(nLayers == 1) {
            layerThickness *= 8.; // 6 layers + 2 * layer thickness outside
        }
        if(nLayers != 1 && layer == 0) {
            meas = new HKalMdcMeasLayer(vPlaneCenter, vPlaneNormal, matsMdc[module], matAir,
                                        module, sector, layer, nLayersInMdc, layerThickness);
        } else {
            meas = new HKalMdcMeasLayer(vPlaneCenter, vPlaneNormal, matsMdc[module], matAir,
                                        module, sector, layer, nLayersInMdc, layerThickness);
        }
        install(meas);
    }
    SetOwner();
}

const HKalMdcMeasLayer* HKalDetCradle::getMdcLayerAt(Int_t sector, Int_t module, Int_t layer) const {
    // Returns the mdc layer in a sector
    // Input:
    // sector: the sector where this detector is located (needed for coordinate transformation)
    // module: the module where this detector is located (needed for coordinate transformation)
    // layer:  layer number in the sector of the mdc module.

    Int_t layIdx = (sector*kNumMdcs + module)*nLayersInMdc;
    if(layer != 6) { // layer 6 = midplane
        layIdx += layer;
    }
#ifdef kalDebug
    if(layIdx < 0 || layIdx > GetEntries() - 1) {
        Error("getMdcLayerAt()", Form("Mdc layer at sector %i, module %i, layer %i not found in detector cradle. Tried to access element at index %i.", sector, module, layer, layIdx));
        exit(1);
    }
    if(!At(layIdx)->InheritsFrom("HKalMdcMeasLayer")) {
        Error("getMdcLayerAt()", Form("Object at index %i in detector cradle is of class %s. Expected class HKalMdcMeasLayer.", layIdx, At(layIdx)->ClassName()));
        exit(1);
    }
    return (HKalMdcMeasLayer*)At(layIdx);
#else
    return (HKalMdcMeasLayer*)At(layIdx);
#endif
}

HKalMixture* HKalDetCradle::getMdcMaterial(mdcComponent comp, Int_t module) const {
    // Returns the material of an Mdc layer component.
    // Input:
    // comp:   The Mdc component (Cathode/field/sense wires, gas, window, mylar foil)
    // module: The module the Mdc layer is located in.

    if(!modOk(module)) {
        Error("getMdcMaterial()", Form("%i is not a valid module number", module));
        return NULL;
    }

    HKalMixture *mdcMix = NULL;
    Float_t mat[kNumMdcMats];

    switch(comp) {
    // Cathode and field wires consists of the same materials.
    case kCatWi:
    case kFieldWi:
	mdcMix = new HKalMixture("Aluminum", "altu", 1);
	getProperties(mat, "al");
	mdcMix->defineElement(0, mat, 1.F);
	mdcMix->calcMixture();
        break;

    case kSenseWi:
        // Material for sense wires.
	Float_t vol[2], rho[2], w[2];
	rho[0] = HMaterials::getDensity("Copper");
	rho[1] = HMaterials::getDensity("Beryllium");
	// Mdc layers contain a 84:16 volume percent mixture of Argon-Isobutane.
	vol[0] = .98;
	vol[1] = .02;
	// Get mass fractions for gas mixtue.
        mdcMix = new HKalMixture("Copper/Beryllium 98/2", "co/be", 2);
	mdcMix->calcMassFracFromVolFrac(w, 2, rho, vol);
	getProperties(mat, "Copper");
	mdcMix->defineElement(0, mat, w[0]);
	getProperties(mat, "Beryllium");
	mdcMix->defineElement(1, mat, w[1]);
	mdcMix->calcMixture();
        break;

    case kWindow:
        // Material for mylar foil.
        mdcMix = new HKalMixture("Mylar", "mylar", 1);
        getProperties(mat, "mylar");
        mdcMix->defineElement(0, mat, 1.F);
        mdcMix->calcMixture();
        break;

    case kGas:

        // Gas in Mdc 1 is Argon-Isobutane
        if(module == 0) {
            Float_t vol[2], rho[2], w[2];
            rho[0] = HMaterials::getDensity("argon");
            rho[1] = HMaterials::getDensity("CO2");
            // Mdc layers contain a 84:16 volume percent mixture of Argon-Isobutane.
            vol[0] = .70;
            vol[1] = .30;
            // Get mass fractions for gas mixtue.
            mdcMix = new HKalMixture("Argon-Isobutane 70:30", "arco2_70_30", 2);
            mdcMix->calcMassFracFromVolFrac(w, 2, rho, vol);
            getProperties(mat, "argon");
            mdcMix->defineElement(0, mat, w[0]);
            getProperties(mat, "CO2");
            mdcMix->defineElement(1, mat, w[1]);
            mdcMix->calcMixture();
        // Gas in the other Mdcs is Helium-Isobutane.
	} else {

            Float_t vol[2], rho[2], w[2];
            rho[0] = HMaterials::getDensity("helium");
            rho[1] = HMaterials::getDensity("butane");
            // Mdc layers contain a 60:40 volume percent mixture of Helium-Isobutane.
            vol[0] = .84;
            vol[1] = .16;
            // Get mass fractions.
            mdcMix = new HKalMixture("Helium-Isobutane 60:40", "hebutane", 2);
            mdcMix->calcMassFracFromVolFrac(w, 2, rho, vol);
            getProperties(mat, "helium");
            mdcMix->defineElement(0, mat, w[0]);
            getProperties(mat, "butane");
            mdcMix->defineElement(1, mat, w[1]);
	    mdcMix->calcMixture();
        }
        break;

    }
    return mdcMix;
}


void HKalDetCradle::getMdcMaterialVolumeFracs(Float_t volFracs[kNumMdcMats],
					      Int_t sector, Int_t module, Int_t layer) const {
    // Calculate the volume fractions of the different mdc components.
    // volFracs: the volume fractions of the components
    // module:   the module number of the mdc layer
    // sector:   the sector number of the mdc layer
    // layer:    the layer number

    if(!layOk(layer)) {
        Error("getMdcMaterialVolumeFracs()", Form("%i is not a valid layer number", layer));
        return;

    }
    if(!modOk(module)) {
        Error("getMdcMaterialVolumeFracs()", Form("%i is not a valid module number", module));
        return;
    }

    HRuntimeDb *rtdb = gHades->getRuntimeDb();
    HMdcLayerGeomPar    *layerGeomPar    = (HMdcLayerGeomPar*)rtdb->getContainer("MdcLayerGeomPar");
    HMdcLayerGeomParLay &layerGeomParLay = (HMdcLayerGeomParLay&)(*layerGeomPar)[sector][module][layer];

    Float_t nLayers = 6; // number of layers in mdc plane

    // Thickness of cell in mm = distance between cathode layers.
    Float_t xCell   = layerGeomParLay.getCatDist();

    Float_t xMylar  = .012; // thickness of mylar foils in mm
    //Float_t xPlane  = xCell * (nLayers+2) + 2 * xMylar; // thickness of mdc plane in mm

    // Distance (pitch) between two wires in mm.
    Float_t pitchCatWi;
    if(module == 3) {
        pitchCatWi = 4.F;
    } else {
        pitchCatWi = 2.F;
    }
    Float_t pitchFieldWi = xCell;
    Float_t pitchSenseWi = xCell;

    Double_t pi = TMath::Pi();

    // Radii of wires in mm.
    Float_t rCatWi   = layerGeomParLay.getCathodeWireThickness() / 2;
    Float_t rFieldWi;
    if(module == 0 || module == 1) {
        rFieldWi = 0.04;
    } else {
        rFieldWi = 0.05;
    }
    Float_t rSenseWi;
    if(module == 3) {
        rSenseWi = 0.015;
    } else {
        rSenseWi = 0.01;
    }

    Float_t thicknessCell[kNumMdcMats];
    // Spread out wires with circular cross sectional area over the wires' pitch
    // to get a wire with a rectangular cross sectional area of equal proportions.
    // Area of circle: pi * r^2
    // Area of rectangle: pitch * x
    // => Spread out thickness of wire: x = pi * r^2 / pitch
    thicknessCell[kCatWi]   = pi * rCatWi   * rCatWi   / pitchCatWi;
    thicknessCell[kFieldWi] = pi * rFieldWi * rFieldWi / pitchFieldWi;
    thicknessCell[kSenseWi] = pi * rSenseWi * rSenseWi / pitchSenseWi;
    thicknessCell[kWindow]  = xMylar;
    thicknessCell[kGas]     = xCell - (thicknessCell[kCatWi] + thicknessCell[kFieldWi] + thicknessCell[kSenseWi]);

    // Materials' thickness added over the whole Mdc plane.
    Float_t thickness[kNumMdcMats];
    thickness[kCatWi]   = (nLayers+1) * thicknessCell[kCatWi];
    thickness[kFieldWi] = nLayers     * thicknessCell[kFieldWi];
    thickness[kSenseWi] = nLayers     * thicknessCell[kSenseWi];
    thickness[kWindow]  = 2           * thicknessCell[kWindow];
    thickness[kGas]     = nLayers     * thicknessCell[kGas]      + xCell * 2;

    Float_t thicknessTotal = 0.F;
    for(Int_t i = 0; i < kNumMdcMats; i++) {
        thicknessTotal += thickness[i];
    }

    for(Int_t i = 0; i < kNumMdcMats; i++) {
        volFracs[i] = thickness[i] / thicknessTotal;
    }
}

void HKalDetCradle::initMdcMaterials() {

    Float_t mat[5]; // Storage for material properties.

    matAir = new HKalMixture("Air", "air", 1);
    getProperties(mat, "air");
    matAir->defineElement(0, mat, 1.F);
    matAir->calcMixture();

    // Materials of mdc planes.

    // Materials of the different components (gas, wires, window foils) of an mdc plane.
    HKalMixture const *matsMdcComp     [kNumMdcMats];
    // Density of mdc components.
    Float_t      rhoMatsMdcComp  [kNumMdcMats];
    // Fractions on total volume of the different mdc components.
    Float_t      volFracsMdcComp [kNumMdcMats];
    // Mass fractions of the different mdc components.
    Float_t      massFracsMdcComp[kNumMdcMats];

    Int_t sector = 0;
    Int_t layer  = 0;

    for(Int_t iModule = 0; iModule < kNumMdcs; iModule++) {
        // Get the materials of the mdc components.
        for(Int_t iComp = 0; iComp < kNumMdcMats; iComp++) {
            matsMdcComp   [iComp] = getMdcMaterial((mdcComponent)iComp, iModule);
            rhoMatsMdcComp[iComp] = matsMdcComp[iComp]->GetDensity();
        }
        // Calculate volume fractions of mdc components.
        getMdcMaterialVolumeFracs(volFracsMdcComp, sector, iModule, layer);
        // Calculate mass fractions from volume fractions and densities.
        HKalMixture::calcMassFracFromVolFrac(massFracsMdcComp, kNumMdcMats, rhoMatsMdcComp, volFracsMdcComp);

        // Make a mixture of the mdc components' materials.
        matsMdc[iModule] = new HKalMixture(Form("Materials for mdc plane %i.", iModule), "mdc", kNumMdcMats);
        for(Int_t iComp = 0; iComp < kNumMdcMats; iComp++) {
            matsMdc[iModule]->defineElement(iComp, matsMdcComp[iComp]->GetA(), matsMdcComp[iComp]->GetZ(),
                                            matsMdcComp[iComp]->GetDensity(), matsMdcComp[iComp]->GetExciteEner(),
                                            matsMdcComp[iComp]->GetRadLength(), massFracsMdcComp[iComp]);
        }
        matsMdc[iModule]->calcMixture();

        for(Int_t iComp = 0; iComp < kNumMdcMats; iComp++) {
            delete matsMdcComp[iComp];
        }
    }
}

void HKalDetCradle::getProperties(Float_t mat[5], const Char_t *id) {
    // Returns the atomic mass, atomic number, density, excitation energy and
    // radiation length in an array and converts the units from cm to mm and eV to MeV.
    // The array index where a material property is stored is determined by the matIdx
    // enum in hkaldef.h.
    // Output:
    // mat: array with material properties.
    // Input:
    // id:  material name as in HMaterial

    mat[Kalman::kMatIdxA]         = HMaterials::getA(id);
    mat[Kalman::kMatIdxZ]         = HMaterials::getZ(id);
    mat[Kalman::kMatIdxDensity]   = HMaterials::getDensity(id);
    mat[Kalman::kMatIdxExEner]    = HMaterials::getExciteEner(id);
    mat[Kalman::kMatIdxRadLength] = HMaterials::getRadLength(id);

    Float_t corrRho = 1.e-3; // g/cm^3 -> g/mm^3
    Float_t corrI   = 1.e-6; // eV -> MeV
    Float_t corrX0  = 10.F;  // cm -> mm

    mat[Kalman::kMatIdxDensity]   *= corrRho;
    mat[Kalman::kMatIdxExEner]    *= corrI;
    mat[Kalman::kMatIdxRadLength] *= corrX0;
}


void HKalDetCradle::install(HKalMdcMeasLayer *layer) {
    // Adds a new mdc measurement to the array.

    Add(layer);
}

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