class TestSpectralModelErrorPropagation: """Test spectral model error propagation. https://github.com/gammapy/gammapy/blob/master/docs/development/pigs/pig-014.rst#proposal https://nbviewer.jupyter.org/github/gammapy/gammapy-extra/blob/master/experiments/uncertainty_estimation_prototype.ipynb """ def setup(self): self.model = LogParabolaSpectralModel( amplitude=3.76e-11 * u.Unit("cm-2 s-1 TeV-1"), reference=1 * u.TeV, alpha=2.44, beta=0.25, ) self.model.covariance = [ [1.31e-23, 0, -6.80e-14, 3.04e-13], [0, 0, 0, 0], [-6.80e-14, 0, 0.00899, 0.00904], [3.04e-13, 0, 0.00904, 0.0284], ] def test_evaluate_error_scalar(self): # evaluate_error on scalar out = self.model.evaluate_error(1 * u.TeV) assert isinstance(out, u.Quantity) assert out.unit == "cm-2 s-1 TeV-1" assert out.shape == (2,) assert_allclose(out.data, [3.7600e-11, 3.6193e-12], rtol=1e-3) def test_evaluate_error_array(self): out = self.model.evaluate_error([1, 100] * u.TeV) assert out.shape == (2, 2) expected = [[3.76e-11, 2.469e-18], [3.619e-12, 9.375e-18]] assert_allclose(out.data, expected, rtol=1e-3) def test_evaluate_error_unit(self): out = self.model.evaluate_error(1e6 * u.MeV) assert out.unit == "cm-2 s-1 TeV-1" assert_allclose(out.data, [3.760e-11, 3.6193e-12], rtol=1e-3) def test_integral_error(self): out = self.model.integral_error(1 * u.TeV, 10 * u.TeV) assert out.unit == "cm-2 s-1" assert out.shape == (2,) assert_allclose(out.data, [2.197e-11, 2.796e-12], rtol=1e-3) def test_energy_flux_error(self): out = self.model.energy_flux_error(1 * u.TeV, 10 * u.TeV) assert out.unit == "TeV cm-2 s-1" assert out.shape == (2,) assert_allclose(out.data, [4.119e-11, 8.157e-12], rtol=1e-3)
class TestSpectralModelErrorPropagation: """Test spectral model error propagation. https://github.com/gammapy/gammapy/blob/master/docs/development/pigs/pig-014.rst#proposal https://nbviewer.jupyter.org/github/gammapy/gammapy-extra/blob/master/experiments/uncertainty_estimation_prototype.ipynb """ def setup(self): self.model = LogParabolaSpectralModel( amplitude=3.76e-11 * u.Unit("cm-2 s-1 TeV-1"), reference=1 * u.TeV, alpha=2.44, beta=0.25, ) self.model.covariance = [ [1.31e-23, 0, -6.80e-14, 3.04e-13], [0, 0, 0, 0], [-6.80e-14, 0, 0.00899, 0.00904], [3.04e-13, 0, 0.00904, 0.0284], ] def test_evaluate_error_scalar(self): # evaluate_error on scalar out = self.model.evaluate_error(1 * u.TeV) assert isinstance(out, u.Quantity) assert out.unit == "cm-2 s-1 TeV-1" assert out.shape == (2, ) assert_allclose(out.data, [3.7600e-11, 3.6193e-12], rtol=1e-3) def test_evaluate_error_array(self): out = self.model.evaluate_error([1, 100] * u.TeV) assert out.shape == (2, 2) expected = [[3.76e-11, 2.469e-18], [3.619e-12, 9.375e-18]] assert_allclose(out.data, expected, rtol=1e-3) def test_evaluate_error_unit(self): out = self.model.evaluate_error(1e6 * u.MeV) assert out.unit == "cm-2 s-1 TeV-1" assert_allclose(out.data, [3.760e-11, 3.6193e-12], rtol=1e-3) @pytest.mark.xfail(reason="FIXME, do we need this method?") def test_integral_error(self): out = self.model.integral_error(1 * u.TeV, 10 * u.TeV) assert out.unit == "cm-2 s-1" assert out.shape == (2, ) assert_allclose(out.data, [2.197e-11, 2.796e-12], rtol=1e-3) @pytest.mark.xfail(reason="FIXME, do we need this method?") def test_energy_flux_error(self): out = self.model.energy_flux_error(1 * u.TeV, 10 * u.TeV) assert out.unit == "TeV cm-2 s-1" assert out.shape == (2, ) assert_allclose(out.data, [4.119e-11, 8.157e-12], rtol=1e-3) def test_ecpl_model(self): # Regression test for ECPL model # https://github.com/gammapy/gammapy/issues/2007 model = ExpCutoffPowerLawSpectralModel( amplitude=2.076183759227292e-12 * u.Unit("cm-2 s-1 TeV-1"), index=1.8763343736076483, lambda_=0.08703226432146616 * u.Unit("TeV-1"), reference=1 * u.TeV, ) model.covariance = [ [0.00204191498, -1.507724e-14, 0.0, -0.001834819, 0.0], [-1.507724e-14, 1.6864740e-25, 0.0, 1.854251e-14, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [-0.001834819175, 1.8542517e-14, 0.0, 0.0032559101, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], ] out = model.evaluate_error(1 * u.TeV) assert_allclose(out.data, [1.903129e-12, 2.979976e-13], rtol=1e-3) out = model.evaluate_error(0.1 * u.TeV) assert_allclose(out.data, [1.548176e-10, 1.933612e-11], rtol=1e-3)