#include "Rtypes.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "Trap.h"
#include "fizconst.h"
/*static double ME = 0.51099906; // MeV
static double Clight = 299792458;
static double mh = ME*0.558;
static double me = ME*1.08; //ev/C^2
static double Kboltz = 8.617385e-5; // eV/K
static double SIgap = 1.12; //eV
static double hbar = 6.5821220e-22; //MeV s
static double hbarc = 197.327053; //MeV fm*/
ClassImp(Trap)
Trap::Trap(Double_t x1,Double_t x2,Double_t x3,Double_t x4,Double_t x5,Double_t x6,Double_t x7,Double_t x8)
{
//Constructor:
// Double_t x1 ; Ratio cn/cp;
// Double_t x2 ; Charge charge>0 holes, charge<0 electrons;
// Double_t x3 ; Introduction rate for effective trapp at reference temperature
// Double_t x4 ; Effective energy Level of the defect
// Double_t x5 ; Temperature
// Double_t x6 ; Fluence;
// Double_t x7 ; RefTemperature;
// Double_t x8 ; cp (used for calculation of effective detrapping time;
Cross=x1;
Charge=x2;
IntroRate=x3;
EnergyLevel=x4;
Temperature=x5;
Fluence=x6;
RefTemperature=x7;
Cp=x8;
init=1;
TrapOnly=0;
}
Trap::~Trap()
{
Clear();
init=0;
}
Double_t Trap::ThermalVelocity()
{
Double_t m;
if(Charge > 0) m=mh*1e6; else m=me*1e6;
return TMath::Sqrt(3*Kboltz*Temperature*TMath::Power(Clight,2)/m)*1e2; //Poprava iz dne 14.4.2000 prej je bilo 1e2
}
Double_t Trap::DenState()
{
Double_t m;
if(Charge > 0) m=mh; else m=me;
return 2*TMath::Power(m*Kboltz*1e-6*Temperature/(2*TMath::Pi()*TMath::Power(hbarc,2)),1.5)*1e39;
}
Double_t Trap::DeTrapTime()
{
Double_t Eg=1.12,kb=8.617385e-5;
Double_t ni=1.45e10*TMath::Exp( Eg/(2*kb)* ( 1/300. - 1/Temperature ) );
Double_t Ei=Eg/2+0.75*kb*Temperature*TMath::Log(0.517);
Double_t ksit=TMath::Exp((EnergyLevel-Ei)/(kb*Temperature));
Double_t eprob;
if(Charge<0) eprob=ni*Cross*Cp*TMath::Sqrt(Temperature/RefTemperature)*ksit;
if(Charge>0) eprob=ni*Cp*TMath::Sqrt(Temperature/RefTemperature)/ksit;
return (1/eprob)*1e-9;
}
Double_t Trap::TrapTime()
{
// Calculates trapping time from the given parameters
//
Double_t ratio;
Double_t Eg=1.12,kb=8.617385e-5;
Double_t Ei=Eg/2+0.75*kb*Temperature*TMath::Log(0.517);
Double_t ksit=TMath::Exp((EnergyLevel-Ei)/(kb*Temperature));
Double_t ksit0=TMath::Exp((EnergyLevel-Ei)/(kb*RefTemperature));
Double_t Pt=1/(ksit*ksit*Cross+1);
Double_t Pt0=1/(ksit0*ksit0*Cross+1);
if(Charge<0) ratio=(1-Pt)/(1-Pt0);
if(Charge>0) ratio=(Pt)/(Pt0);
Double_t result=IntroRate*Fluence*TMath::Sqrt(Temperature/RefTemperature)*ratio;
return (1/result)*1e-9;
}
void Trap::GetInfo()
{
printf("Defect characterization:n");
Dump();
printf("Trapping time %e [s]n", TrapTime());
printf("DeTrapping time %e [s]n", DeTrapTime());
}
void Trap::Trapping(TH1F *inh, TH1F *outh)
{
Double_t binwidth=inh->GetBinWidth(1),expt,expdt;
Int_t nbininh=inh->GetNbinsX(),i,j,k,z,imax,jmax;
Int_t mul[4]={1,1,20,1};
Double_t tmax=0,dtf,tf,binwd=0,detrap=0,trap=0,detr=0;;
Double_t tr=TrapTime();
Double_t dtr=DeTrapTime();
char *hname[4]={"tx0","tx1","tx2","tx3"};
char *hdesc[4]={"x Charge Untrapped","x Charge Trapped ","x Charge Detrapped","x Charge trapping "};
if(Charge>0 && init) for(i=0;i<4;i++){hname[i][1]=(char)'p'; hdesc[i][0]=(char)'+';}
if(Charge<0 && init) for(i=0;i<4;i++){hname[i][1]=(char)'n'; hdesc[i][0]=(char)'-';}
if(init)
{
for(i=0;i<4;i++) outh[i]=TH1F(hname[i],hdesc[i],nbininh*mul[i],0,binwidth*nbininh*mul[i]);
init=0;
}
else
for(i=0;i<4;i++) outh[i].Reset();
for(i=1;i<=nbininh;i++) if(inh->GetBinContent(i)!=0) {tmax=inh->GetBinCenter(i); imax=i;}
jmax=outh[2].GetNbinsX();
//printf("tmax=%e imax=%dn",tmax,imax);
for(i=1;i<=imax;i++) {
outh[0].SetBinContent(i,TMath::Exp(-inh->GetBinCenter(i)/tr));
outh[1].SetBinContent(i,(outh[0].GetBinContent(i)*outh[1].GetBinWidth(i)/tr));
}
if(TrapOnly==0)
{
binwd=outh[2].GetBinWidth(1);
expdt=binwd/dtr;
expt=binwd/tr;
// expdt=1-TMath::Exp(-binwd/dtr);
//expt=1-TMath::Exp(-binwd/tr);
if(expdt>1) expdt=1; if(expt>1) expt=1;
//printf("exptr=%e expdrt=%e tr=%e dtr=%e",1-TMath::Exp(-binwd/tr),1-TMath::Exp(-binwd/dtr),expt,expdt);
for(j=1;j<=jmax-imax;j++)
{
detr=outh[1].GetBinContent(1)*expdt;
outh[1].SetBinContent(1,outh[1].GetBinContent(1)-detr);
outh[2].AddBinContent(j+1,detr*inh->GetBinContent(1));
for(i=2;i<=imax;i++)
{
trap=detr*expt;
//detr-=trap;
detrap=(outh[1].GetBinContent(i)+trap)*expdt;
outh[1].SetBinContent(i,outh[1].GetBinContent(i)+trap-detrap);
detr+=detrap-trap;
outh[2].AddBinContent(j+i,(detr)*inh->GetBinContent(i));
}
trap=0; detrap=0; detr=0;
}
for(i=1;i<outh[3].GetNbinsX();i++) outh[3].SetBinContent(i,inh->GetBinContent(i)*outh[0].GetBinContent(i)+outh[2].GetBinContent(i));
}
else
for(i=1;i<outh[3].GetNbinsX();i++) outh[3].SetBinContent(i,inh->GetBinContent(i)*outh[0].GetBinContent(i));
}
void Trap::Trapping(TH1F *inh)
{
Double_t binwidth=inh->GetBinWidth(1),expt,expdt;
Int_t nbininh=inh->GetNbinsX(),i,j,k,z,imax,jmax;
Int_t mul[4]={1,1,20,1};
Double_t tmax=0,dtf,tf,binwd=0,detrap=0,trap=0,detr=0;;
Double_t tr=TrapTime();
Double_t dtr=DeTrapTime();
TH1F *outh= new TH1F[4];
char *hname[4]={"tx0","tx1","tx2","tx3"};
char *hdesc[4]={"x Charge Untrapped","x Charge Trapped ","x Charge Detrapped","x Charge trapping "};
if(Charge>0 && init) for(i=0;i<4;i++){hname[i][1]=(char)'p'; hdesc[i][0]=(char)'+';}
if(Charge<0 && init) for(i=0;i<4;i++){hname[i][1]=(char)'n'; hdesc[i][0]=(char)'-';}
if(init)
{
for(i=0;i<4;i++) outh[i]=TH1F(hname[i],hdesc[i],nbininh*mul[i],0,binwidth*nbininh*mul[i]);
init=0;
}
else
for(i=0;i<4;i++) outh[i].Reset();
for(i=1;i<=nbininh;i++) if(inh->GetBinContent(i)!=0) {tmax=inh->GetBinCenter(i); imax=i;}
jmax=outh[2].GetNbinsX();
//printf("tmax=%e imax=%dn",tmax,imax);
for(i=1;i<=imax;i++) {
outh[0].SetBinContent(i,TMath::Exp(-inh->GetBinCenter(i)/tr));
outh[1].SetBinContent(i,(outh[0].GetBinContent(i)*outh[1].GetBinWidth(i)/tr));
}
if(TrapOnly==0)
{
binwd=outh[2].GetBinWidth(1);
expdt=binwd/dtr;
expt=binwd/tr;
// expdt=1-TMath::Exp(-binwd/dtr);
//expt=1-TMath::Exp(-binwd/tr);
if(expdt>1) expdt=1; if(expt>1) expt=1;
//printf("exptr=%e expdrt=%e tr=%e dtr=%e",1-TMath::Exp(-binwd/tr),1-TMath::Exp(-binwd/dtr),expt,expdt);
for(j=1;j<=jmax-imax;j++)
{
detr=outh[1].GetBinContent(1)*expdt;
outh[1].SetBinContent(1,outh[1].GetBinContent(1)-detr);
outh[2].AddBinContent(j+1,detr*inh->GetBinContent(1));
for(i=2;i<=imax;i++)
{
trap=detr*expt;
//detr-=trap;
detrap=(outh[1].GetBinContent(i)+trap)*expdt;
outh[1].SetBinContent(i,outh[1].GetBinContent(i)+trap-detrap);
detr+=detrap-trap;
outh[2].AddBinContent(j+i,(detr)*inh->GetBinContent(i));
}
trap=0; detrap=0; detr=0;
}
for(i=1;i<inh->GetNbinsX();i++) inh->SetBinContent(i,inh->GetBinContent(i)*outh[0].GetBinContent(i)+outh[2].GetBinContent(i));
}
else
for(i=1;i<inh->GetNbinsX();i++) inh->SetBinContent(i,inh->GetBinContent(i)*outh[0].GetBinContent(i));
delete [] outh;
}
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.