Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

`RooPlot::chiSquare` returns `NaN` with `Expected` data errors due to division by zero

Đang mở
#21,697 9 bình luận 1 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@guitargeek đang làm issue này rồi.

Từ ngày 26/3/2026.

  • #21710 của @AyachiMishra — đã đóng, không merge

Đánh giá

Issue này chưa được đánh giá.

Mô tả

bug in:RooFit
Check duplicate issues.
  • Checked for duplicates
Description
Description

Calculating the chi2 via RooPlot::chiSquare on data plotted with RooFit::DataError(RooAbsData::Expected) returns NaN. Because RooPlot::chiSquare only supports Neyman-style chi2, the behavior for Expected errors is undefined and causes a silent division by zero.

Reproducer
from array import array
import ROOT

bin_edge = [0., 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5,
            0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.]
bin_content = [0, 0, 0, 0, 0, 1, 3, 16, 17, 14, 18, 18, 7, 5, 1, 0, 0, 0, 0, 0]

h = ROOT.TH1D("h", "h", len(bin_edge) - 1, array("d", bin_edge))
for i, val in enumerate(bin_content):
    h.SetBinContent(i + 1, val)
h.Sumw2(ROOT.kFALSE)

x = ROOT.RooRealVar("X", "x", 0.0, 1.0)
x.setBins(len(bin_edge) - 1)
data = ROOT.RooDataHist("dh", "dh", ROOT.RooArgList(x), h)

mu = ROOT.RooRealVar("mu", "mu", 0.5, 0.0, 1.0)
sig = ROOT.RooRealVar("sigma", "sigma", 0.1, 0.01, 0.5)
pdf = ROOT.RooGaussian("gauss", "gauss", x, mu, sig)
pdf.fitTo(data)

# Test both error types
for err_type, err_name in [(ROOT.RooAbsData.Poisson, "Poisson"), (ROOT.RooAbsData.Expected, "Expected")]:
    frame = x.frame()
    data.plotOn(frame, ROOT.RooFit.DataError(err_type), ROOT.RooFit.Name("h_data"))
    pdf.plotOn(frame, ROOT.RooFit.Name("p_curve"))
    chi2 = frame.chiSquare("p_curve", "h_data", 0)
    print(f"chi2 with {err_name} data error = {chi2}")

Output:

chi2 with Poisson data error = 0.590340854118924
chi2 with Expected data error = nan
Root Cause
  1. Zero Bin Errors: RooPlot defaults to SumW2 for RooHist if error_type != Poisson (RooHist.cxx#L236), yielding zero errors for unweighted data.
  2. Missing Safety Check: RooCurve::chiSquare divides by these errors without checking for zeros (RooCurve.cxx#L563), causing the NaN.
Proposed Solutions
  • Option 1: Raise an error if error_type = Expected is used during RooAbsData::plotOn.
  • Option 2: Fall back to Poisson errors and emit a RooFit::Warning.
Reproducer

See above

ROOT version

6.38.00

Installation method

conda

Operating system

Linux

Additional context

No response

Ngôn ngữ chính
C++
Star
3.3k
Fork
1.6k
Merge trung bình
2 ngày 17 giờ
Pull request đã merge (30 ngày)
188

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của root-project/root

Tất cả issue của root-project/root

Issue tương tự

Thêm issue về C++

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.