diff --git a/machine_learning_hep/analysis/analyzer_jets.py b/machine_learning_hep/analysis/analyzer_jets.py index 8511dbead6..906b749525 100644 --- a/machine_learning_hep/analysis/analyzer_jets.py +++ b/machine_learning_hep/analysis/analyzer_jets.py @@ -1058,9 +1058,11 @@ def _build_effkine(self, h_nocuts, h_cuts): h_cuts.Divide(h_nocuts) return h_cuts - def _build_response_matrix(self, h_response, h_eff = None): + + def _build_response_matrix(self, h_response, h_eff = None, frac_flat = 0.): rm = ROOT.RooUnfoldResponse( project_hist(h_response, [0, 1], {}), project_hist(h_response, [2, 3], {})) + h_gen = project_hist(h_response, [2, 3], {}) for hbin in itertools.product( enumerate(get_axis(h_response, 0).GetXbins(), 1), enumerate(get_axis(h_response, 1).GetXbins(), 1), @@ -1073,8 +1075,12 @@ def _build_response_matrix(self, h_response, h_eff = None): if np.isclose(eff, 0.): self.logger.error('efficiency 0 for %s', hbin[4]) continue - for _ in range(int(n)): - rm.Fill(hbin[0][1], hbin[1][1], hbin[2][1], hbin[3][1], 1./eff) + if (cnt_gen := h_gen.GetBinContent(hbin[2][0], hbin[3][0])) > 0.: + fac = 1. + if frac_flat > 0.: + fac += frac_flat * (1. / cnt_gen - 1.) + for _ in range(int(n)): + rm.Fill(hbin[0][1], hbin[1][1], hbin[2][1], hbin[3][1], 1./eff * fac) # rm.Mresponse().Print() return rm @@ -1103,7 +1109,8 @@ def _unfold(self, hist, var, mcordata): self.logger.error('Response matrix for %s not available, cannot unfold', var + suffix) return [] response_matrix_pr = self._build_response_matrix( - h_response, self.hcandeff['pr'] if mcordata == 'data' else None) + h_response, self.hcandeff['pr'] if mcordata == 'data' else None, + self.cfg('unfolding_frac_flat', 0.)) self._save_hist(response_matrix_pr.Hresponse(), f'uf/h_ptjet-{var}-responsematrix_pr_lin_{mcordata}.png', 'colz') diff --git a/machine_learning_hep/data/data_run3/database_ml_parameters_D0Jet_pp.yml b/machine_learning_hep/data/data_run3/database_ml_parameters_D0Jet_pp.yml index 0cc1e90ec5..d1e0af4ad0 100644 --- a/machine_learning_hep/data/data_run3/database_ml_parameters_D0Jet_pp.yml +++ b/machine_learning_hep/data/data_run3/database_ml_parameters_D0Jet_pp.yml @@ -683,6 +683,8 @@ D0Jet_pp: unfolding_iterations: 8 # used, maximum iteration unfolding_iterations_sel: 4 # used, selected iteration # systematics + # unfolding_frac_flat: .1 + closure: pure_signal: false # exclude_feeddown_det: 'ismcsignal==1 & ismcprompt==1' diff --git a/machine_learning_hep/data/data_run3/database_ml_parameters_LcJet_pp.yml b/machine_learning_hep/data/data_run3/database_ml_parameters_LcJet_pp.yml index da3e682df5..3db2458c94 100644 --- a/machine_learning_hep/data/data_run3/database_ml_parameters_LcJet_pp.yml +++ b/machine_learning_hep/data/data_run3/database_ml_parameters_LcJet_pp.yml @@ -466,6 +466,7 @@ LcJet_pp: unfolding_iterations: 8 # used, maximum iteration unfolding_iterations_sel: 5 # used, selected iteration # systematics + # unfolding_frac_flat: .1 fd_folding_method: 3d fd_root: '/data2/vkucera/powheg/trees_powheg_fd_F05_R05.root'