"""
test_totalchi2.py
test that the action which calculates the total chi2 produces sensible
results for both MC and hessian pdfs
"""
import numpy as np
from validphys.api import API
[docs]def test_hessian_total_chi2(hessian_data_internal_cuts_config):
    """testing total chi2 for hessian pdf
    In particular check that the sum across experiments is handled correctly
    and that calculating the total chi2 from the flat list of datasets gives
    the same answer as using ``total_chi2_data``
    """
    member_chi2, cent_chi2, ndata = API.total_chi2_data(**hessian_data_internal_cuts_config)
    # this is only true for hessian PDF
    np.testing.assert_allclose(member_chi2.central_value(), cent_chi2)
    exps_chi2_data = API.experiments_chi2_data(**hessian_data_internal_cuts_config)
    exps_member_chi2, exps_cent_chi2, exps_ndata = list(zip(*exps_chi2_data))
    assert np.sum(exps_ndata) == ndata
    np.testing.assert_allclose(np.sum(exps_cent_chi2), cent_chi2)
    exps_chi2_error_mem = [stats_obj.error_members() for stats_obj in exps_member_chi2]
    np.testing.assert_allclose(np.sum(exps_chi2_error_mem, axis=0), member_chi2.error_members())
    dsinp_mem_chi2, dsinp_cent_chi2, dsinp_ndata = API.dataset_inputs_abs_chi2_data(
        **hessian_data_internal_cuts_config
    )
    np.testing.assert_allclose(dsinp_mem_chi2.data, member_chi2.data)
    np.testing.assert_allclose(dsinp_cent_chi2, cent_chi2)
    assert dsinp_ndata == ndata 
[docs]def test_mc_total_chi2(data_internal_cuts_config):
    """Testing total chi2 for mc pdf
    In particular check that the sum across experiments is handled correctly
    and that calculating the total chi2 from the flat list of datasets gives
    the same answer as using ``total_chi2_data``
    """
    member_chi2, cent_chi2, ndata = API.total_chi2_data(**data_internal_cuts_config)
    exps_chi2_data = API.experiments_chi2_data(**data_internal_cuts_config)
    exps_member_chi2, exps_cent_chi2, exps_ndata = list(zip(*exps_chi2_data))
    assert np.sum(exps_ndata) == ndata
    np.testing.assert_allclose(np.sum(exps_cent_chi2), cent_chi2)
    exps_chi2_error_mem = [stats_obj.error_members() for stats_obj in exps_member_chi2]
    np.testing.assert_allclose(np.sum(exps_chi2_error_mem, axis=0), member_chi2.error_members())
    dsinp_mem_chi2, dsinp_cent_chi2, dsinp_ndata = API.dataset_inputs_abs_chi2_data(
        **data_internal_cuts_config
    )
    np.testing.assert_allclose(dsinp_mem_chi2.data, member_chi2.data)
    np.testing.assert_allclose(dsinp_cent_chi2, cent_chi2)
    assert dsinp_ndata == ndata 
def _abs_chi2_data(input_config):
    """Checks the chi2 can be computed and has the right shape"""
    pdf = API.pdf(**input_config)
    chi2 = API.abs_chi2_data(**input_config)
    assert chi2.replica_result.data.shape == (pdf.get_members(), 1)
[docs]def test_abs_chi2_data(single_data_internal_cuts_config):
    """Test abs_chi2_data with a normal dataset"""
    _abs_chi2_data(single_data_internal_cuts_config) 
[docs]def test_abs_chi2_data_singlepoint(single_data_single_point_internal_cuts_config):
    """Test abs_chi2_data with the corner case of a single datapoint dataset"""
    _abs_chi2_data(single_data_single_point_internal_cuts_config)