Source code for gammapy.spectrum.sherpa_chi2asym

# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""Implement asymmetric chi-square fit statistic in Sherpa.

To load the ``chi2asym`` fit statistic in your sherpa session::

    import sherpa_chi2asym
    sherpa_chi2asym.load_chi2asym_stat()
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import numpy as np

__all__ = [
    'check_chi2',
    'chi2asym_err_func',
    'chi2asym_stat_func',
    'load_chi2asym_stat',
]


[docs]def chi2asym_stat_func(data, model, staterror=None, syserror=None, weight=None): """Define asymmetric chi-square errors. TODO: reference ROOT TGraphAsymErrors and add test against ROOT result. To make it fit into the Sherpa scheme we do this hack: * staterror = statistical down error * syserror = statistical up error """ # The error is attached to the data point, so if model > data, # we have to use the up error, represented by syserror error = np.where(model > data, syserror, staterror) chi = ((data - model) / error) # Chi per bin chi2 = chi ** 2 # Chi^2 per bin return chi2.sum(), chi2
[docs]def chi2asym_err_func(data): """Compute statistical error per bin from the data.""" error = np.ones_like(data) return error
[docs]def check_chi2(): """Execute this function after fitting to see if the best-fit chi2 reported matches the formula coded here""" import sherpa.astro.ui as sau chi2 = sau.get_fit_results().statval print('chi2 from fit: {0}'.format(chi2)) data = sau.get_dep() model = sau.get_model_plot().y error = np.where(model > data, sau.get_syserror(), sau.get_staterror()) chi = ((data - model) / error) # Chi per bin chi2 = chi ** 2 # Chi^2 per bin print('chi2 re-computed: {0}'.format(chi2.sum()))
[docs]def load_chi2asym_stat(): """"Load and set the chi2asym statistic""" import sherpa.astro.ui as sau sau.load_user_stat("chi2asym", chi2asym_stat_func, chi2asym_err_func) sau.set_stat(chi2asym)