Skip to content

Commit f818aae

Browse files
authored
Improve stability of fits (alisw#1019)
1 parent 1c06c3e commit f818aae

File tree

3 files changed

+36
-196
lines changed

3 files changed

+36
-196
lines changed

machine_learning_hep/analysis/analyzer_jets.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def __init__(self, datap, case, typean, period):
126126
("#it{#mu}", "#it{#sigma}", "significance", "#it{#chi}^{2}"),
127127
)
128128
}
129-
for level in ("data", "mc", "mcsig", "mcrefl")
129+
for level in self.fit_levels
130130
}
131131
self.n_events = {}
132132
self.n_colls_read = {}
@@ -395,7 +395,7 @@ def _roofit_mass(self, level, hist, ipt, pdfnames, param_names, fitcfg, roows=No
395395
chi2 = frame.chiSquare()
396396
if "ptjet" not in filename:
397397
self.h_fit_results[level]["chi2"].SetBinContent(ipt + 1, chi2)
398-
if chi2 > 5.0:
398+
if chi2 > 5.0 and level != "predata":
399399
self.logger.error(
400400
"Roofit fit is too bad: %s, ipt: %d, pthf: %g-%g, Chi2 = %g",
401401
level,
@@ -590,7 +590,7 @@ def fit(self):
590590
level,
591591
ipt,
592592
self.bins_candpt[ipt],
593-
self.bins_candpt[ipt + 1]
593+
self.bins_candpt[ipt + 1],
594594
)
595595
# if level == 'mc':
596596
# roo_ws.Print()

machine_learning_hep/data/data_run3/database_ml_parameters_LcJet_pp.yml

Lines changed: 18 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -410,206 +410,35 @@ LcJet_pp:
410410
double_gauss_sigma: "wide"
411411
fraction_refl: "frac_refl"
412412

413+
fit_levels: ["mc", "predata", "data"]
413414
mass_roofit:
414415
- level: mc
415-
ptrange: [0., 2.]
416416
range: [2.18, 2.39]
417417
components:
418-
sig:
419-
fn: "Gaussian::peak(m[1., 10], mean[2.286, 2.283,2.289], sigma_g1[.007,.007,.012])"
420-
wide:
421-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
422418
model:
423-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
424-
- level: mc
425-
ptrange: [2., 3.]
426-
range: [2.18, 2.39]
427-
components:
428-
sig:
429-
fn: "Gaussian::peak(m[1., 10], mean[2.286, 2.283,2.289], sigma_g1[.007,.007,.012])"
430-
wide:
431-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
432-
model:
433-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
434-
- level: mc
435-
ptrange: [3., 4.]
436-
range: [2.18, 2.39]
437-
components:
438-
sig:
439-
fn: "Gaussian::peak(m[1., 10], mean[2.286, 2.283,2.289], sigma_g1[.007,.007,.012])"
440-
wide:
441-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
442-
model:
443-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
444-
- level: mc
445-
ptrange: [4., 5.]
446-
range: [2.18, 2.39]
447-
components:
448-
sig:
449-
fn: "Gaussian::peak(m[1., 10], mean[2.286, 2.283,2.289], sigma_g1[.007,.007,.012])"
450-
wide:
451-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
452-
model:
453-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
454-
- level: mc
455-
ptrange: [5., 6.]
456-
range: [2.18, 2.39]
457-
components:
458-
sig:
459-
fn: "Gaussian::peak(m[1., 10], mean[2.286, 2.283,2.289], sigma_g1[.012,.01,.016])"
460-
wide:
461-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
462-
model:
463-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
464-
- level: mc
465-
ptrange: [6., 7.]
466-
range: [2.17, 2.40]
467-
components:
468-
sig:
469-
fn: "Gaussian::peak(m[1., 10], mean[2.286, 2.283,2.289], sigma_g1[.012,.01,.016])"
470-
wide:
471-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
472-
model:
473-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
474-
- level: mc
475-
ptrange: [7., 8.]
476-
range: [2.10, 2.45]
477-
components:
478-
sig:
479-
fn: "Gaussian::peak(m[1., 10], mean[2.2865, 2.283,2.289], sigma_g1[.013,.013,.020])"
480-
wide:
481-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
482-
model:
483-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
484-
- level: mc
485-
ptrange: [8., 10.]
486-
range: [2.10, 2.45]
487-
components:
488-
sig:
489-
fn: "Gaussian::peak(m[1., 10], mean[2.2865, 2.283,2.289], sigma_g1[.013,.013,.020])"
490-
wide:
491-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
492-
model:
493-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
494-
- level: mc
495-
ptrange: [10., 12.]
496-
range: [2.10, 2.45]
497-
components:
498-
sig:
499-
fn: "Gaussian::peak(m[1., 10], mean[2.2865, 2.283,2.289], sigma_g1[.013,.013,.020])"
500-
wide:
501-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
502-
model:
503-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
504-
- level: mc
505-
ptrange: [12., 16.]
506-
range: [2.10, 2.45]
507-
components:
508-
sig:
509-
fn: "Gaussian::peak(m[1., 10], mean[2.2865, 2.283,2.289], sigma_g1[.020,.020,.029])"
510-
wide:
511-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
512-
model:
513-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
514-
- level: mc
515-
ptrange: [16., 30.]
516-
range: [2.10, 2.47]
517-
components:
518-
sig:
519-
fn: "Gaussian::peak(m[1., 10], mean[2.2865, 2.283,2.289], sigma_g1[.020,.020,.029])"
520-
wide:
521-
fn: 'Gaussian::wide(m, mean, expr("n*sigma_g1", n[1.,5.], sigma_g1))'
522-
model:
523-
fn: "SUM::sig(f_peak[0.,1.]*peak, wide)"
524-
- ptrange: [0., 2.]
525-
range: [2.21, 2.36] #2.216, 2.36
526-
fix_params: ['n', 'f_peak']
527-
components:
528-
#sig:
529-
#fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.005,.015])'
530-
bkg:
531-
fn: 'Polynomial::bkg(m, {a1[-0.15, -3, 3], a2[0.1, -3., 3]})'
532-
model:
533-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
534-
- ptrange: [2., 3.]
535-
range: [2.20, 2.37]
536-
fix_params: ['n', 'f_peak']
537-
components:
538-
#sig:
539-
# fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.005,.015])'
540-
bkg:
541-
fn: 'Polynomial::bkg(m, {a1[-0.15, -3, 3], a2[0.1, -3., 3]})'
542-
model:
543-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
544-
- ptrange: [3., 4.]
545-
range: [2.18, 2.38]
546-
fix_params: ['n', 'f_peak']
547-
components:
548-
#sig:
549-
#fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.005,.015])'
550-
bkg:
551-
fn: 'Polynomial::bkg(m, {a1[-0.15, -3, 3], a2[0.1, -3., 3]})'
552-
model:
553-
fn: 'SUM::sum(f_sig[0., 1.]*sig, bkg)'
554-
- ptrange: [4., 5.]
555-
range: [2.19, 2.38]
556-
fix_params: ['n', 'f_peak']
557-
components:
558-
# sig:
559-
# fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.005,.015])'
560-
bkg:
561-
fn: 'Polynomial::bkg(m, {a1[-0.15, -3, 3], a2[0.1, -3., 3]})'
562-
model:
563-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
564-
- ptrange: [5., 6.]
565-
range: [2.18, 2.39]
566-
fix_params: ['n', 'f_peak']
567-
components:
568-
# sig:
569-
# fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.005,.015])'
570-
bkg:
571-
fn: 'Polynomial::bkg(m, {a1[-0.2 , -3, 3], a2[0., -3, 3.]})'
572-
model:
573-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
574-
- ptrange: [6., 7.]
575-
range: [2.16, 2.41]
576-
fix_params: ['n', 'f_peak']
577-
components:
578-
# sig:
579-
# fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.03])'
580-
bkg:
581-
fn: 'Polynomial::bkg(m, {a1[-0.2 , -3, 3], a2[0., -3, 3.]})'
582-
model:
583-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
584-
- ptrange: [7., 8.]
585-
range: [2.16, 2.41]
586-
fix_params: ['n', 'f_peak']
587-
components:
588-
# sig:
589-
# fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.03])'
590-
bkg:
591-
fn: 'Polynomial::bkg(m, {a1[-0.2 , -3, 3], a2[0., -3, 3.]})'
592-
model:
593-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
594-
- ptrange: [8., 10.]
595-
range: [2.1, 2.46]
596-
fix_params: ['n', 'f_peak']
419+
fn: "RooCrystalBall::sig(m[1., 4.], mean[2.286, 2.27, 2.30], sigma_g1[0.006, 0.035], alpha1[0., 2.], n1[0., 100.], alpha1, n1)"
420+
- level: predata
421+
range: [2.16, 2.39]
422+
fix_params: ["alpha1", "n1"]
597423
components:
598-
# sig:
599-
# fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.03])'
600424
bkg:
601-
fn: 'Polynomial::bkg(m, {a1[-0.2 , -3, 3], a2[-0.2, -3, 3.]})'
425+
fn: "Polynomial::prebkg(m, {a0[1.], a1[0., -.5, 0.]}, lowestOrder = 0)"
602426
model:
603-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
604-
- range: [2.1, 2.47]
605-
fix_params: ['n', 'f_peak']
427+
fn: "SUM::presum(f_sig[0.,1.]*sig, prebkg)"
428+
- level: data
429+
range: [2.16, 2.39]
430+
fix_params: ["alpha1", "n1", "a1"]
606431
components:
607-
# sig:
608-
# fn: 'Gaussian::sig(m, mean[2.28,2.29], sigma_g1[.005,.03])'
609432
bkg:
610-
fn: 'Polynomial::bkg(m, {a1[-0.2 , -3, 3], a2[-0.2, -3, 3.]})'
433+
# fn: "Polynomial::bkg(m, {a1[0., -.5, .5], a2[0., -5., 5.]})"
434+
# fn: "Polynomial::bkg(m, {expr('a1 - 2.*a2*mean', a1[0., -.5, .5], a2[0., -.1, .1], mean), a2})"
435+
# fn: "Polynomial::bkg(m, {expr('a1 - 2.*a2*offset', a1[0., -.5, -.2], a2[0., 0., 5.], offset[3., 0., 100.]), a2})"
436+
# fn: "Polynomial::bkg(m, {expr('a1 - 2.*a2*offset', a1, a2[10., 0., 5000.], offset[0., -100., 100.]), a2})"
437+
fn: "Polynomial::bkg(m, {expr('a0 + a2*offset*offset', offset[0., 3., 100.], a0, a2[0., -100., 100.]), expr('a1 - 2.*a2*offset', a1, a2, offset), a2}, lowestOrder = 0)"
438+
# fn: "Polynomial::bkg(m, {expr('c + a2*offset*offset', c[0., 0., 1.], offset[0., -1000., 1000.], a2[0., -5000., 5000.]), expr('- 2.*a2*offset', a2, offset), a2}, lowestOrder = 0)"
439+
# fn: "Polynomial::bkg(expr('m-mean', m, mean), {a1[-0.15, -10000.0, 10000.], a2[0.1, -10000., 10000.]})"
611440
model:
612-
fn: 'SUM::sum(f_sig[0.,1.]*sig, bkg)'
441+
fn: "SUM::sum(f_sig[0.,1.]*sig, bkg)"
613442

614443
#sidesub_per_ptjet: true
615444
sidesub:

machine_learning_hep/fitting/roofitter.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import ROOT
1818
from ROOT import RooAddPdf, RooArgList, RooArgSet, RooFit, RooRealVar, TPaveText
1919

20+
USE_EXTMODEL = True
2021

2122
# pylint: disable=too-few-public-methods, too-many-statements
2223
# (temporary until we add more functionality)
@@ -42,7 +43,7 @@ def fit_mass_new(self, hist, pdfnames, fit_spec, level, roows=None, plot=False):
4243
model = fn
4344
m = ws.var(var_m)
4445

45-
if level == "data":
46+
if level == "data" and USE_EXTMODEL:
4647
signal_pdf = ws.pdf(pdfnames["pdf_sig"])
4748
if not signal_pdf:
4849
raise ValueError("sig PDF not found")
@@ -60,13 +61,13 @@ def fit_mass_new(self, hist, pdfnames, fit_spec, level, roows=None, plot=False):
6061
m.setRange("fit", *range_m)
6162
# print(f'using fit range: {range_m}, var range: {m.getRange("fit")}')
6263
res = model.fitTo(dh, Range=(range_m[0], range_m[1]), Save=True, PrintLevel=-1, Strategy=1, MaxCalls=5000)
63-
if level == 'data':
64+
if level == 'data' and USE_EXTMODEL:
6465
for v in ws.allVars():
6566
v.setConstant(True)
6667
res = extmodel.fitTo(dh, Range=(range_m[0], range_m[1]), Save=True, PrintLevel=-1, Strategy=1, MaxCalls=5000)
6768
else:
6869
res = model.fitTo(dh, Save=True, PrintLevel=-1, Strategy=1, MaxCalls=5000)
69-
if level == 'data':
70+
if level == 'data' and USE_EXTMODEL:
7071
for v in ws.allVars():
7172
v.setConstant(True)
7273
res = extmodel.fitTo(dh, Save=True, PrintLevel=-1, Strategy=1, MaxCalls=5000)
@@ -108,7 +109,7 @@ def fit_mass_new(self, hist, pdfnames, fit_spec, level, roows=None, plot=False):
108109
# c.Modified()
109110
# c.Update()
110111

111-
if level == "data":
112+
if level == "data" and USE_EXTMODEL:
112113
residuals = frame.residHist("data", "pdf_bkg")
113114
residual_frame = m.frame()
114115
residual_frame.addPlotable(residuals, "P")
@@ -153,6 +154,8 @@ def fit_mass(self, hist, fit_spec, plot=False):
153154

154155

155156
def calc_signif(roows, res, pdfnames, param_names, mean_sgn, sigma_sgn):
157+
if not USE_EXTMODEL:
158+
return (0., 0., 0., 0., 0., 0, 0, 0.)
156159
f_sig = roows.pdf(pdfnames["pdf_sig"])
157160
n_signal = res.floatParsFinal().find("n_signal").getVal()
158161
sigma_n_signal = res.floatParsFinal().find("n_signal").getError()
@@ -239,6 +242,14 @@ def add_text_info_fit(text_info, frame, roows, param_names):
239242
text_info.AddText(f"#sigma wide = {sigmawide_sgn.getVal():.3f} #pm {sigmawide_sgn.getError():.3f}")
240243
if refl_frac:
241244
text_info.AddText(f"refl.frac. = {refl_frac.getVal():.3f} #pm {refl_frac.getError():.3f}")
245+
if a0 := roows.var("a0"):
246+
text_info.AddText(f"a0 = {a0.getVal():.3f} #pm {a0.getError():.3f}")
247+
if a1 := roows.var("a1"):
248+
text_info.AddText(f"a1 = {a1.getVal():.3f} #pm {a1.getError():.3f}")
249+
if a2 := roows.var("a2"):
250+
text_info.AddText(f"a2 = {a2.getVal():.3f} #pm {a2.getError():.3f}")
251+
if offset := roows.var("offset"):
252+
text_info.AddText(f"offset = {offset.getVal():.3f} #pm {offset.getError():.3f}")
242253

243254

244255
def add_text_info_perf(text_info, sig, sig_err, bkg, bkg_err, s_over_b, s_over_b_err, signif, signif_err):

0 commit comments

Comments
 (0)