Skip to content

Commit bd2d00c

Browse files
Luigi Dello Strittoqgp
authored andcommitted
RooFit in hadron analyzer
1 parent 8f2d5ae commit bd2d00c

12 files changed

+1709
-1033
lines changed

machine_learning_hep/analysis/analyzer_jets.py

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
from ROOT import TF1, TCanvas, TFile, gStyle
2121

2222
from machine_learning_hep.analysis.analyzer import Analyzer
23-
from machine_learning_hep.fitting.roofitter import RooFitter
23+
from machine_learning_hep.fitting.roofitter import RooFitter, calc_signif
24+
from machine_learning_hep.fitting.roofitter import create_text_info, add_text_info_fit, add_text_info_perf
2425
from machine_learning_hep.utilities import folding, make_message_notfound
2526
from machine_learning_hep.utils.hist import (bin_array, create_hist, norm_response, fold_hist,
2627
fill_hist_fast, get_axis, get_dim, get_bin_limits,
@@ -72,6 +73,9 @@ def __init__(self, datap, case, typean, period):
7273
file_result_name = datap["files_names"]["resultfilename"]
7374
self.n_fileresult = os.path.join(self.d_resultsallpdata, file_result_name)
7475

76+
self.p_pdfnames = datap["analysis"][self.typean]['pdf_names']
77+
self.p_param_names = datap["analysis"][self.typean]['param_names']
78+
7579
self.observables = {
7680
'qa': ['zg', 'rg', 'nsd', 'zpar', 'dr', 'lntheta', 'lnkt', 'lntheta-lnkt'],
7781
'all': [var for var, spec in self.cfg('observables', {}).items()
@@ -341,17 +345,41 @@ def _correct_efficiency(self, hist, ipt):
341345

342346

343347
#region fitting
344-
def _roofit_mass(self, hist, ipt, fitcfg, roows = None, filename = None):
348+
def _roofit_mass(self, level, hist, ipt, pdfnames, param_names, fitcfg, roows = None, filename = None):
345349
if fitcfg is None:
346350
return None, None
347-
res, ws, frame = self.fitter.fit_mass_new(hist, fitcfg, roows, True)
351+
res, ws, frame, residual_frame = self.fitter.fit_mass_new(hist, pdfnames, fitcfg, level, roows, True)
348352
frame.SetTitle(f'inv. mass for p_{{T}} {self.bins_candpt[ipt]} - {self.bins_candpt[ipt+1]} GeV/c')
349353
c = TCanvas()
354+
355+
textInfoRight = create_text_info(0.62, 0.68, 1.0, 0.89)
356+
add_text_info_fit(textInfoRight, frame, ws, param_names)
357+
358+
textInfoLeft = create_text_info(0.12, 0.68, 0.6, 0.89)
359+
if level == "data":
360+
mean_sgn = ws.var("mean")
361+
sigma_sgn = ws.var("sigma_g1")
362+
(sig, sig_err, bkg, bkg_err,
363+
signif, signif_err, s_over_b, s_over_b_err
364+
) = calc_signif(ws, res, pdfnames, param_names, mean_sgn, sigma_sgn)
365+
366+
add_text_info_perf(textInfoLeft, sig, sig_err, bkg, bkg_err, s_over_b, s_over_b_err, signif, signif_err)
367+
350368
frame.Draw()
369+
textInfoRight.Draw()
370+
textInfoLeft.Draw()
351371
if res.status() != 0:
352372
self.logger.warning('Invalid fit result for %s', hist.GetName())
353373
filename = filename.replace('.png', '_invalid.png')
354374
self._save_canvas(c, filename)
375+
376+
if level == "data":
377+
residual_frame.SetTitle(f'inv. mass for p_{{T}} {self.bins_candpt[ipt]} - {self.bins_candpt[ipt+1]} GeV/c')
378+
cres = TCanvas()
379+
residual_frame.Draw()
380+
filename = filename.replace('.png', '_residual.png')
381+
self._save_canvas(cres, filename)
382+
355383
return res, ws
356384

357385

@@ -493,7 +521,7 @@ def fit(self):
493521
if var := roows.var(par):
494522
var.setConstant(True)
495523
roo_res, roo_ws = self._roofit_mass(
496-
h_invmass, ipt, fitcfg, roows,
524+
level, h_invmass, ipt, self.p_pdfnames, self.p_param_names, fitcfg, roows,
497525
f'roofit/h_mass_fitted{jetptlabel}_{string_range_pthf(range_pthf)}_{level}.png')
498526
if roo_res.status() != 0:
499527
self.logger.error('RooFit failed for %s iptjet %s ipt %d', level, iptjet, ipt)
@@ -514,13 +542,14 @@ def fit(self):
514542
self.roo_ws_ptjet[level][jptjet][ipt] = roo_ws.Clone()
515543
# TODO: take parameter names from DB
516544
if level in ('data', 'mc'):
517-
varname_mean = fitcfg.get('var_mean', 'mean')
518-
varname_sigma = fitcfg.get('var_sigma', 'sigma_g1')
545+
varname_mean = fitcfg.get('var_mean', self.p_param_names["gauss_mean"])
546+
varname_sigma = fitcfg.get('var_sigma', self.p_param_names["gauss_sigma"])
519547
self.fit_mean[level][ipt] = roo_ws.var(varname_mean).getValV()
520548
self.fit_sigma[level][ipt] = roo_ws.var(varname_sigma).getValV()
521-
varname_m = fitcfg.get('var', 'm')
522-
if roo_ws.pdf("bkg"):
523-
self.fit_func_bkg[level][ipt] = roo_ws.pdf("bkg").asTF(roo_ws.var(varname_m))
549+
varname_m = fitcfg.get('var', self.p_param_names["mass"])
550+
pdf_bkg = roo_ws.pdf(self.p_pdfnames["pdf_bkg"])
551+
if pdf_bkg:
552+
self.fit_func_bkg[level][ipt] = pdf_bkg.asTF(roo_ws.var(varname_m))
524553
self.fit_range[level][ipt] = (roo_ws.var(varname_m).getMin('fit'),
525554
roo_ws.var(varname_m).getMax('fit'))
526555
self.logger.debug('fit range for %s-%i: %s', level, ipt, self.fit_range[level][ipt])

0 commit comments

Comments
 (0)