def test_eqwith_err1(make_data_path, restore_xspec_settings): def check1(e0, e1, e2): assert e0 == pytest.approx(0.028335201547206704, rel=1.0e-3) assert e1 == pytest.approx(-0.00744118799274448756, rel=1.0e-3) assert e2 == pytest.approx(0.0706249544851336, rel=1.0e-3) ui.set_xsabund('angr') ui.set_xsxsect('bcmc') ui.load_pha(make_data_path('3c273.pi')) ui.notice(0.5, 7.0) ui.set_stat("chi2datavar") ui.set_method("simplex") ui.set_model('powlaw1d.p1+gauss1d.g1') g1.fwhm = 0.1 g1.pos = 2.0 ui.freeze(g1.pos, g1.fwhm) ui.fit() np.random.seed(2345) e = ui.eqwidth(p1, p1 + g1, error=True, niter=100) check1(e[0], e[1], e[2]) params = e[3] np.random.seed(2345) e = ui.eqwidth(p1, p1 + g1, error=True, params=params, niter=100) check1(e[0], e[1], e[2]) parvals = ui.get_fit_results().parvals assert parvals[0] == pytest.approx(1.9055272902160334, rel=1.0e-3) assert parvals[1] == pytest.approx(0.00017387966749772638, rel=1.0e-3) assert parvals[2] == pytest.approx(1.279415076070516e-05, rel=1.0e-3)
def test_eqwith_err1(make_data_path, restore_xspec_settings): def check1(e0, e1, e2): assert e0 == approx(0.028335201547206704, rel=1.0e-3) assert e1 == approx(-0.00744118799274448756, rel=1.0e-3) assert e2 == approx(0.0706249544851336, rel=1.0e-3) ui.set_xsabund('angr') ui.set_xsxsect('bcmc') ui.load_pha(make_data_path('3c273.pi')) ui.notice(0.5, 7.0) ui.set_stat("chi2datavar") ui.set_method("simplex") ui.set_model('powlaw1d.p1+gauss1d.g1') g1.fwhm = 0.1 g1.pos = 2.0 ui.freeze(g1.pos, g1.fwhm) ui.fit() numpy.random.seed(2345) e = ui.eqwidth(p1, p1 + g1, error=True, niter=100) check1(e[0], e[1], e[2]) params = e[3] numpy.random.seed(2345) e = ui.eqwidth(p1, p1 + g1, error=True, params=params, niter=100) check1(e[0], e[1], e[2]) parvals = ui.get_fit_results().parvals assert parvals[0] == approx(1.9055272902160334, rel=1.0e-3) assert parvals[1] == approx(0.00017387966749772638, rel=1.0e-3) assert parvals[2] == approx(1.279415076070516e-05, rel=1.0e-3)
def test_pha_intro(self): self.run_thread('pha_intro') # astro.ui imported as ui, instead of # being in global namespace self.assertEqualWithinTol(ui.get_fit_results().statval, 37.9079, 1e-4) self.assertEqualWithinTol(ui.get_fit_results().rstat, 0.902569, 1e-4) self.assertEqualWithinTol(ui.get_fit_results().qval, 0.651155, 1e-4) self.assertEqualWithinTol(self.locals['p1'].gamma.val, 2.15852, 1e-4) self.assertEqualWithinTol(self.locals['p1'].ampl.val, 0.00022484, 1e-4) self.assertEqualWithinTol(ui.calc_photon_flux(), 0.000469964, 1e-4) self.assertEqualWithinTol(ui.calc_energy_flux(), 9.614847e-13, 1e-4) self.assertEqualWithinTol(ui.calc_data_sum(), 706.85714092, 1e-4) self.assertEqualWithinTol(ui.calc_model_sum(), 638.45693377, 1e-4) self.assertEqualWithinTol(ui.calc_source_sum(), 0.046996409, 1e-4) self.assertEqualWithinTol( ui.eqwidth(self.locals['p1'], ui.get_source()), -0.57731725, 1e-4) self.assertEqualWithinTol( ui.calc_kcorr([1, 1.2, 1.4, 1.6, 1.8, 2], 0.5, 2), [ 0.93341286, 0.93752836, 0.94325233, 0.94990140, 0.95678054, 0.96393515 ], 1e-4) self.assertEqual(ui.get_fit_results().nfev, 22) self.assertEqual(ui.get_fit_results().numpoints, 44) self.assertEqual(ui.get_fit_results().dof, 42)
def cmp_pha_intro(fit_result, p1, covarerr): assert fit_result.statval == approx(37.9079, rel=1e-4) assert fit_result.rstat == approx(0.902569, rel=1e-4) assert fit_result.qval == approx(0.651155, rel=1e-4) self.assertEqual(fit_result.nfev, 22) self.assertEqual(fit_result.numpoints, 44) self.assertEqual(fit_result.dof, 42) p1.gamma.val == approx(2.15852, rel=1e-4) p1.ampl.val == approx(0.00022484, rel=1e-4) assert ui.calc_photon_flux() == approx(0.000469964, rel=1e-4) assert ui.calc_energy_flux() == approx(9.614847e-13, rel=1e-4) assert ui.calc_data_sum() == approx(706.85714092, rel=1e-4) assert ui.calc_model_sum() == approx(638.45693377, rel=1e-4) assert ui.calc_source_sum() == approx(0.046996409, rel=1e-4) calc = ui.eqwidth(self.locals['p1'], ui.get_source()) assert calc == approx(-0.57731725, rel=1e-4) calc = ui.calc_kcorr([1, 1.2, 1.4, 1.6, 1.8, 2], 0.5, 2) # Prior to fixing #619 the expected values were # expected = [0.93341286, 0.93752836, 0.94325233, # 0.94990140, 0.95678054, 0.96393515] expected = [0.93132747, 0.9352768, 0.94085917, 0.94738472, 0.95415463, 0.96121113] assert calc == approx(expected, rel=1e-4)
def test_eqwidth_err_needs_fit(clean_astro_ui): """We get an error if fit has not been called""" ui.load_arrays(2, [1, 5], [1, 12], ui.Data1D) cmdl = ui.const1d.cmdl pmdl = ui.polynom1d.pmdl cmdl.c0 = 1.5 pmdl.c0 = -5 pmdl.c1 = 2 ui.set_source(2, cmdl + pmdl) with pytest.raises(SessionErr) as exc: ui.eqwidth(cmdl, cmdl + pmdl, id=2, error=True) assert str(exc.value) == 'no fit has been performed'
def test_pha_intro(self): self.run_thread("pha_intro") # astro.ui imported as ui, instead of # being in global namespace self.assertEqualWithinTol(ui.get_fit_results().statval, 37.9079, 1e-4) self.assertEqualWithinTol(ui.get_fit_results().rstat, 0.902569, 1e-4) self.assertEqualWithinTol(ui.get_fit_results().qval, 0.651155, 1e-4) self.assertEqualWithinTol(self.locals["p1"].gamma.val, 2.15852, 1e-4) self.assertEqualWithinTol(self.locals["p1"].ampl.val, 0.00022484, 1e-4) self.assertEqualWithinTol(ui.calc_photon_flux(), 0.000469964, 1e-4) self.assertEqualWithinTol(ui.calc_energy_flux(), 9.614847e-13, 1e-4) self.assertEqualWithinTol(ui.calc_data_sum(), 706.85714092, 1e-4) self.assertEqualWithinTol(ui.calc_model_sum(), 638.45693377, 1e-4) self.assertEqualWithinTol(ui.calc_source_sum(), 0.046996409, 1e-4) self.assertEqualWithinTol(ui.eqwidth(self.locals["p1"], ui.get_source()), -0.57731725, 1e-4) self.assertEqualWithinTol( ui.calc_kcorr([1, 1.2, 1.4, 1.6, 1.8, 2], 0.5, 2), [0.93341286, 0.93752836, 0.94325233, 0.94990140, 0.95678054, 0.96393515], 1e-4, ) self.assertEqual(ui.get_fit_results().nfev, 22) self.assertEqual(ui.get_fit_results().numpoints, 44) self.assertEqual(ui.get_fit_results().dof, 42)
def cmp_thread(fit_result, p1, covarerr): assert fit_result.statval == approx(37.9079, rel=1e-4) assert fit_result.rstat == approx(0.902569, rel=1e-4) assert fit_result.qval == approx(0.651155, rel=1e-4) assert fit_result.nfev == 22 assert fit_result.numpoints == 44 assert fit_result.dof == 42 p1.gamma.val == approx(2.15852, rel=1e-4) p1.ampl.val == approx(0.00022484, rel=1e-4) assert ui.calc_photon_flux() == approx(0.000469964, rel=1e-4) assert ui.calc_energy_flux() == approx(9.614847e-13, rel=1e-4) assert ui.calc_data_sum() == approx(706.85714092, rel=1e-4) assert ui.calc_model_sum() == approx(638.45693377, rel=1e-4) assert ui.calc_source_sum() == approx(0.046996409, rel=1e-4) calc = ui.eqwidth(p1, ui.get_source()) assert calc == approx(-0.57731725, rel=1e-4) calc = ui.calc_kcorr([1, 1.2, 1.4, 1.6, 1.8, 2], 0.5, 2) expected = [ 0.93132747, 0.9352768, 0.94085917, 0.94738472, 0.95415463, 0.96121113 ] assert calc == approx(expected, rel=1e-4)
def test_pha_intro(self): self.run_thread('pha_intro') # astro.ui imported as ui, instead of # being in global namespace fit_results = ui.get_fit_results() covarerr = sqrt(fit_results.extra_output['covar'].diagonal()) assert covarerr[0] == approx(0.0790393, rel=1e-4) assert covarerr[1] == approx(1.4564e-05, rel=1e-4) assert fit_results.statval == approx(37.9079, rel=1e-4) assert fit_results.rstat == approx(0.902569, rel=1e-4) assert fit_results.qval == approx(0.651155, rel=1e-4) assert self.locals['p1'].gamma.val == approx(2.15852, rel=1e-4) assert self.locals['p1'].ampl.val == approx(0.00022484, rel=1e-4) assert ui.calc_photon_flux() == approx(0.000469964, rel=1e-4) assert ui.calc_energy_flux() == approx(9.614847e-13, rel=1e-4) assert ui.calc_data_sum() == approx(706.85714092, rel=1e-4) assert ui.calc_model_sum() == approx(638.45693377, rel=1e-4) assert ui.calc_source_sum() == approx(0.046996409, rel=1e-4) calc = ui.eqwidth(self.locals['p1'], ui.get_source()) assert calc == approx(-0.57731725, rel=1e-4) calc = ui.calc_kcorr([1, 1.2, 1.4, 1.6, 1.8, 2], 0.5, 2) expected = [0.93341286, 0.93752836, 0.94325233, 0.94990140, 0.95678054, 0.96393515] assert calc == approx(expected, rel=1e-4) self.assertEqual(ui.get_fit_results().nfev, 22) self.assertEqual(ui.get_fit_results().numpoints, 44) self.assertEqual(ui.get_fit_results().dof, 42)
def test_eqwith_err(make_data_path, restore_xspec_settings): def check(a0, a1, a2): assert a0 == approx(0.16443033244310976, rel=1e-3) assert a1 == approx(0.09205564216156815, rel=1e-3) assert a2 == approx(0.23933118287470895, rel=1e-3) ui.set_method('neldermead') ui.set_stat('cstat') ui.set_xsabund('angr') ui.set_xsxsect('bcmc') ui.load_data(make_data_path('12845.pi')) ui.notice(0.5, 7) ui.set_model("xsphabs.gal*xszphabs.zabs*(powlaw1d.p1+xszgauss.g1)") ui.set_par(gal.nh, 0.08) ui.freeze(gal) ui.set_par(zabs.redshift, 0.518) ui.set_par(g1.redshift, 0.518) ui.set_par(g1.Sigma, 0.01) ui.freeze(g1.Sigma) ui.set_par(g1.LineE, min=6.0, max=7.0) ui.fit() numpy.random.seed(12345) result = ui.eqwidth(p1, p1 + g1, error=True, niter=100) check(result[0], result[1], result[2]) params = result[3] numpy.random.seed(12345) result = ui.eqwidth(p1, p1 + g1, error=True, params=params, niter=100) check(result[0], result[1], result[2]) parvals = ui.get_fit_results().parvals assert parvals[0] == approx(0.6111340686157877, rel=1.0e-3) assert parvals[1] == approx(1.6409785803466297, rel=1.0e-3) assert parvals[2] == approx(8.960926761312153e-05, rel=1.0e-3) assert parvals[3] == approx(6.620017726014523, rel=1.0e-3) assert parvals[4] == approx(1.9279114810359657e-06, rel=1.0e-3)
def test_eqwith_err(make_data_path, restore_xspec_settings): def check(a0, a1, a2): assert a0 == pytest.approx(0.16443033244310976, rel=1e-3) assert a1 == pytest.approx(0.09205564216156815, rel=1e-3) assert a2 == pytest.approx(0.23933118287470895, rel=1e-3) ui.set_method('neldermead') ui.set_stat('cstat') ui.set_xsabund('angr') ui.set_xsxsect('bcmc') ui.load_data(make_data_path('12845.pi')) ui.notice(0.5, 7) ui.set_model("xsphabs.gal*xszphabs.zabs*(powlaw1d.p1+xszgauss.g1)") ui.set_par(gal.nh, 0.08) ui.freeze(gal) ui.set_par(zabs.redshift, 0.518) ui.set_par(g1.redshift, 0.518) ui.set_par(g1.Sigma, 0.01) ui.freeze(g1.Sigma) ui.set_par(g1.LineE, min=6.0, max=7.0) ui.fit() np.random.seed(12345) result = ui.eqwidth(p1, p1 + g1, error=True, niter=100) check(result[0], result[1], result[2]) params = result[3] np.random.seed(12345) result = ui.eqwidth(p1, p1 + g1, error=True, params=params, niter=100) check(result[0], result[1], result[2]) parvals = ui.get_fit_results().parvals assert parvals[0] == pytest.approx(0.6111340686157877, rel=1.0e-3) assert parvals[1] == pytest.approx(1.6409785803466297, rel=1.0e-3) assert parvals[2] == pytest.approx(8.960926761312153e-05, rel=1.0e-3) assert parvals[3] == pytest.approx(6.620017726014523, rel=1.0e-3) assert parvals[4] == pytest.approx(1.9279114810359657e-06, rel=1.0e-3)
def test_eqwidth_err_arg_is_numpy(arg, clean_astro_ui): """Ensure argument is a NumPy argument.""" ui.load_arrays('bob', [1, 5], [1, 12], ui.Data1D) cmdl = ui.const1d.cmdl pmdl = ui.polynom1d.pmdl cmdl.c0 = 1.5 pmdl.c0 = -5 pmdl.c1 = 2 ui.set_source('bob', cmdl + pmdl) ui.fit('bob') arglist = {'id': 'bob', 'error': True, 'niter': 100, arg: 2.3} with pytest.raises(IOErr) as exc: ui.eqwidth(cmdl, cmdl + pmdl, **arglist) assert str(exc.value) == f'{arg} must be of type numpy.ndarray'
def test_eqwidth_err_arg_size(arg, clean_astro_ui): """Ensure argument is the correct size.""" ui.load_arrays('bob', [1, 5], [1, 12], ui.Data1D) cmdl = ui.const1d.cmdl pmdl = ui.polynom1d.pmdl cmdl.c0 = 1.5 pmdl.c0 = -5 pmdl.c1 = 2 ui.set_source('bob', cmdl + pmdl) ui.fit('bob') arglist = {'id': 'bob', 'error': True, 'niter': 100, arg: np.arange(12).reshape(3, 4)} with pytest.raises(IOErr) as exc: ui.eqwidth(cmdl, cmdl + pmdl, **arglist) assert str(exc.value) == f'{arg} must be of dimension (2, x)'
def test_eqwidth_err_arg_square(clean_astro_ui): """Ensure argument is square. It looks like this is only checked for with covar_matrix argument """ ui.load_arrays('bob', [1, 5], [1, 12], ui.Data1D) cmdl = ui.const1d.cmdl pmdl = ui.polynom1d.pmdl cmdl.c0 = 1.5 pmdl.c0 = -5 pmdl.c1 = 2 ui.set_source('bob', cmdl + pmdl) ui.fit('bob') arglist = {'id': 'bob', 'error': True, 'niter': 100, 'covar_matrix': np.arange(12).reshape(2, 6)} with pytest.raises(IOErr) as exc: ui.eqwidth(cmdl, cmdl + pmdl, **arglist) assert str(exc.value) == 'covar_matrix must be of dimension (2, 2)'
def test_numpy_histogram_density_vs_normed(): from sherpa.astro import ui ui.load_arrays(1, [1, 2, 3], [1, 2, 3]) ui.set_source('const1d.c') c = ui.get_model_component('c') ui.fit() res = ui.eqwidth(c, c+c, error=True) ui.plot_pdf(res[4]) plot = ui.get_pdf_plot() expected_x = numpy.linspace(2.5, 3.5, 13) expected_xlo, expected_xhi = expected_x[:-1], expected_x[1:] expected_y = [0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0] assert plot.y == pytest.approx(expected_y) assert plot.xlo == pytest.approx(expected_xlo) assert plot.xhi == pytest.approx(expected_xhi)