Skip to content

Commit 9895db6

Browse files
committed
add minimisation status histogram
1 parent f762349 commit 9895db6

2 files changed

Lines changed: 29 additions & 5 deletions

File tree

PWGHF/D2H/Macros/compute_fraction_cutvar.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import ROOT # pylint: disable=import-error
1717
sys.path.insert(0, '..')
1818
from cut_variation import CutVarMinimiser
19+
from cut_variation import MinimisationStatus
1920
from style_formatter import set_object_style
2021

2122
# pylint: disable=no-member,too-many-locals,too-many-statements
@@ -100,7 +101,8 @@ def main(config):
100101
hist_covariance_npnp = hist_rawy[0].Clone("hCovNonPromptNonPrompt")
101102
hist_corrfrac_prompt = hist_rawy[0].Clone("hCorrFracPrompt")
102103
hist_corrfrac_nonprompt = hist_rawy[0].Clone("hCorrFracNonPrompt")
103-
for histo in hist_corry_prompt, hist_corry_nonprompt, hist_covariance_pnp, hist_covariance_pp, hist_covariance_npnp, hist_corrfrac_prompt, hist_corrfrac_nonprompt:
104+
hist_minimisation_status = hist_rawy[0].Clone("hMinimizationStatus")
105+
for histo in hist_corry_prompt, hist_corry_nonprompt, hist_covariance_pnp, hist_covariance_pp, hist_covariance_npnp, hist_corrfrac_prompt, hist_corrfrac_nonprompt, hist_minimisation_status:
104106
histo.Reset()
105107
hist_corry_prompt.GetYaxis().SetTitle("corrected yields prompt")
106108
hist_corry_nonprompt.GetYaxis().SetTitle("corrected yields non-prompt")
@@ -109,6 +111,12 @@ def main(config):
109111
hist_covariance_npnp.GetYaxis().SetTitle("#sigma(non-prompt, non-prompt)")
110112
hist_corrfrac_prompt.GetYaxis().SetTitle("corrected fraction prompt")
111113
hist_corrfrac_nonprompt.GetYaxis().SetTitle("corrected fraction non-prompt")
114+
hist_minimisation_status.GetYaxis().SetTitle("minimisation status")
115+
hist_minimisation_status_title = ""
116+
for min_status in MinimisationStatus:
117+
hist_minimisation_status_title += (str(min_status.value) + " = " + min_status.name + ", ")
118+
hist_minimisation_status_title = hist_minimisation_status_title[:-2]
119+
hist_minimisation_status.SetTitle(hist_minimisation_status_title)
112120
set_object_style(
113121
hist_corry_prompt,
114122
color=ROOT.kRed + 1,
@@ -124,6 +132,7 @@ def main(config):
124132
set_object_style(hist_covariance_pnp)
125133
set_object_style(hist_covariance_pp)
126134
set_object_style(hist_covariance_npnp)
135+
set_object_style(hist_minimisation_status)
127136
set_object_style(
128137
hist_corrfrac_prompt,
129138
color=ROOT.kRed + 1,
@@ -168,6 +177,7 @@ def main(config):
168177
for ipt in range(hist_rawy[0].GetNbinsX()):
169178
if pt_bin_to_process !=-1 and ipt+1 != pt_bin_to_process:
170179
continue
180+
all_vectors_monotonous = MinimisationStatus.Success
171181
pt_min = hist_rawy[0].GetXaxis().GetBinLowEdge(ipt + 1)
172182
pt_max = hist_rawy[0].GetXaxis().GetBinUpEdge(ipt + 1)
173183
print(f"\n\nINFO: processing pt range {ipt+1} from {pt_min} to {pt_max} {pt_axis_title}")
@@ -183,16 +193,18 @@ def main(config):
183193

184194
if cfg["minimisation"]["correlated"]:
185195
if not (np.all(rawy[1:] > rawy[:-1]) or np.all(rawy[1:] < rawy[:-1])):
196+
all_vectors_monotonous = MinimisationStatus.MonotonyViolation
186197
print("\0\33[33mWARNING! main(): the raw yield vector is not monotonous. Check the input for stability.\0\33[0m")
187198
print(f"raw yield vector elements = {rawy}\n")
188199
if not (np.all(unc_rawy[1:] > unc_rawy[:-1]) or np.all(unc_rawy[1:] < unc_rawy[:-1])):
200+
all_vectors_monotonous = MinimisationStatus.MonotonyViolation
189201
print("\0\33[33mWARNING! main(): the raw yield uncertainties vector is not monotonous. Check the input for stability.\0\33[0m")
190202
print(f"raw yield uncertainties vector elements = {unc_rawy}\n")
191203

192204
minimiser = CutVarMinimiser(rawy, effp, effnp, unc_rawy, unc_effp, unc_effnp)
193205
status = minimiser.minimise_system(cfg["minimisation"]["correlated"])
194206

195-
if status:
207+
if status != MinimisationStatus.Fail:
196208
hist_corry_prompt.SetBinContent(ipt + 1, minimiser.get_prompt_yield_and_error()[0])
197209
hist_corry_prompt.SetBinError(ipt + 1, minimiser.get_prompt_yield_and_error()[1])
198210
hist_corry_nonprompt.SetBinContent(ipt + 1, minimiser.get_nonprompt_yield_and_error()[0])
@@ -209,6 +221,7 @@ def main(config):
209221
hist_corrfrac_prompt.SetBinError(ipt + 1, corr_frac_prompt[1])
210222
hist_corrfrac_nonprompt.SetBinContent(ipt + 1, corr_frac_nonprompt[0])
211223
hist_corrfrac_nonprompt.SetBinError(ipt + 1, corr_frac_nonprompt[1])
224+
hist_minimisation_status.SetBinContent(ipt + 1, max(status, all_vectors_monotonous))
212225
if cfg["central_efficiency"]["computerawfrac"]:
213226
raw_frac_prompt = minimiser.get_raw_prompt_fraction(
214227
hist_central_effp.GetBinContent(ipt + 1), hist_central_effnp.GetBinContent(ipt + 1)
@@ -268,10 +281,12 @@ def main(config):
268281
canv_cov.SaveAs(f"canv_cov_{ipt+1}.C")
269282
else:
270283
print(f"Minimization for pT {pt_min}, {pt_max} not successful")
284+
hist_minimisation_status.SetBinContent(ipt + 1, MinimisationStatus.Fail)
271285
canv_rawy = ROOT.TCanvas("c_rawy_minimization_error", "Minimization error", 500, 500)
272286
canv_eff = ROOT.TCanvas("c_eff_minimization_error", "Minimization error", 500, 500)
273287
canv_frac = ROOT.TCanvas("c_frac_minimization_error", "Minimization error", 500, 500)
274288
canv_cov = ROOT.TCanvas("c_conv_minimization_error", "Minimization error", 500, 500)
289+
canv_unc = ROOT.TCanvas("c_unc_minimization_error", "Minimization error", 500, 500)
275290

276291
canv_combined = ROOT.TCanvas(f"canv_combined_{ipt}", "", 1000, 1000)
277292
canv_combined.Divide(2, 2)
@@ -316,6 +331,7 @@ def main(config):
316331
hist_covariance_npnp.Write()
317332
hist_corrfrac_prompt.Write()
318333
hist_corrfrac_nonprompt.Write()
334+
hist_minimisation_status.Write()
319335
if cfg["central_efficiency"]["computerawfrac"]:
320336
hist_frac_raw_prompt.Write()
321337
hist_frac_raw_nonprompt.Write()

PWGHF/D2H/Macros/cut_variation.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@
1313
import ROOT # pylint: disable=import-error
1414
sys.path.insert(0, '..')
1515
from style_formatter import set_global_style, set_object_style
16+
from enum import IntEnum
1617

18+
class MinimisationStatus(IntEnum):
19+
Undefined = 0
20+
Success = 1
21+
MonotonyViolation = 2
22+
Fail = 3
1723

1824
# pylint: disable=too-many-instance-attributes
1925
class CutVarMinimiser:
@@ -171,15 +177,15 @@ def minimise_system(self, correlated=True, precision=1.0e-8, max_iterations=100)
171177
try:
172178
self.m_weights = np.linalg.inv(np.linalg.cholesky(self.m_cov_sets))
173179
except np.linalg.LinAlgError:
174-
return False
180+
return MinimisationStatus.Fail
175181
self.m_weights = self.m_weights.T * self.m_weights
176182
m_eff_tr = self.m_eff.T
177183

178184
self.m_covariance = (m_eff_tr * self.m_weights) * self.m_eff
179185
try:
180186
self.m_covariance = np.linalg.inv(np.linalg.cholesky(self.m_covariance))
181187
except np.linalg.LinAlgError:
182-
return False
188+
return MinimisationStatus.Fail
183189
self.m_covariance = self.m_covariance.T * self.m_covariance
184190

185191
self.m_corr_yields = self.m_covariance * (m_eff_tr * self.m_weights) * self.m_rawy
@@ -196,9 +202,11 @@ def minimise_system(self, correlated=True, precision=1.0e-8, max_iterations=100)
196202
m_corr_yields_old = np.copy(self.m_corr_yields)
197203

198204
print(f"INFO: number of processed iterations = {iteration+1}\n")
205+
minimisation_status = MinimisationStatus.Success
199206
if correlated:
200207
m_cov_sets_diag = np.diag(self.m_cov_sets)
201208
if not (np.all(m_cov_sets_diag[1:] > m_cov_sets_diag[:-1]) or np.all(m_cov_sets_diag[1:] < m_cov_sets_diag[:-1])):
209+
minimisation_status = MinimisationStatus.MonotonyViolation
202210
print("\033[33mWARNING! minimise_system(): the residual vector uncertainties elements are not monotonous. Check the input for stability.\033[0m")
203211
print(f"residual vector uncertainties elements = {np.sqrt(m_cov_sets_diag)}\n")
204212

@@ -229,7 +237,7 @@ def minimise_system(self, correlated=True, precision=1.0e-8, max_iterations=100)
229237
self.unc_frac_prompt[i_set] = unc_fp
230238
self.unc_frac_nonprompt[i_set] = unc_fnp
231239

232-
return True
240+
return minimisation_status
233241

234242
def get_red_chi2(self):
235243
"""

0 commit comments

Comments
 (0)