319 def compute_roc(self, sig, bkg):
320 n_bins = sig.GetNbinsX()
321 total_sig = sig.Integral()
322 total_bkg = bkg.Integral()
323
324 x_vals, y_vals = [], []
325 if total_sig == 0 or total_bkg == 0:
326 logging.error("Zero total signal or background counts; cannot compute ROC.")
327 return None
328
329 for cut_bin in range(1, n_bins + 1):
330 sig_pass = sig.Integral(cut_bin, n_bins)
331 bkg_pass = bkg.Integral(cut_bin, n_bins)
332
333 eff = sig_pass / total_sig
334
335 if bkg_pass <= 0:
336
337 continue
338
339 rej = total_bkg / bkg_pass
340
341 x_vals.append(eff)
342 y_vals.append(rej)
343
344 if not x_vals:
345 return None
346
347 graph = ROOT.TGraphErrors(len(x_vals))
348 for i, (x, y) in enumerate(zip(x_vals, y_vals)):
349 graph.SetPoint(i, x, y)
350
351 return graph
352