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

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////
// HMdcGarReader
// Class to read several GARFIELD formats
////////////////////////////////////////////////////////////////////////////
using namespace std;
#include <stdlib.h>
#include <iostream> 
#include <fstream>
#include <iomanip>
#include "hmdcgarreader.h"
#include "htool.h"
#include "TMath.h"
#include "TArray.h"
#include "TStyle.h"

ClassImp(HMdcGarReader)

HMdcGarReader::HMdcGarReader(const Char_t* name,const Char_t* title)
    : TNamed(name,title)
{
    // constructor for HMdcGarReader
    initVariables();
}
HMdcGarReader::~HMdcGarReader()
{
  // destructor of HMdcGarReader
}
void HMdcGarReader::initVariables()
{
    // inits all variables
}
TGraph* HMdcGarReader::readXT(TString inputname,Int_t color)
{
    // Reads GARFIELD XT curve from ascii input "inputname" into a TGraph
    // with LineColor "color", which is returned

    gStyle->SetPalette(50);
    FILE* input=0;
    if(!HTool::openAscii(&input,inputname,"r"))
    {
	exit(1);
    }
    cout<<"HMdcGarReader::readXT() , Reading XT-data from GARFIELD file\n"<<inputname.Data()<<endl;

    TArrayF distance;
    TArrayF drifttime;

    Int_t numberOfBins=0;

    Char_t line[400];
    Int_t scan_count;
    Float_t  f_x ,f_t;
    Char_t Tag[]=" This member contains";
    Bool_t res=kTRUE;
    while(1)
    {
	if(feof(input)) break;
	res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;
	if (!strncmp(line, Tag ,strlen(Tag)))
	{
            sscanf(line,"%*s%*s%*s%i%*s",&numberOfBins);
	    distance .Set(numberOfBins);
            drifttime.Set(numberOfBins);
	    break;
	}
    }
    Int_t count=0;
    while (count<numberOfBins)  {
	if (feof(input)) break;

	res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;
	scan_count=sscanf(line,"%*s%e%e",&f_x, &f_t);

	if(scan_count==2)
	{
	    distance [count]=f_x*10;
	    drifttime[count]=f_t*1000;
	    printf("%03i distance %7.3f mm drift time %7.3f ns\n",count,distance [count],drifttime[count]);
	    count++;
	}
    }

    Float_t* gdist =new Float_t[count];
    Float_t* gdrift=new Float_t[count];

    for(Int_t i=0;i<count;i++)
    {
        gdist [i]=distance [i];
        gdrift[i]=drifttime[i];
    }

    TGraph* h=new TGraph(count,gdist,gdrift);

    h->SetMarkerStyle(29);
    h->SetMarkerColor(4);
    h->SetMarkerSize(.8);
    h->SetLineColor(color);

    HTool::closeAscii(&input);
    return h;
}
TGraph* HMdcGarReader::readXTdiffusion(TString inputname,Int_t color)
{
    // Reads GARFIELD integrated diffusion curve from ascii input "inputname" into a TGraph
    // with LineColor "color", which is returned

    gStyle->SetPalette(50);
    FILE* input=0;
    if(!HTool::openAscii(&input,inputname,"r"))
    {
	exit(1);
    }
    cout<<"HMdcGarReader::readXTdiffusion() , Reading XT-integrated diffusion data from GARFIELD file\n"<<inputname.Data()<<endl;

    TArrayF distance;
    TArrayF drifttime;

    Int_t numberOfBins=0;

    Char_t line[400];
    Int_t scan_count;
    Float_t  f_x ,f_t;
    Char_t Tag[]=" This member contains";

    Bool_t res=kTRUE;
    while(1)
    {
	if(feof(input)) break;
	res=fgets(line, sizeof(line), input);
	if(!res) cout<<"could not read next line!"<<endl;
	if (!strncmp(line, Tag ,strlen(Tag)))
	{
            sscanf(line,"%*s%*s%*s%i%*s",&numberOfBins);
	    distance .Set(numberOfBins);
            drifttime.Set(numberOfBins);
	    break;
	}
    }
    Int_t count=0;
    while (count<numberOfBins)  {
	if (feof(input)) break;

	res=fgets(line, sizeof(line), input);
	if(!res) cout<<"could not read next line!"<<endl;
	scan_count=sscanf(line,"%*s%e%*s%*s%e",&f_x, &f_t);

	if(scan_count==2)
	{
	    distance [count]=f_x*10;
	    drifttime[count]=f_t*1000;
	    printf("%03i distance %7.3f mm integrated diffusion %7.3f ns\n",count,distance [count],drifttime[count]);
	    count++;
	}
    }

    Float_t* gdist =new Float_t[count];
    Float_t* gdrift=new Float_t[count];

    for(Int_t i=0;i<count;i++)
    {
        gdist [i]=distance [i];
        gdrift[i]=drifttime[i];
    }

    TGraph* h=new TGraph(count,gdist,gdrift);

    h->SetMarkerStyle(29);
    h->SetMarkerColor(4);
    h->SetMarkerSize(.8);
    h->SetLineColor(color);

    HTool::closeAscii(&input);
    return h;
}
TGraph* HMdcGarReader::readMagboltzVdrift(TString inputname,Int_t color)
{
    // Reads MAGBOLTZ vdrift/E (E/P:Log10) curve from ascii input "inputname" into a TGraph
    // with LineColor "color", which is returned
    TGraph* h=0;

    gStyle->SetPalette(50);
    FILE* input=0;
    if(!HTool::openAscii(&input,inputname,"r"))
    {
	exit(1);
    }
    cout<<"HMdcGarReader::readMagboltz() , Reading Vdrift/E-data from MAGBOLTZ file\n"<<inputname.Data()<<endl;

    TArrayF ep;
    TArrayF Vdrift;
    ep.Set(100);
    Vdrift.Set(100);

    Int_t numberOfBins=0;
    Int_t version=0;
    Char_t line[400];
    Float_t  f_ep ,f_vdrift;
    Char_t Tag []=" The gas tables follow";
    Char_t Tag1[]=" Dimension : F";
    Char_t Tag2[]=" Version   :";
    Char_t Tag3[]=" E fields";
    Char_t Tag4[]=" E-B angles";
    TString buffer=" ";

    Int_t count=0;
    Bool_t res=kTRUE;
    while(1)
    {
	if(feof(input)) break;
	res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;
	if (!strncmp(line, Tag2 ,strlen(Tag2))) // version
        {   //  find version of format
            sscanf(line,"%*s%*s%i",&version);
            cout<<"version "<<version<<endl;
        }
	if (!strncmp(line, Tag1 ,strlen(Tag1)))  // E-Field values
	{   //  find number of entries
	    sscanf(line,"%*s%*s%*s%2i%*s%*s",&numberOfBins);
	    ep    .Set(numberOfBins);
            Vdrift.Set(numberOfBins);
	    break;
	}
    }
    Int_t found=0;
    while(1&&version>=4&&found==0)
    {   // read e-field in version 4
	if(feof(input)) break;
	res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;
	if (!strncmp(line, Tag3 ,strlen(Tag3))) // E-Field
        {
            found=1;
            while(1)
            {
                res=fgets(line, sizeof(line), input);
		if(!res) cout<<"could not read next line!"<<endl;
                if (!strncmp(line, Tag4 ,strlen(Tag4)))  //E-B angles
                {   // if next topic is entered break
                    break;
                }

                sscanf(line,"%e%e%e%e%e",&ep[count*5+0],&ep[count*5+1],&ep[count*5+2],&ep[count*5+3],&ep[count*5+4]);
                count++;
            }
        }
    }
    count=0;
    while(1)
    {
        if(feof(input)) break;
        res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;
        if (!strncmp(line, Tag ,strlen(Tag))) break;
    }

    
    while (count<numberOfBins)  {
	if (feof(input)) break;
	res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;
        if(version==3)
        {   // read old version 3
            sscanf(line,"%e%e%*s",
		   &f_ep, &f_vdrift);
            ep    [count]=f_ep;
            Vdrift[count]=f_vdrift*10;
        }
        else if(version==4)
        {   // read new version 4
            sscanf(line,"%e%*s",
		   &f_vdrift);
            Vdrift[count]=f_vdrift*10;
        }
        else if(version==6)
        {   // read new version 6
            sscanf(line,"%e%*s",
		   &f_vdrift);
            Vdrift[count]=f_vdrift*10;
        }
        printf("%03i ep %12.2f kV/cm*bar Vdrift %7.3f ns/mu\n",count,ep[count],Vdrift[count]);

	res=fgets(line, sizeof(line), input);
	res=fgets(line, sizeof(line), input);
	res=fgets(line, sizeof(line), input);
	if(!res) cout<<"could not read next line!"<<endl;

	count++;
    };

    Float_t* gep    =new Float_t[count];
    Float_t* gVdrift=new Float_t[count];

    for(Int_t i=0;i<count;i++)
    {
        gep    [i]=ep    [i];
	gVdrift[i]=Vdrift[i];
    }

    h=new TGraph(count,gep,gVdrift);

    h->SetMarkerStyle(29);
    h->SetMarkerColor(4);
    h->SetMarkerSize(.8);
    h->SetLineColor(color);

    HTool::closeAscii(&input);
    return h;
}
TGraph* HMdcGarReader::readMagboltzGasPrint(TString inputname,TString option,Int_t color)
{
    // Reads MAGBOLTZ townsend/E (E/P:Log10) curve from ascii input "inputname" into a TGraph
    // with LineColor "color", which is returned
    TGraph* h=0;

    gStyle->SetPalette(50);
    FILE* input=0;
    if(!HTool::openAscii(&input,inputname,"r"))
    {
	exit(1);
    }
    cout<<"HMdcGarReader::readMagboltzGasPrint() , Reading Gas-Print-data from MAGBOLTZ file\n"<<inputname.Data()<<endl;

    TArrayF ep;
    TArrayF data;
    ep.Set(100);
    data.Set(100);

    Char_t line[400];
    Float_t f_ep, f_data;
    Char_t Tag []="    [V/cm]";
    TString buffer=" ";
    Bool_t res=kTRUE;
    Int_t count=0;
    while(1)
    {
	if(feof(input)) break;
	res=fgets(line, sizeof(line), input);
	if(!res) cout<<"could not read next line!"<<endl;

	if (!strncmp(line, Tag ,strlen(Tag)))
        {
            //  find first line
	    break;
	}
    }

    while(1)
    {   // read
        if(feof(input)) break;
        res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;
	buffer=line;
        if(buffer.CompareTo("\n")==0)break;
        buffer.ReplaceAll("Not available","-1");
        if(option.CompareTo("vdrift")==0)
        {
            sscanf(buffer.Data(),"%f%f%*s%*s%*s%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=10*f_data;
            printf("%03i ep %12.2f kV/cm Vdrift %7.3f ns/mu\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("ionmobility")==0)
        {
            sscanf(buffer.Data(),"%f%*s%f%*s%*s%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm ion mobility %7.3f [cm2/V.musec]\n",count,ep[count],data[count]);
      
        }
        else if(option.CompareTo("diffusion_long")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%f%*s%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm diffusion Long_t %7.3f [micron for 1 cm]\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("diffusion_trans")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%*s%f%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm diffusion trans %7.3f [micron for 1 cm]\n",count,ep[count],data[count]);
  
        }
        else if(option.CompareTo("townsend")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%*s%*s%f%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm townsend %7.3f [1/cm]\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("attachment")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%*s%*s%*s%f%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm attachment %7.3f [1/cm]\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("lorentz")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%*s%*s%*s%*s%f",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm lorentz angle %7.3f [degrees]\n",count,ep[count],data[count]);
        }
        count++;
    }

    Float_t* gep    =new Float_t[count];
    Float_t* gdata  =new Float_t[count];

    for(Int_t i=0;i<count;i++)
    {
        gep  [i]=ep  [i];
	gdata[i]=data[i];
    }

    h=new TGraph(count,gep,gdata);

    h->SetMarkerStyle(29);
    h->SetMarkerColor(4);
    h->SetMarkerSize(.8);
    h->SetLineColor(color);

    HTool::closeAscii(&input);
    return h;
}
TGraph* HMdcGarReader::readMagboltzGasPrintVersion6(TString inputname,TString option,Int_t color)
{
    // Reads MAGBOLTZ townsend/E (E/P:Log10) curve from ascii input "inputname" into a TGraph
    // with LineColor "color", which is returned
    TGraph* h=0;

    gStyle->SetPalette(50);
    FILE* input=0;
    if(!HTool::openAscii(&input,inputname,"r"))
    {
	exit(1);
    }
    cout<<"HMdcGarReader::readMagboltzGasPrint() , Reading Gas-Print-data from MAGBOLTZ file\n"<<inputname.Data()<<endl;

    TArrayF ep;
    TArrayF data;
    ep.Set(100);
    data.Set(100);

    Char_t line[400];
    Float_t f_ep, f_data;
    Char_t Tag []="    [V/cm]";
    TString buffer=" ";

    Bool_t res=kTRUE;
    Int_t count=0;
    while(1)
    {
	if(feof(input)) break;
	res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;

	if (!strncmp(line, Tag ,strlen(Tag)))
        {
            //  find first line
	    break;
	}
    }

    while(1)
    {   // read
        if(feof(input)) break;
        res=fgets(line, sizeof(line), input);
        if(!res) cout<<"could not read next line!"<<endl;

	buffer=line;
        if(buffer.CompareTo("\n")==0)break;
        buffer.ReplaceAll("Not available","-1");
        if(option.CompareTo("vdrift")==0)
        {
            sscanf(buffer.Data(),"%f%f%*s%*s%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=10*f_data;
            printf("%03i ep %12.2f kV/cm Vdrift %7.3f ns/mu\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("ionmobility")==0)
        {
            sscanf(buffer.Data(),"%f%*s%f%*s%*s%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm ion mobility %7.3f [cm2/V.musec]\n",count,ep[count],data[count]);
      
        }
        else if(option.CompareTo("diffusion_long")==0)
        {
            sscanf(buffer.Data(),"%f%*s%f%*s%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm diffusion Long_t %7.3f [micron for 1 cm]\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("diffusion_trans")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%f%*s%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm diffusion trans %7.3f [micron for 1 cm]\n",count,ep[count],data[count]);
  
        }
        else if(option.CompareTo("townsend")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%*s%f%*s%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm townsend %7.3f [1/cm]\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("attachment")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%*s%*s%f%*s",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm attachment %7.3f [1/cm]\n",count,ep[count],data[count]);
        }
        else if(option.CompareTo("lorentz")==0)
        {
            sscanf(buffer.Data(),"%f%*s%*s%*s%*s%*s%f",&f_ep,&f_data);
            ep  [count]=0.001*f_ep;
            data[count]=f_data;
            printf("%03i ep %12.2f kV/cm lorentz angle %7.3f [degrees]\n",count,ep[count],data[count]);
        }
        count++;
    }

    Float_t* gep    =new Float_t[count];
    Float_t* gdata  =new Float_t[count];

    for(Int_t i=0;i<count;i++)
    {
        gep  [i]=ep  [i];
	gdata[i]=data[i];
    }

    h=new TGraph(count,gep,gdata);

    h->SetMarkerStyle(29);
    h->SetMarkerColor(4);
    h->SetMarkerSize(.8);
    h->SetLineColor(color);

    HTool::closeAscii(&input);
    return h;
}
TArrayD* HMdcGarReader::readMatrix(TString inputname,Int_t& size1,Int_t& size2)
{
    // matrix is written in linear form for 1 and 2-D
    // In 2-D case: matrix[x][y] is written as loop over y inside loop over x

    fstream input;
    input.open(inputname.Data(),ios::in);


    Char_t line[400];

    Char_t Tag []=" Dimension:";
    Char_t Tag1[]=" Sizes:";
    Char_t Tag2[]=" CONTENTS";
    Int_t dimension=0;
    size1=0; // first index
    size2=1; // second index
    while(1)
    {   // reading format information
	if(input.eof()) break;
	input.getline(line, sizeof(line));

	if (!strncmp(line, Tag ,strlen(Tag)))
	{
	    sscanf(line,"%*s%i",&dimension);
	}
	if (!strncmp(line, Tag1 ,strlen(Tag1)))
	{
	   if(dimension==1) sscanf(line,"%*s%i"  ,&size1);
           if(dimension==2) sscanf(line,"%*s%i%i",&size1,&size2);
	}
	if (!strncmp(line, Tag2 ,strlen(Tag2)))
	{   // end of format information
	    break;
	}
    }
    TArrayD* array=new TArrayD(size1*size2);
    cout<<"Dimension of array: "<<dimension<<endl;
    cout<<"Number of points  : "<<size1*size2<<endl;
    Int_t count=0;
    Int_t col,row;
    while (count<size1*size2)  {
	if (input.eof()) break;

        input>>(*array)[count];
	if(dimension==1)cout<<"point : "<<count+1<<" = "<< (*array)[count]<<endl;
	if(dimension==2)
	{
            col=(count)%(size1);
            row=(Int_t)((count)/size1);
	    cout<<"point : "<<count+1<<" col "<<col<<" row "<<row <<" = "<< (*array)[count]<<endl;
	}
	count++;
    }
    input.close();
    return array;
}
TH1F* HMdcGarReader::readMatrix1DToHist(TString inputname,Float_t binsize1,Float_t start1)
{
   Int_t size1,size2;
   TArrayD* array=readMatrix(inputname,size1,size2);
   Int_t size=array->GetSize();

   // creating hist name from input file
   TString histname=inputname;
   if(histname.Contains("/")==1)
   { // do not use path names
       histname.Replace(0,inputname.Last('/')+1,"",0);
   }
   if(histname.Contains(".")==1)
   { // skip file extensions
      histname.Replace(histname.First('.'),histname.Sizeof(),"",0);
   }

   TH1F* h=new TH1F(histname.Data(),"",size,start1,start1+binsize1*size);

   cout<<"Input file       : "<<inputname.Data()<<endl;
   cout<<"Histogram name   : "<<histname.Data() <<endl;
   cout<<"Number of bins   : "<<size<<endl;
   cout<<"Minimum x range  : "<<start1<<endl;
   cout<<"Maximum x range  : "<<start1+binsize1*size<<endl;

   for(Int_t i=0;i<size;i++){
	   h->SetBinContent(i+1,(*array)[i]);
   }
   delete array;
   return h;
}
TH2F* HMdcGarReader::readMatrix2DToHist(TString inputname,Float_t binsize1,Float_t start1,Float_t binsize2,Float_t start2)
{
   Int_t size1,size2;
   TArrayD* array=readMatrix(inputname,size1,size2);

   // creating hist name from input file
   TString histname=inputname;
   if(histname.Contains("/")==1)
   { // do not use path names
       histname.Replace(0,inputname.Last('/')+1,"",0);
   }
   if(histname.Contains(".")==1)
   { // skip file extensions
      histname.Replace(histname.First('.'),histname.Sizeof(),"",0);
   }

   TH2F* h=new TH2F(histname.Data(),"",size1,start1,start1+binsize1*size1,size2,start2,start2+binsize2*size2);

   cout<<"Input file       : "<<inputname.Data()<<endl;
   cout<<"Histogram name   : "<<histname.Data() <<endl;
   cout<<"Number of binsX  : "<<size1<<endl;
   cout<<"Minimum x range  : "<<start1<<endl;
   cout<<"Maximum x range  : "<<start1+binsize1*size1<<endl;
   cout<<"Number of binsY  : "<<size2<<endl;
   cout<<"Minimum y range  : "<<start2<<endl;
   cout<<"Maximum y range  : "<<start2+binsize2*size2<<endl;

   for(Int_t i=0;i<size1;i++){
       for(Int_t j=0;j<size2;j++){
	   h->SetBinContent(i+1,j+1,(*array)[j*size1+i]);
       }
   }
   delete array;
   return h;
}


TH1F* HMdcGarReader::readHist1D(TString inputname,Float_t scale,Float_t scalex)
{
    fstream input;
    input.open(inputname.Data(),ios::in);


    Char_t line[400];

    Char_t Tag []=" Minimum:";
    Char_t Tag1[]=" Maximum:";
    Char_t Tag2[]=" Bins:";
    Char_t Tag3[]=" CONTENTS";
    Float_t xmin=0;
    Float_t xmax=0;
    Int_t bins=0;
    while(1)
    {   // reading format information
	if(input.eof()) break;
	input.getline(line, sizeof(line));

	if (!strncmp(line, Tag ,strlen(Tag)))
	{   // minimum range
	    sscanf(line,"%*s%f",&xmin);
	}
	if (!strncmp(line, Tag1 ,strlen(Tag1)))
	{   // maximum range
	    sscanf(line,"%*s%f",&xmax);
	}
        if (!strncmp(line, Tag2 ,strlen(Tag2)))
	{   // number of bins
	    sscanf(line,"%*s%i",&bins);
	}
	if (!strncmp(line, Tag3 ,strlen(Tag2)))
	{   // end of format information
	    break;
	}
    }
    xmin=scalex*xmin;
    xmax=scalex*xmax;

    // creating hist name from input file
    TString histname=inputname;
    if(histname.Contains("/")==1)
    { // do not use path names
      histname.Replace(0,inputname.Last('/')+1,"",0);
    }
    if(histname.Contains(".")==1)
    { // skip file extensions
      histname.Replace(histname.First('.'),histname.Sizeof(),"",0);
    }

    TH1F* h=new TH1F(histname.Data(),"",bins,xmin,xmax);

    cout<<"Input file       : "<<inputname.Data()<<endl;
    cout<<"Histogram name   : "<<histname.Data() <<endl;
    cout<<"Number of bins   : "<<bins<<endl;
    cout<<"Minimum x range  : "<<xmin<<endl;
    cout<<"Maximum x range  : "<<xmax<<endl;
    Int_t count=0;
    Float_t content=0;
    Int_t binnumber=0;
    while (count<bins+1)  {
	if (input.eof()) break;
	input.getline(line, sizeof(line));
        sscanf(line,"%i%f",&binnumber,&content);
	if(count!=0){
	    h->SetBinContent(binnumber,content);
	    cout<<"bin "<<binnumber<<"   "<<content<<endl;
	}
	count++;
    }
    h->Scale(scale);
    input.close();
    return h;
}
TH1F* HMdcGarReader::readHist1D(TString inputname1,TString inputname2,Float_t scale,Float_t scalex)
{
    cout<<"Reading data points:"<<endl;
    TH1F* h   =readHist1D(inputname1,scale,scalex);
    cout<<"Reading errors:"<<endl;
    TH1F* herr=readHist1D(inputname2,scale,scalex);

    for(Int_t i=0;i<h->GetNbinsX();i++){
       h->SetBinError(i+1,herr->GetBinError(i+1));
    }
    herr->Delete();
    return h;
}
TGraph* HMdcGarReader::readHist1DToGraph(TString inputname1,Float_t scale,Float_t scalex)
{
    cout<<"Reading data points:"<<endl;
    TH1F* h   =readHist1D(inputname1,scale,scalex);
    TGraph* g=new TGraphErrors();
    Int_t binstep  =(Int_t)((h->GetXaxis()->GetXmax() - h->GetXaxis()->GetXmin())/(Float_t)(h->GetNbinsX()-1));

    for(Int_t i=0;i<h->GetNbinsX();i++){
	g->SetPoint     (i,(i+1)*binstep,h   ->GetBinContent(i+1));
    }

    h   ->Delete();
    return g;
}
TGraphErrors* HMdcGarReader::readHist1DToGraph(TString inputname1,TString inputname2,Float_t scale,Float_t scalex)
{
    cout<<"Reading data points:"<<endl;
    TH1F* h   =readHist1D(inputname1,scale,scalex);
    cout<<"Reading errors:"<<endl;
    TH1F* herr=readHist1D(inputname2,scale,scalex);

    TGraphErrors* g=new TGraphErrors();
    Int_t binstep  =(Int_t)((h->GetXaxis()->GetXmax() - h->GetXaxis()->GetXmin())/(Float_t)(h->GetNbinsX()-1));

    for(Int_t i=0;i<h->GetNbinsX();i++){
	g->SetPoint     (i,(i+1)*binstep,h   ->GetBinContent(i+1));
        g->SetPointError(i,0,herr->GetBinContent(i+1));
    }

    h   ->Delete();
    herr->Delete();

    return g;
}



TObjArray* HMdcGarReader::readSignal(TString inputName,Int_t nbins,Double_t xmin,Double_t xmax,Int_t version)
{


    FILE* inputAscii = fopen(inputName.Data(),"r");
    if (inputAscii == NULL)
    {
        ::Error("HMdcGarSignalReader::readInput()","Cannot open %s\n",inputName.Data());
        exit(1);
    }
    cout<<"HMdcGarSignalReader::readInput()   : Reading from "<<inputName.Data()<<endl;


    TObjArray* array =  new TObjArray();



    Char_t Tag []=" + VALUE_SCALE_FACTOR";
    Char_t Tag1[]="% Created";
    Char_t Tag3[]=" +";
    Char_t line[400];
    Int_t signalcount = 0;
    Int_t sigcount    = 0;
    Bool_t condition  = kFALSE;
    Int_t bin = 0;
    TH1F* hsignal = 0;
    Float_t f_time,f_current;

    cout<<"creating hist "<< signalcount<<endl;
    hsignal = new TH1F(Form("hsignal_%i",signalcount),"Current as function of drift time",nbins,xmin,xmax);
    hsignal->SetXTitle("drift time [ns]");
    hsignal->SetYTitle("current [#mu A]");
    array->Add(hsignal);

    Bool_t res=kTRUE;
    while(!feof(inputAscii))
    {   // end of file condition
        //--------------------------------- search first value ---------------------------
        while(1)
        {
            if(feof(inputAscii)) break;
            res=fgets(line, sizeof(line), inputAscii);
	    if(!res) cout<<"could not read next line!"<<endl;
	    if (!strncmp(line, Tag ,strlen(Tag))) break;  // break if " + VALUE_SCALE_FACTOR" has been found
        }
        //--------------------------------------------------------------------------------
        while(1)
        {
            if (feof(inputAscii)) break;
            res=fgets(line, sizeof(line), inputAscii);
	    if(!res) cout<<"could not read next line!"<<endl;
	    if(strncmp(line,Tag1,strlen(Tag1)) && !strncmp(line,Tag3,strlen(Tag3)) ) // read until "% Created" has been found
            {
                //--------------------------------- read signal ----------------------------------
                sscanf(&line[5],"%e%e%*s",&f_time, &f_current);

                condition=kFALSE;
                if      (version==704)                    condition=kTRUE;
                else if (version==708&&(signalcount%2==0))condition=kTRUE;

                if(condition)
                {
                    hsignal->SetBinContent(bin,f_current);
                    bin++;
                }
                //--------------------------------------------------------------------------------
            }
            else
            {
                signalcount++;

                condition=kFALSE;
                if      (version==704)                      condition=kTRUE;
                else if (version==708&&((signalcount)%2==0))condition=kTRUE;

                if(condition)
                {
                    sigcount++;
                    // new signal found
                    cout<<"creating hist "<< sigcount<<endl;
                    hsignal = new TH1F(Form("hsignal_%i",sigcount),"Current as function of drift time",nbins,xmin,xmax);
                    hsignal->SetXTitle("drift time [ns]");
                    hsignal->SetYTitle("current [#mu A]");
                    array->Add(hsignal);
                    bin = 0;
                }
                break;
            }
        }
    }
    //---------------- very last signal of the file ----------------------------------
    return array;
}

TGraph* HMdcGarReader::readGraphE(TString inputName,TString dir,Float_t min,Float_t max,Int_t color,Float_t scale,Bool_t suppressZero)
{
    // inputName = file name of GARFIELD plot e
    // dir       = x (default) coordinate along x
    //           = y           coordinate along y
    // min,max   = (default -999999) no cut on range, otherwise collect values along coordinate between min-max
    // color     = (default = 2) color of line/marker
    // scale     = (default = 10) cm -> mm
    // suppressZero = (default = kTRUE) do not fill field==0 points

    FILE* inputAscii = fopen(inputName.Data(),"r");
    if (inputAscii == NULL)
    {
        ::Error("HMdcGarSignalReader::readGraphE()","Cannot open %s\n",inputName.Data());
        exit(1);
    }
    cout<<"HMdcGarSignalReader::readGraphE()   : Reading from "<<inputName.Data()<<endl;



    Char_t line[400];
    Char_t Tag [] ="  Coordinate";
    Int_t bin     = 0;
    Float_t f_x,f_y,f_e;


    Bool_t xcoord = kTRUE;
    if(dir == "y") xcoord = kFALSE;

    TGraph* g = new TGraph();
    g->SetMarkerColor(color);
    g->SetLineColor(color);
    Bool_t res=kTRUE;
    while(!feof(inputAscii))
    {   // end of file condition
        //--------------------------------- search first value ---------------------------
        while(1)
        {
            if(feof(inputAscii)) break;
            res=fgets(line, sizeof(line), inputAscii);
	    if(!res) cout<<"could not read next line!"<<endl;
	    if (!strncmp(line, Tag ,strlen(Tag))) break;  // break if "  Coordinate" has been found
        }
        //--------------------------------------------------------------------------------
        while(1)
        {
            if (feof(inputAscii)) break;
            res=fgets(line, sizeof(line), inputAscii);
	    if(!res) cout<<"could not read next line!"<<endl;
	    sscanf(line,"%e%e%*s%e",&f_x,&f_y, &f_e);
            if(suppressZero && f_e == 0) continue;
            if(xcoord){
                if((min ==-999999 || f_x*scale >= min) &&
                   (max ==-999999 || f_x*scale <= max)){
                    g->SetPoint(bin,f_x*scale,f_e);
                    bin++;
                }
            } else {
                if((min ==-999999 || f_y*scale >= min) &&
                   (max ==-999999 || f_y*scale <= max)){
                    g->SetPoint(bin,f_y*scale,f_e);
                    bin++;
                }
            }
        }
    }
    g->Print("All");
    return g;
}
 hmdcgarreader.cc:1
 hmdcgarreader.cc:2
 hmdcgarreader.cc:3
 hmdcgarreader.cc:4
 hmdcgarreader.cc:5
 hmdcgarreader.cc:6
 hmdcgarreader.cc:7
 hmdcgarreader.cc:8
 hmdcgarreader.cc:9
 hmdcgarreader.cc:10
 hmdcgarreader.cc:11
 hmdcgarreader.cc:12
 hmdcgarreader.cc:13
 hmdcgarreader.cc:14
 hmdcgarreader.cc:15
 hmdcgarreader.cc:16
 hmdcgarreader.cc:17
 hmdcgarreader.cc:18
 hmdcgarreader.cc:19
 hmdcgarreader.cc:20
 hmdcgarreader.cc:21
 hmdcgarreader.cc:22
 hmdcgarreader.cc:23
 hmdcgarreader.cc:24
 hmdcgarreader.cc:25
 hmdcgarreader.cc:26
 hmdcgarreader.cc:27
 hmdcgarreader.cc:28
 hmdcgarreader.cc:29
 hmdcgarreader.cc:30
 hmdcgarreader.cc:31
 hmdcgarreader.cc:32
 hmdcgarreader.cc:33
 hmdcgarreader.cc:34
 hmdcgarreader.cc:35
 hmdcgarreader.cc:36
 hmdcgarreader.cc:37
 hmdcgarreader.cc:38
 hmdcgarreader.cc:39
 hmdcgarreader.cc:40
 hmdcgarreader.cc:41
 hmdcgarreader.cc:42
 hmdcgarreader.cc:43
 hmdcgarreader.cc:44
 hmdcgarreader.cc:45
 hmdcgarreader.cc:46
 hmdcgarreader.cc:47
 hmdcgarreader.cc:48
 hmdcgarreader.cc:49
 hmdcgarreader.cc:50
 hmdcgarreader.cc:51
 hmdcgarreader.cc:52
 hmdcgarreader.cc:53
 hmdcgarreader.cc:54
 hmdcgarreader.cc:55
 hmdcgarreader.cc:56
 hmdcgarreader.cc:57
 hmdcgarreader.cc:58
 hmdcgarreader.cc:59
 hmdcgarreader.cc:60
 hmdcgarreader.cc:61
 hmdcgarreader.cc:62
 hmdcgarreader.cc:63
 hmdcgarreader.cc:64
 hmdcgarreader.cc:65
 hmdcgarreader.cc:66
 hmdcgarreader.cc:67
 hmdcgarreader.cc:68
 hmdcgarreader.cc:69
 hmdcgarreader.cc:70
 hmdcgarreader.cc:71
 hmdcgarreader.cc:72
 hmdcgarreader.cc:73
 hmdcgarreader.cc:74
 hmdcgarreader.cc:75
 hmdcgarreader.cc:76
 hmdcgarreader.cc:77
 hmdcgarreader.cc:78
 hmdcgarreader.cc:79
 hmdcgarreader.cc:80
 hmdcgarreader.cc:81
 hmdcgarreader.cc:82
 hmdcgarreader.cc:83
 hmdcgarreader.cc:84
 hmdcgarreader.cc:85
 hmdcgarreader.cc:86
 hmdcgarreader.cc:87
 hmdcgarreader.cc:88
 hmdcgarreader.cc:89
 hmdcgarreader.cc:90
 hmdcgarreader.cc:91
 hmdcgarreader.cc:92
 hmdcgarreader.cc:93
 hmdcgarreader.cc:94
 hmdcgarreader.cc:95
 hmdcgarreader.cc:96
 hmdcgarreader.cc:97
 hmdcgarreader.cc:98
 hmdcgarreader.cc:99
 hmdcgarreader.cc:100
 hmdcgarreader.cc:101
 hmdcgarreader.cc:102
 hmdcgarreader.cc:103
 hmdcgarreader.cc:104
 hmdcgarreader.cc:105
 hmdcgarreader.cc:106
 hmdcgarreader.cc:107
 hmdcgarreader.cc:108
 hmdcgarreader.cc:109
 hmdcgarreader.cc:110
 hmdcgarreader.cc:111
 hmdcgarreader.cc:112
 hmdcgarreader.cc:113
 hmdcgarreader.cc:114
 hmdcgarreader.cc:115
 hmdcgarreader.cc:116
 hmdcgarreader.cc:117
 hmdcgarreader.cc:118
 hmdcgarreader.cc:119
 hmdcgarreader.cc:120
 hmdcgarreader.cc:121
 hmdcgarreader.cc:122
 hmdcgarreader.cc:123
 hmdcgarreader.cc:124
 hmdcgarreader.cc:125
 hmdcgarreader.cc:126
 hmdcgarreader.cc:127
 hmdcgarreader.cc:128
 hmdcgarreader.cc:129
 hmdcgarreader.cc:130
 hmdcgarreader.cc:131
 hmdcgarreader.cc:132
 hmdcgarreader.cc:133
 hmdcgarreader.cc:134
 hmdcgarreader.cc:135
 hmdcgarreader.cc:136
 hmdcgarreader.cc:137
 hmdcgarreader.cc:138
 hmdcgarreader.cc:139
 hmdcgarreader.cc:140
 hmdcgarreader.cc:141
 hmdcgarreader.cc:142
 hmdcgarreader.cc:143
 hmdcgarreader.cc:144
 hmdcgarreader.cc:145
 hmdcgarreader.cc:146
 hmdcgarreader.cc:147
 hmdcgarreader.cc:148
 hmdcgarreader.cc:149
 hmdcgarreader.cc:150
 hmdcgarreader.cc:151
 hmdcgarreader.cc:152
 hmdcgarreader.cc:153
 hmdcgarreader.cc:154
 hmdcgarreader.cc:155
 hmdcgarreader.cc:156
 hmdcgarreader.cc:157
 hmdcgarreader.cc:158
 hmdcgarreader.cc:159
 hmdcgarreader.cc:160
 hmdcgarreader.cc:161
 hmdcgarreader.cc:162
 hmdcgarreader.cc:163
 hmdcgarreader.cc:164
 hmdcgarreader.cc:165
 hmdcgarreader.cc:166
 hmdcgarreader.cc:167
 hmdcgarreader.cc:168
 hmdcgarreader.cc:169
 hmdcgarreader.cc:170
 hmdcgarreader.cc:171
 hmdcgarreader.cc:172
 hmdcgarreader.cc:173
 hmdcgarreader.cc:174
 hmdcgarreader.cc:175
 hmdcgarreader.cc:176
 hmdcgarreader.cc:177
 hmdcgarreader.cc:178
 hmdcgarreader.cc:179
 hmdcgarreader.cc:180
 hmdcgarreader.cc:181
 hmdcgarreader.cc:182
 hmdcgarreader.cc:183
 hmdcgarreader.cc:184
 hmdcgarreader.cc:185
 hmdcgarreader.cc:186
 hmdcgarreader.cc:187
 hmdcgarreader.cc:188
 hmdcgarreader.cc:189
 hmdcgarreader.cc:190
 hmdcgarreader.cc:191
 hmdcgarreader.cc:192
 hmdcgarreader.cc:193
 hmdcgarreader.cc:194
 hmdcgarreader.cc:195
 hmdcgarreader.cc:196
 hmdcgarreader.cc:197
 hmdcgarreader.cc:198
 hmdcgarreader.cc:199
 hmdcgarreader.cc:200
 hmdcgarreader.cc:201
 hmdcgarreader.cc:202
 hmdcgarreader.cc:203
 hmdcgarreader.cc:204
 hmdcgarreader.cc:205
 hmdcgarreader.cc:206
 hmdcgarreader.cc:207
 hmdcgarreader.cc:208
 hmdcgarreader.cc:209
 hmdcgarreader.cc:210
 hmdcgarreader.cc:211
 hmdcgarreader.cc:212
 hmdcgarreader.cc:213
 hmdcgarreader.cc:214
 hmdcgarreader.cc:215
 hmdcgarreader.cc:216
 hmdcgarreader.cc:217
 hmdcgarreader.cc:218
 hmdcgarreader.cc:219
 hmdcgarreader.cc:220
 hmdcgarreader.cc:221
 hmdcgarreader.cc:222
 hmdcgarreader.cc:223
 hmdcgarreader.cc:224
 hmdcgarreader.cc:225
 hmdcgarreader.cc:226
 hmdcgarreader.cc:227
 hmdcgarreader.cc:228
 hmdcgarreader.cc:229
 hmdcgarreader.cc:230
 hmdcgarreader.cc:231
 hmdcgarreader.cc:232
 hmdcgarreader.cc:233
 hmdcgarreader.cc:234
 hmdcgarreader.cc:235
 hmdcgarreader.cc:236
 hmdcgarreader.cc:237
 hmdcgarreader.cc:238
 hmdcgarreader.cc:239
 hmdcgarreader.cc:240
 hmdcgarreader.cc:241
 hmdcgarreader.cc:242
 hmdcgarreader.cc:243
 hmdcgarreader.cc:244
 hmdcgarreader.cc:245
 hmdcgarreader.cc:246
 hmdcgarreader.cc:247
 hmdcgarreader.cc:248
 hmdcgarreader.cc:249
 hmdcgarreader.cc:250
 hmdcgarreader.cc:251
 hmdcgarreader.cc:252
 hmdcgarreader.cc:253
 hmdcgarreader.cc:254
 hmdcgarreader.cc:255
 hmdcgarreader.cc:256
 hmdcgarreader.cc:257
 hmdcgarreader.cc:258
 hmdcgarreader.cc:259
 hmdcgarreader.cc:260
 hmdcgarreader.cc:261
 hmdcgarreader.cc:262
 hmdcgarreader.cc:263
 hmdcgarreader.cc:264
 hmdcgarreader.cc:265
 hmdcgarreader.cc:266
 hmdcgarreader.cc:267
 hmdcgarreader.cc:268
 hmdcgarreader.cc:269
 hmdcgarreader.cc:270
 hmdcgarreader.cc:271
 hmdcgarreader.cc:272
 hmdcgarreader.cc:273
 hmdcgarreader.cc:274
 hmdcgarreader.cc:275
 hmdcgarreader.cc:276
 hmdcgarreader.cc:277
 hmdcgarreader.cc:278
 hmdcgarreader.cc:279
 hmdcgarreader.cc:280
 hmdcgarreader.cc:281
 hmdcgarreader.cc:282
 hmdcgarreader.cc:283
 hmdcgarreader.cc:284
 hmdcgarreader.cc:285
 hmdcgarreader.cc:286
 hmdcgarreader.cc:287
 hmdcgarreader.cc:288
 hmdcgarreader.cc:289
 hmdcgarreader.cc:290
 hmdcgarreader.cc:291
 hmdcgarreader.cc:292
 hmdcgarreader.cc:293
 hmdcgarreader.cc:294
 hmdcgarreader.cc:295
 hmdcgarreader.cc:296
 hmdcgarreader.cc:297
 hmdcgarreader.cc:298
 hmdcgarreader.cc:299
 hmdcgarreader.cc:300
 hmdcgarreader.cc:301
 hmdcgarreader.cc:302
 hmdcgarreader.cc:303
 hmdcgarreader.cc:304
 hmdcgarreader.cc:305
 hmdcgarreader.cc:306
 hmdcgarreader.cc:307
 hmdcgarreader.cc:308
 hmdcgarreader.cc:309
 hmdcgarreader.cc:310
 hmdcgarreader.cc:311
 hmdcgarreader.cc:312
 hmdcgarreader.cc:313
 hmdcgarreader.cc:314
 hmdcgarreader.cc:315
 hmdcgarreader.cc:316
 hmdcgarreader.cc:317
 hmdcgarreader.cc:318
 hmdcgarreader.cc:319
 hmdcgarreader.cc:320
 hmdcgarreader.cc:321
 hmdcgarreader.cc:322
 hmdcgarreader.cc:323
 hmdcgarreader.cc:324
 hmdcgarreader.cc:325
 hmdcgarreader.cc:326
 hmdcgarreader.cc:327
 hmdcgarreader.cc:328
 hmdcgarreader.cc:329
 hmdcgarreader.cc:330
 hmdcgarreader.cc:331
 hmdcgarreader.cc:332
 hmdcgarreader.cc:333
 hmdcgarreader.cc:334
 hmdcgarreader.cc:335
 hmdcgarreader.cc:336
 hmdcgarreader.cc:337
 hmdcgarreader.cc:338
 hmdcgarreader.cc:339
 hmdcgarreader.cc:340
 hmdcgarreader.cc:341
 hmdcgarreader.cc:342
 hmdcgarreader.cc:343
 hmdcgarreader.cc:344
 hmdcgarreader.cc:345
 hmdcgarreader.cc:346
 hmdcgarreader.cc:347
 hmdcgarreader.cc:348
 hmdcgarreader.cc:349
 hmdcgarreader.cc:350
 hmdcgarreader.cc:351
 hmdcgarreader.cc:352
 hmdcgarreader.cc:353
 hmdcgarreader.cc:354
 hmdcgarreader.cc:355
 hmdcgarreader.cc:356
 hmdcgarreader.cc:357
 hmdcgarreader.cc:358
 hmdcgarreader.cc:359
 hmdcgarreader.cc:360
 hmdcgarreader.cc:361
 hmdcgarreader.cc:362
 hmdcgarreader.cc:363
 hmdcgarreader.cc:364
 hmdcgarreader.cc:365
 hmdcgarreader.cc:366
 hmdcgarreader.cc:367
 hmdcgarreader.cc:368
 hmdcgarreader.cc:369
 hmdcgarreader.cc:370
 hmdcgarreader.cc:371
 hmdcgarreader.cc:372
 hmdcgarreader.cc:373
 hmdcgarreader.cc:374
 hmdcgarreader.cc:375
 hmdcgarreader.cc:376
 hmdcgarreader.cc:377
 hmdcgarreader.cc:378
 hmdcgarreader.cc:379
 hmdcgarreader.cc:380
 hmdcgarreader.cc:381
 hmdcgarreader.cc:382
 hmdcgarreader.cc:383
 hmdcgarreader.cc:384
 hmdcgarreader.cc:385
 hmdcgarreader.cc:386
 hmdcgarreader.cc:387
 hmdcgarreader.cc:388
 hmdcgarreader.cc:389
 hmdcgarreader.cc:390
 hmdcgarreader.cc:391
 hmdcgarreader.cc:392
 hmdcgarreader.cc:393
 hmdcgarreader.cc:394
 hmdcgarreader.cc:395
 hmdcgarreader.cc:396
 hmdcgarreader.cc:397
 hmdcgarreader.cc:398
 hmdcgarreader.cc:399
 hmdcgarreader.cc:400
 hmdcgarreader.cc:401
 hmdcgarreader.cc:402
 hmdcgarreader.cc:403
 hmdcgarreader.cc:404
 hmdcgarreader.cc:405
 hmdcgarreader.cc:406
 hmdcgarreader.cc:407
 hmdcgarreader.cc:408
 hmdcgarreader.cc:409
 hmdcgarreader.cc:410
 hmdcgarreader.cc:411
 hmdcgarreader.cc:412
 hmdcgarreader.cc:413
 hmdcgarreader.cc:414
 hmdcgarreader.cc:415
 hmdcgarreader.cc:416
 hmdcgarreader.cc:417
 hmdcgarreader.cc:418
 hmdcgarreader.cc:419
 hmdcgarreader.cc:420
 hmdcgarreader.cc:421
 hmdcgarreader.cc:422
 hmdcgarreader.cc:423
 hmdcgarreader.cc:424
 hmdcgarreader.cc:425
 hmdcgarreader.cc:426
 hmdcgarreader.cc:427
 hmdcgarreader.cc:428
 hmdcgarreader.cc:429
 hmdcgarreader.cc:430
 hmdcgarreader.cc:431
 hmdcgarreader.cc:432
 hmdcgarreader.cc:433
 hmdcgarreader.cc:434
 hmdcgarreader.cc:435
 hmdcgarreader.cc:436
 hmdcgarreader.cc:437
 hmdcgarreader.cc:438
 hmdcgarreader.cc:439
 hmdcgarreader.cc:440
 hmdcgarreader.cc:441
 hmdcgarreader.cc:442
 hmdcgarreader.cc:443
 hmdcgarreader.cc:444
 hmdcgarreader.cc:445
 hmdcgarreader.cc:446
 hmdcgarreader.cc:447
 hmdcgarreader.cc:448
 hmdcgarreader.cc:449
 hmdcgarreader.cc:450
 hmdcgarreader.cc:451
 hmdcgarreader.cc:452
 hmdcgarreader.cc:453
 hmdcgarreader.cc:454
 hmdcgarreader.cc:455
 hmdcgarreader.cc:456
 hmdcgarreader.cc:457
 hmdcgarreader.cc:458
 hmdcgarreader.cc:459
 hmdcgarreader.cc:460
 hmdcgarreader.cc:461
 hmdcgarreader.cc:462
 hmdcgarreader.cc:463
 hmdcgarreader.cc:464
 hmdcgarreader.cc:465
 hmdcgarreader.cc:466
 hmdcgarreader.cc:467
 hmdcgarreader.cc:468
 hmdcgarreader.cc:469
 hmdcgarreader.cc:470
 hmdcgarreader.cc:471
 hmdcgarreader.cc:472
 hmdcgarreader.cc:473
 hmdcgarreader.cc:474
 hmdcgarreader.cc:475
 hmdcgarreader.cc:476
 hmdcgarreader.cc:477
 hmdcgarreader.cc:478
 hmdcgarreader.cc:479
 hmdcgarreader.cc:480
 hmdcgarreader.cc:481
 hmdcgarreader.cc:482
 hmdcgarreader.cc:483
 hmdcgarreader.cc:484
 hmdcgarreader.cc:485
 hmdcgarreader.cc:486
 hmdcgarreader.cc:487
 hmdcgarreader.cc:488
 hmdcgarreader.cc:489
 hmdcgarreader.cc:490
 hmdcgarreader.cc:491
 hmdcgarreader.cc:492
 hmdcgarreader.cc:493
 hmdcgarreader.cc:494
 hmdcgarreader.cc:495
 hmdcgarreader.cc:496
 hmdcgarreader.cc:497
 hmdcgarreader.cc:498
 hmdcgarreader.cc:499
 hmdcgarreader.cc:500
 hmdcgarreader.cc:501
 hmdcgarreader.cc:502
 hmdcgarreader.cc:503
 hmdcgarreader.cc:504
 hmdcgarreader.cc:505
 hmdcgarreader.cc:506
 hmdcgarreader.cc:507
 hmdcgarreader.cc:508
 hmdcgarreader.cc:509
 hmdcgarreader.cc:510
 hmdcgarreader.cc:511
 hmdcgarreader.cc:512
 hmdcgarreader.cc:513
 hmdcgarreader.cc:514
 hmdcgarreader.cc:515
 hmdcgarreader.cc:516
 hmdcgarreader.cc:517
 hmdcgarreader.cc:518
 hmdcgarreader.cc:519
 hmdcgarreader.cc:520
 hmdcgarreader.cc:521
 hmdcgarreader.cc:522
 hmdcgarreader.cc:523
 hmdcgarreader.cc:524
 hmdcgarreader.cc:525
 hmdcgarreader.cc:526
 hmdcgarreader.cc:527
 hmdcgarreader.cc:528
 hmdcgarreader.cc:529
 hmdcgarreader.cc:530
 hmdcgarreader.cc:531
 hmdcgarreader.cc:532
 hmdcgarreader.cc:533
 hmdcgarreader.cc:534
 hmdcgarreader.cc:535
 hmdcgarreader.cc:536
 hmdcgarreader.cc:537
 hmdcgarreader.cc:538
 hmdcgarreader.cc:539
 hmdcgarreader.cc:540
 hmdcgarreader.cc:541
 hmdcgarreader.cc:542
 hmdcgarreader.cc:543
 hmdcgarreader.cc:544
 hmdcgarreader.cc:545
 hmdcgarreader.cc:546
 hmdcgarreader.cc:547
 hmdcgarreader.cc:548
 hmdcgarreader.cc:549
 hmdcgarreader.cc:550
 hmdcgarreader.cc:551
 hmdcgarreader.cc:552
 hmdcgarreader.cc:553
 hmdcgarreader.cc:554
 hmdcgarreader.cc:555
 hmdcgarreader.cc:556
 hmdcgarreader.cc:557
 hmdcgarreader.cc:558
 hmdcgarreader.cc:559
 hmdcgarreader.cc:560
 hmdcgarreader.cc:561
 hmdcgarreader.cc:562
 hmdcgarreader.cc:563
 hmdcgarreader.cc:564
 hmdcgarreader.cc:565
 hmdcgarreader.cc:566
 hmdcgarreader.cc:567
 hmdcgarreader.cc:568
 hmdcgarreader.cc:569
 hmdcgarreader.cc:570
 hmdcgarreader.cc:571
 hmdcgarreader.cc:572
 hmdcgarreader.cc:573
 hmdcgarreader.cc:574
 hmdcgarreader.cc:575
 hmdcgarreader.cc:576
 hmdcgarreader.cc:577
 hmdcgarreader.cc:578
 hmdcgarreader.cc:579
 hmdcgarreader.cc:580
 hmdcgarreader.cc:581
 hmdcgarreader.cc:582
 hmdcgarreader.cc:583
 hmdcgarreader.cc:584
 hmdcgarreader.cc:585
 hmdcgarreader.cc:586
 hmdcgarreader.cc:587
 hmdcgarreader.cc:588
 hmdcgarreader.cc:589
 hmdcgarreader.cc:590
 hmdcgarreader.cc:591
 hmdcgarreader.cc:592
 hmdcgarreader.cc:593
 hmdcgarreader.cc:594
 hmdcgarreader.cc:595
 hmdcgarreader.cc:596
 hmdcgarreader.cc:597
 hmdcgarreader.cc:598
 hmdcgarreader.cc:599
 hmdcgarreader.cc:600
 hmdcgarreader.cc:601
 hmdcgarreader.cc:602
 hmdcgarreader.cc:603
 hmdcgarreader.cc:604
 hmdcgarreader.cc:605
 hmdcgarreader.cc:606
 hmdcgarreader.cc:607
 hmdcgarreader.cc:608
 hmdcgarreader.cc:609
 hmdcgarreader.cc:610
 hmdcgarreader.cc:611
 hmdcgarreader.cc:612
 hmdcgarreader.cc:613
 hmdcgarreader.cc:614
 hmdcgarreader.cc:615
 hmdcgarreader.cc:616
 hmdcgarreader.cc:617
 hmdcgarreader.cc:618
 hmdcgarreader.cc:619
 hmdcgarreader.cc:620
 hmdcgarreader.cc:621
 hmdcgarreader.cc:622
 hmdcgarreader.cc:623
 hmdcgarreader.cc:624
 hmdcgarreader.cc:625
 hmdcgarreader.cc:626
 hmdcgarreader.cc:627
 hmdcgarreader.cc:628
 hmdcgarreader.cc:629
 hmdcgarreader.cc:630
 hmdcgarreader.cc:631
 hmdcgarreader.cc:632
 hmdcgarreader.cc:633
 hmdcgarreader.cc:634
 hmdcgarreader.cc:635
 hmdcgarreader.cc:636
 hmdcgarreader.cc:637
 hmdcgarreader.cc:638
 hmdcgarreader.cc:639
 hmdcgarreader.cc:640
 hmdcgarreader.cc:641
 hmdcgarreader.cc:642
 hmdcgarreader.cc:643
 hmdcgarreader.cc:644
 hmdcgarreader.cc:645
 hmdcgarreader.cc:646
 hmdcgarreader.cc:647
 hmdcgarreader.cc:648
 hmdcgarreader.cc:649
 hmdcgarreader.cc:650
 hmdcgarreader.cc:651
 hmdcgarreader.cc:652
 hmdcgarreader.cc:653
 hmdcgarreader.cc:654
 hmdcgarreader.cc:655
 hmdcgarreader.cc:656
 hmdcgarreader.cc:657
 hmdcgarreader.cc:658
 hmdcgarreader.cc:659
 hmdcgarreader.cc:660
 hmdcgarreader.cc:661
 hmdcgarreader.cc:662
 hmdcgarreader.cc:663
 hmdcgarreader.cc:664
 hmdcgarreader.cc:665
 hmdcgarreader.cc:666
 hmdcgarreader.cc:667
 hmdcgarreader.cc:668
 hmdcgarreader.cc:669
 hmdcgarreader.cc:670
 hmdcgarreader.cc:671
 hmdcgarreader.cc:672
 hmdcgarreader.cc:673
 hmdcgarreader.cc:674
 hmdcgarreader.cc:675
 hmdcgarreader.cc:676
 hmdcgarreader.cc:677
 hmdcgarreader.cc:678
 hmdcgarreader.cc:679
 hmdcgarreader.cc:680
 hmdcgarreader.cc:681
 hmdcgarreader.cc:682
 hmdcgarreader.cc:683
 hmdcgarreader.cc:684
 hmdcgarreader.cc:685
 hmdcgarreader.cc:686
 hmdcgarreader.cc:687
 hmdcgarreader.cc:688
 hmdcgarreader.cc:689
 hmdcgarreader.cc:690
 hmdcgarreader.cc:691
 hmdcgarreader.cc:692
 hmdcgarreader.cc:693
 hmdcgarreader.cc:694
 hmdcgarreader.cc:695
 hmdcgarreader.cc:696
 hmdcgarreader.cc:697
 hmdcgarreader.cc:698
 hmdcgarreader.cc:699
 hmdcgarreader.cc:700
 hmdcgarreader.cc:701
 hmdcgarreader.cc:702
 hmdcgarreader.cc:703
 hmdcgarreader.cc:704
 hmdcgarreader.cc:705
 hmdcgarreader.cc:706
 hmdcgarreader.cc:707
 hmdcgarreader.cc:708
 hmdcgarreader.cc:709
 hmdcgarreader.cc:710
 hmdcgarreader.cc:711
 hmdcgarreader.cc:712
 hmdcgarreader.cc:713
 hmdcgarreader.cc:714
 hmdcgarreader.cc:715
 hmdcgarreader.cc:716
 hmdcgarreader.cc:717
 hmdcgarreader.cc:718
 hmdcgarreader.cc:719
 hmdcgarreader.cc:720
 hmdcgarreader.cc:721
 hmdcgarreader.cc:722
 hmdcgarreader.cc:723
 hmdcgarreader.cc:724
 hmdcgarreader.cc:725
 hmdcgarreader.cc:726
 hmdcgarreader.cc:727
 hmdcgarreader.cc:728
 hmdcgarreader.cc:729
 hmdcgarreader.cc:730
 hmdcgarreader.cc:731
 hmdcgarreader.cc:732
 hmdcgarreader.cc:733
 hmdcgarreader.cc:734
 hmdcgarreader.cc:735
 hmdcgarreader.cc:736
 hmdcgarreader.cc:737
 hmdcgarreader.cc:738
 hmdcgarreader.cc:739
 hmdcgarreader.cc:740
 hmdcgarreader.cc:741
 hmdcgarreader.cc:742
 hmdcgarreader.cc:743
 hmdcgarreader.cc:744
 hmdcgarreader.cc:745
 hmdcgarreader.cc:746
 hmdcgarreader.cc:747
 hmdcgarreader.cc:748
 hmdcgarreader.cc:749
 hmdcgarreader.cc:750
 hmdcgarreader.cc:751
 hmdcgarreader.cc:752
 hmdcgarreader.cc:753
 hmdcgarreader.cc:754
 hmdcgarreader.cc:755
 hmdcgarreader.cc:756
 hmdcgarreader.cc:757
 hmdcgarreader.cc:758
 hmdcgarreader.cc:759
 hmdcgarreader.cc:760
 hmdcgarreader.cc:761
 hmdcgarreader.cc:762
 hmdcgarreader.cc:763
 hmdcgarreader.cc:764
 hmdcgarreader.cc:765
 hmdcgarreader.cc:766
 hmdcgarreader.cc:767
 hmdcgarreader.cc:768
 hmdcgarreader.cc:769
 hmdcgarreader.cc:770
 hmdcgarreader.cc:771
 hmdcgarreader.cc:772
 hmdcgarreader.cc:773
 hmdcgarreader.cc:774
 hmdcgarreader.cc:775
 hmdcgarreader.cc:776
 hmdcgarreader.cc:777
 hmdcgarreader.cc:778
 hmdcgarreader.cc:779
 hmdcgarreader.cc:780
 hmdcgarreader.cc:781
 hmdcgarreader.cc:782
 hmdcgarreader.cc:783
 hmdcgarreader.cc:784
 hmdcgarreader.cc:785
 hmdcgarreader.cc:786
 hmdcgarreader.cc:787
 hmdcgarreader.cc:788
 hmdcgarreader.cc:789
 hmdcgarreader.cc:790
 hmdcgarreader.cc:791
 hmdcgarreader.cc:792
 hmdcgarreader.cc:793
 hmdcgarreader.cc:794
 hmdcgarreader.cc:795
 hmdcgarreader.cc:796
 hmdcgarreader.cc:797
 hmdcgarreader.cc:798
 hmdcgarreader.cc:799
 hmdcgarreader.cc:800
 hmdcgarreader.cc:801
 hmdcgarreader.cc:802
 hmdcgarreader.cc:803
 hmdcgarreader.cc:804
 hmdcgarreader.cc:805
 hmdcgarreader.cc:806
 hmdcgarreader.cc:807
 hmdcgarreader.cc:808
 hmdcgarreader.cc:809
 hmdcgarreader.cc:810
 hmdcgarreader.cc:811
 hmdcgarreader.cc:812
 hmdcgarreader.cc:813
 hmdcgarreader.cc:814
 hmdcgarreader.cc:815
 hmdcgarreader.cc:816
 hmdcgarreader.cc:817
 hmdcgarreader.cc:818
 hmdcgarreader.cc:819
 hmdcgarreader.cc:820
 hmdcgarreader.cc:821
 hmdcgarreader.cc:822
 hmdcgarreader.cc:823
 hmdcgarreader.cc:824
 hmdcgarreader.cc:825
 hmdcgarreader.cc:826
 hmdcgarreader.cc:827
 hmdcgarreader.cc:828
 hmdcgarreader.cc:829
 hmdcgarreader.cc:830
 hmdcgarreader.cc:831
 hmdcgarreader.cc:832
 hmdcgarreader.cc:833
 hmdcgarreader.cc:834
 hmdcgarreader.cc:835
 hmdcgarreader.cc:836
 hmdcgarreader.cc:837
 hmdcgarreader.cc:838
 hmdcgarreader.cc:839
 hmdcgarreader.cc:840
 hmdcgarreader.cc:841
 hmdcgarreader.cc:842
 hmdcgarreader.cc:843
 hmdcgarreader.cc:844
 hmdcgarreader.cc:845
 hmdcgarreader.cc:846
 hmdcgarreader.cc:847
 hmdcgarreader.cc:848
 hmdcgarreader.cc:849
 hmdcgarreader.cc:850
 hmdcgarreader.cc:851
 hmdcgarreader.cc:852
 hmdcgarreader.cc:853
 hmdcgarreader.cc:854
 hmdcgarreader.cc:855
 hmdcgarreader.cc:856
 hmdcgarreader.cc:857
 hmdcgarreader.cc:858
 hmdcgarreader.cc:859
 hmdcgarreader.cc:860
 hmdcgarreader.cc:861
 hmdcgarreader.cc:862
 hmdcgarreader.cc:863
 hmdcgarreader.cc:864
 hmdcgarreader.cc:865
 hmdcgarreader.cc:866
 hmdcgarreader.cc:867
 hmdcgarreader.cc:868
 hmdcgarreader.cc:869
 hmdcgarreader.cc:870
 hmdcgarreader.cc:871
 hmdcgarreader.cc:872
 hmdcgarreader.cc:873
 hmdcgarreader.cc:874
 hmdcgarreader.cc:875
 hmdcgarreader.cc:876
 hmdcgarreader.cc:877
 hmdcgarreader.cc:878
 hmdcgarreader.cc:879
 hmdcgarreader.cc:880
 hmdcgarreader.cc:881
 hmdcgarreader.cc:882
 hmdcgarreader.cc:883
 hmdcgarreader.cc:884
 hmdcgarreader.cc:885
 hmdcgarreader.cc:886
 hmdcgarreader.cc:887
 hmdcgarreader.cc:888
 hmdcgarreader.cc:889
 hmdcgarreader.cc:890
 hmdcgarreader.cc:891
 hmdcgarreader.cc:892
 hmdcgarreader.cc:893
 hmdcgarreader.cc:894
 hmdcgarreader.cc:895
 hmdcgarreader.cc:896
 hmdcgarreader.cc:897
 hmdcgarreader.cc:898
 hmdcgarreader.cc:899
 hmdcgarreader.cc:900
 hmdcgarreader.cc:901
 hmdcgarreader.cc:902
 hmdcgarreader.cc:903
 hmdcgarreader.cc:904
 hmdcgarreader.cc:905
 hmdcgarreader.cc:906
 hmdcgarreader.cc:907
 hmdcgarreader.cc:908
 hmdcgarreader.cc:909
 hmdcgarreader.cc:910
 hmdcgarreader.cc:911
 hmdcgarreader.cc:912
 hmdcgarreader.cc:913
 hmdcgarreader.cc:914
 hmdcgarreader.cc:915
 hmdcgarreader.cc:916
 hmdcgarreader.cc:917
 hmdcgarreader.cc:918
 hmdcgarreader.cc:919
 hmdcgarreader.cc:920
 hmdcgarreader.cc:921
 hmdcgarreader.cc:922
 hmdcgarreader.cc:923
 hmdcgarreader.cc:924
 hmdcgarreader.cc:925
 hmdcgarreader.cc:926
 hmdcgarreader.cc:927
 hmdcgarreader.cc:928
 hmdcgarreader.cc:929
 hmdcgarreader.cc:930
 hmdcgarreader.cc:931
 hmdcgarreader.cc:932
 hmdcgarreader.cc:933
 hmdcgarreader.cc:934
 hmdcgarreader.cc:935
 hmdcgarreader.cc:936
 hmdcgarreader.cc:937
 hmdcgarreader.cc:938
 hmdcgarreader.cc:939
 hmdcgarreader.cc:940
 hmdcgarreader.cc:941
 hmdcgarreader.cc:942
 hmdcgarreader.cc:943
 hmdcgarreader.cc:944
 hmdcgarreader.cc:945
 hmdcgarreader.cc:946
 hmdcgarreader.cc:947
 hmdcgarreader.cc:948
 hmdcgarreader.cc:949
 hmdcgarreader.cc:950
 hmdcgarreader.cc:951
 hmdcgarreader.cc:952
 hmdcgarreader.cc:953
 hmdcgarreader.cc:954
 hmdcgarreader.cc:955
 hmdcgarreader.cc:956
 hmdcgarreader.cc:957
 hmdcgarreader.cc:958
 hmdcgarreader.cc:959
 hmdcgarreader.cc:960
 hmdcgarreader.cc:961
 hmdcgarreader.cc:962
 hmdcgarreader.cc:963
 hmdcgarreader.cc:964
 hmdcgarreader.cc:965
 hmdcgarreader.cc:966
 hmdcgarreader.cc:967