20 double maxeffsiggoal,
int maxnp) {
21 double max_penalty_best = -1;
23 for (
int np = 3;
np <= maxnp; ++
np) {
26 if (max_penalty_best > 0) {
29 if (max_penalty_best < 0 || max_penalty < max_penalty_best) {
30 max_penalty_best = max_penalty;
36 if (max_penalty_best < 0 || max_penalty < max_penalty_best) {
37 max_penalty_best = max_penalty;
43 if (max_penalty_best < 0 || max_penalty < max_penalty_best) {
44 max_penalty_best = max_penalty;
50 <<
" ==============");
52 for (
int i = 0;
i < sp_best.GetNp(); ++
i) {
54 sp_best.GetKnot(
i,
p,
x);
59 if (max_penalty_best < 2)
64 return max_penalty_best;
69 double maxeffsiggoal) {
75 double maxdev =
get_maxdev(
hist, sp, maxeffsig, p_maxdev, p_maxeffsig);
77 if (maxdev / maxdevgoal > maxeffsig / maxeffsiggoal)
80 p_improve = p_maxeffsig;
82 int nsplinepoints = sp.GetNp();
83 std::vector<double> nprop(nsplinepoints + 1);
85 ATH_MSG(
INFO) <<
"Spline init p_improve=" << p_improve <<
" | ";
86 for (
int i = 0;
i < nsplinepoints; ++
i) {
89 if (
i == 0 && p_improve <
p) {
90 nprop[
ind] = (0 +
p) / 2;
99 if (
i == nsplinepoints - 1 && p_improve >
p) {
100 nprop[
ind] = (1 +
p) / 2;
104 if (
i < nsplinepoints - 1) {
106 sp.GetKnot(
i + 1,
pn, xn);
107 if (p_improve >
p && p_improve <
pn) {
108 nprop[
ind] = (
p +
pn) / 2;
116 nprop.resize(nsplinepoints);
121 ATH_MSG_INFO(
"Spline init spline #=" << nsplinepoints <<
" : maxdev="
122 << maxdev <<
" p_maxdev=" << p_maxdev
123 <<
" maxeffsig=" << maxeffsig
124 <<
" p_maxeffsig=" << p_maxeffsig
125 <<
" max_penalty=" << max_penalty);
138 double maxeffsiggoal,
144 for (
int i = 1;
i <=
hist->GetNbinsX();
i++) {
145 xmin =
hist->GetXaxis()->GetBinLowEdge(
i);
146 if (
hist->GetBinContent(
i) > 0)
149 for (
int i =
hist->GetNbinsX();
i >= 1;
i--) {
150 xmax =
hist->GetXaxis()->GetBinUpEdge(
i);
151 if (
hist->GetBinContent(
i) > 0)
156 double dx = (
xmax -
xmin) / (nsplinepoints - 1);
158 std::vector<double> nprop(nsplinepoints);
159 std::vector<double> nx(nsplinepoints);
163 for (
int i = 1;
i < nsplinepoints; ++
i) {
170 p_test = 0.5 * (p_min + p_max);
176 if ((p_max - p_min) < 0.0000001)
178 }
while (TMath::Abs(
tx - nx[
i]) >
dx / 10);
189 ATH_MSG_INFO(
"Spline init equ. dist. #=" << nsplinepoints <<
" : maxdev="
190 << maxdev <<
" p_maxdev=" << p_maxdev
191 <<
" maxeffsig=" << maxeffsig
192 <<
" p_maxeffsig=" << p_maxeffsig
193 <<
" max_penalty=" << max_penalty);
206 double maxeffsiggoal,
210 double dprop = 1.0 / (nsplinepoints - 1);
211 std::vector<double> nprop(nsplinepoints);
212 for (
int i = 0;
i < nsplinepoints; ++
i) {
213 nprop[
i] =
i * dprop;
222 ATH_MSG_INFO(
"Spline init equ. prob. #=" << nsplinepoints <<
" : maxdev="
223 << maxdev <<
" p_maxdev=" << p_maxdev
224 <<
" maxeffsig=" << maxeffsig
225 <<
" p_maxeffsig=" << p_maxeffsig
226 <<
" max_penalty=" << max_penalty);
238 std::vector<double> &nprop,
241 double maxdevgoal,
double maxeffsiggoal) {
242 int nsplinepoints = (
int)nprop.size();
245 std::vector<double> nx(nsplinepoints);
246 std::vector<double> nprop_try = nprop;
247 double max_penalty = -1;
248 double p_gotobest = 0.5 / nsplinepoints;
249 int ntry = 200 / p_gotobest;
251 for (
double dproploop = 0.4 / nsplinepoints; dproploop > 0.02 / nsplinepoints;
253 double dprop = dproploop;
255 for (
int itry = 0; itry < ntry; ++itry) {
257 for (
int i = 0;
i < nsplinepoints; ++
i) {
260 TSpline3 sp(
"1Dspline", nprop_try.data(), nx.data(), nsplinepoints,
265 double maxdev =
get_maxdev(
hist, sp, maxeffsig, p_maxdev, p_maxeffsig);
266 double penalty = maxdev / maxdevgoal + maxeffsig / maxeffsiggoal;
267 if (max_penalty < 0 || penalty < max_penalty) {
268 max_penalty = penalty;
281 if (gRandom->Rndm() < p_gotobest)
285 if (n_nogain > 20 / p_gotobest)
288 int ip = 1 + gRandom->Rndm() * (nsplinepoints - 1);
289 if (
ip > nsplinepoints - 1)
290 ip = nsplinepoints - 1;
292 if (gRandom->Rndm() > 0.5)
294 double nprop_new = nprop_try[
ip] +
d;
296 if (nprop_try[
ip - 1] + dprop / 2 > nprop_new) {
297 nprop_new = nprop_try[
ip];
300 if (
ip < nsplinepoints - 1)
301 if (nprop_new > nprop_try[
ip + 1] - dprop / 2) {
302 nprop_new = nprop_try[
ip];
313 nprop_try[
ip] = nprop_new;
321 double &maxeffsig,
double &p_maxdev,
322 double &p_maxeffsig,
int ntoy) {
326 TH1 *hist_clone = (TH1 *)
hist->Clone(
"hist_clone");
327 hist_clone->SetDirectory(
nullptr);
336 double toyweight = 1.0 / ntoy;
337 for (
int itoy = 0; itoy < ntoy; ++itoy) {
338 double prop = itoy * toyweight;
339 hist_clone->Fill(sp.Eval(prop), toyweight);
344 for (
int i = 0;
i <=
hist->GetNbinsX() + 1;
i++) {
346 int2 += hist_clone->GetBinContent(
i);
347 double val = TMath::Abs(int1 - int2);
355 double int1err = TMath::Sqrt(int1 * (1 - int1) / effN);
358 valsig =
val / int1err;
359 if (valsig > maxeffsig) {
381 TH1 *histfine =
nullptr;
382 if (
hist ==
nullptr) {
388 hist =
new TH1D(
"test1D",
"test1D", nbinsx,
xmin,
xmax);
389 histfine =
new TH1D(
"test1Dfine",
"test1Dfine", 10 * nbinsx,
xmin,
xmax);
391 for (
int i = 1;
i <= 100000; ++
i) {
392 double x = gRandom->Gaus(xpeak,
sigma);
397 histfine->Fill(
x, 10);
404 nbinsx =
hist->GetNbinsX();
409 for (rnd[0] = 0; rnd[0] < 0.9999; rnd[0] += 0.25) {
414 TH1 *hist_val = (TH1 *)histfine->Clone(
"hist_val");
415 hist_val->SetTitle(
"toy simulation");
417 hist_val->SetLineColor(2);
418 TH1 *hist_diff = (TH1 *)
hist->Clone(
"hist_diff");
419 hist_diff->SetTitle(
"difference");
422 double weight = histfine->Integral() / nrnd;
423 double weightdiff =
hist->Integral() / nrnd;
426 for (
int i = 0;
i < nrnd; ++
i) {
427 rnd[0] = gRandom->Rndm();
430 hist_diff->Fill(
value[0], weightdiff);
432 hist_diff->Add(
hist, -1);
434 TH1F *hist_pull =
new TH1F(
"pull",
"pull", 200, -10, 10);
435 for (
int ix = 1; ix <= nbinsx; ++ix) {
436 float val = hist_diff->GetBinContent(ix);
437 float err = hist_diff->GetBinError(ix);
439 hist_pull->Fill(
val /
err);
445 #if defined(__FastCaloSimStandAlone__)
446 new TCanvas(
"input",
"Input");
447 histfine->SetLineColor(kGray);
448 histfine->Draw(
"hist");
450 hist_val->Draw(
"sameshist");
452 new TCanvas(
"spline",
"spline");
455 TGraph *
gr =
new TGraph();
456 for (
int i = 0;
i < ngr; ++
i) {
457 double r =
i * 1.0 / (ngr - 1);
460 gr->SetMarkerStyle(7);
462 TSpline3 *sp =
new TSpline3(rtof.
spline());
464 sp->SetMarkerColor(2);
465 sp->SetMarkerStyle(2);
468 new TCanvas(
"difference",
"difference");
471 new TCanvas(
"pull",
"Pull");