Skip to content

Commit

Permalink
protect gtanalysis.py handling of parameter scans
Browse files Browse the repository at this point in the history
  • Loading branch information
eacharles committed Feb 3, 2018
1 parent fd8f587 commit 68c739e
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions fermipy/gtanalysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -1776,8 +1776,8 @@ def set_parameter(self, name, par, value, true_value=True, scale=None,
if bounds is not None:
self.like[idx].setBounds(*bounds)
except RuntimeError:
self.logger.warning("Caught failure on setBounds for %s::%s."%(name, par))
pass


if error is not None:
self.like[idx].setError(error)
Expand Down Expand Up @@ -2472,7 +2472,7 @@ def _find_scan_pts(self, name, logemin=None, logemax=None, npts=20):
npred = np.sum(cs)

if npred < 10:
val *= 1. / max(1.0, npred)
val *= 1. / max(1e-16, npred)
xvals = val * 10 ** np.linspace(-1.0, 3.0, npts - 1)
xvals = np.insert(xvals, 0, 0.0)
else:
Expand Down Expand Up @@ -2515,6 +2515,9 @@ def _find_scan_pts_reopt(self, name, logemin=None, logemax=None, npts=20,
xvals = xvals[np.isfinite(xvals)]

# Generate likelihood profile w/ free nuisance pars
if np.isnan(xvals).any():
raise ValueError("Parameter scan points for %s::%s include infinite value."%(name, parName))

lnlp1 = self.profile(name, parName, logemin=logemin, logemax=logemax,
reoptimize=True, xvals=xvals, **kwargs)

Expand Down Expand Up @@ -2633,13 +2636,16 @@ def profile(self, name, parName, logemin=None, logemax=None,
xvals = np.linspace(0, 1, 25)
xvals = np.concatenate((-1.0 * xvals[1:][::-1], xvals))
xvals = val * 10 ** xvals

if np.isnan(xvals).any():
raise RuntimeError("Parameter scan points for %s::%s include infinite value."%(name, parName))

# Update parameter bounds to encompass scan range
try:
self.like[idx].setBounds(min(min(xvals), value, bounds[0]),
max(max(xvals), value, bounds[1]))
except RuntimeError:
print ("xxx", xvals, value, bounds)
self.logger.warning("Caught failure on setBounds for %s::%s."%(name, parName))

o = {'xvals': xvals,
'npred': np.zeros(len(xvals)),
Expand All @@ -2662,7 +2668,8 @@ def profile(self, name, parName, logemin=None, logemax=None,
try:
self.like[idx] = x
except RuntimeError:
pass
self.logger.warning("Caught failure on set for %s::%s: %.2f"%(name, parName, x))

if self.like.nFreeParams() > 1 and reoptimize:
# Only reoptimize if not all frozen
self.like.freeze(idx)
Expand Down

0 comments on commit 68c739e

Please sign in to comment.