sipm-characterisation 0.1.0
SiPM characterisation for ePIC — IV/DCR/gain, laser, readout, irradiation
Loading...
Searching...
No Matches
make_iv_scan.C
Go to the documentation of this file.
1#pragma once
2
3#include "makeiv.C"
4
5bool iv_fit_oneshot = true;
6
7double iv_fit_function(double *x, double *p)
8{
9 double x2 = (x[0] - p[3]) * (x[0] - p[3]);
10 double x4 = x2 * x2;
11 double x6 = x2 * x2 * x2;
12 double below = p[0] * std::exp(p[2] * x[0]) + p[1] * std::exp(p[2] * x[0] * x[0]);
13 double transition = 0.5 * (std::erf((x[0] - p[3]) / p[4]) + 1.);
14 double above = p[5] * p[5] * x2 + p[6] * p[6] * x4 + p[7] * p[7] * x6;
15 return below + transition * above;
16}
17
19{
20 auto f = new TF1("f_iv_fit_function", iv_fit_function, 0., 100., 7);
21 f->SetParameter(0, 1.e-10);
22 f->SetParameter(1, 1.e-10);
23 f->SetParameter(2, -1.e-10);
24 f->SetParameter(3, vbreak);
25 f->SetParameter(4, 0.1);
26 f->SetParameter(5, 1.e-10);
27 f->SetParameter(6, 1.e-10);
28 f->SetParameter(7, 1.e-10);
29 return f;
30}
31
33{
34 TVirtualFitter::SetMaxIterations(kMaxInt);
36
37 for (int itry = 0; itry < ntry; ++itry)
38 {
39
41 for (int i = 3; i < fbelow->GetNpar(); ++i)
42 fbelow->FixParameter(i, 0.);
43 g->Fit(fbelow, "0q", "", 0., vstart - 1.);
44
46 for (int i = 0; i < 3; ++i)
47 fabove->FixParameter(i, 0.);
48 fabove->FixParameter(3, vstart);
49 fabove->FixParameter(4, 0.1);
50 g->Fit(fabove, "0q", "", vstart + 1., vstart + 3.);
51
52 for (int i = 0; i < 3; ++i)
53 fall->SetParameter(i, fbelow->GetParameter(i));
54 for (int i = 3; i < fbelow->GetNpar(); ++i)
55 fall->SetParameter(i, fabove->GetParameter(i));
56 fall->FixParameter(3, vstart);
57 fall->FixParameter(4, 0.1);
58 g->Fit(fall, "0q", "", 0., vstart + 3.);
59 fall->ReleaseParameter(3);
60 fall->ReleaseParameter(4);
61 g->Fit(fall, "0q", "", 0., vstart + 3.);
62 g->Fit(fall, "0q", "", 0., vstart + 3.);
63 g->Fit(fall, "0q", "", 0., vstart + 3.);
64
65 delete fbelow;
66 delete fabove;
67
68 std::cout << fall->GetParameter(3) << " +- " << fall->GetParError(3) << std::endl;
69
70 if (std::fabs(fall->GetParameter(3) - vstart) < 0.005)
71 break;
72
73 vstart = fall->GetParameter(3);
74 }
75
76 return fall;
77}
78
79TF1 *iv_fit(TGraphErrors *g, float vstart, bool oneshot = true)
80{
81 TVirtualFitter::SetMaxIterations(kMaxUInt);
82
83 std::cout << " --- IV FIT : " << g << std::endl;
84 // g->Print("all");
85
86 // auto f = new TF1("f", "expo(0) + pol0(2) + (x > [3]) * ( [4] * pow(abs(x - [3]), [5]) )", 0., 100.);
87
88 auto f = new TF1("fSURF", "expo(0) + pol0(2) + (x > [3]) * ( [4] * pow(abs(x - [3]), [5]) + [6] * pow(abs(x - [3]), [7]) )", 0., 100.);
89
90 for (int itry = 0; itry < 100; ++itry)
91 {
92
93 // fit background
94 for (int i = 0; i < f->GetNpar(); ++i)
95 f->FixParameter(i, 0.);
96 f->ReleaseParameter(0);
97 f->ReleaseParameter(1);
98 f->SetParLimits(1, -1.e6, 0.);
99 g->Fit(f, "0q", "", vstart - 2., vstart - 1.);
100
101 // fit sensor
102 for (int i = 0; i < f->GetNpar(); ++i)
103 f->ReleaseParameter(i);
104 f->FixParameter(0, f->GetParameter(0));
105 f->FixParameter(1, f->GetParameter(1));
106 f->SetParameter(2, 1.e-12);
107 f->SetParLimits(2, 0., 1.e-10);
108 f->SetParameter(3, vstart);
109 f->SetParLimits(3, vstart - 1., vstart + 1.);
110 f->SetParameter(4, 1.e-12);
111 f->SetParLimits(4, 0., 1.e-6);
112 f->FixParameter(5, 2.);
113 // f->SetParLimits(5, 0., 10.);
114 f->SetParameter(6, 1.e-12);
115 // f->SetParLimits(6, 0., 1.e-6);
116 f->FixParameter(7, 4.);
117 // f->SetParLimits(7, 0., 10.);
118 g->Fit(f, "0q", "", vstart + 1., vstart + 2.);
119
120 // fit all
121 for (int i = 0; i < f->GetNpar(); ++i)
122 f->ReleaseParameter(i);
123 f->SetParLimits(1, -1.e3, 0.);
124 f->SetParLimits(2, 0., 1.e-10);
125 f->SetParLimits(3, vstart - 3., vstart + 3.);
126 f->SetParLimits(4, 0., 1.e-6);
127 f->FixParameter(5, 2.);
128 // f->SetParLimits(5, 0., 10.);
129 // R+++++ f->SetParLimits(6, 0., 1.e-6);
130 f->FixParameter(7, 4.);
131 // f->SetParLimits(7, 0., 10.);
132 g->Fit(f, "0", "", 0., vstart + 3.);
133 f->ReleaseParameter(5);
134 f->ReleaseParameter(7);
135 int res = g->Fit(f, "0M", "", 0., vstart + 3.);
136 std::cout << " --->>> " << res << std::endl;
137
138 f->SetRange(0., vstart + 5.);
139
140 if (iv_fit_oneshot || fabs(f->GetParameter(3) - vstart) < 0.01)
141 break;
142
143 vstart = f->GetParameter(3);
144 }
145
146 // f->SetParameter(4, 0.);
147 // f->DrawClone("same");
148 std::cout << "vdb = " << f->GetParameter(3) << " +- " << f->GetParError(3) << std::endl;
149
150 return f;
151}
152
154make_iv_scan(std::string filename, std::string filenameOPEN = "", std::string filenameZERO = "", float vbreak = -1.)
155{
156 auto g = makeiv(filename, filenameZERO, true, true, false);
157 if (!g)
158 return nullptr;
159 if (filenameOPEN.empty())
160 {
161 // make_csv(g, filename + ".processed.csv");
162 return g;
163 }
164
165 auto gOPEN = makeiv(filenameOPEN, "", true, true, false);
166 if (!gOPEN)
167 return nullptr;
168 auto fOPEN = (TF1 *)gROOT->GetFunction("pol1");
169 gOPEN->Fit(fOPEN, "Q");
170 for (int i = 0; i < g->GetN(); ++i)
171 {
172 double offset = fOPEN->Eval(g->GetX()[i]);
173 //g->GetY()[i] -= offset;
174 }
175
176 // make_csv(g, filename + ".processed.opensubtracted.csv");
177
178 return g;
179}
180
181TCanvas *
183 std::string tagname,
184 std::vector<std::string> rows,
185 std::vector<std::string> cols,
186 std::vector<std::string> outliers,
187 TCanvas *c = nullptr,
188 int marker = 20,
189 int color = kAzure - 3,
190 float vmin = 0.,
191 float vmax = 100.,
192 float vcut = 100.,
193 bool subtractopen = true,
194 float subtractsurface = -1.)
195{
196
197 if (!c)
198 {
199 c = new TCanvas("c", "c", 800, 800);
200 c->DrawFrame(vmin, 1.e-13, vmax, 1.e-3, ";bias voltage (V);current (A)");
201 c->SetLogy();
202 }
203
204 // auto cmap = new TCanvas("cmap", "cmap", 1600, 800);
205 // cmap->Divide(8, 4);
206
207 auto hbreak = new TH1F("hbreak", "", 1000., 0., 100.);
208
209 int ipad = 1;
210 for (auto row : rows)
211 {
212 for (auto col : cols)
213 {
214 // cmap->cd(ipad)->DrawFrame(vmin, 1.e-11, vmax, 1.e-3, ";bias voltage (V);current (A)");
215 // cmap->cd(ipad)->SetLogy();
216 ipad++;
217 std::string chname = row + col;
218 if (std::find(outliers.begin(), outliers.end(), chname) != outliers.end())
219 continue;
220 std::string filename = dirname + "/" + tagname + "_243K_" + chname + ".ivscan.csv";
221 std::string filenameOPEN = dirname + "/" + tagname + "_243K_OPEN-" + chname + ".ivscan.csv";
222
224
225 if (subtractsurface > 0.)
226 {
227 auto fSURF = iv_fit(g, subtractsurface);
228 hbreak->Fill(fSURF->GetParameter(3.));
229 fSURF->SetParameter(4, 0.);
230 fSURF->SetRange(0., 100.);
231 for (int i = 0; i < g->GetN(); ++i)
232 {
233 double surfcurr = fSURF->Eval(g->GetX()[i]);
234 g->GetY()[i] -= surfcurr;
235 }
236 }
237
238 auto gg = new TGraphErrors;
239 gg->SetName(g->GetName());
240 gg->SetMarkerStyle(marker);
241 gg->SetMarkerColor(color);
242 gg->SetLineColor(color);
243 for (int i = 0; i < g->GetN(); ++i)
244 {
245 if (g->GetX()[i] > vcut)
246 continue;
247 auto n = gg->GetN();
248 gg->SetPoint(n, g->GetX()[i], g->GetY()[i]);
249 gg->SetPointError(n, g->GetEX()[i], g->GetEY()[i]);
250 }
251
252 gg->Draw("samelp");
253 }
254 }
255
256 new TCanvas;
257 hbreak->Draw();
258
259 return c;
260}
TH2_Type * build_fine_tune_raw_histogram(std::vector< TString > kInputFileNames, TString kRunTag, TString kOutputFileName, bool kRecalculate)
Functions -------------------------------------------------------------------------------------------...
Definition fine_analysis.h:80
double iv_fit_function(double *x, double *p)
Definition make_iv_scan.C:7
TGraphErrors * make_iv_scan(std::string filename, std::string filenameOPEN="", std::string filenameZERO="", float vbreak=-1.)
Definition make_iv_scan.C:154
TF1 * iv_fit_better(TGraphErrors *g, float vstart, int ntry=100)
Definition make_iv_scan.C:32
TF1 * get_iv_fit_function(double vbreak)
Definition make_iv_scan.C:18
bool iv_fit_oneshot
Definition make_iv_scan.C:5
TF1 * iv_fit(TGraphErrors *g, float vstart, bool oneshot=true)
Definition make_iv_scan.C:79
TCanvas * draw_iv_scan(std::string dirname, std::string tagname, std::vector< std::string > rows, std::vector< std::string > cols, std::vector< std::string > outliers, TCanvas *c=nullptr, int marker=20, int color=kAzure - 3, float vmin=0., float vmax=100., float vcut=100., bool subtractopen=true, float subtractsurface=-1.)
Definition make_iv_scan.C:182
Definition transition.py:1
TGraphErrors * makeiv(const std::string fnivscan, const std::string fnzero, bool invertX=true, bool invertY=true, bool write=true)
Definition makeiv.C:6