ROOT logo
//*-- AUTHOR : J. Markert

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////
// HMdcCal2Par
//
// Container class for the calibration parameters from Cal1 to Cal2 of the MDC
// time -> distance.Contains functions for calculating time ->distance for santiago track fitter
// and Calibrater2 of Mdc
////////////////////////////////////////////////////////////////////////////

#include "hmdccal2par.h"
#include "hmdccal2parsim.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hpario.h"
#include "hdetpario.h"
#include "hdetector.h"
#include "hmessagemgr.h"

#include "TH2.h"
#include "TStyle.h"
#include "TROOT.h"
#include "TCanvas.h"
#include "TGraphErrors.h"
#include "TF1.h"
#include "TMath.h"


using namespace std;
#include <stdlib.h>
#include <iostream> 
#include <iomanip>

ClassImp(HMdcCal2ParAngle)
ClassImp(HMdcCal2ParMod)
ClassImp(HMdcCal2ParSec)
ClassImp(HMdcCal2Par)



void HMdcCal2ParAngle::fillDistance(HMdcCal2ParAngle& r) {
    for(Int_t i=0;i<100;i++)
    {
	distance[i]=r.distance[i];
    }
}
void HMdcCal2ParAngle::fillDistanceError(HMdcCal2ParAngle& r) {
    for(Int_t i=0;i<100;i++)
    {
	distanceErr[i]=r.distanceErr[i];
    }
}
HMdcCal2ParMod::HMdcCal2ParMod(Int_t sec, Int_t mod, Int_t angle) {
  // constructor takes the sector, module and angle
    array = new TObjArray(angle);
    for (Int_t i=0; i<angle; ++i)
        array->AddAt(new HMdcCal2ParAngle(),i);
}

HMdcCal2ParMod::~HMdcCal2ParMod() {
  // destructor
  array->Delete();
  delete array;
}

HMdcCal2ParSec::HMdcCal2ParSec(Int_t sec, Int_t mod) {
  // constructor takes the sector, module number
  array = new TObjArray(mod);
  for (Int_t i=0; i<mod; i++)
        array->AddAt(new HMdcCal2ParMod(sec,i),i);
}

HMdcCal2ParSec::~HMdcCal2ParSec() {
  // destructor
  array->Delete();
  delete array;
}

HMdcCal2Par::HMdcCal2Par(const Char_t* name,const Char_t* title,
                         const Char_t* context,Int_t n)
            : HParSet(name,title,context)
{
  // constructor
  comment="no comment";

  cal2parsim=0;
  cal2parsim=(HMdcCal2ParSim*)gHades->getRuntimeDb()->getContainer("MdcCal2ParSim");
  if(!cal2parsim)
  {
      Error("HMdcCal2Par()","ZERO POINTER RETRIEVED FOR HMDCCAL2PARSIM!");
      exit(1);
  }
  strcpy(detName,"Mdc");
  if (gHades) {
      fMdc = (HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
  } else {
      fMdc = 0;
  }
  array = new TObjArray(n);
  for (Int_t i=0; i<n; i++) array->AddAt(new HMdcCal2ParSec(i),i);
  linecounter=0;
  linecounterwrite=0;
  type=0;
  myslopeOutside=0.01;
}

HMdcCal2Par::~HMdcCal2Par() {
  // destructor
  array->Delete();
  delete array;
}

Bool_t HMdcCal2Par::init(HParIo* inp) {
  // intitializes the container from an input
    linecounter=0;
    linecounterwrite=0;
    type=0;

    if (!cal2parsim) return kFALSE;
    Int_t v1=cal2parsim->getInputVersion(1);
    Int_t v2=cal2parsim->getInputVersion(2);
    if (v1==versions[1] && v2==versions[2]) return kTRUE;
    // needs reinitialization

    HDetector *mdcDet = (HMdcDetector*)(((HSpectrometer*)(gHades->getSetup()))->getDetector("Mdc"));
    if (!mdcDet)
    {
	Error("HMdcCal2Par:init()","Detector setup (gHades->getSetup()->getDetector(\"Mdc\")) missing.");
    }
    else
    {
      INFO_msg(10,HMessageMgr::DET_MDC,"HMdcCal2Par initialized from HMdcCal2ParSim for modules ");
      Char_t *buf;
      buf =  new char[200];
      strcpy(buf,"\n");
	for(Int_t s=0; s<6; s++)
	{  //loop over sectors
	    for(Int_t m=0; m<4; m++)
	    {  //loop over modules
		if (!mdcDet->getModule(s, m)) continue;
		sprintf(buf,"%s %i",buf,s*4+m);
		for(Int_t a=0;a<18;a++)
		{
		    cal2parsim->transformToDistance(s,m,a,4.0,this);
		}
	    }
	}
	gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),"%s ",buf);
	delete []buf;
    }
    myslopeOutside=cal2parsim->getSlopeOutside();

    versions[1]=v1;
    versions[2]=v2;
    changed=kTRUE;
    return kTRUE;
}
void HMdcCal2Par::plot(Int_t s,Int_t m)
{
    // plots data into TGraphErrors for distance including errors

    cout<<"HMdcCal2Par: plotting sector "<<s<<" module "<<m<<endl;
    gStyle->SetOptStat(0);
    gStyle->SetOptTitle(0);

    Char_t nameCanvas[300];
    sprintf(nameCanvas,"%s %i %s %i","time -> distance sector ",s," module ",m);
    TH2F* dummy=new TH2F("dummy","dummy",2,0,410,2,0,10.1);
    dummy->SetXTitle("drift time [ns]");
    dummy->SetYTitle("distance from wire [mm]");

    TCanvas* result=new TCanvas(nameCanvas,nameCanvas,1000,800);
    result->Divide(6,3);
    result->Draw();
    Float_t x[100];
    Float_t y[100];
    Float_t ex[100];
    Float_t ey[100];

    for(Int_t a=0;a<18;a++)
    {
	for(Int_t i=0;i<100;i++)
	{
	    x[i] =i*4.0;
	    y[i] =(*this)[s][m][a].distance[i];
            ex[i]=0;
	    ey[i]=(*this)[s][m][a].distanceErr[i];
	}
	result->cd(a+1);
        dummy->DrawCopy();
	TGraphErrors* g=new TGraphErrors(100,x,y,ex,ey);
	g->SetLineColor(2);
        g->Draw();
    }
    result->Update();
    delete dummy;
}
void HMdcCal2Par::plot2D(Int_t s,Int_t m,Int_t type)
{
    // Plots data into 2d-Hists
    // type = 0 ->distance
    // type = 1 ->Error distance

    cout<<"HMdcCal2Par: plotting 2D sector "<<s<<" module "<<m<<endl;

    gStyle->SetOptStat(0);
    gStyle->SetOptTitle(0);
    gStyle->SetPalette(1);

    Char_t nameCanvas[300];
    if(type==0)sprintf(nameCanvas,"%s %i %s %i","distance sector ",s," module ",m);
    if(type==1)sprintf(nameCanvas,"%s %i %s %i","Error distance sector ",s," module ",m);

    TH2F* dummy=new TH2F("dummy","dummy",18,0,90,100,0,400);
   
    dummy->SetXTitle("angle");
    dummy->SetYTitle("drift time [ns]");

    if(type==0)dummy->SetZTitle("distance [mm]");
    if(type==1)dummy->SetZTitle("Error distance [mm]");

    TCanvas* result=new TCanvas(nameCanvas,nameCanvas,1000,800);

    for(Int_t a=0;a<18;a++)
    {
	for(Int_t i=0;i<100;i++)
	{
	    if(type==0)dummy->SetBinContent(a+1,i,(*this)[s][m][a].distance[i]);
            if(type==1)dummy->SetBinContent(a+1,i,(*this)[s][m][a].distanceErr[i]);
	}
    }
    result->cd();
    dummy->DrawCopy("lego2");

    result->Update();
    delete dummy;
}
Double_t HMdcCal2Par::calcDistance(Int_t s,Int_t m,Double_t a,Double_t time)
{
    // This function calculates the distance from sense wire for a given drift time.
    // A Interpolation between the two closest angle steps
    // is performed and the distance value returned.
    // Input is the angle of the track (alphaTrack:90 degree for perpendicular impact),which
    // has to be recalculated to the angle of minimum drift distance (alphaDrDist:0 degree for
    // perpendicular impact).
    //   y ^
    //     |  |------------*----|              cathod  plane
    //     |  | cell        *   |
    //     |  |            / *  |
    //     |  |           /90 * |
    //     |  | driftDist/     *|
    //     |  |         / |     *
    //   --|--|--------*^-|-----|*--------->   sense/potential plane
    //     |  |           |     | *        x
    //     |  |      alphaDrDist|  *
    //        |                 |/  *          alphaDriftDist=90-alphaTrack
    //        |      alphaTrack /    *
    //        |-----------------|     * track  cathod plane
    //
    // angles must be between 0 and 90 degree, all other angles have to be shifted
    // before calling the function.
    if(time<0)
    {
	return -1;
    }
    Double_t angle=90.-a;
    Double_t angleStepD=angle/5;
    Int_t angleStepI=Int_t(angleStepD);
    if(angleStepI==18)angleStepI=17;      // if angle==90, angleStepI=18 ->not defined
  
    HMdcCal2ParAngle& rAngle =(*this)[s][m][angleStepI];// pointer to the first set
    HMdcCal2ParAngle& rAngle2=(angleStepI<17) ? (*this)[s][m][angleStepI+1] : rAngle;

    Double_t dminF=time/4.;
    Int_t dminI=Int_t(dminF); 

    Double_t finalDistance;
    if(dminI>98)
    {   // drift time outside matrix
	Double_t y1=(time-396)/myslopeOutside + rAngle.distance[99];
	Double_t y2=(time-396)/myslopeOutside + rAngle2.distance[99];

	Double_t t=angleStepD - angleStepI;

        finalDistance=y1-t*(y1-y2);
	return finalDistance;
    }

    //#################################### calc distance ######################
    Double_t y1=rAngle.distance [dminI];
    Double_t y2=rAngle2.distance[dminI];
    Double_t y3=rAngle2.distance[dminI+1];
    Double_t y4=rAngle.distance [dminI+1];

    Double_t t=angleStepD - angleStepI;
    Double_t u=dminF - dminI;

    finalDistance=y1-t*(y1-y2)-u*(y1-y4)+t*u*(y1-y2+y3-y4);
    return finalDistance;
}
Double_t HMdcCal2Par::calcDistanceErr(Int_t s,Int_t m,Double_t a,Double_t time) {
    // This function calculates the Error of distance from sense wire for a given drift time.
    // A Interpolation between the two closest angle steps
    // is performed and the distance value returned.
    // Input is the angle of the track (alphaTrack:90 degree for perpendicular impact),which
    // has to be recalculated to the angle of minimum drift distance (alphaDrDist:0 degree for
    // perpendicular impact).
    //   y ^
    //     |  |------------*----|              cathod  plane
    //     |  | cell        *   |
    //     |  |            / *  |
    //     |  |           /90 * |
    //     |  | driftDist/     *|
    //     |  |         / |     *
    //   --|--|--------*^-|-----|*--------->   sense/potential plane
    //     |  |           |     | *        x
    //     |  |      alphaDrDist|  *
    //        |                 |/  *          alphaDriftDist=90-alphaTrack
    //        |      alphaTrack /    *
    //        |-----------------|     * track  cathod plane
    //
    // angles must be between 0 and 90 degree, all other angles have to be shifted
    // before calling the function.
    if(time<0)
    {
	return -1;
    }
    Double_t angle=90.-a;
    Double_t angleStepD=angle/5;
    Int_t angleStepI=Int_t(angleStepD);
    if(angleStepI==18)angleStepI=17;      // if angle==90, angleStepI=18 ->not defined
  
    HMdcCal2ParAngle& rAngle =(*this)[s][m][angleStepI];// pointer to the first set
    HMdcCal2ParAngle& rAngle2=(angleStepI<17) ? (*this)[s][m][angleStepI+1] : rAngle;

    Double_t dminF=time/4.;
    Int_t dminI=Int_t(dminF); 

    Double_t finalErr;
    if(dminI>98)
    {   // drift time outside matrix
	Double_t y1= rAngle.distance[99];
	Double_t y2= rAngle2.distance[99];

	Double_t t=angleStepD - angleStepI;

        finalErr=y1-t*(y1-y2);
	return finalErr;
    }

    //#################################### calc distance Error ######################
    Double_t y1=rAngle.distanceErr [dminI];
    Double_t y2=rAngle2.distanceErr[dminI];
    Double_t y3=rAngle2.distanceErr[dminI+1];
    Double_t y4=rAngle.distanceErr [dminI+1];

    Double_t t=angleStepD - angleStepI;
    Double_t u=dminF - dminI;

    finalErr=y1-t*(y1-y2)-u*(y1-y4)+t*u*(y1-y2+y3-y4);
    return finalErr;
}
void HMdcCal2Par::calcDistance(Int_t s,Int_t m,Double_t a,Double_t time
			      ,Double_t*dist,Double_t*distErr)
{
    // This function calculates the distance from sense wire for a given drift time.
    // A Interpolation between the two closest angle steps
    // is performed and the distance value returned.
    // Input is the angle of the track (alphaTrack:90 degree for perpendicular impact),which
    // has to be recalculated to the angle of minimum drift distance (alphaDrDist:0 degree for
    // perpendicular impact).
    //   y ^
    //     |  |------------*----|              cathod  plane
    //     |  | cell        *   |
    //     |  |            / *  |
    //     |  |           /90 * |
    //     |  | driftDist/     *|
    //     |  |         / |     *
    //   --|--|--------*^-|-----|*--------->   sense/potential plane
    //     |  |           |     | *        x
    //     |  |      alphaDrDist|  *
    //        |                 |/  *          alphaDriftDist=90-alphaTrack
    //        |      alphaTrack /    *
    //        |-----------------|     * track  cathod plane
    //
    // angles must be between 0 and 90 degree, all other angles have to be shifted
    // before calling the function.
    // Distance and Error of Distance are returned to Float pointers
    if(time<0)
    {
	*dist   =-1;
	*distErr=-1;
    }
    else
    {
	Double_t angle=90.-a;
	Double_t angleStepD=angle/5;
	Int_t angleStepI=Int_t(angleStepD);
	if(angleStepI==18)angleStepI=17;      // if angle==90, angleStepI=18 ->not defined

	HMdcCal2ParAngle& rAngle =(*this)[s][m][angleStepI];// pointer to the first set
	HMdcCal2ParAngle& rAngle2=(angleStepI<17) ? (*this)[s][m][angleStepI+1] : rAngle;

	Double_t dminF=time/4.;
	Int_t dminI=Int_t(dminF);

	if(dminI>98)
	{   // drift time outside matrix
	    Double_t y1=(time-396)/myslopeOutside + rAngle.distance[99];
	    Double_t y2=(time-396)/myslopeOutside + rAngle2.distance[99];

	    Double_t t=angleStepD - angleStepI;

	    *dist=y1-t*(y1-y2);

	    y1=rAngle.distance[99];
	    y2=rAngle2.distance[99];

	    *distErr=y1-t*(y1-y2);
	}
	else
	{
	    //#################################### calc distance ######################
	    Double_t y1=rAngle.distance [dminI];
	    Double_t y2=rAngle2.distance[dminI];
	    Double_t y3=rAngle2.distance[dminI+1];
	    Double_t y4=rAngle.distance [dminI+1];

	    Double_t t=angleStepD - angleStepI;
	    Double_t u=dminF - dminI;

	    *dist=y1-t*(y1-y2)-u*(y1-y4)+t*u*(y1-y2+y3-y4);

	    //################################ calc errors ######################################
	    y1=rAngle.distanceErr [dminI];
	    y2=rAngle2.distanceErr[dminI];
	    y3=rAngle2.distanceErr[dminI+1];
	    y4=rAngle.distanceErr [dminI+1];

	    *distErr=y1-t*(y1-y2)-u*(y1-y4)+t*u*(y1-y2+y3-y4);
	}
    }
}
Int_t HMdcCal2Par::write(HParIo* output) {
    // writes the container to an output
    if (strcmp(output->IsA()->GetName(),"HParAsciiFileIo")==0)
    {
	HDetParIo* out=output->getDetParIo("HMdcParIo");
	if (out) return out->write(this);
    }
    changed=kFALSE;
    return 0;
}
void HMdcCal2Par::putAsciiHeader(TString& header) {
  // puts the ascii header to the string used in HMdcParAsciiFileIo
  header=
	"# Cal2 Calibration parameters of the MDC\n"
	"# time -> distance\n"
	"# Format: type: 0=dist, 1=distErr\n"
	"# sector  module  angle type par0 par1 par2 par3 par4 par5 pa6 par7 par8 par9 par10\n";
}

Bool_t HMdcCal2Par::writeline(Char_t *buf, Int_t sec, Int_t mod, Int_t angle) {
  // writes one line to the buffer used by ascii file I/O
 Bool_t r = kTRUE;
 if (fMdc) {
     if (fMdc->getModule(sec,mod) != 0) {
	 if  (sec>-1 && sec<getSize()) {
	     HMdcCal2ParSec &sector = (*this)[sec];
	     if (mod>-1 && mod<sector.getSize()) {

		 HMdcCal2ParAngle& rAngle=(*this)[sec][mod][angle];
		 Char_t dummy[20];

		 if(linecounterwrite%10==0&&linecounterwrite>1)
		 {
		     linecounterwrite=0;
		     type++;
		 }
                 if(type>1)
		 {
		    type=0;
		 }
		 sprintf(dummy,"%1i %1i %2i %1i",sec, mod, angle, type);
		 switch (type){
		 case 0:
		     sprintf(buf,"%s %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f\n",
			     dummy,
			     rAngle.getDistance(linecounterwrite,0),rAngle.getDistance(linecounterwrite,1),
			     rAngle.getDistance(linecounterwrite,2),rAngle.getDistance(linecounterwrite,3),
			     rAngle.getDistance(linecounterwrite,4),rAngle.getDistance(linecounterwrite,5),
			     rAngle.getDistance(linecounterwrite,6),rAngle.getDistance(linecounterwrite,7),
			     rAngle.getDistance(linecounterwrite,8),rAngle.getDistance(linecounterwrite,9) );
		     break;
		 case 1:
		     sprintf(buf,"%s %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f\n",
			     dummy,
			     rAngle.getDistanceError(linecounterwrite,0),rAngle.getDistanceError(linecounterwrite,1),
			     rAngle.getDistanceError(linecounterwrite,2),rAngle.getDistanceError(linecounterwrite,3),
			     rAngle.getDistanceError(linecounterwrite,4),rAngle.getDistanceError(linecounterwrite,5),
			     rAngle.getDistanceError(linecounterwrite,6),rAngle.getDistanceError(linecounterwrite,7),
			     rAngle.getDistanceError(linecounterwrite,8),rAngle.getDistanceError(linecounterwrite,9) );
		     break;
		 default:Error("HMdcCal2Par::writeline()","argument \"type\" out of range ");
                 break;
		 }

		 linecounterwrite++;
	     } else r = kFALSE;
	 }  else r = kFALSE;
     } else { strcpy(buf,""); }
 }

 return r;
}

void HMdcCal2Par::clear() {
  // clears the container
  for(Int_t s=0;s<getSize();s++) {
    HMdcCal2ParSec& sec=(*this)[s];
    for(Int_t m=0;m<sec.getSize();m++) {
      HMdcCal2ParMod& mod=sec[m];
      for(Int_t l=0;l<18;l++) {
          HMdcCal2ParAngle& angle=mod[l];
          angle.clear();
      }
    }
  }
  status=kFALSE;
  resetInputVersions();
}
void HMdcCal2Par::printParam() {
  // prints the container
    for(Int_t s=0;s<getSize();s++) {
	HMdcCal2ParSec& sec=(*this)[s];
	for(Int_t m=0;m<sec.getSize();m++) {
	    HMdcCal2ParMod& mod=sec[m];
	    for(Int_t l=0;l<18;l++) {
		HMdcCal2ParAngle& rAngle=mod[l];
		for(Int_t mytype=0;mytype<2;mytype++){
		    for(Int_t myline=0;myline<10;myline++){
		        gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),"%1i %1i %2i %1i",s, m, l, mytype);
			switch (mytype){
			case 0:
			    gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),
				"%7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f\n",
				rAngle.getDistance(myline,0),rAngle.getDistance(myline,1),
				rAngle.getDistance(myline,2),rAngle.getDistance(myline,3),
				rAngle.getDistance(myline,4),rAngle.getDistance(myline,5),
				rAngle.getDistance(myline,6),rAngle.getDistance(myline,7),
				rAngle.getDistance(myline,8),rAngle.getDistance(myline,9) );
			    break;
			case 1:
			    gHades->getMsg()->info(10,HMessageMgr::DET_MDC,GetName(),
				"%7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f %7.4f\n",
				rAngle.getDistanceError(myline,0),rAngle.getDistanceError(myline,1),
				rAngle.getDistanceError(myline,2),rAngle.getDistanceError(myline,3),
				rAngle.getDistanceError(myline,4),rAngle.getDistanceError(myline,5),
				rAngle.getDistanceError(myline,6),rAngle.getDistanceError(myline,7),
				rAngle.getDistanceError(myline,8),rAngle.getDistanceError(myline,9) );
			    break;
			default:Error("HMdcCal2Par::printParam()","argument \"type\" out of range ");
			break;
			}
		    }
		}
	    }
	}
    }
}
 hmdccal2par.cc:1
 hmdccal2par.cc:2
 hmdccal2par.cc:3
 hmdccal2par.cc:4
 hmdccal2par.cc:5
 hmdccal2par.cc:6
 hmdccal2par.cc:7
 hmdccal2par.cc:8
 hmdccal2par.cc:9
 hmdccal2par.cc:10
 hmdccal2par.cc:11
 hmdccal2par.cc:12
 hmdccal2par.cc:13
 hmdccal2par.cc:14
 hmdccal2par.cc:15
 hmdccal2par.cc:16
 hmdccal2par.cc:17
 hmdccal2par.cc:18
 hmdccal2par.cc:19
 hmdccal2par.cc:20
 hmdccal2par.cc:21
 hmdccal2par.cc:22
 hmdccal2par.cc:23
 hmdccal2par.cc:24
 hmdccal2par.cc:25
 hmdccal2par.cc:26
 hmdccal2par.cc:27
 hmdccal2par.cc:28
 hmdccal2par.cc:29
 hmdccal2par.cc:30
 hmdccal2par.cc:31
 hmdccal2par.cc:32
 hmdccal2par.cc:33
 hmdccal2par.cc:34
 hmdccal2par.cc:35
 hmdccal2par.cc:36
 hmdccal2par.cc:37
 hmdccal2par.cc:38
 hmdccal2par.cc:39
 hmdccal2par.cc:40
 hmdccal2par.cc:41
 hmdccal2par.cc:42
 hmdccal2par.cc:43
 hmdccal2par.cc:44
 hmdccal2par.cc:45
 hmdccal2par.cc:46
 hmdccal2par.cc:47
 hmdccal2par.cc:48
 hmdccal2par.cc:49
 hmdccal2par.cc:50
 hmdccal2par.cc:51
 hmdccal2par.cc:52
 hmdccal2par.cc:53
 hmdccal2par.cc:54
 hmdccal2par.cc:55
 hmdccal2par.cc:56
 hmdccal2par.cc:57
 hmdccal2par.cc:58
 hmdccal2par.cc:59
 hmdccal2par.cc:60
 hmdccal2par.cc:61
 hmdccal2par.cc:62
 hmdccal2par.cc:63
 hmdccal2par.cc:64
 hmdccal2par.cc:65
 hmdccal2par.cc:66
 hmdccal2par.cc:67
 hmdccal2par.cc:68
 hmdccal2par.cc:69
 hmdccal2par.cc:70
 hmdccal2par.cc:71
 hmdccal2par.cc:72
 hmdccal2par.cc:73
 hmdccal2par.cc:74
 hmdccal2par.cc:75
 hmdccal2par.cc:76
 hmdccal2par.cc:77
 hmdccal2par.cc:78
 hmdccal2par.cc:79
 hmdccal2par.cc:80
 hmdccal2par.cc:81
 hmdccal2par.cc:82
 hmdccal2par.cc:83
 hmdccal2par.cc:84
 hmdccal2par.cc:85
 hmdccal2par.cc:86
 hmdccal2par.cc:87
 hmdccal2par.cc:88
 hmdccal2par.cc:89
 hmdccal2par.cc:90
 hmdccal2par.cc:91
 hmdccal2par.cc:92
 hmdccal2par.cc:93
 hmdccal2par.cc:94
 hmdccal2par.cc:95
 hmdccal2par.cc:96
 hmdccal2par.cc:97
 hmdccal2par.cc:98
 hmdccal2par.cc:99
 hmdccal2par.cc:100
 hmdccal2par.cc:101
 hmdccal2par.cc:102
 hmdccal2par.cc:103
 hmdccal2par.cc:104
 hmdccal2par.cc:105
 hmdccal2par.cc:106
 hmdccal2par.cc:107
 hmdccal2par.cc:108
 hmdccal2par.cc:109
 hmdccal2par.cc:110
 hmdccal2par.cc:111
 hmdccal2par.cc:112
 hmdccal2par.cc:113
 hmdccal2par.cc:114
 hmdccal2par.cc:115
 hmdccal2par.cc:116
 hmdccal2par.cc:117
 hmdccal2par.cc:118
 hmdccal2par.cc:119
 hmdccal2par.cc:120
 hmdccal2par.cc:121
 hmdccal2par.cc:122
 hmdccal2par.cc:123
 hmdccal2par.cc:124
 hmdccal2par.cc:125
 hmdccal2par.cc:126
 hmdccal2par.cc:127
 hmdccal2par.cc:128
 hmdccal2par.cc:129
 hmdccal2par.cc:130
 hmdccal2par.cc:131
 hmdccal2par.cc:132
 hmdccal2par.cc:133
 hmdccal2par.cc:134
 hmdccal2par.cc:135
 hmdccal2par.cc:136
 hmdccal2par.cc:137
 hmdccal2par.cc:138
 hmdccal2par.cc:139
 hmdccal2par.cc:140
 hmdccal2par.cc:141
 hmdccal2par.cc:142
 hmdccal2par.cc:143
 hmdccal2par.cc:144
 hmdccal2par.cc:145
 hmdccal2par.cc:146
 hmdccal2par.cc:147
 hmdccal2par.cc:148
 hmdccal2par.cc:149
 hmdccal2par.cc:150
 hmdccal2par.cc:151
 hmdccal2par.cc:152
 hmdccal2par.cc:153
 hmdccal2par.cc:154
 hmdccal2par.cc:155
 hmdccal2par.cc:156
 hmdccal2par.cc:157
 hmdccal2par.cc:158
 hmdccal2par.cc:159
 hmdccal2par.cc:160
 hmdccal2par.cc:161
 hmdccal2par.cc:162
 hmdccal2par.cc:163
 hmdccal2par.cc:164
 hmdccal2par.cc:165
 hmdccal2par.cc:166
 hmdccal2par.cc:167
 hmdccal2par.cc:168
 hmdccal2par.cc:169
 hmdccal2par.cc:170
 hmdccal2par.cc:171
 hmdccal2par.cc:172
 hmdccal2par.cc:173
 hmdccal2par.cc:174
 hmdccal2par.cc:175
 hmdccal2par.cc:176
 hmdccal2par.cc:177
 hmdccal2par.cc:178
 hmdccal2par.cc:179
 hmdccal2par.cc:180
 hmdccal2par.cc:181
 hmdccal2par.cc:182
 hmdccal2par.cc:183
 hmdccal2par.cc:184
 hmdccal2par.cc:185
 hmdccal2par.cc:186
 hmdccal2par.cc:187
 hmdccal2par.cc:188
 hmdccal2par.cc:189
 hmdccal2par.cc:190
 hmdccal2par.cc:191
 hmdccal2par.cc:192
 hmdccal2par.cc:193
 hmdccal2par.cc:194
 hmdccal2par.cc:195
 hmdccal2par.cc:196
 hmdccal2par.cc:197
 hmdccal2par.cc:198
 hmdccal2par.cc:199
 hmdccal2par.cc:200
 hmdccal2par.cc:201
 hmdccal2par.cc:202
 hmdccal2par.cc:203
 hmdccal2par.cc:204
 hmdccal2par.cc:205
 hmdccal2par.cc:206
 hmdccal2par.cc:207
 hmdccal2par.cc:208
 hmdccal2par.cc:209
 hmdccal2par.cc:210
 hmdccal2par.cc:211
 hmdccal2par.cc:212
 hmdccal2par.cc:213
 hmdccal2par.cc:214
 hmdccal2par.cc:215
 hmdccal2par.cc:216
 hmdccal2par.cc:217
 hmdccal2par.cc:218
 hmdccal2par.cc:219
 hmdccal2par.cc:220
 hmdccal2par.cc:221
 hmdccal2par.cc:222
 hmdccal2par.cc:223
 hmdccal2par.cc:224
 hmdccal2par.cc:225
 hmdccal2par.cc:226
 hmdccal2par.cc:227
 hmdccal2par.cc:228
 hmdccal2par.cc:229
 hmdccal2par.cc:230
 hmdccal2par.cc:231
 hmdccal2par.cc:232
 hmdccal2par.cc:233
 hmdccal2par.cc:234
 hmdccal2par.cc:235
 hmdccal2par.cc:236
 hmdccal2par.cc:237
 hmdccal2par.cc:238
 hmdccal2par.cc:239
 hmdccal2par.cc:240
 hmdccal2par.cc:241
 hmdccal2par.cc:242
 hmdccal2par.cc:243
 hmdccal2par.cc:244
 hmdccal2par.cc:245
 hmdccal2par.cc:246
 hmdccal2par.cc:247
 hmdccal2par.cc:248
 hmdccal2par.cc:249
 hmdccal2par.cc:250
 hmdccal2par.cc:251
 hmdccal2par.cc:252
 hmdccal2par.cc:253
 hmdccal2par.cc:254
 hmdccal2par.cc:255
 hmdccal2par.cc:256
 hmdccal2par.cc:257
 hmdccal2par.cc:258
 hmdccal2par.cc:259
 hmdccal2par.cc:260
 hmdccal2par.cc:261
 hmdccal2par.cc:262
 hmdccal2par.cc:263
 hmdccal2par.cc:264
 hmdccal2par.cc:265
 hmdccal2par.cc:266
 hmdccal2par.cc:267
 hmdccal2par.cc:268
 hmdccal2par.cc:269
 hmdccal2par.cc:270
 hmdccal2par.cc:271
 hmdccal2par.cc:272
 hmdccal2par.cc:273
 hmdccal2par.cc:274
 hmdccal2par.cc:275
 hmdccal2par.cc:276
 hmdccal2par.cc:277
 hmdccal2par.cc:278
 hmdccal2par.cc:279
 hmdccal2par.cc:280
 hmdccal2par.cc:281
 hmdccal2par.cc:282
 hmdccal2par.cc:283
 hmdccal2par.cc:284
 hmdccal2par.cc:285
 hmdccal2par.cc:286
 hmdccal2par.cc:287
 hmdccal2par.cc:288
 hmdccal2par.cc:289
 hmdccal2par.cc:290
 hmdccal2par.cc:291
 hmdccal2par.cc:292
 hmdccal2par.cc:293
 hmdccal2par.cc:294
 hmdccal2par.cc:295
 hmdccal2par.cc:296
 hmdccal2par.cc:297
 hmdccal2par.cc:298
 hmdccal2par.cc:299
 hmdccal2par.cc:300
 hmdccal2par.cc:301
 hmdccal2par.cc:302
 hmdccal2par.cc:303
 hmdccal2par.cc:304
 hmdccal2par.cc:305
 hmdccal2par.cc:306
 hmdccal2par.cc:307
 hmdccal2par.cc:308
 hmdccal2par.cc:309
 hmdccal2par.cc:310
 hmdccal2par.cc:311
 hmdccal2par.cc:312
 hmdccal2par.cc:313
 hmdccal2par.cc:314
 hmdccal2par.cc:315
 hmdccal2par.cc:316
 hmdccal2par.cc:317
 hmdccal2par.cc:318
 hmdccal2par.cc:319
 hmdccal2par.cc:320
 hmdccal2par.cc:321
 hmdccal2par.cc:322
 hmdccal2par.cc:323
 hmdccal2par.cc:324
 hmdccal2par.cc:325
 hmdccal2par.cc:326
 hmdccal2par.cc:327
 hmdccal2par.cc:328
 hmdccal2par.cc:329
 hmdccal2par.cc:330
 hmdccal2par.cc:331
 hmdccal2par.cc:332
 hmdccal2par.cc:333
 hmdccal2par.cc:334
 hmdccal2par.cc:335
 hmdccal2par.cc:336
 hmdccal2par.cc:337
 hmdccal2par.cc:338
 hmdccal2par.cc:339
 hmdccal2par.cc:340
 hmdccal2par.cc:341
 hmdccal2par.cc:342
 hmdccal2par.cc:343
 hmdccal2par.cc:344
 hmdccal2par.cc:345
 hmdccal2par.cc:346
 hmdccal2par.cc:347
 hmdccal2par.cc:348
 hmdccal2par.cc:349
 hmdccal2par.cc:350
 hmdccal2par.cc:351
 hmdccal2par.cc:352
 hmdccal2par.cc:353
 hmdccal2par.cc:354
 hmdccal2par.cc:355
 hmdccal2par.cc:356
 hmdccal2par.cc:357
 hmdccal2par.cc:358
 hmdccal2par.cc:359
 hmdccal2par.cc:360
 hmdccal2par.cc:361
 hmdccal2par.cc:362
 hmdccal2par.cc:363
 hmdccal2par.cc:364
 hmdccal2par.cc:365
 hmdccal2par.cc:366
 hmdccal2par.cc:367
 hmdccal2par.cc:368
 hmdccal2par.cc:369
 hmdccal2par.cc:370
 hmdccal2par.cc:371
 hmdccal2par.cc:372
 hmdccal2par.cc:373
 hmdccal2par.cc:374
 hmdccal2par.cc:375
 hmdccal2par.cc:376
 hmdccal2par.cc:377
 hmdccal2par.cc:378
 hmdccal2par.cc:379
 hmdccal2par.cc:380
 hmdccal2par.cc:381
 hmdccal2par.cc:382
 hmdccal2par.cc:383
 hmdccal2par.cc:384
 hmdccal2par.cc:385
 hmdccal2par.cc:386
 hmdccal2par.cc:387
 hmdccal2par.cc:388
 hmdccal2par.cc:389
 hmdccal2par.cc:390
 hmdccal2par.cc:391
 hmdccal2par.cc:392
 hmdccal2par.cc:393
 hmdccal2par.cc:394
 hmdccal2par.cc:395
 hmdccal2par.cc:396
 hmdccal2par.cc:397
 hmdccal2par.cc:398
 hmdccal2par.cc:399
 hmdccal2par.cc:400
 hmdccal2par.cc:401
 hmdccal2par.cc:402
 hmdccal2par.cc:403
 hmdccal2par.cc:404
 hmdccal2par.cc:405
 hmdccal2par.cc:406
 hmdccal2par.cc:407
 hmdccal2par.cc:408
 hmdccal2par.cc:409
 hmdccal2par.cc:410
 hmdccal2par.cc:411
 hmdccal2par.cc:412
 hmdccal2par.cc:413
 hmdccal2par.cc:414
 hmdccal2par.cc:415
 hmdccal2par.cc:416
 hmdccal2par.cc:417
 hmdccal2par.cc:418
 hmdccal2par.cc:419
 hmdccal2par.cc:420
 hmdccal2par.cc:421
 hmdccal2par.cc:422
 hmdccal2par.cc:423
 hmdccal2par.cc:424
 hmdccal2par.cc:425
 hmdccal2par.cc:426
 hmdccal2par.cc:427
 hmdccal2par.cc:428
 hmdccal2par.cc:429
 hmdccal2par.cc:430
 hmdccal2par.cc:431
 hmdccal2par.cc:432
 hmdccal2par.cc:433
 hmdccal2par.cc:434
 hmdccal2par.cc:435
 hmdccal2par.cc:436
 hmdccal2par.cc:437
 hmdccal2par.cc:438
 hmdccal2par.cc:439
 hmdccal2par.cc:440
 hmdccal2par.cc:441
 hmdccal2par.cc:442
 hmdccal2par.cc:443
 hmdccal2par.cc:444
 hmdccal2par.cc:445
 hmdccal2par.cc:446
 hmdccal2par.cc:447
 hmdccal2par.cc:448
 hmdccal2par.cc:449
 hmdccal2par.cc:450
 hmdccal2par.cc:451
 hmdccal2par.cc:452
 hmdccal2par.cc:453
 hmdccal2par.cc:454
 hmdccal2par.cc:455
 hmdccal2par.cc:456
 hmdccal2par.cc:457
 hmdccal2par.cc:458
 hmdccal2par.cc:459
 hmdccal2par.cc:460
 hmdccal2par.cc:461
 hmdccal2par.cc:462
 hmdccal2par.cc:463
 hmdccal2par.cc:464
 hmdccal2par.cc:465
 hmdccal2par.cc:466
 hmdccal2par.cc:467
 hmdccal2par.cc:468
 hmdccal2par.cc:469
 hmdccal2par.cc:470
 hmdccal2par.cc:471
 hmdccal2par.cc:472
 hmdccal2par.cc:473
 hmdccal2par.cc:474
 hmdccal2par.cc:475
 hmdccal2par.cc:476
 hmdccal2par.cc:477
 hmdccal2par.cc:478
 hmdccal2par.cc:479
 hmdccal2par.cc:480
 hmdccal2par.cc:481
 hmdccal2par.cc:482
 hmdccal2par.cc:483
 hmdccal2par.cc:484
 hmdccal2par.cc:485
 hmdccal2par.cc:486
 hmdccal2par.cc:487
 hmdccal2par.cc:488
 hmdccal2par.cc:489
 hmdccal2par.cc:490
 hmdccal2par.cc:491
 hmdccal2par.cc:492
 hmdccal2par.cc:493
 hmdccal2par.cc:494
 hmdccal2par.cc:495
 hmdccal2par.cc:496
 hmdccal2par.cc:497
 hmdccal2par.cc:498
 hmdccal2par.cc:499
 hmdccal2par.cc:500
 hmdccal2par.cc:501
 hmdccal2par.cc:502
 hmdccal2par.cc:503
 hmdccal2par.cc:504
 hmdccal2par.cc:505
 hmdccal2par.cc:506
 hmdccal2par.cc:507
 hmdccal2par.cc:508
 hmdccal2par.cc:509
 hmdccal2par.cc:510
 hmdccal2par.cc:511
 hmdccal2par.cc:512
 hmdccal2par.cc:513
 hmdccal2par.cc:514
 hmdccal2par.cc:515
 hmdccal2par.cc:516
 hmdccal2par.cc:517
 hmdccal2par.cc:518
 hmdccal2par.cc:519
 hmdccal2par.cc:520
 hmdccal2par.cc:521
 hmdccal2par.cc:522
 hmdccal2par.cc:523
 hmdccal2par.cc:524
 hmdccal2par.cc:525
 hmdccal2par.cc:526
 hmdccal2par.cc:527
 hmdccal2par.cc:528
 hmdccal2par.cc:529
 hmdccal2par.cc:530
 hmdccal2par.cc:531
 hmdccal2par.cc:532
 hmdccal2par.cc:533
 hmdccal2par.cc:534
 hmdccal2par.cc:535
 hmdccal2par.cc:536
 hmdccal2par.cc:537
 hmdccal2par.cc:538
 hmdccal2par.cc:539
 hmdccal2par.cc:540
 hmdccal2par.cc:541
 hmdccal2par.cc:542
 hmdccal2par.cc:543
 hmdccal2par.cc:544
 hmdccal2par.cc:545
 hmdccal2par.cc:546
 hmdccal2par.cc:547
 hmdccal2par.cc:548
 hmdccal2par.cc:549
 hmdccal2par.cc:550
 hmdccal2par.cc:551
 hmdccal2par.cc:552
 hmdccal2par.cc:553
 hmdccal2par.cc:554
 hmdccal2par.cc:555
 hmdccal2par.cc:556
 hmdccal2par.cc:557
 hmdccal2par.cc:558
 hmdccal2par.cc:559
 hmdccal2par.cc:560
 hmdccal2par.cc:561
 hmdccal2par.cc:562
 hmdccal2par.cc:563
 hmdccal2par.cc:564
 hmdccal2par.cc:565
 hmdccal2par.cc:566
 hmdccal2par.cc:567
 hmdccal2par.cc:568
 hmdccal2par.cc:569
 hmdccal2par.cc:570
 hmdccal2par.cc:571
 hmdccal2par.cc:572
 hmdccal2par.cc:573