const int n=1401;
double GetCfromDepletionRadius(double voltage, double radius, double boreR)
{
detector.
Bias[1]=voltage;
double up=radius, down=boreR, depletionR=radius;
depletionR=(down+up)/2;
if (grid.
GetV(depletionR)<voltage) down=depletionR;
else up=depletionR;
}
cout<<depletionR<<" "<<voltage<<endl;
return epsilon*3.14159*2/log(depletionR/boreR);
}
double GetCfromGeFiCa(double voltage, double radius,double boreR)
{
detector.
Bias[1]=voltage;
}
double FindR(double voltage,double upR,double downR,double boreR,double rho)
{
if (upR<downR+1e-7*
mm)
return upR;
double r=(upR+downR)/2;
double c1=-rho*r*r/2;
double c2=rho*boreR*boreR/4-c1*log(boreR);
double V=rho*r*r/4+c1*log(r)+c2;
if (V>voltage) return FindR(voltage,r,downR,boreR,rho);
else return FindR(voltage,upR,r,boreR,rho);
}
double GetCanalytically(double voltage, double radius,double boreR)
{
double depth=FindR(voltage,radius,boreR,boreR,rho);
if (depth>radius) depth=radius;
cout<<depth<<endl;
return epsilon*3.14159*2/log(depth/boreR);
}
void verifyCV()
{
const int np=12;
Double_t V[np], Cn[np], Ca[np],Cg[np],b[np];
for (Int_t i=1;i<np;i++) {
V[i] = 200;
b[i]=boreR*i;
Cn[i] = GetCfromDepletionRadius(V[i],radius,boreR*i)/
pF;
Cg[i] = GetCfromGeFiCa(V[i],radius,boreR*i)/
pF;
Ca[i] = GetCanalytically(V[i],radius,boreR*i)/
pF;
}
TGraph *gn = new TGraph(np,b,Cn); gn->SetMarkerStyle(22);
TGraph *gg = new TGraph(np,b,Cg); gg->SetMarkerStyle(24);
TGraph *ga = new TGraph(np,b,Ca); ga->SetMarkerStyle(25);
gStyle->SetPadLeftMargin(0.09);
gStyle->SetPadRightMargin(0.01);
gStyle->SetTitleOffset(0.85,"y");
TMultiGraph *gs = new TMultiGraph; gs->Add(gn); gs->Add(gg); gs->Add(ga);
gs->SetTitle(";Bias [V];Capacitance per unit length [pF/cm]");
gs->Draw("pac");
TLegend *l = new TLegend(0.4,0.7,0.97,0.97);
l->AddEntry(ga,"2#pi#varepsilon/ln(R_{out}/R_{in}), analytically","pl");
l->AddEntry(gn,"2#pi#varepsilon/ln(R_{out}/R_{in}), numerically","pl");
l->AddEntry(gg,"GeFiCa::X::GetC()","pl");
l->Draw();
}