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)
{
initVariables();
}
HMdcGarReader::~HMdcGarReader()
{
}
void HMdcGarReader::initVariables()
{
}
TGraph* HMdcGarReader::readXT(TString inputname,Int_t color)
{
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";
while(1)
{
if(feof(input)) break;
fgets(line, sizeof(line), input);
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;
fgets(line, sizeof(line), input);
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)
{
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";
while(1)
{
if(feof(input)) break;
fgets(line, sizeof(line), input);
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;
fgets(line, sizeof(line), input);
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)
{
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];
Int_t scan_count;
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;
while(1)
{
if(feof(input)) break;
fgets(line, sizeof(line), input);
if (!strncmp(line, Tag2 ,strlen(Tag2)))
{
sscanf(line,"%*s%*s%i",&version);
cout<<"version "<<version<<endl;
}
if (!strncmp(line, Tag1 ,strlen(Tag1)))
{
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)
{
if(feof(input)) break;
fgets(line, sizeof(line), input);
if (!strncmp(line, Tag3 ,strlen(Tag3)))
{
found=1;
while(1)
{
fgets(line, sizeof(line), input);
if (!strncmp(line, Tag4 ,strlen(Tag4)))
{
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;
fgets(line, sizeof(line), input);
if (!strncmp(line, Tag ,strlen(Tag))) break;
}
while (count<numberOfBins) {
if (feof(input)) break;
fgets(line, sizeof(line), input);
if(version==3)
{
scan_count=sscanf(line,"%e%e%*s",
&f_ep, &f_vdrift);
ep [count]=f_ep;
Vdrift[count]=f_vdrift*10;
}
else if(version==4)
{
scan_count=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]);
fgets(line, sizeof(line), input);
fgets(line, sizeof(line), input);
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)
{
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=" ";
Int_t count=0;
while(1)
{
if(feof(input)) break;
fgets(line, sizeof(line), input);
if (!strncmp(line, Tag ,strlen(Tag)))
{
break;
}
}
while(1)
{
if(feof(input)) break;
fgets(line, sizeof(line), input);
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;
}
TArrayD* HMdcGarReader::readMatrix(TString inputname,Int_t& size1,Int_t& size2)
{
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;
size2=1;
while(1)
{
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)))
{
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();
TString histname=inputname;
if(histname.Contains("/")==1)
{
histname.Replace(0,inputname.Last('/')+1,"",0);
}
if(histname.Contains(".")==1)
{
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);
TString histname=inputname;
if(histname.Contains("/")==1)
{
histname.Replace(0,inputname.Last('/')+1,"",0);
}
if(histname.Contains(".")==1)
{
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)
{
if(input.eof()) break;
input.getline(line, sizeof(line));
if (!strncmp(line, Tag ,strlen(Tag)))
{
sscanf(line,"%*s%f",&xmin);
}
if (!strncmp(line, Tag1 ,strlen(Tag1)))
{
sscanf(line,"%*s%f",&xmax);
}
if (!strncmp(line, Tag2 ,strlen(Tag2)))
{
sscanf(line,"%*s%i",&bins);
}
if (!strncmp(line, Tag3 ,strlen(Tag2)))
{
break;
}
}
xmin=scalex*xmin;
xmax=scalex*xmax;
TString histname=inputname;
if(histname.Contains("/")==1)
{
histname.Replace(0,inputname.Last('/')+1,"",0);
}
if(histname.Contains(".")==1)
{
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;
}
Last change: Sat May 22 13:01:59 2010
Last generated: 2010-05-22 13:01
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.