ROOT logo
//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////
//*-- AUTHOR : J. Markert
////////////////////////////////////////////////////////////////////////////
// HMdcDeDx
//
// This transformation class calculates the "pseudo dEdx" from t2-t1 (time above threshold)
// of all fired drift cells included in one HMdcSeg. The transformation is performed doing a
// normalization of the measured t2-t1 with impact angle and minimum distance to wire
// (MDCCAL2 parametrization) and the algorithm to normalize the single measurements and
// average over all cells included in the segment.
//-------------------------------------------------------------------------
// Calculation of dEdx:
// Float_t calcDeDx(HMdcSeg*,Float_t*,Float_t*,UChar_t*,Float_t*,UChar_t*,
//		    Int_t vers=2,Int_t mod=2, Bool_t useTruncMean=kTRUE, Float_t truncMeanWindow=-99.,Int_t inputselect)
// calculates dedx of a MDC (or 2) segment by doing normalization for
// impact angle and distance from wire for the fired cells of
// the segment. The measurements are sorted in decreasing order,
// the mean and sigma is calculated. Afterwards the truncated mean
// is calculated and returned as dedx. Mean,sigma,number of wires before
// truncating,truncated mean,truncated mean sigma and number of wires
// after truncating can be obtained by the returned pointers.
// Different methods can be selected:
// vers==0 : Input filling from inner HMdcSeg
// vers==1 : Input filling from outer HMdcSeg
// vers==2 : Input filling from inner+outer HMdcSeg (default)
// mod==0  : calc dedx from 1st module in segment
// mod==1  : calc dedx from 2nd module in segment
// mod==2  : calc dedx from whole segment (default)
// useTruncMean: kTRUE (default) apply truncated Mean
// truncMeanWindow (unit: SIGMA RMS of mean TOT): -99 (default) use standard window
// inputselect==0 : fill from segment (default,wires rejected by fit are missing)
// inputselect==1 : fill from cluster
// returns -99 if nothing was calculated
//-------------------------------------------------------------------------
// Settings of the truncated Mean method:
// The truncated mean is calculated according to the set window (in sigma units)
// (setWindow(Float_t window)) arround the mean. For the calculation of the truncated
// mean only drift cells with a dEdx inside the window arround the mean (calculated from
// all drift cells of the segment) will be taken into account.
// With setMinimumWires(Int_t minwires) the algorithm can be forced to keep
// a minimum number of wires. The method will stop removing drift cells from the active
// sample if the minimum number is reached.
////////////////////////////////////////////////////////////////////////////
#include "hmdcdedx2.h"
#include "hmessagemgr.h"
#include "hparamlist.h"
#include "hmatrixcategory.h"
#include "hlinearcategory.h"
#include "hrecevent.h"
#include "hmdcdef.h"
#include "hmdctrackddef.h"
#include "hmdccal1.h"
#include "hmdcseg.h"
#include "hmdchit.h"
#include "hmdcclusinf.h"
#include "hmdcclusfit.h"
#include "hmdcclus.h"
#include "hmdcwirefit.h"
#include "hmdcsizescells.h"
#include "hphysicsconstants.h"
#include "hgeantkine.h"

#include "TStyle.h"
#include "TMath.h"
#include "TRandom.h"
#include "TH1.h"
#include <stdlib.h>

ClassImp(HMdcDeDx2)

Float_t HMdcDeDx2::MaxMdcMinDist[4] = {4.,4.,8.,9.};
Bool_t  HMdcDeDx2::debug=kFALSE;


HMdcDeDx2::HMdcDeDx2(const Char_t* name,const Char_t* title,
		     const Char_t* context)
    : HParCond(name,title,context)
{
    //
    clear();
    loccal.set(4,0,0,0,0);
    minimumWires  = 5;
    isInitialized = kFALSE;
    setWindow(1.);
    measurements.Set(MAX_WIRES);
    measurements.Reset(-99);
    module = 2;
    method = 2;
    useCalibration = kTRUE;
    for(Int_t i = 0; i < 4; i ++){
	MinDistStep[i] = MaxMdcMinDist[i] / (Float_t) N_DIST;
        parmindistcut[i] = MaxMdcMinDist[i];
    }
    AngleStep = 5.;

    memset(&parMax[0][0][0][0],0,sizeof(Double_t) * 6 * 4 * N_ANGLE * N_DIST);
    memset(&pargaincorr[0][0][0][0],0,sizeof(Double_t) * 6 * 4 * 6 * 220);
}
HMdcDeDx2::~HMdcDeDx2()
{
    // destructor
}
void HMdcDeDx2::clear()
{
    hefr    = 0;
    status  = kFALSE;
    resetInputVersions();
    changed = kFALSE;
}
void HMdcDeDx2::printParam(TString opt)
{
    // prints the parameters of HMdcDeDx2 to the screen.

    cout<<"HMdcDeDx2:"<<endl;
    if(opt.CompareTo("par") == 0 || opt.CompareTo("all") == 0)
    {
	cout<<"par:"<<endl;

	for(Int_t s = 0; s < 6; s ++){
	    for(Int_t m = 0; m < 4; m ++){
		for(Int_t a = 0; a < N_ANGLE; a ++){
		    for(Int_t d = 0; d < N_DIST; d ++){
			    printf("s %i m %i angle %2i dist %2i %1.15e %1.15e %1.15e %1.15e\n",
				   s,m,a,d,
				   par[s][m][a][d][0],par[s][m][a][d][1],par[s][m][a][d][2],par[s][m][a][d][3]);
		    }
		}
	    }
	}
    }
    if(opt.CompareTo("parMax") == 0 || opt.CompareTo("all") == 0)
    {
	cout<<"parMax:"<<endl;

	for(Int_t s = 0; s < 6; s ++){
	    for(Int_t m = 0; m < 4; m ++){
		for(Int_t a = 0; a < N_ANGLE; a ++){
		    for(Int_t d = 0; d < N_DIST; d ++){
			printf("s %i m %i angle %2i dist %2i %7.3f\n",
			       s,m,a,d,
			       parMax[s][m][a][d]);
		    }
		}
	    }
	}
    }
    if(opt.CompareTo("shiftpar") == 0 || opt.CompareTo("all") == 0)
    {
	cout<<"shift par:"<<endl;
	for(Int_t s = 0; s < 6; s ++){
	    for(Int_t m = 0; m < 4; m ++){
		for(Int_t a = 0; a < N_ANGLE; a ++){
		    for(Int_t d = 0; d < N_DIST; d ++){
			    printf("s %i m %i angle %2i dist %2i %1.15e %1.15e\n",
				   s,m,a,d,
				   shiftpar[s][m][a][d][0],shiftpar[s][m][a][d][1]);
		    }
		}
	    }
	}
    }

    if(opt.CompareTo("pargaincorr") == 0 || opt.CompareTo("all") == 0)
    {
	cout<<"pargaincorr:"<<endl;

	for(Int_t s = 0; s < 6; s ++){
	    for(Int_t m = 0; m < 4; m ++){
		for(Int_t l = 0; l < 6; l ++){
		    for(Int_t c = 0; c < 220; c ++){
			printf("s %i m %i l %i c %i %7.3f\n",
			       s,m,l,c,
			       pargaincorr[s][m][l][c]);
		    }
		}
	    }
	}
    }

    if(opt.CompareTo("parmindistcut") == 0 || opt.CompareTo("all") == 0)
    {
	cout<<"parmindistcut:"<<endl;

	for(Int_t m = 0; m < 4; m ++){
	    printf("m %i %7.3f\n",
		   m,
		   parmindistcut[m]);
	}
    }

    cout<<"window:"<<endl;
    printf("window %7.3f \n",window);
    cout<<"hefr:"<<endl;
    printf("hefr %7.3f \n",hefr);

}
Bool_t HMdcDeDx2::createMaxPar(Bool_t print)
{
    // create the maximum allowed value of ToT to keep
    // the numerical calulations inside the range of double.
    // The procedure loops over all s,m,abin,dbin to set
    // the boundary automatically. This function needs
    // the parameter array for the fit functions to be initialized
    // before. The boundary value are stored inside the container.
    Double_t dEdX;
    Double_t ToT;
    for(Int_t s = 0; s < 6; s ++){
	for(Int_t m = 0; m < 4; m ++){
	    for(Int_t a = 0; a < N_ANGLE; a ++){
		for(Int_t d = 0; d <N_DIST; d ++){
		    Double_t* p = &par[s][m][a][d][0];

		    ToT  = 1.;
		    dEdX = TMath::Power(10.,(TMath::Power((ToT - p[0]) / p[1],(1. / p[2])))) - p[3];
		    while(TMath::Finite(dEdX))
		    {
                        ToT += 1.;
			dEdX = TMath::Power(10.,(TMath::Power((ToT - p[0]) / p[1],(1. / p[2])))) - p[3];
			if(!TMath::Finite(dEdX)) {
			    parMax[s][m][a][d] = ToT - 1;
			    break;
			}
		    }
		    if(print)
		    {
			cout<<"s " <<s
			    <<" m "<<m
			    <<" a "<<a
			    <<" d "<<d
			    <<" ToTmax " <<parMax[s][m][a][d]
			    <<endl;
		    }
		}
	    }
	}
    }

  return kTRUE;
}
Bool_t HMdcDeDx2::initContainer()
{
    if(!isInitialized)
    {

	catcal     = (HCategory*)((HRecEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcCal1);
	if(!catcal) { Error("initContainer()","HMdcCal1 Category not found in current Event!");}

	cathit     = (HCategory*)((HRecEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcHit);
	if(!cathit) { Error("initContainer()","HMdcHit Category not found in current Event!");}

	catclusinf = (HCategory*)((HRecEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcClusInf);
	if(!catclusinf) { Error("initContainer()","HMdcClusInf Category not found in current Event!");}

	catclus     = (HCategory*)((HRecEvent*)(gHades->getCurrentEvent()))->getCategory(catMdcClus);
	if(!catclus) { Error("initContainer()","HMdcClus Category not found in current Event!");}

   	sizescells = HMdcSizesCells::getExObject();
	if(!sizescells)
	{
	    Error("init()","NO HMDCSIZESCELLS CONTAINER IN INPUT!");
	    return kFALSE;
	}
	//if(!sizescells->hasChanged()) sizescells->initContainer();
	isInitialized = kTRUE;
    }
    return kTRUE;
}
void HMdcDeDx2::putParams(HParamList* l)
{
    // Puts all params of HMdcDeDx2 to the parameter list of
    // HParamList (which ist used by the io);
    if (!l) return;
    l->add("par"        ,&par     [0][0][0][0][0],6 * 4 * N_ANGLE * N_DIST * N_PARAM      );
    l->add("parMax"     ,&parMax  [0][0][0][0]   ,6 * 4 * N_ANGLE * N_DIST                );
    l->add("shiftpar"   ,&shiftpar[0][0][0][0][0],6 * 4 * N_ANGLE * N_DIST * N_SHIFT_PARAM);

    l->add("pargaincorr",&pargaincorr[0][0][0][0],6 * 4 * 6 * 220);
    l->add("parmindistcut",&parmindistcut[0],4);

    l->add("window"   ,window);
    l->add("hefr"     ,hefr);


}
Bool_t HMdcDeDx2::getParams(HParamList* l)
{
    if (!l) return kFALSE;
    if (!( l->fill("par"      ,&par     [0][0][0][0][0],6 * 4 * N_ANGLE * N_DIST * N_PARAM      ))) return kFALSE;
    if (!( l->fill("parMax"   ,&parMax  [0][0][0][0]   ,6 * 4 * N_ANGLE * N_DIST                ))) return kFALSE;
    if (!( l->fill("shiftpar" ,&shiftpar[0][0][0][0][0],6 * 4 * N_ANGLE * N_DIST * N_SHIFT_PARAM))) return kFALSE;

    if (!( l->fill("pargaincorr"  ,&pargaincorr[0][0][0][0],6 * 4 * 6 * 220                     ))) return kFALSE;
    if (!( l->fill("parmindistcut",&parmindistcut[0]       ,4                                   ))) return kFALSE;

    if (!( l->fill("window"   ,&window                                                          ))) return kFALSE;
    if (!( l->fill("hefr"     ,&hefr                                                            ))) return kFALSE;

    return kTRUE;
}

void HMdcDeDx2::sort(Int_t nHits)
{
    // Puts the measurement values into decreasing order.

    Int_t nhit=nHits;
    if(nHits>MAX_WIRES) nhit=MAX_WIRES;

    register Int_t a,b,c;
    Int_t exchange;
    Double_t val;

    for(a = 0; a < nhit - 1; ++ a)
    {
	exchange = 0;
	c        = a;
	val      = measurements[a];

	for(b = a + 1; b < nhit; ++ b)
	{
	    if(measurements[b] > val)   // : < increasing  :> decreasing
	    {
		c = b;
		val = measurements[b];
		exchange = 1;
	    }
	}
	if(exchange)
	{
	    measurements[c] = measurements[a];
	    measurements[a] = val;
	}
    }
}
Float_t HMdcDeDx2::calcDeDx(HMdcSeg* seg[2],
			    Float_t* meanold,Float_t* sigmaold,UChar_t* nwire,
			    Float_t* sigmanew,UChar_t* nwiretrunc,
			    Int_t vers,Int_t mod,
			    Bool_t useTruncMean,
			    Float_t truncMeanWindow,
			    Int_t inputselect)
{
    // calculates dedx of a MDC segment by doing normalization for
    // impact angle and distance from wire for the fired cells of
    // the segment. The measurements are sorted in decreasing order,
    // the mean and sigma is calculated. Afterwards the truncated mean
    // according to the set window (in sigma units) arround the mean
    // is calculated and returned as dedx. Mean,sigma,number of wires before
    // truncating,truncated mean,truncated mean sigma and number of wires
    // after truncating can be obtained by the returned pointers.
    // Different methods can be selected:
    // vers==0 : Input filling from inner HMdcSeg
    // vers==1 : Input filling from outer HMdcSeg
    // vers==2 : Input filling from inner+outer HMdcSeg (default)
    // mod==0  : calc dedx from 1st module in segment
    // mod==1  : calc dedx from 2nd module in segment
    // mod==2  : calc dedx from whole segment (default)
    // useTruncMean: kTRUE (default) apply truncated Mean
    // truncMeanWindow (unit: SIGMA RMS of mean TOT): -99 (default) use standard window
    // inputselect==0 : fill from segment (default, wires rejected by fit are missing)
    // inputselect==1 : fill from cluster
    // returns -99 if nothing was calculated

    //to be sure initialized values are returned
    *meanold   = -1.;
    *sigmaold  = -1.;
    *nwire     =  0;
    *sigmanew  = -1.;
    *nwiretrunc=  0;
    Float_t dedx       = -99.;
    Float_t mean       = -99.;
    Float_t sigma      = -99.;
    UChar_t nWire      =   0;
    UChar_t nWireTrunc =   0;

    if(!catcal ) return mean; // no cal1 data in input !

    if(!isInitialized) {
	Error("HMdcDeDx2::calcDeDx()","Container HMdcDeDx2 has not been initialized!");
	return mean;

    }
    if(vers >= 0 && vers <= 2) method = vers;

    if(seg[0] == 0 && (method == 0 || method == 2))
    {
	Error("HMdcDeDx2::calcDeDx()","ZERO POINTER FOR inner HMdcSeg RECEIVED!");
	return mean;
    }
    if(seg[1] == 0 && (method == 1))
    {
	return mean;
    }

    if(mod >= 0 && mod < 3)
    {
	module = mod;
    }
    else
    {
	Warning("calcDeDx()","Unknown module type! Will use both modules of Segment!");
        module = 2;
    }

    //---------------------------------------------------
    // getting input
    measurements.Reset(-99);

    nWire = fillingInput(seg,inputselect);
    if(debug) {
	cout<<"calcDeDx() from fillingInput(): "
	    <<"nw "      <<((Int_t)nWire)
	    <<" methode "<<method
            <<" module " <<module
	    <<endl;
    }
    if(nWire == 0) return mean;

    *nwire = nWire;

    if(nWire > 0) mean = TMath::Mean(nWire,measurements.GetArray(), NULL);
    *meanold = mean;
    //---------------------------------------------------
    // calculating sigma
    if(nWire >= 1)
    {
        sigma       = TMath::RMS(nWire,measurements.GetArray());
        *sigmaold   = sigma;
        //--------------------truncating measurements outside +- x*sigma
	if (useTruncMean) {
	    nWireTrunc  = select(mean,sigma,nWire,truncMeanWindow);
	} else {
	    sort(nWire);
            nWireTrunc=nWire;
	}
        *nwiretrunc = nWireTrunc;
        //--------------------calculating truncated mean
        dedx        = TMath::Mean(nWireTrunc,measurements.GetArray(), NULL);
        //--------------------calculating new sigma
        sigma       = TMath::RMS(nWireTrunc,measurements.GetArray());
        *sigmanew   = sigma;

    }else{
	Warning("calcDeDx()","nWire <=1 : skipped %i and %i with t2<=-998 !",
		ctskipmod1,ctskipmod1);
    }

    //---------------------------------------------------
    // now calibrate mean value of ToT to dEdX
    Int_t s = 0;
    if(seg[0]){
	s = seg[0]->getSec();
    }
    dedx = toTTodEdX(s,ref_MOD,-1,-1,ref_ANGLE,ref_DIST,dedx);
    if(dedx > 100000) {
	if(debug){cout<<"calcDeDx() : dEdX>1000 -->"<<dedx<<endl;}
	dedx = 100000.;
    }
    //---------------------------------------------------

    return dedx;
}
UChar_t HMdcDeDx2::fillingInput(HMdcSeg* seg[2],Int_t inputselect)
{
    // Fills array of measurements from HMdcSeg and returns the number of fired wires in Segment
    // The single measurements are normalized by impact angle and distance from wire. Only the first
    // wires < MAX_WIRES are accepted.
    // inputselect==0 : fill from segment (default,wires rejected by fit are missing)
    // inputselect==1 : fill from cluster

    ctskipmod0 = 0;
    ctskipmod1 = 0;

    Float_t t1,t2;
    Double_t alpha,mindist;
    Double_t x1,y1,z1,x2,y2,z2;

    UChar_t nWire = 0;

    if(!catcal ) return nWire; // no cal1 data in input !

    if(inputselect == 1 &&
       (!cathit || !catclusinf || !catclus)
      ) return nWire; // no cluster data in input !

    HMdcClus* clus[2] = {0};
    //----------------------------------------getting input--------------------------------------------------
    Int_t low = 0;
    Int_t up  = 2;

    if     (method == 0) {low = 0;up = 1;}   // inner seg
    else if(method == 1) {low = 1;up = 2;}   // outer seg
    else if(method == 2) {low = 0;up = 2;}   // both  seg

    for(Int_t io = low; io < up; io ++)
    {
        if(seg[io] == 0) continue;

        //---------------------------------------------------------------------------
	if(inputselect == 1)
	{
	    // we have to get the cluster for looping
	    // the drift cells
	    for(Int_t ihit = 0; ihit < 2; ihit ++)
	    {
		Int_t hitind = seg[io]->getHitInd(ihit);
		if(hitind != -1)
		{   // hit and clusinf have the same index!
		    HMdcClusInf* clusinf = (HMdcClusInf*) catclusinf->getObject(hitind);
		    if(clusinf)
		    {
			clus[io] = (HMdcClus*) catclus->getObject(clusinf->getClusIndex());
			if(clus[io] == 0){
			    Error("fillingInput()","Zero pointer for HMdcClus object retrieved!");
			    return nWire;
			}
		    }
		    else Error("fillingInput()","Zero pointer for HMdcClusInd object retrieved!");

		    break;  // found cluster -> exit the loop
		}

	    }
	}
        //---------------------------------------------------------------------------


	for(Int_t l = 0; l < 12; l ++)
	{
	    if(module == 0 && l > 5) continue;  // fill for 1st module only
	    if(module == 1 && l < 6) continue;  // fill for 2st module only

	    Int_t nCell = 0;
            // input selection
	    if(inputselect == 1){nCell = clus[io]->getNCells(l);}
	    else                {nCell = seg [io]->getNCells(l);}

	    loccal[0]   = seg[io]->getSec();
	    Int_t ioseg = seg[io]->getIOSeg();

	    for(Int_t i = 0; i < nCell; i ++)
	    {
		if(ioseg == 0){
		    (l < 6)? loccal[1] = 0 : loccal[1] = 1;
		}else if(ioseg == 1){
		    (l < 6)? loccal[1] = 2 : loccal[1] = 3;
		}
		(l < 6)? loccal[2] = l : loccal[2] = l - 6;

		// input selection
		if(inputselect == 1){loccal[3] = clus[io]->getCell(l,i);}
                else                {loccal[3] = seg [io]->getCell(l,i);}

		calcSegPoints(seg[io],x1,y1,z1,x2,y2,z2);
		(*sizescells)[loccal[0]][loccal[1]][loccal[2]].getImpact(x1,y1,z1,x2,y2,z2,loccal[3],alpha,mindist);

		HMdcCal1* cal1 = (HMdcCal1*)catcal->getObject(loccal);
		if(cal1 != 0)
		{
		    t1  = cal1->getTime1();
		    t2  = cal1->getTime2();

		    if(t2 != -998 && t2 != -999 &&
                       t1 != -998 && t1 != -999 &&
		       TMath::Finite(t1)        &&
                       TMath::Finite(t2)        &&

                       mindist<=parmindistcut[loccal[1]]
		      )
		    {   // some times t1 or t2 can be missing (-999,-998)
			// calculating mean value

			if(nWire < MAX_WIRES - 1)
			{
			    if(useCalibration)measurements[nWire] = normalize(loccal[0],loccal[1],loccal[2],loccal[3],alpha,mindist,t2-t1);
			    else              measurements[nWire] = t2-t1;
			    nWire ++;
			}else{
			    if(debug) Warning("fillingInput()","Number of wires in Segment=%i > MAX_WIRES = %i! Skipped!",nWire,MAX_WIRES);
			}
		    } else {
			if(loccal[1] == 0 || loccal[1] == 2) ctskipmod0 ++;
			if(loccal[1] == 1 || loccal[1] == 3) ctskipmod1 ++;}
		}else{
		    Warning("calcDeDx()","ZERO pointer recieved for cal1 object!");
		}
	    }
	}
    }
    return nWire;
}

UChar_t HMdcDeDx2::select(Float_t mean,Float_t sigma,UChar_t nWire,Float_t wind)
{
    // loops over the measurement array with nWire values and puts values to
    // -99 if the measurements are outside the wanted window arround the mean value mean
    // (set with setWindow() (sigma units)).
    // The procedure keeps at least a number of minimum wires set with setMinimumWires().

    UChar_t nWTrunc = nWire;
    UChar_t count   = 0;
    UChar_t minW    = (UChar_t)getMinimumWires();

    if(nWTrunc < minW)
    {
	if(debug){cout<<"select : skipp because nWT<minW "<<endl;}
	return nWTrunc;
    }

    //---------------------------------------------------
    // decide about the window for truncated Mean method
    Float_t tempWindow = getWindow();
    if(wind > 0) tempWindow = wind;
    //---------------------------------------------------

    //--------------------sorting measurements in decreasing order
    sort(nWire);
    if(debug){
	cout<<"---------------------------------------------------"<<endl;
	cout<<"measurements before truncation :"<<endl;
	for(Int_t i = 0; i < nWire; i ++){
	    cout<<i<<" "<<measurements[i]<<endl;
	}
    }

    Bool_t fail_high = kFALSE;
    Bool_t fail_low  = kFALSE;

    while(nWTrunc > minW &&
	  count < nWire )
    {
	//------------------------------------------------------------
	// starting from highest val
        if(!fail_high && fabs(measurements[count] - mean) > (tempWindow * sigma))
        { // if measurement outside the window
	    measurements[count] = -99;
	    nWTrunc --;
        } else  fail_high = kTRUE;
	//------------------------------------------------------------

	//------------------------------------------------------------
	// taking lowest val next
	if(nWTrunc > minW)
	{
	    if(!fail_low && fabs(measurements[nWire - 1 - count] - mean) > (tempWindow * sigma))
	    { // if measurement outside the window
		measurements[nWire - 1 - count] = -99;
		nWTrunc --;
	    }
	    else  fail_low = kTRUE;
	} else  fail_low = kTRUE;
	//------------------------------------------------------------
	count ++;
        if(fail_low && fail_high) break;
    }
    sort(nWire);

    if(debug){
	cout<<"---------------------------------------------------"<<endl;
	cout<<"measurements after truncation :"<<endl;
	for(Int_t i = 0; i < nWTrunc; i ++){
	    cout<<i<<" "<<measurements[i]<<endl;
	}
	cout<<"method "  <<method
	    <<" window " <<tempWindow
	    <<" mean "   <<mean
	    <<" meanN "  <<TMath::Mean(nWTrunc,measurements.GetArray())
	    <<" sig "    <<sigma
	    <<" sigN "   <<TMath::RMS(nWTrunc,measurements.GetArray())
	    <<" w "      <<((Int_t)nWire)
	    <<" trunc w "<<((Int_t)nWTrunc)
	    <<endl;
    }

    return  nWTrunc;

}
void HMdcDeDx2::setFuncPar(Int_t s,Int_t m,Int_t abin,Int_t dbin,Double_t* p,Int_t size)
{
    // set the values for the dedx functions by s, m, angle bin, dist bin. Needs pointer
    // to parameter array[N_PARAM]
    if(size == N_PARAM             &&
       abin >= 0 && abin < N_ANGLE &&
       dbin >= 0 && dbin < N_DIST  &&
       s >= 0 && s < 6             &&
       m >= 0 && m < 4){
	for(Int_t i = 0; i < size; i ++) par[s][m][abin][dbin][i] = p[i];
    } else Error("SetFuncPar(...)","array indices out of range!");
}
void HMdcDeDx2::setFuncPar(Double_t* p)
{
    // set all values for the dedx functions. Needs pointer
    // to parameter array[6][4][N_ANGLE][N_DIST][N_PARAM]
   for(Int_t s = 0; s < 6;s ++) {
	for(Int_t m = 0; m < 4; m ++) {
	    for(Int_t a = 0; a < N_ANGLE; a ++) {
		for(Int_t d = 0; d < N_DIST; d ++) {
		    for(Int_t i = 0; i < N_PARAM; i ++) {

			Int_t maxS = 4 * N_ANGLE * N_DIST * N_PARAM;
                        Int_t maxM = N_ANGLE * N_DIST * N_PARAM;
                        Int_t maxA = N_DIST * N_PARAM;

			par[s][m][a][d][i] = p[s * maxS + m * maxM + a * maxA + d * N_PARAM + i];
		    }
		}
	    }
	}
    }
}
void HMdcDeDx2::getFuncPar(Double_t* p)
{
    // set all values for the dedx functions. Needs pointer
    // to parameter array[6][4][N_ANGLE][N_DIST][N_PARAM]
   for(Int_t s = 0;s < 6; s ++) {
	for(Int_t m = 0; m < 4; m ++) {
	    for(Int_t a = 0; a < N_ANGLE; a ++) {
		for(Int_t d = 0; d < N_DIST; d ++) {
		    for(Int_t i = 0; i < N_PARAM; i ++) {

			Int_t maxS = 4 * N_ANGLE * N_DIST * N_PARAM;
                        Int_t maxM = N_ANGLE * N_DIST * N_PARAM;
                        Int_t maxA = N_DIST * N_PARAM;

			p[s * maxS + m * maxM + a * maxA + d * N_PARAM + i] = par[s][m][a][d][i];
		    }
		}
	    }
	}
    }
}
void HMdcDeDx2::setFuncMaxPar(Int_t s,Int_t m,Int_t abin,Int_t dbin,Double_t p)
{
    // set the values for the dedx functions by s, m, angle bin, dist bin.
    if(abin >= 0 && abin < N_ANGLE &&
       dbin >= 0 && dbin < N_DIST  &&
       s >= 0 && s < 6             &&
       m >= 0 && m < 4){
	parMax[s][m][abin][dbin] = p;
    } else Error("SetFuncPar(...)","array indices out of range!");
}
void HMdcDeDx2::setFuncMaxPar(Double_t* p)
{
    // set all values for the dedx functions. Needs pointer
    // to parameter array[6][4][N_ANGLE][N_DIST]
    for(Int_t s = 0; s < 6; s ++) {
	for(Int_t m = 0; m < 4; m ++) {
	    for(Int_t a = 0; a < N_ANGLE; a ++) {
		for(Int_t d = 0; d < N_DIST;d ++) {
		    Int_t maxS = 4 * N_ANGLE * N_DIST;
		    Int_t maxM = N_ANGLE * N_DIST;
		    Int_t maxA = N_DIST;

		    parMax[s][m][a][d] = p[s * maxS + m * maxM + a * maxA + d];
		}
	    }
	}
    }
}
void HMdcDeDx2::getFuncMaxPar(Double_t* p)
{
    // set all values for the dedx functions. Needs pointer
    // to parameter array[6][4][N_ANGLE][N_DIST]
   for(Int_t s = 0; s < 6; s ++) {
       for(Int_t m = 0; m < 4; m ++) {
	   for(Int_t a = 0; a < N_ANGLE; a ++) {
	       for(Int_t d = 0; d <N_DIST; d ++) {
		   Int_t maxS = 4 * N_ANGLE * N_DIST;
		   Int_t maxM = N_ANGLE * N_DIST;
		   Int_t maxA = N_DIST;

		   p[s * maxS + m * maxM + a * maxA + d] = parMax[s][m][a][d];
	       }
	   }
       }
   }
}

void HMdcDeDx2::setFuncWidthPar(Int_t s,Int_t m,Int_t abin,Int_t dbin,Double_t* p,Int_t size)
{
    // set the values fpr the dedx width functions by s, m, angle bin, dist bin. Needs pointer
    // to parameter array[N_SHIFT_PARAM]

    if(size == N_SHIFT_PARAM      &&
       abin >= 0 && abin < N_ANGLE&&
       dbin >= 0 && dbin < N_DIST &&
       s >= 0 && s < 6            &&
       m >= 0 && m < 4){
	for(Int_t i = 0; i < size; i ++) shiftpar[s][m][abin][dbin][i] = p[i];
    } else Error("SetFuncPar(...)","array indices out of range!");
}
void HMdcDeDx2::setFuncWidthPar(Double_t* p)
{
    // set all values for the dedx width functions. Needs pointer
    // to parameter array[6][4][N_ANGLE][N_DIST][N_SHIFT_PARAM]
    for(Int_t s = 0;s < 6; s ++) {
	for(Int_t m = 0; m < 4; m ++) {
	    for(Int_t a = 0; a < N_ANGLE; a ++) {
		for(Int_t d = 0; d < N_DIST; d ++) {
		    for(Int_t i = 0; i < N_SHIFT_PARAM; i ++) {

			Int_t maxS = 4 * N_ANGLE * N_DIST * N_SHIFT_PARAM;
                        Int_t maxM = N_ANGLE * N_DIST * N_SHIFT_PARAM;
                        Int_t maxA = N_DIST * N_SHIFT_PARAM;

			shiftpar[s][m][a][d][i] = p[s * maxS + m * maxM + a * maxA + d * N_SHIFT_PARAM + i];
		    }
		}
	    }
	}
    }
}
void HMdcDeDx2::getFuncWidthPar(Double_t* p)
{
    // set all values for the dedx width functions. Needs pointer
    // to parameter array[6][4][N_ANGLE][N_DIST][N_SHIFT_PARAM]
    for(Int_t s = 0; s < 6; s ++) {
	for(Int_t m = 0; m < 4; m ++) {
	    for(Int_t a = 0; a < N_ANGLE; a ++) {
		for(Int_t d = 0; d < N_DIST; d ++) {
		    for(Int_t i = 0; i < N_SHIFT_PARAM; i ++) {

			Int_t maxS = 4 * N_ANGLE * N_DIST * N_SHIFT_PARAM;
                        Int_t maxM = N_ANGLE * N_DIST * N_SHIFT_PARAM;
                        Int_t maxA = N_DIST * N_SHIFT_PARAM;

			p[s * maxS + m * maxM + a * maxA + d * N_SHIFT_PARAM + i] = shiftpar[s][m][a][d][i];
		    }
		}
	    }
	}
    }
}

void HMdcDeDx2::setFuncGainPar(Int_t s,Int_t m,Int_t l,Int_t c,Double_t p)
{
    // set the values for the gain corrections by s, m, l, c.
    if(c >= 0 && c < 220 &&
       l >= 0 && l < 6   &&
       s >= 0 && s < 6   &&
       m >= 0 && m < 4){
	pargaincorr[s][m][l][c] = p;
    } else Error("SetGainPar(...)","array indices out of range!");
}
void HMdcDeDx2::setFuncGainPar(Double_t* p)
{
    // set all values for the gain correction. Needs pointer
    // to parameter array[6][4][6][220]
    for(Int_t s = 0; s < 6; s ++) {
	for(Int_t m = 0; m < 4; m ++) {
	    for(Int_t l = 0; l < 6; l ++) {
		for(Int_t c = 0; c < 220;c ++) {
		    Int_t maxS = 4 * 6 * 220;
		    Int_t maxM = 6 * 220;
		    Int_t maxL = 220;

		    pargaincorr[s][m][l][c] = p[s * maxS + m * maxM + l * maxL + c];
		}
	    }
	}
    }
}
void HMdcDeDx2::getFuncGainPar(Double_t* p)
{
    // set all values for the gain correction. Needs pointer
    // to parameter array[6][4][6][220]
   for(Int_t s = 0; s < 6; s ++) {
       for(Int_t m = 0; m < 4; m ++) {
	   for(Int_t l = 0; l < 6; l ++) {
	       for(Int_t c = 0; c < 220;c ++) {
		   Int_t maxS = 4 * 6 * 220;
		   Int_t maxM = 6 * 220;
		   Int_t maxL = 220;

		   p[s * maxS + m * maxM + l * maxL + c] = pargaincorr[s][m][l][c];
	       }
	   }
       }
   }
}

void HMdcDeDx2::setMinDistCutPar(Int_t m,Double_t p)
{
    // set the values for the cut on minDist by m.
    if(m >= 0 && m < 4){
	parmindistcut[m] = p;
    } else Error("SetMinDistCutPar(...)","array indices out of range!");
}
void HMdcDeDx2::setMinDistCutPar(Double_t* p)
{
    // set all values for the minDistcut. Needs pointer
    // to parameter array[4]
    for(Int_t m = 0; m < 4; m ++) {

	parmindistcut[m] = p[m];
    }
}
void HMdcDeDx2::getMinDistCutPar(Double_t* p)
{
    // set all values for the minDistcut. Needs pointer
    // to parameter array[4]
    for(Int_t m = 0; m < 4; m ++) {

	p[m] = parmindistcut[m];
   }
}

Double_t HMdcDeDx2::calcLength(Int_t m,Double_t angle,Double_t dist)
{
    // calc max length of track in cell for given module
    // m (0-3), impact angle "angle" [Deg] and distance
    // from wire "dist" [mm]

    Double_t maxLength;
    Double_t yU,xU,yL,xL;
    Double_t alphaRad,tanAlpha,b;
    Double_t cellX[4];
    Double_t cellY[4];
     
    Double_t cX[4] = {2.5,3.0,6.0,7.0};
    Double_t cY[4] = {2.5,2.5,4.0,5.0};
    for(Int_t i=0;i<4;i++){
	cellX[i] = cX[i];
	cellY[i] = cY[i];
    }

    alphaRad = angle * TMath::DegToRad();// angle of Curve
    b        = dist / cos(alphaRad);
    tanAlpha = tan(alphaRad);
    if(angle > 0) {
	xU = (cellY[m] - b) / tanAlpha;
	if(xU <= cellX[m]) {
	    yU = cellY[m];
	} else {
	    yU = tanAlpha * cellX[m] + b;
	    xU = cellX[m];
	}

	xL = (-cellY[m] - b) / tanAlpha;
	if(xL >= -cellX[m]) {
	    yL = -cellY[m];
	}  else {
	    yL = tanAlpha * -cellX[m] + b;
	    xL = -cellX[m];
	}

	maxLength = sqrt( (xU - xL) * (xU - xL) + (yU - yL) * (yU - yL) );
    } else {
	yU = 0;
	xU = 0;
	yL = 0;
	xL = 0;
	maxLength = 2 * cellX[m];
    }

    return maxLength ;
}


void  HMdcDeDx2::calcSegPoints(HMdcSeg * seg,Double_t& x1, Double_t& y1, Double_t& z1, Double_t& x2, Double_t& y2, Double_t& z2)
{
    // calculates 2 coordinate points from segment

    Double_t teta = seg->getTheta();
    Double_t phi  = seg->getPhi();
    Double_t z    = seg->getZ();
    Double_t r    = seg->getR();
    Double_t pi2  = acos(-1.)/2.;

    Double_t X = r * cos(phi + pi2);
    Double_t Y = r * sin(phi + pi2);
    Double_t Z = z;

    x1 = X;
    y1 = Y;
    z1 = Z;
    x2 = X + cos(phi) * sin(teta);
    y2 = Y + sin(phi) * sin(teta);
    z2 = Z + cos(teta);

}

void  HMdcDeDx2::findBin(Int_t m,Double_t* angle,Double_t* mindist,Int_t* abin,Int_t* dbin)
{
    Double_t a =* angle;
    Double_t d =* mindist;

    if(d>MaxMdcMinDist[m]) d = MaxMdcMinDist[m];
    if(a > 90) a = 90.;
    if(a < 0)  a =  0.;

    (*abin) = (Int_t)((90. - a) / AngleStep);
    (*dbin) = (Int_t)(d / MinDistStep[m]);

    if((*abin) == 18)     (*abin) = 17;
    if((*dbin) == N_DIST) (*dbin) = N_DIST - 1;

}

Double_t HMdcDeDx2::toTSigma(Int_t s,Int_t m,Double_t angle,Double_t mindist,Int_t shift)
{
    // returns asymmetric width of ToT for single drift cell
    // shift == 0 (default) : returns 0
    //       ==-1           : low   bound width of ToT distribution (sigma)
    //       == 1           : upper bound width of ToT distribution (sigma)

    Int_t abin = 0;
    Int_t dbin = 0;

    findBin(m,&angle,&mindist,&abin,&dbin);

    // shift is half FWHM = 2.355/2=1.1775 sigma
    // we have to recalulate sigma here

    if      (shift < 0) return (shiftpar[s][m][abin][dbin][0] / 1.1775);
    else if (shift > 0) return (shiftpar[s][m][abin][dbin][1] / 1.1775);
    else return 0.;
}

Double_t HMdcDeDx2::toTTodEdX(Int_t s,Int_t m,Int_t l,Int_t c,Double_t angle,Double_t mindist,Double_t ToT)
{
    // calculation of ToT -> dEdX for single drift cell

    Int_t abin = 0;
    Int_t dbin = 0;

    findBin(m,&angle,&mindist,&abin,&dbin);

    Double_t* p= &par[s][m][abin][dbin][0];

    //-----------------------------------------------------
    Double_t ToTgaincorr = ToT;
    Double_t ToTcorr     = ToT;

    if(l > -1 && c > -1){

	ToTgaincorr = ToT + pargaincorr[s][m][l][c];
        ToTcorr     = ToTgaincorr/calcLength(m,angle,mindist);
    }

    if(ToTcorr > parMax[s][m][abin][dbin]) ToTcorr = parMax[s][m][abin][dbin];

    Double_t dEdX = TMath::Power(10.,(TMath::Power((ToTcorr - p[0]) / p[1],(1. / p[2])))) - p[3];
    if(!TMath::Finite(dEdX)){
	Warning("totTodEdX()","dEdX out of range: s %i m %i abin %i dbin %i ToT %1.15e dEdX %1.15e !",s,m,abin,dbin,ToTcorr,dEdX);
	dEdX = -1;
    }
    return dEdX;
}
Double_t HMdcDeDx2::dEdXToToT(Int_t s,Int_t m,Int_t l,Int_t c,Double_t angle,Double_t mindist,Double_t dEdX)
{
    // calculation of dEdX -> ToT for single drift cell

    Int_t abin = 0;
    Int_t dbin = 0;

    findBin(m,&angle,&mindist,&abin,&dbin);

    Double_t* p = &par[s][m][abin][dbin][0];

    Double_t ToT       = p[0] + p[1] * TMath::Power((TMath::Log10(dEdX +  p[3])),p[2]);
    Double_t ToTcorr   = ToT;

    if(l > -1 && c > -1){
        ToTcorr = ToT*calcLength(m,angle,mindist);
        ToTcorr = ToTcorr - pargaincorr[s][m][l][c];
    }

    if(!TMath::Finite(ToTcorr)){
	Warning("dEdXToToT()","ToT out of range: s %i m %i abin %i dbin %i ToT %1.15e dEdX %1.15e !",s,m,abin,dbin,ToTcorr,dEdX);
	ToTcorr = -1;
    }

    return ToTcorr;
}
Double_t HMdcDeDx2::normalize(Int_t s,Int_t m,Int_t l,Int_t c,Double_t angle,Double_t mindist,Double_t ToT)
{
    // calibrate ToT :
    // dEdX=TotTodEdX(t2-t1) ----> dEdXToToT(dEdX) for reference module,angle,distbin
    if(ToT < 0)  return ToT;
    Double_t     dEdX = toTTodEdX(s,m,l,c,angle,mindist,ToT);
    if(dEdX >= 0) ToT = dEdXToToT(s,ref_MOD,-1,-1,ref_ANGLE,ref_DIST,dEdX);

    return ToT;
}



//----------------------dEdx-----------------------------------------------
Double_t HMdcDeDx2::beta(Int_t id,Double_t p)
{
    Double_t mass   = HPhysicsConstants::mass(id);
    if(mass == 0) return -1;
    return  sqrt(1. / (((mass*mass)/(p*p)) + 1.));
}
TGraph* HMdcDeDx2::betaGraph(Int_t id,Int_t opt,Int_t markerstyle,Int_t markercolor,Float_t markersize)
{
    // creates a TGraph for particle with GEANT ID id and
    // momentum p
    // opt     = 1  : no exchange x-axis and y-axis
    //          -1  : take -p
    //           2  : exchange axis
    //          -2  : -p + exchange axis

    if(opt<-2||opt>2||opt==0){
	::Error("betaGraph()","Unknown Option opt=%i!. Use default opt=1",opt);
	opt=1;
    }

    Double_t pmin = 50;
    Double_t pmax = 100000.;
    Int_t    np   = 100;

    Double_t ptot = 0;
    Double_t xarray[np];
    Double_t yarray[np];


    for(Int_t i = 1; i <= np; i ++)
    {
      ptot = pmin * pow((pmax / pmin),(i - 1) / (Double_t)(np - 1.));
      xarray[i - 1] = (opt == -1 || opt == -2)? -ptot : ptot;
      yarray[i - 1] = HMdcDeDx2::beta(id,ptot);
    }
    Char_t name[300];
    sprintf(name,"beta_%s",HPhysicsConstants::pid(id));
    TGraph* g = 0;
    if(opt==1||opt==-1)g = new TGraph(np,xarray,yarray);
    else         g = new TGraph(np,yarray,xarray);
    g->SetName(name);
    g->SetMarkerStyle(markerstyle);
    g->SetMarkerSize (markersize);
    g->SetMarkerColor(markercolor);

    return g;
}

Double_t HMdcDeDx2::gamma(Int_t id,Double_t p)
{
    Double_t mass   = HPhysicsConstants::mass(id);
    if(mass == 0) return -1;
    Double_t beta2 = 1. / (((mass*mass)/(p*p)) + 1.);
    return  sqrt(1./ (1 - beta2));
}

Double_t HMdcDeDx2::energyLoss(Int_t id,Double_t p,Double_t hefr)
{
    // Calculates the dEdx (MeV 1/g cm2) of an particle with GEANT ID id
    // and momentum p (MeV) for He/i-butan gas mixture with He fraction hefr
    // (He (hefr) / i-butan (1-hefr)). The fomular is taken from PDG and doesn't
    // include the density correction term. The values for the mean excitation
    // energy are taken from Sauli.

    if(p == 0)                 return -1;
    if(hefr < 0. || hefr > 1.) return -1;
    Double_t mass   = HPhysicsConstants::mass(id);
    if(mass == 0) return -1;

    // keep function value inside boundary
    if      (mass <  150                 && p < 5 )   p = 5 ;
    else if (mass >= 150  && mass < 1000 && p < 20)   p = 20;
    else if (mass >= 1000 && mass < 2000 && p < 35)   p = 35;
    else if (mass >= 2000                && p < 55)   p = 55;

    // Z and A
    Double_t Z_gas  = 2. * hefr + (1. - hefr) * 34.;
    Double_t A_gas  = 4. * hefr + (1. - hefr) * 58.;
    // I_0 and I
    Double_t I_0_gas = 24.6 * hefr + (1. - hefr) * 10.8;
    Double_t I2      = pow(I_0_gas * Z_gas * (1.e-6),2); // sauli
    //Double_t I2     =pow(16. * pow(Z_gas,0.9),2); //C.Lippmann thesis


    Double_t K      = 0.307075; // MeV cm2 PDG, 4 * pi * N_{A} * r_{e}2 * m_{e}2 * c2
    Double_t mass2  = pow(mass,2);
    Double_t m_ec2  = HPhysicsConstants::mass(3);
    Double_t z2     = pow((Float_t)HPhysicsConstants::charge(id),2);
    Double_t p2     = pow(p,2);
    Double_t beta2  = 1. / ((mass2/p2) + 1.);
    Double_t gamma2 = 1./ (1 - beta2);
    Double_t gamma  = sqrt(gamma2);

    Double_t Tmax   = (2. * m_ec2 * beta2 * gamma2) / (1. + 2.* gamma * (m_ec2 / mass) + pow((m_ec2 / mass),2));
    Double_t term1  = K * z2 * (Z_gas / A_gas) * (1. / beta2);
    Double_t term2  = ((2. * m_ec2 * beta2 * gamma2 * Tmax) / I2);
    Double_t dedx   = term1 * (0.5 * log(term2) - beta2);

    return dedx;
}
TGraph* HMdcDeDx2::energyLossGraph(Int_t id,Double_t hefr,TString opt,Bool_t exchange,Int_t markerstyle,Int_t markercolor,Float_t markersize)
{
    // creates a TGraph for particle with GEANT ID id and
    // and He/i-butan gas mixture with He fraction hefr
    // (He (hefr) / i-butan (1-hefr) dEdx vs p,beta,1/beta2 or betagamma
    // depending on opt (p,beta,1/beta2,betagamma). exchange=kTRUE
    // will exchange x-axis and y-axis.


    Double_t pmin = 50;
    Double_t pmax = 100000.;
    Int_t    np   = 100;

    Double_t ptot = 0;
    Double_t xarray[np];
    Double_t yarray[np];

    Int_t    vers = 0;
    Double_t mass = HPhysicsConstants::mass(id);


    if(opt.CompareTo("p"             ) == 0) vers = 0;
    else if(opt.CompareTo("beta"     ) == 0) vers = 1;
    else if(opt.CompareTo("1/beta2"  ) == 0) vers = 2;
    else if(opt.CompareTo("betagamma") == 0) vers = 3;
    else {cout<<"HMdcDedx::calcDeDxGraph():unknow option!"<<endl;}

    for(Int_t i = 1; i <= np; i ++)
    {
      ptot = pmin * pow((pmax / pmin),(i - 1) / (Double_t)(np - 1.));
      if(vers == 0){xarray[i - 1] = ptot;}
      if(vers == 1){xarray[i - 1] = sqrt(1. / ((pow(mass,2) / pow(ptot,2)) + 1.));}
      if(vers == 2){xarray[i-1] = ((pow(mass,2) / pow(ptot,2)) + 1.);}
      if(vers == 3){xarray[i-1] = (ptot / mass);}
      yarray[i - 1] = HMdcDeDx2::energyLoss(id,ptot,hefr);
    }
    Char_t name[300];
    sprintf(name,"dedx_%s_He_%5.1f_ibutane_%5.1f",HPhysicsConstants::pid(id),hefr * 100,(1 - hefr) * 100);
    TGraph* g = 0;
    if(!exchange)g = new TGraph(np,xarray,yarray);
    else         g = new TGraph(np,yarray,xarray);
    g->SetName(name);
    g->SetMarkerStyle(markerstyle);
    g->SetMarkerSize (markersize);
    g->SetMarkerColor(markercolor);

    return g;
}
Double_t HMdcDeDx2::scaledTimeAboveThreshold(HGeantKine* kine,
					     Double_t p,
                                             Float_t t1, Float_t t2, Float_t* t2err,
					     Int_t s,Int_t m,Int_t l,Int_t c,
					     Double_t alpha,Double_t mindist)
{
    // calculated the t2 of drift cell measurent
    // from dedx of a given particle with momentum p.
    // The assumption is that all drift cell measurements
    // belonging to one track can be treated independent.
    // return t2 and smeared error to pointer t2err for an
    // single measurement. If the result t2-t1 would
    // be < 0 a random value for t2 0-20 ns larger than
    // t1(already including error) will be created.
    // The smeared error will be returned to the pointer t2err.


    //------------------------------------------------
    // check input
    if(!kine) {
        Error("caledTimeAboveThreshold()","retrieved ZERO pointer for kine object!");
	return -99;
    }
    if(p < 0) {
        Error("caledTimeAboveThreshold()","momentum = %5.3f is wrong!",p);
	return -99;
    }
    if(t1 < -997) {
        Error("caledTimeAboveThreshold()","t1 = %5.3f is wrong!",t1);
	return -99;
    }
    if(t2 < -997) {
        Error("caledTimeAboveThreshold()","t2 = %5.3f is wrong!",t1);
	return -99;
    }
    //------------------------------------------------

    //------------------------------------------------
    // get particle ID from kine object
    Int_t pTr = -1,pID = 0;
    kine->getParticle(pTr,pID);
    //------------------------------------------------


    //------------------------------------------------
    // get mass and charge of particle for dedx
    // calculation
    Double_t mass   = HPhysicsConstants::mass  (pID);
    Int_t    charge = HPhysicsConstants::charge(pID);


    if(charge == 0 || mass == 0)
    {
        Warning("HMdcDeDx2::scaledEnergyLoss()","id %i %s mass %7.5f charge %i p %7.5f skipped!"
                ,pID,HPhysicsConstants::pid(pID),mass,charge,p);
        return t2;
    }
    //------------------------------------------------

    //------------------------------------------------
    // calulate analytical dedx of particle

    Double_t dedx   = energyLoss(pID,p,getHeFraction());

    if(!TMath::Finite(dedx)){
	Error("scaledTimeAboveThreshold()","dedx either NaN or Inf!");
        return t2;
    }
    //------------------------------------------------

    //------------------------------------------------
    // recalculate dedx to mean value of Time over
    // threshold for the given drift chamber
    Double_t ToTmean = dEdXToToT(s,m,l,c,alpha,mindist,dedx);

    if(!TMath::Finite(ToTmean) || dedx < 0){
	Error("caledTimeAboveThreshold()","ToT either NaN or Inf!");
	cout<<"s "      <<s
            <<" m "     <<m
	    <<" angle " <<alpha
	    <<" dist "  <<mindist
	    <<" dedx "  <<dedx
	    <<" pid "   <<pID
	    <<" mass "  <<mass
	    <<" charge "<<charge
	    <<" mom "   <<p
	    <<" t1 "    <<t1
	    <<" t2 "    <<t2
	    <<endl;

	return t2;
    }
    //------------------------------------------------

    //------------------------------------------------
    // generate some realistic smearing arround
    // the ToT mean value for single measurement
    // The distribution of ToT is asymmetric.
    // the smearing has to be done for left and right half
    // different.

    Double_t length = calcLength(m,alpha,mindist);
    Double_t sigL   = toTSigma (s,m,alpha,mindist,-1)*length;
    Double_t sigR   = toTSigma (s,m,alpha,mindist, 1)*length;

    Double_t smear;
    if(gRandom->Rndm() > 0.5){
	smear =  TMath::Abs(gRandom->Gaus(0., sigR));
    } else{
	smear = -TMath::Abs(gRandom->Gaus(0., sigL));
    }
    if(t2err) * t2err = smear;
    //------------------------------------------------


    //------------------------------------------------
    // return t2 mean of an  single measurement. If the
    // result t2-t1 would  be < 0 a random value for
    // t2 0-20 ns larger than t1 will be created.
    t2 = ToTmean + t1;
    if(t2 <= t1){
	t2 = t1 + gRandom->Rndm() * 20.;
    }
    if(debug){
	cout<<"scaledEnergyLoss() "
	    <<" s "     <<s
            <<" m "     <<m
	    <<" a "     <<alpha
            <<" d "     <<mindist
	    <<" id "    <<pID
	    <<" mass "  <<mass
	    <<" charge "<<charge
	    <<" mom "   <<p
            <<" dedx "  <<dedx
	    <<" t1 "    <<t1
            <<" t2 "    <<t2
	    <<" t2err " <<smear
            <<" tot "   <<ToTmean
	    <<" sigL "  <<sigL
	    <<" sigR "  <<sigR
            <<endl;
    }

    return t2;
}

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