#include "Rtypes.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "CVIV.h"
#include <string.h>
#include "TF1.h"
#include "TString.h"
#include "TArray.h"
ClassImp(CVIV)
CVIV::CVIV(Char_t *FileName,Int_t x,Int_t y)
{
NumFreq=x;
Offset=0;
Scale=1;
FILE *in;
Date=TArrayF(6);
Freq=TArrayF(NumFreq);
if((in=fopen((const Char_t *)FileName,"r+"))==NULL) {printf("\n Error opening file for reading\n"); return;}
Read(in,y,0);
fclose(in);
}
CVIV::CVIV(FILE *in,Int_t x,Int_t y)
{
NumFreq=x;
Date=TArrayF(6);
Freq=TArrayF(NumFreq);
Read(in,y,0);
}
void CVIV::Read(FILE *in,Int_t y,Int_t show)
{
Float_t temp[1000];
Int_t i=0,j=0;
if(y==-1111) Steps=0;
fscanf(in,"%f %f %f %f %f %f\n",&Date[0],&Date[1],&Date[2],&Date[3],&Date[4],&Date[5]);
if(show) printf("DATE= %4.0f %4.0f %4.0f %4.0f %4.0f %4.0f\n",Date[0],Date[1],Date[2],Date[3],Date[4],Date[5]);
if(y==-1111)
{
fscanf(in,"%f ",&temp[Steps]);
while(1)
{
Steps++;
fscanf(in,"%f ",&temp[Steps]);
if(TMath::Abs(temp[Steps])<0.001 && Steps>4) break;
}
if(show) printf("Steps=%d temp[Steps]=%e\n",Steps,temp[Steps]);
Current=TArrayF(Steps);
Voltages=TArrayF(Steps);
Current[0]=temp[Steps];
Voltages[0]=temp[0];
for(i=1;i<Steps;i++) {Voltages[i]=temp[i]; fscanf(in,"%f ",&Current[i]); }
}
else
{
Voltages=TArrayF(Steps);
for(i=0;i<Steps;i++) fscanf(in,"%f ",&Voltages[i]);
for(i=0;i<Steps;i++) fscanf(in,"%f ",&Current[i]);
}
Cap=TArrayF(Steps*NumFreq);
Res=TArrayF(Steps*NumFreq);
Char_t frekname[20],number[20];
Int_t lenght,pos;
for(j=0;j<NumFreq;j++)
{
fscanf(in,"%s",frekname);
Freq[j]= GetFreq(frekname);
if(show) printf("Freq=%d %s : val=%f\n",j,frekname,GetFreq(frekname));
for(i=0;i<Steps;i++) {fscanf(in,"%f ",&Cap[j*Steps+i]); if(show) printf("%d(%5.2e)\n",i,Cap[j*Steps+i]);}
}
for(j=0;j<NumFreq;j++)
{
fscanf(in,"%s",frekname);
for(i=0;i<Steps;i++) fscanf(in,"%f ",&Res[j*Steps+i]);;
}
Temperature=TArrayF(Steps);
for(i=0;i<Steps;i++) fscanf(in,"%f ",&Temperature[i]);
}
Float_t CVIV::GetFreq(Char_t *value)
{
Char_t valstr[20];
Float_t val,Mul=1;
Int_t start=strcspn(value,"Hz");
//printf("Start=%d ::: ",start);
if(value[start-1]=='k' || value[start-1]=='K') Mul=1;
if(value[start-1]=='M') Mul=1000;
if(value[start-1]==' ') Mul=0.001;
strncpy(valstr,&value[1],start-2);
valstr[start-2]='0';//printf("%sn",valstr);
val=atof(valstr)*Mul;
//printf("val=%fn",val);
return val;
}
void CVIV::Legend(TGraph *gr, Int_t start, Int_t end)
{
Float_t minx,miny,maxy,maxx,x1,x2,y1,y2;
TString title,utit="f=";
Char_t v[5];
Int_t color;
Int_t colori[]={1,2,3,4,5,6,7,13,28,30,34,38,40,31,46,49,1,2,3,4,5,6,7};
TText *text;
//minx=(gr->GetX())[0];
//maxx=(gr->GetX())[Steps];
miny=(gr->GetYaxis())->GetXmin();
maxy=(gr->GetYaxis())->GetXmax();
minx=(gr->GetXaxis())->GetXmin();
maxx=(gr->GetXaxis())->GetXmax();
//printf("ata");
//miny=((TH1F *)gr->GetHistogram())->GetMinimum();
//maxy=((TH1F *)gr->GetHistogram())->GetMaximum();
x1=(maxx-minx)*0.6+minx;
x2=(maxx-minx)*0.9+minx;
y2=(maxy-miny)*0.35+miny;
y1=(maxy-miny)*0.95+miny;
//printf("coords: x1=%f y1=%f x2=%f y2=%fn",x1,y1,x2,y2);
pt.Clear();
TPaveText tpt(x1,y1,x2,y2);
tpt.TPave::Copy(pt);
for(Int_t i=start;i<=end;i++)
{
i2a(v,(Int_t)Freq[i]);
// color=i/7*40+i%7+1;
color=colori[i-start];
title=utit+v; title=title+" kHz";
text=pt.AddText((const char *)title);
text->SetTextColor((Color_t)color);
text->SetTextSize(0.05);
}
pt.Draw();
tpt.Clear();
}
CVIV::~CVIV()
{
}
TGraph *CVIV::DrawIV(Int_t reverse)
{
Int_t i=0;
Float_t *ii=new Float_t[Steps];
Float_t *vv=new Float_t[Steps];
for( i=0;i<Steps;i++) if(reverse) {ii[i]=-Current[i]*1e6; vv[i]=-Voltages[i]; } else { ii[i]=Current[i]*1e6; vv[i]=Voltages[i]; };
TGraph *iv=new TGraph(Steps,vv,ii);
iv->SetLineWidth(4);
iv->SetMarkerStyle(20);
Char_t v[6];
Float_t MeanT=Temperature.GetSum()/Temperature.GetSize();
i2a(&v[1],TMath::Abs(MeanT)); if(MeanT<0) v[0]=45; else v[0]=43;
TString title="I-V @ T="; title=title+v; title=title+" C";
iv->SetTitle((const char *)title);
iv->Draw("APL");
iv->GetHistogram()->SetXTitle("U[V]");
iv->GetHistogram()->SetYTitle("I[uA]");
iv->GetHistogram()->Draw();
iv->Draw("APL");
return(iv);
iv->Draw("AL*");
}
TGraph *CVIV::DrawCV(Int_t index,Int_t option,Int_t start, Int_t end,Int_t drawopt)
{
Int_t i;
Float_t *cc,*vv;
cc=new Float_t[Steps];
vv=new Float_t[Steps];
char namex[20],namey[20];
if(start==-1111) start=0;
if(end==-1111) end=Steps;
switch(option)
{
case 0:
for( i=start;i<end;i++) {vv[i]=TMath::Abs(Voltages[i]); cc[i]=(Cap[index*Steps+i]-Offset)*1e12*Scale;};
strcpy(namex,"U[V]"); strcpy(namey,"C [pF]"); break;
case 1:
for( i=start;i<end;i++) {vv[i]=TMath::Abs(Voltages[i]); cc[i]=1e-24/TMath::Power((Cap[index*Steps+i]-Offset)*Scale,2);}
strcpy(namex,"U[V]"); strcpy(namey,"1/C^{2} [1/pF^{2}]"); break;
case 2:
for( i=start;i<end;i++) {vv[i]=TMath::Sqrt(TMath::Abs(Voltages[i])); cc[i]=1e-12/((Cap[index*Steps+i]-Offset)*Scale);}
strcpy(namex,"Sqrt(U)[Sqrt(V)]"); strcpy(namey,"1/C [1/pF]"); break;
case 3:
for( i=start;i<end;i++) {vv[i]=TMath::Log(TMath::Abs(Voltages[i]+0.000001)); cc[i]=TMath::Log(TMath::Abs((Cap[index*Steps+i]-Offset)*Scale) );};
strcpy(namex,"Log U"); strcpy(namey,"log C"); break;
}
TGraph *cv=new TGraph(end-start,&vv[start],&cc[start]);
cv->SetLineWidth(4);
cv->SetMarkerStyle(21);
if(drawopt)
{
Char_t v[6];
Float_t MeanT=Temperature.GetSum()/Temperature.GetSize();
i2a(&v[1],TMath::Abs(MeanT)); if(MeanT<0) v[0]=45; else v[0]=43;
TString title="C-V @ T="; title=title+v; title=title+" C";
if(drawopt<2)
{
title=title+" , #nu=";
i2a(v,Freq[index]);
title=title+v; title=title+" kHz";
}
cv->SetTitle((const char *)title);
cv->Draw("APL");
cv->GetHistogram()->SetXTitle(namex);
cv->GetHistogram()->SetYTitle(namey);
cv->GetHistogram()->Draw();
cv->Draw("APL");
}
delete cc;
delete vv;
return(cv);
cv->Draw("AL*");
}
void CVIV::DrawMulti(Int_t option,Int_t sm, Int_t em,Int_t sbin,Int_t ebin)
{
Int_t i,j;
TGraph *gr,*grm;
Float_t miny=1e40,maxy=1e-40;
Int_t color;
Int_t colori[]={1,2,3,4,5,6,7,13,28,30,34,38,40,31,46,49,1,2,3,4,5,6,7};
if(sbin==-1111) sbin=0;
if(ebin==-1111) ebin=Steps;
if(em==-1111) em=NumFreq;
for(i=sm;i<em; i++)
if(i==sm)
{
grm=DrawCV(i,option,sbin,ebin,2);
color=colori[i-sm];
grm->SetLineColor(color);
grm->SetMarkerColor(color);
}
else
{
gr=DrawCV(i,option,sbin,ebin,0);
gr->SetMarkerStyle(i+20);
color=colori[i-sm];
gr->SetLineColor(color);
gr->SetMarkerColor(color);
gr->Draw("PL");
}
Legend(grm,sm,em-1);
}
TGraph *CVIV::DrawTV()
{
Float_t *vv=new Float_t[Voltages.GetSize()];
for(Int_t i=0;i<Voltages.GetSize();i++) vv[i]=TMath::Abs(Voltages[i]);
TGraph *iv=new TGraph(Steps,vv,Temperature.GetArray());
iv->SetLineWidth(4);
iv->SetMarkerStyle(20);
iv->SetTitle("T-V");
iv->Draw("APL");
iv->GetHistogram()->SetXTitle("U[V]");
iv->GetHistogram()->SetYTitle("T[C]");
iv->GetHistogram()->Draw();
iv->Draw("APL");
delete [] vv;
return(iv);
}
Int_t CVIV::i2a(Char_t *v,Float_t freq)
{
Int_t k=0,ok=0;
Int_t vol=(Int_t) freq;
if((Int_t) vol/1000!=0 || ok) {v[k++]=(Char_t)(vol/1000)+48; vol=vol%1000; ok=1;}
if((Int_t) vol/100!=0 || ok) {v[k++]=(Char_t)(vol/100)+48; vol=vol%100; ok=1;}
if((Int_t) vol/10!=0 || ok) {v[k++]=(Char_t)(vol/10)+48; vol=vol%10; ok=1;}
v[k++]=(Char_t)((Int_t) vol)+48;
v[k++]='0';
return k-1;
}
Float_t CVIV::GetFDV(Float_t x0, Float_t x1, Float_t x2, Float_t x3, Int_t index, Int_t option,Int_t show)
{
TF1 *p1=new TF1("p1","pol1",x0,x1);
TF1 *p2=new TF1("p2","pol1",x2,x3);
TGraph *gr;
Float_t result,FitRes;
gr=DrawCV(index,option,-1111,-1111,show);
gr->Fit("p1","RQ");
gr->Fit("p2","RQ");
FitRes=(p2->GetParameter(0)-p1->GetParameter(0))/(p1->GetParameter(1)-p2->GetParameter(1));
switch(option)
{
case 0: break;
case 1: result=FitRes; break;
case 2: result=FitRes*FitRes; break;
case 3: result=TMath::Exp(FitRes); break;
}
if(show)
{
//printf("%f %f %f %fn",x0,p1->GetParameter(0)+p1->GetParameter(1)*x0,x2,p1->GetParameter(0)+p1->GetParameter(1)*x2);
TLine *line1=new TLine(x0,p1->GetParameter(0)+p1->GetParameter(1)*x0,x2,p1->GetParameter(0)+p1->GetParameter(1)*x2);
TLine *line2=new TLine(x1,p2->GetParameter(0)+p2->GetParameter(1)*x1,x3,p2->GetParameter(0)+p2->GetParameter(1)*x3);
line1->SetLineColor(2);
line1->SetLineWidth(2);
line2->SetLineColor(2);
line2->SetLineWidth(2);
line2->Draw();
line1->Draw();
}
else
{
delete gr;
delete p1;
delete p2;
}
return(result);
}
void CVIV::Info(Int_t full)
{
Int_t i;
printf("Date: %4.0f %4.0f %4.0f , Time: %4.0f %4.0f %4.0fn",Date[0],Date[1],Date[2],Date[3],Date[4],Date[5]);
printf("Number of steps: %d :: First=%5.2f V -> Last=%5.2f Vn",Steps,Voltages[0],Voltages[Steps-1]);
printf("Number of frequency: %d (",NumFreq);
for(i=0;i<NumFreq;i++) printf("%3.0f kHz ",Freq[i]); printf(")n");
printf("Average Temperature: %fn",Temperature.GetSum()/Temperature.GetSize());
if(full)
{
printf("Printing CV information:");
for( i=0;i<Steps*NumFreq;i++)
{
if(i%Steps==0) printf("n");
printf("%3.1f ,",Cap[i]*1e12);
};
printf("n");
}
}
Float_t CVIV::GetTime(Float_t scale)
{
Float_t MonthSec[12]={0,31,59,90,120,151,181,212,243,273,303,333};
if(Date[0]==0) Date[0]=100;
Float_t Year=(Date[0]-95)*31536000./scale;
if(((Int_t)Year)%4==0) for(Int_t i=2;i<12;i++) MonthSec[i]+=1;
Float_t Month=MonthSec[(Int_t) (Date[1]-1)]*86400./scale;
Float_t Day=Date[2]*86400./scale;;
Float_t Hour=Date[3]*3600./scale;
Float_t Min=Date[4]*60./scale;
Float_t Sec=Date[5]/scale;
//printf("%f %f %f %f %f %fn",Year,Month,Day,Hour,Min,Sec);
return(Year+Month+Day+Hour+Min+Sec);
}
Float_t CVIV::GetCurrent(Float_t Volt)
{
Float_t curr;
Int_t i=0;
for(i=0;i<Steps;i++)
if(TMath::Abs(Volt)<=TMath::Abs(Voltages[i])) break;
curr=(Current[i]-Current[i-1])/(Voltages[i]-Voltages[i-1])*(TMath::Abs(Volt)-TMath::Abs(Voltages[i-1]))+Current[i-1];
return curr;
}
ROOT page - Class index - Top of the page
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.