ROOT logo
//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
//
// HMdcSlope
//
// Calculates the Slope parameter for MDC calibration. Uses cal1 container
// as an input data
//
///////////////////////////////////////////////////////////////////////////////

// File: $RCSfile: hmdcslope.cc,v $
//
// *-- AUTHOR           : P.Zumbruch, J.Kempter, T.Bretz
// *-- Modified         : 26-06-2000 P.Zumbruch
// *-- Last Modification: 08-12-2004 P.Zumbruch
//
// Version: $Revision: 1.22 $
// Modified by $Author: halo $ on $Date: 2009-07-15 11:42:10 $
////////////////////////////////////////////////////////////

using namespace std;

#include <stdlib.h>
#include <fstream> 
#include <iomanip> 
#include <iostream> 

#include "TH1.h"
#include "TH2.h"
#include "TF1.h"
#include "TNtuple.h"
#include "TGraphErrors.h"
#include "TStopwatch.h"

#include "heventheader.h"
#include "hmdcslope.h"
#include "hmdcdef.h"
#include "hmdcraw.h"
#include "hdebug.h"
#include "hades.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hevent.h"
#include "hcategory.h"
#include "hlocation.h"
#include "hmdccal1.h"
#include "hmdclookupgeom.h"
#include "hmdccalparraw.h"
#include "hmdcslopes.h"
#define HMDC_SLOPE_NALGORITHM 3
#define HMDC_SLOPE_NFITHISTOGRAMMMETHODS 2

ClassImp(HMdcSlope)

HMdcSlope::HMdcSlope()
{
    rawCat   = NULL;
    slopeCat = NULL;
    iter     = NULL;
    file     = NULL;

    avgSlope               = (MyFloatField*)new MyFloatField;
    avgSlopeErr            = (MyFloatField*)new MyFloatField;
    nEvt                   = (MyIntField*)  new MyIntField;

    memset(nEvt       ,0,sizeof(Int_t)  *6*4*16*96);
    memset(avgSlope   ,0,sizeof(Float_t)*6*4*16*96);
    memset(avgSlopeErr,0,sizeof(Float_t)*6*4*16*96);

    memset(slopeTrend ,0,sizeof(Int_t)  *6*4*16*96*5000);



    linRegActive           = kTRUE;
    histFitActive          = kFALSE;
    graphFitActive         = kFALSE;

    selectorActive         = kFALSE;

    createNtupleActive     = kFALSE;

    debugActive            = 0;
    trendCalculationActive = kFALSE;
    calibrationAlgorithm   = 1;
    nTimeValues            = 6;
    fNameRoot              = NULL;
    fNameNtuple            = NULL;
}

HMdcSlope::HMdcSlope(const Text_t* name,const Text_t* title) : HReconstructor(name,title)
{
    slopeCat = NULL;
    rawCat   = NULL;
    iter     = NULL;
    file     = NULL;

    avgSlope               = (MyFloatField*)new MyFloatField;
    avgSlopeErr            = (MyFloatField*)new MyFloatField;
    nEvt                   = (MyIntField*)  new MyIntField;

    memset(nEvt       ,0,sizeof(Int_t)  *6*4*16*96);
    memset(avgSlope   ,0,sizeof(Float_t)*6*4*16*96);
    memset(avgSlopeErr,0,sizeof(Float_t)*6*4*16*96);

    memset(slopeTrend ,0,sizeof(Int_t)  *6*4*16*96*5000);


    linRegActive           = kTRUE;
    histFitActive          = kFALSE;
    graphFitActive         = kFALSE;

    selectorActive         = kFALSE;

    createNtupleActive     = kFALSE;

    debugActive            = 0;
    trendCalculationActive = kFALSE;
    calibrationAlgorithm   = 1;
    nTimeValues            = 6;
    fNameRoot              = NULL;
    fNameNtuple            = NULL;
}

HMdcSlope::~HMdcSlope()
{
    // destructor deletes the iterator
    if (iter)       delete iter;
    if (fNameRoot)  delete fNameRoot;
    if (avgSlope)   delete[] avgSlope;
    if (avgSlopeErr)delete[] avgSlopeErr;
    if (nEvt)       delete[] nEvt;
    iter = NULL;
}

void HMdcSlope::setOutputRoot(Char_t *c)
{
  if (fNameRoot) delete fNameRoot;
  fNameRoot = new Char_t[strlen(c)+1];
  strcpy(fNameRoot, c);
  return;
}

void HMdcSlope::setMbSelector(Int_t i)
{ 
  mbSelector = 0;
  if (i >= 0 && i <=16)
    {
      mbSelector = i;
    }
  return;
}

void HMdcSlope::selectCalibrationAlgorithm(Int_t i)
{
  calibrationAlgorithm=0;
  if (i >= 0 && i <= HMDC_SLOPE_NALGORITHM) 
      {
	calibrationAlgorithm=i;
      }
  return;
}

void HMdcSlope::selectHistFitMethod(Int_t i)
{
  calibrationAlgorithm=0;
  if (i >= 0 && i <= HMDC_SLOPE_NFITHISTOGRAMMMETHODS) 
      {
	fitHistMethod=i;
      }
  return;
}

void HMdcSlope::setnTimeValues(Int_t i)
{
  nTimeValues=6;
  if (i >= 2 && i <= 6) 
      {
	nTimeValues=i;
      }
}

void HMdcSlope::setTrendCalculationActive(Bool_t b)
{
  trendCalculationActive = b;
  return;
}

void HMdcSlope::setTdcSelector(Int_t i)
{
  tdcSelector = 0;
  if (i >= 0 && i <= 95)
    {
      tdcSelector = i;
    }
  return;
}

void HMdcSlope::setBinError(Int_t i)
{
  binError=0;
  if (i >= 0)
    {
      binError = i;
    }
  return;
}

void HMdcSlope::setSelectorActive(Bool_t b)
{
  selectorActive = b;
}

void HMdcSlope::setCreateNtupleActive(Bool_t b)
{
  createNtupleActive = b;
  if (createNtupleActive) cout << "setting NtupleActive" << endl;
}

void HMdcSlope::setOutputNtuple(Char_t *c)
{
  if (fNameNtuple) delete fNameNtuple;
  fNameNtuple = new Char_t[strlen(c)+1];
  strcpy(fNameNtuple, c);
  return;
}

void HMdcSlope::setLinRegActive(Bool_t b)
{
  linRegActive = b;
}

void HMdcSlope::setHistFitActive(Bool_t b)
{
  histFitActive = b;
}

void HMdcSlope::setGraphFitActive(Bool_t b)
{
  graphFitActive = b;
}

void HMdcSlope::setDebugActive(Int_t i)
{
  debugActive = 0;
  if (i >=0)
    {
      debugActive = i;
    }
  return;
}

void HMdcSlope::fitHistogramm(Float_t* slope, Float_t* sigma,
			      Int_t sector, Int_t module,
			      Int_t motherboard, Int_t tdc, Int_t method)
{
  switch(method)
    {
    case 1: 
      fitHistogrammMaxCondition (slope, sigma, sector, module, motherboard, tdc);
      break;
    case 2:
      fitHistogrammMeanCondition(slope, sigma, sector, module, motherboard, tdc);
      break;
    default:
      cout << "wrong histogramm fitting method" << endl;
      return;
      break;
    }
 // check for finite values
 if (!TMath::Finite(*slope))
 {
  *slope = 0.;
 }
 if (!TMath::Finite(*sigma))
 {
  *sigma = 100.;
 }

  return;
}

void HMdcSlope::fitHistogrammMaxCondition(Float_t* slope, Float_t* sigma,
					  Int_t sector, Int_t module, Int_t motherboard, Int_t tdc)
{
  static Char_t tmp[80];
  sprintf(tmp,"fithist_sec%i_mod%i_mb%i_tdc%i",sector,module,motherboard,tdc);

  if (fNameRoot) file->cd();

  TH1F *proj = new TH1F(tmp,tmp,5000,0.3,0.8);

  for (Int_t myiter=0;myiter<5000;myiter++)
    { 
      proj->SetBinContent(myiter,slopeTrend[sector][module][motherboard][tdc][myiter]);
    }

  static Float_t xminfitbin, xmaxfitbin;
  xminfitbin=(proj->GetMaximum())-0.001;
  xmaxfitbin=(proj->GetMaximum())+0.001;

  TF1 *f = new TF1("f1","gaus", xminfitbin, xmaxfitbin);
  proj->Fit("f1","RNQ");
  
  *slope = (Float_t)f->GetParameter(1);
  *sigma = (Float_t)f->GetParameter(2);
 
  if ((debugActive & 0x20)) cout << endl << "Slope " << *slope << endl;

if (fNameRoot)
  {
    file->cd();  
    proj->SetFillColor(2);
    proj->Write();
    if ((debugActive & 0x20)) cout << "writing file" << endl;
  }

  delete proj;
  delete f;
  return;
}

void HMdcSlope::fitHistogrammMeanCondition(Float_t* slope, Float_t* sigma,
					   Int_t sector, Int_t module, Int_t motherboard, Int_t tdc)
{
  Char_t tmp[80];
  sprintf(tmp,"fithist_sec%i_mod%i_mb%i_tdc%i",sector,module,motherboard,tdc);

  if (fNameRoot) file->cd();

  TH1F *proj = new TH1F(tmp,tmp,5000,0.3,0.8);

  for (Int_t myiter=0;myiter<5000;myiter++)
    { 
      proj->SetBinContent(myiter,slopeTrend[sector][module][motherboard][tdc][myiter]);
    }
  /*
  static Float_t xminfitbin, xmaxfitbin;
  xminfitbin=(proj->GetMean())-10*0.0001;
  xmaxfitbin=(proj->GetMean())+10*0.0001;
  TF1 *f = new TF1("f1","gaus", xminfitbin, xmaxfitbin); 
  proj->Fit("f1","RNQ");
  */
  *slope = (Float_t)proj->GetMean();
  *sigma = (Float_t)proj->GetRMS();
 
  if ((debugActive & 0x20)) cout << endl << "Slope " << *slope << endl;

if (fNameRoot)
  {
    file->cd();  
    proj->SetFillColor(2);
    proj->Write();
    if ((debugActive & 0x20)) cout << "writing file" << endl;
  }

  delete proj;
  //delete f;
  return;
}

Bool_t HMdcSlope::init(void)
{
  // creates the parameter containers MdcCalPar and MdcLookup if they do not
  // exist and adds them to the list of parameter containers in the runtime
  // database
  
  calparraw=(HMdcCalParRaw*)gHades->getRuntimeDb()->getContainer("MdcCalParRaw");
  
  // creates the MdcRaw category and adds them to the current
  // event
  
  rawCat=gHades->getCurrentEvent()->getCategory(catMdcRaw);
  if (!rawCat) 
    {
      rawCat=gHades->getSetup()->getDetector("Mdc")->buildCategory(catMdcRaw);
      if (!rawCat) return kFALSE;
      else gHades->getCurrentEvent()->addCategory(catMdc,rawCat,"Mdc");
    }

  // creates the MdcSlopes category and adds them to the current
  // event

  slopeCat=gHades->getCurrentEvent()->getCategory(catMdcSlope);
  if (!slopeCat) 
    {
      slopeCat=gHades->getSetup()->getDetector("Mdc")->buildCategory(catMdcSlope);
      if (slopeCat)
	{
	  gHades->getCurrentEvent()->addCategory(catMdcSlope,rawCat,"Mdc");
	}
    }

  // creates an iterator which loops over all fired cells

  iter=(HIterator *)rawCat->MakeIterator();

  if (trendCalculationActive)
    {
      fitHistMethod=2;
    }

  if (fNameRoot) 
    {
      file = new TFile(fNameRoot,"RECREATE");
      file->cd();
      if ((debugActive & 0x02)) printf("File %s aktiv \n",fNameRoot);
      hSlope = new TH1F("Slope", "Slope", 800, 0,0.8);
      hTime  = new TH1F("Time" , "Time", 4096, 0,4096);
    } 

  if (createNtupleActive)
    {
      if ((debugActive & 0x02)) printf("generating Ntuple \n");
       if (fNameNtuple) ntupleOutputFile = new TFile(fNameNtuple,"RECREATE");
       else ntupleOutputFile = new TFile("Slope-ntuple.root","RECREATE");
       ntupleOutputFile->cd();
       ntuple = new TNtuple("ntuple",
			    "ntuple",
			    "index:time:evtSeqNr:sector:module:mbo:tdc:slope:error:t1:t2:t3:t4:t5:t6");
    }

  
 fActive=kTRUE;
 return kTRUE;
}

Bool_t HMdcSlope::finalize(void)
{

  HDetector *mdcDet = gHades->getSetup()->getDetector("Mdc");

  if (trendCalculationActive)
  {
      Info("finalize","trendCalculation may take some minutes");
  }

  if (!mdcDet)
    {
	Error("finalize()",
	      "Mdc-Detector setup (gHades->getSetup()->getDetector(\"Mdc\")) missing.");
    }
  else
    {
      Float_t slope, sigma;
      //loop over sectors
      for(Int_t s=0; s<6; s++) 
	{  
	  //loop over modules
	  for(Int_t mo=0; mo<4; mo++) 
	    {  
	      if (!mdcDet->getModule(s, mo)) continue;
	      static Int_t nMb;
              nMb=(*calparraw)[s][mo].getSize();
	      //loop over motherboards
	      for(Int_t mb=0; mb<nMb; mb++) 
		{ 
		  static Int_t nTdc;
                  nTdc=(*calparraw)[s][mo][mb].getSize();
		  for(Int_t t=0; t<nTdc; t++) 
		    {
		      static Int_t n;
		      n=(*nEvt)[s][mo][mb][t];
		 
		      // 
		      // Trend Calculation 
		      // 
		      if (trendCalculationActive)
			{
			  if (n)
			    {
			      fitHistogramm(&slope, &sigma, s, mo, mb, t, 
					    fitHistMethod);
			      if (slope >0 && slope<1)
				{
				  (*calparraw)[s][mo][mb][t].setSlope(slope);
				  (*calparraw)[s][mo][mb][t].setSlopeErr(sigma);
				  (*calparraw)[s][mo][mb][t].setSlopeMethod(2);
				}
			      else
				{
				  (*calparraw)[s][mo][mb][t].setSlope(0.5);
				  (*calparraw)[s][mo][mb][t].setSlopeErr(100);
				  (*calparraw)[s][mo][mb][t].setSlopeMethod(3);
				} 
			    }
			  else
			    {
			      (*calparraw)[s][mo][mb][t].setSlope(0.5);
			      (*calparraw)[s][mo][mb][t].setSlopeErr(100);
			      (*calparraw)[s][mo][mb][t].setSlopeMethod(4);
			    }
			}
		      // 
		      // Online Calculation !!!!!!!!!!! 
		      // 
		      else 
			{
			  (*calparraw)[s][mo][mb][t].setSlope(n?((*avgSlope)[s][mo][mb][t]/n):0);
			  (*calparraw)[s][mo][mb][t].setSlopeErr(n?((*avgSlopeErr)[s][mo][mb][t]/n):0);
			}
		    }
		}
	    }
	}
    }
  // writing to file 

  if (file)
    {
      file->cd();
      hSlope->Write();
      hTime-> Write();

      file->Save();
      file->Close();
      delete file;
    }

  if (createNtupleActive)
    {
      ntupleOutputFile->cd();
      ntuple->Write();
      ntupleOutputFile->Save();
      ntupleOutputFile->Close();
      delete ntupleOutputFile;
    }

  // free memory space;//??

  if (trendCalculationActive)
    {
    }
  
  return kTRUE;
}

void HMdcSlope::calcSlope(Int_t t0, Int_t t1, Int_t t2, Int_t t3, Int_t t4, Int_t t5,
			  Float_t delta,
			  Float_t* myslope,
			  Float_t* myerror,
			  Float_t* chiSquare,
			  Int_t nvals,
			  Int_t myAlgorithm)
{
    // depending on the value of myAlgorithm
    // calc
    // calc5
    // calcCHI
    // calcGraph
    // are called to caculate the values for the slopes

    // set default values
      *myslope  = -1000.;
      *myerror  = -1000.;
      *chiSquare= -1000.;

    // TODO: replace by pointer array to fcn pointers

 switch(myAlgorithm)
   {
   case 1: 
     calc     (t0,t1,t2,t3,t4,t5, delta, myslope, myerror);
     break;   
   case 2: 
     calc5    (t0,t1,t2,t3,t4,t5, delta, myslope, myerror);
     break;   
   case 3:
     calcCHI  (t0,t1,t2,t3,t4,t5, delta, myslope, myerror);
     break;   
   case 4:
     calcGraph(t0,t1,t2,t3,t4,t5, delta, myslope, myerror);
     break;   
   default:
     *myslope  =0.;
     *myerror  =-99.;
     *chiSquare=-99.;
     break;
   }

 // check for finite values
 if (!TMath::Finite(*myslope))
 {
  *myslope = 0.;
 }
 if (!TMath::Finite(*myerror))
 {
  *myerror = 100.;
 }

return;
}

void HMdcSlope::calc(Int_t t0, Int_t t1, Int_t t2, Int_t t3, Int_t t4, Int_t t5,
		     Float_t delta, Float_t *myslope, Float_t *myerror)
{
  // Linear regression
  // with 6 equal distanced base points, (t[i] = delta * i, i = 1...6) 
  // f(t) = a0 + a1 * t
  // 
  // s2a1: (standard deviation)^2 of mya1
  // slope = -1/mya1;
  //                                sqrt(s2a1) 
  // standard deviation of slope = --------------
  //                                  (mya1)^2
  //
  
  if  (t5<0 || t4<0 || t3<0 || t2<0 || t1<0 || t0<0)  
    {
      *myslope = 0.;
      *myerror = 0.;
      return;
    }
  
  // correct error calculation has to be improved
  
  static Double_t sumt ;     // t0   + ... + t5
  static Double_t sumkt;     // t0*1 + ... + t5*6
  static Double_t s2y  ;     // variance of y
  static Double_t sa1  ;     // standard deviation of a1
  static Double_t mya0 ;     // a0
  static Double_t mya1 ;     // a1
  static Double_t difference[6];
  static Int_t ybin[6];
  
  // default values
  sumt =0.;
  sumkt=0.;
  s2y  =0.;
  sa1  =0.;
  mya0 =0.;
  mya1 =0.;
  difference[0] = 0.;
  difference[1] = 0.;
  difference[2] = 0.;
  difference[3] = 0.;
  difference[4] = 0.;
  difference[5] = 0.;

  // copying the values (???)
  ybin[0]=t0;
  ybin[1]=t1;
  ybin[2]=t2;
  ybin[3]=t3;
  ybin[4]=t4;
  ybin[5]=t5;
  
  sumt = ybin[0] +ybin[1]  +ybin[2]  +ybin[3]  +ybin[4]  +ybin[5];

  //         n          
  //        ---         
  //        \                                                                  .
  // sumt  = > ybin[k-1]
  //        /           
  //        ---         
  //        k=1         

  sumkt= ybin[0] +ybin[1]*2+ybin[2]*3+ybin[3]*4+ybin[4]*5+ybin[5]*6;

  //         n  
  //        --- 
  //        \                                                                  .
  // sumkt = > k * ybin[k-1]
  //        /  
  //        ---
  //        k=1
  
  mya0=(13/15)*sumt-0.2*sumkt;
  
  //                      ---          n                n              ---
  //                      |           ---              ---               |
  //              1       |           \                \                 |
  // mya0 = ------------- |  2(2n + 1) > ybin[k-1] - 6  > k * ybin[k-1]  |
  //         n * (n - 1)  |           /                /                 |
  //                      |           ---              ---               |
  //                      ---         k=1              k=1             ---
  //
  //              1                  
  //      = ------------- (  2(2n + 1) sumt - 6 * sumkt) 
  //         n * (n - 1)             
  //                                 
  //                                                    , n=number of Points (=6)
  //
  //    (n=6)     1                                         13
  //      = ------------- ( 2(2*6 + 1) sumt - 6 * sumkt) = ---- sumt - 0.2 sumkt 
  //         6 * (6 - 1)                                    15
  //                                 

 
  mya1=(2*sumkt-7*sumt)/(35*delta);

  //                               ---   n                        n            ---   
  //                               |    ---                      ---             |
  //                   1           |    \                        \               |
  // mya1 = ---------------------- | 12  > k * ybin[k-1] - 6(n+1) > ybin[k-1]    |
  //         delta * n * (n^2 - 1) |    /                        /               |
  //                               |    ---                      ---             |
  //                               ---  k=1                      k=1           ---
  //
  //                   1               
  //      = ---------------------- ( 12 * sumkt - 6(n+1) * sumt )
  //         delta * n * (n^2 - 1)     
  //
  //                                                    , n=number of Points (=6)
  //
  //    (n=6)          1               
  //      = ---------------------- (12 * sumkt - 6(6+1) * sumt)  
  //         delta * 6 * (6^2 - 1)     
  //
  //              1                
  //      = ----------- (2 * sumkt - 7 * sumt)  
  //         delta * 35     
  //

  
  for (Int_t k=1;k<=6;k++)
    { 
      difference[k-1]=(ybin[k-1]-mya0-mya1*delta*k)*(ybin[k-1]-mya0-mya1*delta*k);
    }

  s2y=(difference[0]+difference[1]+difference[2]+difference[3]+difference[4]+difference[5])/4;

  // s2y:s^2y: variance in y:
  //
  //                    n
  //                   ---  
  //           1       \                                    2
  //  s^2y = ----- *    >  (ybin[k-1] - a0 - a1 * k * delta) 
  //         n - 2     /
  //                   ---
  //                   k=1
  //
  //                    n
  //                   ---  
  //           1       \                  2
  //       = ----- *    >  difference[k-1]                     , n=number of Points (=6)
  //         n - 2     /
  //                   ---
  //                   k=1
  //

  
  sa1=(sqrt(s2y/10)/delta); 

  // sa1: standard deviation of a1: 
  //
  //            ------------------------------
  //           /                  12        
  // sa1 =    / (sy^2)*  ---------------------  , n=number of Points (=6)
  //       \ /           delta * n * (n^2 - 1)
  //        V
  //
  //
  //            ------------------------------
  //           /                  12        
  //     =    / (sy^2)*  ---------------------  
  //       \ /           delta * 6 * (6^2 - 1)
  //        V
  //
      
  *myslope=(Float_t) (-1/mya1);

  //            -1
  // myslope = ----
  //           mya1

  *myerror=(Float_t) ((sa1)/(mya1*mya1));
 
  //
  //             sa1
  // myerror = -------
  //                2
  //            mya1

  return; 
}

void HMdcSlope::calc5(Int_t t0, Int_t t1, Int_t t2, Int_t t3, Int_t t4, Int_t t5,
		      Float_t delta, Float_t *myslope, Float_t *myerror)
{
  // Linear regression
  // with 5 equal distanced base points, (t[i] = delta * i, i = 1...5) 
  // f(t) = a0 + a1 * t
  // 
  // s2a1: (standard deviation)^2 of mya1
  // slope = -1/mya1;
  //                                sqrt(s2a1) 
  // standard deviation of slope = --------------
  //                                  (mya1)^2
  //

  if (debugActive &0x10) cout << "." << flush;

  if  (t4<0 || t3<0 || t2<0 || t1<0 || t0<0)
    {
      *myslope = 0.;
      *myerror = 100.;
      return;
    }
  
  // correct error calculation has to be improved
  
  static Double_t sumt ;     // t0   + ... + t1
  static Double_t sumkt;     // t0*1 + ... + t4*5
  static Double_t s2y  ;     // variance of y
  static Double_t sa1  ;     // standard deviation of a1
  static Double_t mya0 ;     // a0
  static Double_t mya1 ;     // a1
  static Double_t difference[5];
  static Int_t ybin[5];
  
  // default values
  sumt =0.;
  sumkt=0.;
  s2y  =0.;
  sa1  =0.;
  mya0 =0.;
  mya1 =0.;
  difference[0] = 0.;
  difference[1] = 0.;
  difference[2] = 0.;
  difference[3] = 0.;
  difference[4] = 0.;

  // copy values
  ybin[0]=t0;
  ybin[1]=t1;
  ybin[2]=t2;
  ybin[3]=t3;
  ybin[4]=t4;
  
  sumt =ybin[0]+ybin[1]  +ybin[2]  +ybin[3]  +ybin[4];
  sumkt=ybin[0]+ybin[1]*2+ybin[2]*3+ybin[3]*4+ybin[4]*5;
  
  mya0=+1.1*sumt-0.3*sumkt;
  
  //                      ---          n                n              ---
  //                      |           ---              ---               |
  //              1       |           \                \                 |
  // mya0 = ------------- |  2(2n + 1) > ybin[k-1] - 6  > k * ybin[k-1]  |
  //         n * (n - 1)  |           /                /                 |
  //                      |           ---              ---               |
  //                      ---         k=1              k=1             ---
  //
  //              1                  
  //      = ------------- (  2(2n + 1) sumt - 6 * sumkt) 
  //         n * (n - 1)             
  //                                 
  //                                                    , n=number of Points (=5)
  //
  //    (n=5)     1                  
  //      = ------------- ( 2(2*5 + 1) sumt - 6 * sumkt) = 1.1 sumt - 0.3 sumkt 
  //         5 * (5 - 1)             
  //                                 

 
  mya1=(sumkt-3*sumt)/(10*delta);

  //                               ---   n                        n            ---   
  //                               |    ---                      ---             |
  //                   1           |    \                        \               |
  // mya1 = ---------------------- | 12  > k * ybin[k-1] - 6(n+1) > ybin[k-1]    |
  //         delta * n * (n^2 - 1) |    /                        /               |
  //                               |    ---                      ---             |
  //                               ---  k=1                      k=1           ---
  //
  //                   1               
  //      = ---------------------- ( 12 * sumkt - 6(n+1) * sumt )
  //         delta * n * (n^2 - 1)     
  //
  //                                                    , n=number of Points (=5)
  //
  //    (n=5)          1               
  //      = ---------------------- (12 * sumkt - 6(5+1) * sumt)  
  //         delta * 5 * (5^2 - 1)     
  //
  //              1                
  //      = ----------- (sumkt - 3 sumt)  
  //         delta * 10     
  //
  
  for (Int_t k=1;k<=5;k++)
    { 
      difference[k-1]=(ybin[k-1]-mya0-mya1*delta*k)*(ybin[k-1]-mya0-mya1*delta*k);
    }

  s2y=(difference[0]+difference[1]+difference[2]+difference[3]+difference[4])/3;

  // s2y:s^2y: variance in y:
  //
  //                    n
  //                   ---  
  //           1       \                                    2
  //  s^2y = ----- *    >  (ybin[k-1] - a0 - a1 * k * delta) 
  //         n - 2     /
  //                   ---
  //                   k=1
  //                    n
  //                   ---  
  //           1       \                  2
  //       = ----- *    >  difference[k-1]                     , n=number of Points (=5)
  //         n - 2     /
  //                   ---
  //                   k=1
  

  sa1=(sqrt(s2y/10)/delta); 

  // sa1: standard deviation of a1: 
  //
  //            ------------------------------
  //           /                  12        
  // sa1 =    / (sy^2)*  ---------------------  , n=number of Points (=5)
  //       \ /           delta * n * (n^2 - 1)
  //        V
  //
      
  *myslope=(Float_t) (-1/mya1);

  //            -1
  // myslope = ----
  //           mya1

  *myerror=(Float_t) ((sa1)/(mya1*mya1));
 
  //
  //             sa1
  // myerror = -------
  //                2
  //            mya1

if ((debugActive & 0x10))
  {
    cout << endl;
    cout << "LS" << endl;
    cout <<  (-1/mya1) <<" " << ((sa1)/(mya1*mya1)) << endl;
  }

  return; 
}

void HMdcSlope::calcCHI(Int_t t0, Int_t t1, Int_t t2, Int_t t3, Int_t t4, Int_t t5,
			Float_t delta, Float_t *myslope, Float_t *myerror)
{
  // calculate slopes using histogram based fit

  if  (t5<0 || t4<0 || t3<0 || t2<0 || t1<0 || t0<0)  
    {
      *myslope = 0.;
      *myerror = 100.;
      return;
    }
  
  TH1F *hFitarea = new TH1F("fit","fit",5,0.5,5.5);
  hFitarea->SetBinContent((Int_t) 1 ,t0);
  hFitarea->SetBinContent((Int_t) 2 ,t1);
  hFitarea->SetBinContent((Int_t) 3 ,t2);
  hFitarea->SetBinContent((Int_t) 4 ,t3);
  hFitarea->SetBinContent((Int_t) 5 ,t4);
  
  for (Int_t myiter=1;myiter <=5; myiter++)
    {
      hFitarea->SetBinError((Int_t) myiter, binError);
    }
  
  // calculation of slope & chisquare
  
  TF1 *f = new TF1("f1","pol1", 0,6); // call fit function poynom 1.order in x-range
  hFitarea->Fit("f1","RNQ");
  
  delete hFitarea;
  
  *myslope = (Float_t) ((-1)/f->GetParameter(1)*delta) ;
  *myerror = (Float_t) (f->GetParError(1)/((*myslope)*(*myslope)*delta));
  //  *chi2= (Float_t) (f->GetChisquare()/f->GetNDF());

  if (debugActive & 0x10)
    {
      cout << endl;
      cout << "chi" << endl;
      cout << *myslope <<" " << *myerror << endl;
    }

  delete f;

  return; 
}


void HMdcSlope::calcGraph(Int_t t0, Int_t t1, Int_t t2, Int_t t3, Int_t t4, Int_t t5,
			  Float_t delta, Float_t *myslope, Float_t *myerror)
{
 // calculate slopes using graph based fit

  static Int_t nrOfPts=5;
  static Float_t x[5];
  static Float_t y[5];
  static Float_t ex[5];
  static Float_t ey[5];
      
  for (Int_t myiter=0;myiter<nrOfPts; myiter++)
    {
	x[myiter] =(myiter+1)*delta;
	y[myiter] =0.;
	ex[myiter]=0.;
	ey[myiter]=binError;
    }

  y[0]= t0;
  y[1]= t1;
  y[2]= t2;
  y[3]= t3;
  y[4]= t4;
 
  TGraphErrors *gFitGraph = new TGraphErrors(nrOfPts,x,y,ex,ey);
   
  // calculation of slope & chisquare
  
  TF1 *f = new TF1("f1","pol1", 0,6*delta); // call fit function poynom 1.order in x-range
  gFitGraph->Fit("f1","RNQ");
  
  delete gFitGraph;
  
  *myslope = (Float_t) ((-1)/f->GetParameter(1)) ;
  *myerror = (Float_t) (f->GetParError(1)/((*myslope)*(*myslope)));
  //  *chi2= (Float_t) (f->GetChisquare()/f->GetNDF());

  if(debugActive & 0x10)
  {
      cout << endl;
      cout << "Graph" << endl;
      cout << *myslope <<" " << *myerror << endl;
  }

  delete f;
  return; 
}

Int_t HMdcSlope::calcBinNr(Double_t value, Double_t min, Double_t max, Int_t nbins)
{
  // calculate bin number for value in given binned ranged
  if (min<max && value >= min && value <= max)
    {
      return ((Int_t)((nbins/(max-min))*(value - min)));
    }
  return 0;
}

Int_t HMdcSlope::execute(void)
{
    // evaluates the calibration events in the data stream
    // based on the input from HMdcRaw
    // slopes are determined
    // Two modes of slope evaluation do exist
    // a) TrendCalculation (offline procedure)
    // b) Online Calculation
    //
    //  // a) TrendCalculation
    //  //
    //  // the idea of this offline procedure is to first fill
    //  // the calculated slopes of the whole dataset into
    //  // a histogramm (SlopeTrend) and to derive the slope value
    //  // as the result of a Gaussian Fit in the finalize function.
    //  // Where the slope corresponds to the first moment
    //  // and the error to the sigma
    //  //
    //  //
    //  // b) Online Calculation
    //  //
    //  // For each event the slope is calculated with the chosen algorithm
    //  // and its content is written to the calparraw container
    //  //

  static HMdcRaw* raw=NULL;
  static Int_t s, mo, mb, t;
  static Int_t index;

  static UInt_t DaqTime     ;
  static Int_t DaqHour      ;
  static Int_t DaqMin       ;
  static Int_t DaqSec       ;
  static Float_t DaqJustSec ;
  static Float_t delta      ;
  index++;

  if (debugActive& 0x04){if (!(index%10)) cout << index << endl;}

  DaqTime     = (gHades->getCurrentEvent()->getHeader()->getTime());
  DaqHour      =        ((DaqTime & 0x00ff0000) >> 16);
  DaqMin       =        ((DaqTime & 0x0000ff00) >> 8);
  DaqSec       =          DaqTime & 0x000000ff;
  DaqJustSec = 3600.*DaqHour + 60.*DaqMin + DaqSec;
  
  delta = 401.5/2; // delta of 401.5/2 should be somewhen retrieved from the database !!!!
  iter->Reset();

  // 
  // TrendCalculation
  // 

  if (trendCalculationActive)
    { 
      // 
      // TrendCalculation
      // 
      // the idea of this offline procedure is to first fill 
      // the calculated slopes of the whole dataset into 
      // a histogramm (SlopeTrend) and to derive the slope value 
      // as the result of a Gaussian Fit.
      // Where the slope corresponds to the first moment
      // and the error to the sigma
      //

      static Float_t slope, error, chiSquare; 

      while ((raw=(HMdcRaw*)iter->Next()))
	{
	  slope     = -100.;
          error     = -100.;
          chiSquare = -100.;
	  raw->getAddress(s, mo, mb, t);
              
          Int_t time1 = raw->getTime(1);
          Int_t time2 = raw->getTime(2);
          Int_t time3 = raw->getTime(3);
          Int_t time4 = raw->getTime(4);
          Int_t time5 = raw->getTime(5);
          Int_t time6 = raw->getTime(6);       
	  time1 |= 2048;
	  if(time3 < time4) time3 |= 2048;
	  if(time2 < time3) time2 |= 2048;
          
	  calcSlope(time1,
		    time2,
		    time3,
		    time4,
		    time5,
		    time6,
		    delta,
		    &slope,
		    &error,
		    &chiSquare,
		    nTimeValues,
		    calibrationAlgorithm);
	
	  slopeTrend[s][mo][mb][t][calcBinNr(slope,0.3,0.8,5000)]++;
	  
	  if(slopeCat)
	    {
	      static HLocation loc;
	      loc.set(4,0,0,0,0);

	      //set location indexes 
	      
	      loc[0] = s;
	      loc[1] = mo;
	      loc[2] = mb;
	      loc[3] = t;

	      // filling the data to the location
	      // first get a free or existing slot

	      static HMdcSlopes *pMdcSlopes;
              pMdcSlopes = NULL;
	      pMdcSlopes = (HMdcSlopes*) slopeCat->getSlot(loc);
	      if (pMdcSlopes) 
		{
		  pMdcSlopes = new (pMdcSlopes) HMdcSlopes();

		  pMdcSlopes->setAddress(loc[0],loc[1],loc[2],loc[3]);
		  pMdcSlopes->setSlope(slope);
		  pMdcSlopes->setError(error);
		  pMdcSlopes->setMethode(-1);
		}
	      else
		{
		  Warning("execute","couldn't get slot for HMdcSlopes");
		}
	    }

	  (*nEvt)[s][mo][mb][t]++;

	  if(file) 
	    {
	      file->cd();
	      hSlope->Fill(slope);
              hTime->Fill(time1);
              hTime->Fill(time2);
              hTime->Fill(time3);
              hTime->Fill(time4);
              hTime->Fill(time5);
              hTime->Fill(time6);
	    }

	  if (createNtupleActive)
	    {
	      ntupleOutputFile->cd();
	      if (!selectorActive || 
		  (selectorActive && 
		   (mbSelector == mb || mbSelector == -1) &&
		   (tdcSelector == t || tdcSelector == -1) ))
		{
		  ntuple->Fill(index,
			       DaqJustSec,
			       gHades->getCurrentEvent()->getHeader()->getEventSeqNumber(),
			       s,mo,mb,t,slope,error,
			       time1,time2,time3,time4,time5,time6);
		}
	    }
	}
      return 0;
    }

  //
  // Online Calculation
  //
  else
    {
      //
      // Online Calculation
      //
      // For each event the slope is calculated with the chosen algorithm
      // and its content is written to the calparraw container
      //

      static Float_t slope[3], error[3], chiSquare[3]; 

      static Bool_t algorithmActive[3] = {linRegActive, histFitActive, graphFitActive};

      // default values
      for (Int_t index=0; index < 3; index++)
      {
	  slope    [index]=-100.;
	  error    [index]=-100.;
          chiSquare[index]=-100.;
      }
      while ((raw=(HMdcRaw*)iter->Next()))
	{
	  raw->getAddress(s, mo, mb, t);
	  
	  if (!selectorActive || 
	      (selectorActive && (mbSelector==mb || mbSelector == -1) && (tdcSelector == t || tdcSelector == -1) ))
	    {
              
              Int_t time1 = raw->getTime(1);
              Int_t time2 = raw->getTime(2);
              Int_t time3 = raw->getTime(3);
              Int_t time4 = raw->getTime(4);
              Int_t time5 = raw->getTime(5);
              Int_t time6 = raw->getTime(6);       
	      time1 |= 2048;
	      if(time3 < time4) time3 |= 2048;
	      if(time2 < time3) time2 |= 2048;
              
	      for (Int_t methodIter=0; methodIter < HMDC_SLOPE_NALGORITHM; methodIter++)
		{
		  if (algorithmActive[methodIter]==kTRUE)
		    {
                      // default values
		      slope    [methodIter]=-100.;
		      error    [methodIter]=-100.;
		      chiSquare[methodIter]=-100.;
		      calcSlope(time1,
				time2,
				time3,
				time4,
				time5,
				time6,
				delta,
				&slope[methodIter],
				&error[methodIter],
				&chiSquare[methodIter],
				nTimeValues,
				methodIter+1);
		    }
		}
	      
	      (*avgSlope)   [s][mo][mb][t] += slope[0];
	      (*avgSlopeErr)[s][mo][mb][t] += error[0];
	      (*nEvt)       [s][mo][mb][t] ++;
	      
	      if(file) 
		{
		  hSlope->Fill(slope[0]);
                  hTime->Fill(time1);
                  hTime->Fill(time2);
                  hTime->Fill(time3);
                  hTime->Fill(time4);
                  hTime->Fill(time5);
                  hTime->Fill(time6);
		}
	      
	      if(slopeCat)
		{
		  static HLocation loc;
		  loc.set(4,0,0,0,0);
		  
		  //set location indexes 
		  
		  loc[0] = s;
		  loc[1] = mo;
		  loc[2] = mb;
		  loc[3] = t;
		  
		  // filling the data to the location
		  // first get a free or existing slot
		  
		  static HMdcSlopes *pMdcSlopes;
                  pMdcSlopes = NULL;
		  pMdcSlopes = (HMdcSlopes*) slopeCat->getSlot(loc);
		  if (pMdcSlopes) 
		    {
		      pMdcSlopes = new (pMdcSlopes) HMdcSlopes();

		      pMdcSlopes->setAddress(loc[0],loc[1],loc[2],loc[3]);
		      pMdcSlopes->setSlope(slope[0]);
		      pMdcSlopes->setError(error[0]);
		      if (slope[0]>0. && slope[0] <1.) { pMdcSlopes->setMethode(1); }
		    }
		  else
		    {
		      Warning("execute","couldn't get slot for HMdcSlopes");
		    }
		}
	      
	      if (slope[0]>0 && slope[0] <1)
		{	   
		  (*calparraw)[s][mo][mb][t].setSlope   (slope[0]);
		  (*calparraw)[s][mo][mb][t].setSlopeErr(error[0]);
		  (*calparraw)[s][mo][mb][t].setSlopeMethod(1);
		}
	      else if(slope[0]==0)
		{
		  // in later versions the values should be set to a default or former value
		  (*calparraw)[s][mo][mb][t].setSlope(0.5);
		  (*calparraw)[s][mo][mb][t].setSlopeErr(100.);
		  (*calparraw)[s][mo][mb][t].setSlopeMethod(4);
		}
	      else if(slope[0]>1)
		{
		  (*calparraw)[s][mo][mb][t].setSlope(0.);
		  (*calparraw)[s][mo][mb][t].setSlopeErr(0.);
		  (*calparraw)[s][mo][mb][t].setSlopeMethod(3); // manually set
		}
	    }
	}
      return 0;
    }
}

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