From 71c399b381fda5a5bb865583517ab68346205b90 Mon Sep 17 00:00:00 2001 From: swetank18 Date: Fri, 23 Jan 2026 05:54:54 +0530 Subject: [PATCH 1/2] Fix edge case in analytical integral of exponential TF1 --- hist/hist/src/AnalyticalIntegrals.cxx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/hist/hist/src/AnalyticalIntegrals.cxx b/hist/hist/src/AnalyticalIntegrals.cxx index ca7c402625c6b..3fe57034b888c 100644 --- a/hist/hist/src/AnalyticalIntegrals.cxx +++ b/hist/hist/src/AnalyticalIntegrals.cxx @@ -40,10 +40,20 @@ Double_t AnalyticalIntegral(TF1 *f, Double_t a, Double_t b) return TMath::QuietNaN(); } - if (num == 200)//expo: exp(p0+p1*x) - { - result = ( exp(p[0]+p[1]*xmax) - exp(p[0]+p[1]*xmin))/p[1]; + else if (num == 200) { // expo: exp(p0 + p1*x) + const double p0 = p[0]; + const double p1 = p[1]; + + if (p1 == 0) { + // Limit p1 -> 0: integral of constant exp(p0) + result = std::exp(p0) * (xmax - xmin); + } else { + const double ea = p0 + p1 * xmin; + const double eb = p0 + p1 * xmax; + result = (std::exp(eb) - std::exp(ea)) / p1; } +} + else if (num == 100)//gaus: [0]*exp(-0.5*((x-[1])/[2])^2)) { double amp = p[0]; From 820b9ad5c169501257c7e9e4004d77d13c58e319 Mon Sep 17 00:00:00 2001 From: swetank18 Date: Fri, 23 Jan 2026 06:21:02 +0530 Subject: [PATCH 2/2] Add parameter domain checks to analytical integrals --- hist/hist/src/AnalyticalIntegrals.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hist/hist/src/AnalyticalIntegrals.cxx b/hist/hist/src/AnalyticalIntegrals.cxx index 3fe57034b888c..96a641874e0cd 100644 --- a/hist/hist/src/AnalyticalIntegrals.cxx +++ b/hist/hist/src/AnalyticalIntegrals.cxx @@ -59,6 +59,8 @@ Double_t AnalyticalIntegral(TF1 *f, Double_t a, Double_t b) double amp = p[0]; double mean = p[1]; double sigma = p[2]; + if (sigma <= 0) + return TMath::QuietNaN(); if (formula->TestBit(TFormula::kNormalized)) result = amp * (ROOT::Math::gaussian_cdf(xmax, sigma, mean) - ROOT::Math::gaussian_cdf(xmin, sigma, mean)); else @@ -71,6 +73,8 @@ Double_t AnalyticalIntegral(TF1 *f, Double_t a, Double_t b) double amp = p[0]; double mean = p[1]; double sigma = p[2]; + if (sigma <= 0) + return TMath::QuietNaN(); //printf("computing integral for landau in [%f,%f] for m=%f s = %f \n",xmin,xmax,mean,sigma); if (formula->TestBit(TFormula::kNormalized) ) result = amp*(ROOT::Math::landau_cdf(xmax,sigma,mean) - ROOT::Math::landau_cdf(xmin,sigma,mean)); @@ -84,7 +88,8 @@ Double_t AnalyticalIntegral(TF1 *f, Double_t a, Double_t b) double sigma = p[2]; double alpha = p[3]; double n = p[4]; - + if (sigma <= 0 || n <= 0) + return TMath::QuietNaN(); //printf("computing integral for CB in [%f,%f] for m=%f s = %f alpha = %f n = %f\n",xmin,xmax,mean,sigma,alpha,n); if (alpha > 0) result = amp*( ROOT::Math::crystalball_integral(xmin,alpha,n,sigma,mean) - ROOT::Math::crystalball_integral(xmax,alpha,n,sigma,mean) );