2020from ROOT import TF1 , TCanvas , TFile , gStyle
2121
2222from 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
2425from machine_learning_hep .utilities import folding , make_message_notfound
2526from 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 ,
@@ -71,6 +72,8 @@ def __init__(self, datap, case, typean, period):
7172 self .n_fileresp = os .path .join (self .d_resultsallpmc_proc , self .n_fileresp )
7273 file_result_name = datap ["files_names" ]["resultfilename" ]
7374 self .n_fileresult = os .path .join (self .d_resultsallpdata , file_result_name )
75+ self .p_pdfnames = datap ["analysis" ][self .typean ]['pdf_names' ]
76+ self .p_param_names = datap ["analysis" ][self .typean ]['param_names' ]
7477
7578 self .observables = {
7679 'qa' : ['zg' , 'rg' , 'nsd' , 'zpar' , 'dr' , 'lntheta' , 'lnkt' , 'lntheta-lnkt' ],
@@ -341,17 +344,41 @@ def _correct_efficiency(self, hist, ipt):
341344
342345
343346 #region fitting
344- def _roofit_mass (self , hist , ipt , fitcfg , roows = None , filename = None ):
347+ def _roofit_mass (self , level , hist , ipt , pdfnames , param_names , fitcfg , roows = None , filename = None ):
345348 if fitcfg is None :
346349 return None , None
347- res , ws , frame = self .fitter .fit_mass_new (hist , fitcfg , roows , True )
350+ res , ws , frame , residual_frame = self .fitter .fit_mass_new (hist , pdfnames , fitcfg , level , roows , True )
348351 frame .SetTitle (f'inv. mass for p_{{T}} { self .bins_candpt [ipt ]} - { self .bins_candpt [ipt + 1 ]} GeV/c' )
349352 c = TCanvas ()
353+
354+ textInfoRight = create_text_info (0.62 , 0.68 , 1.0 , 0.89 )
355+ add_text_info_fit (textInfoRight , frame , ws , param_names )
356+
357+ textInfoLeft = create_text_info (0.12 , 0.68 , 0.6 , 0.89 )
358+ if level == "data" :
359+ mean_sgn = ws .var (self .p_param_names ["gauss_mean" ])
360+ sigma_sgn = ws .var (self .p_param_names ["gauss_sigma" ])
361+ (sig , sig_err , bkg , bkg_err ,
362+ signif , signif_err , s_over_b , s_over_b_err
363+ ) = calc_signif (ws , res , pdfnames , param_names , mean_sgn , sigma_sgn )
364+
365+ add_text_info_perf (textInfoLeft , sig , sig_err , bkg , bkg_err , s_over_b , s_over_b_err , signif , signif_err )
366+
350367 frame .Draw ()
368+ textInfoRight .Draw ()
369+ textInfoLeft .Draw ()
351370 if res .status () != 0 :
352371 self .logger .warning ('Invalid fit result for %s' , hist .GetName ())
353372 filename = filename .replace ('.png' , '_invalid.png' )
354373 self ._save_canvas (c , filename )
374+
375+ if level == "data" :
376+ residual_frame .SetTitle (f'inv. mass for p_{{T}} { self .bins_candpt [ipt ]} - { self .bins_candpt [ipt + 1 ]} GeV/c' )
377+ cres = TCanvas ()
378+ residual_frame .Draw ()
379+ filename = filename .replace ('.png' , '_residual.png' )
380+ self ._save_canvas (cres , filename )
381+
355382 return res , ws
356383
357384
@@ -493,7 +520,7 @@ def fit(self):
493520 if var := roows .var (par ):
494521 var .setConstant (True )
495522 roo_res , roo_ws = self ._roofit_mass (
496- h_invmass , ipt , fitcfg , roows ,
523+ level , h_invmass , ipt , self . p_pdfnames , self . p_param_names , fitcfg , roows ,
497524 f'roofit/h_mass_fitted{ jetptlabel } _{ string_range_pthf (range_pthf )} _{ level } .png' )
498525 if roo_res .status () != 0 :
499526 self .logger .error ('RooFit failed for %s iptjet %s ipt %d' , level , iptjet , ipt )
@@ -514,8 +541,8 @@ def fit(self):
514541 self .roo_ws_ptjet [level ][jptjet ][ipt ] = roo_ws .Clone ()
515542 # TODO: take parameter names from DB
516543 if level in ('data' , 'mc' ):
517- varname_mean = fitcfg .get ('var_mean' , 'mean' )
518- varname_sigma = fitcfg .get ('var_sigma' , 'sigma_g1' )
544+ varname_mean = fitcfg .get ('var_mean' , self . p_param_names [ "gauss_mean" ] )
545+ varname_sigma = fitcfg .get ('var_sigma' , self . p_param_names [ "gauss_sigma" ] )
519546 self .fit_mean [level ][ipt ] = roo_ws .var (varname_mean ).getValV ()
520547 self .fit_sigma [level ][ipt ] = roo_ws .var (varname_sigma ).getValV ()
521548 varname_m = fitcfg .get ('var' , 'm' )
0 commit comments