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 ,
@@ -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