def test_flux_estimator_norm_range_template(): energy = MapAxis.from_energy_bounds(0.1, 10, 3.0, unit="TeV", name="energy_true") template = WcsNDMap.create(npix=10, axes=[energy], unit="cm-2 s-1 sr-1 TeV-1") spatial = TemplateSpatialModel(template, normalize=False) spectral = PowerLawNormSpectralModel() model = SkyModel(spectral_model=spectral, spatial_model=spatial, name="test") model.spectral_model.norm.max = 10 model.spectral_model.norm.min = 0 estimator = FluxEstimator(source="test", selection_optional=[], reoptimize=True) scale_model = estimator.get_scale_model(Models([model])) assert_allclose(scale_model.norm.min, 0) assert_allclose(scale_model.norm.max, 10) assert scale_model.norm.interp == "log"
def test_flux_estimator_fermi_no_reoptimization(fermi_datasets): estimator = FluxEstimator( 0, norm_n_values=5, norm_min=0.5, norm_max=2, selection_optional="all", reoptimize=False ) datasets = fermi_datasets.slice_by_energy( energy_min="1 GeV", energy_max="100 GeV" ) datasets.models = fermi_datasets.models result = estimator.run(datasets) assert_allclose(result["norm"], 0.98949, atol=1e-3) assert_allclose(result["ts"], 25083.75408, rtol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3) assert_allclose(result["norm_errn"], 0.0199, atol=1e-3) assert_allclose(result["norm_errp"], 0.0199, atol=1e-3) assert len(result["norm_scan"]) == 5 assert_allclose(result["norm_scan"][0], 0.5) assert_allclose(result["norm_scan"][-1], 2) assert_allclose(result["e_min"], 10 * u.GeV, atol=1e-3) assert_allclose(result["e_max"], 83.255 * u.GeV, atol=1e-3)
def test_flux_estimator_fermi_with_reoptimization(fermi_datasets): estimator = FluxEstimator(0, energy_range=["1 GeV", "100 GeV"], reoptimize=True) result = estimator.run(fermi_datasets, steps=["err", "ts"]) assert_allclose(result["norm"], 0.970614, atol=1e-3) assert_allclose(result["ts"], 13005.903067, atol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3)
def test_flux_estimator_incorrect_energy_range(hess_datasets): with pytest.raises(ValueError): FluxEstimator(hess_datasets, source="Crab", energy_range=[1, 3, 10] * u.TeV) with pytest.raises(ValueError): FluxEstimator(hess_datasets, source="Crab", energy_range=[10, 1] * u.TeV)
def test_flux_estimator_1d(hess_datasets): estimator = FluxEstimator(hess_datasets, source="Crab") result = estimator.run('1 TeV', '10 TeV', steps=["ts", "errp-errn", "ul"]) assert_allclose(result["norm"], 1.176789, atol=1e-3) assert_allclose(result["delta_ts"], 693.111777, atol=1e-3) assert_allclose(result["err"], 0.078087, atol=1e-3) assert_allclose(result["errn"], 0.078046, atol=1e-3) assert_allclose(result["errp"], 0.081665, atol=1e-3) assert_allclose(result["ul"], 1.431722, atol=1e-3)
def test_flux_estimator_1d(hess_datasets): estimator = FluxEstimator(source="Crab", energy_range=[1, 10] * u.TeV) result = estimator.run(hess_datasets, steps=["err", "ts", "errp-errn", "ul"]) assert_allclose(result["norm"], 1.176789, atol=1e-3) assert_allclose(result["ts"], 693.111777, atol=1e-3) assert_allclose(result["norm_err"], 0.078087, atol=1e-3) assert_allclose(result["norm_errn"], 0.078046, atol=1e-3) assert_allclose(result["norm_errp"], 0.081665, atol=1e-3) assert_allclose(result["norm_ul"], 1.431722, atol=1e-3)
def test_flux_estimator_fermi_with_reoptimization(fermi_datasets): estimator = FluxEstimator(0, e_min="1 GeV", e_max="100 GeV", reoptimize=True, selection_optional=None) result = estimator.run(fermi_datasets) assert_allclose(result["norm"], 1.010983, atol=1e-3) assert_allclose(result["ts"], 20896.1864, atol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3)
def test_flux_estimator_fermi_with_reoptimization(fermi_datasets): estimator = FluxEstimator(0, energy_min="1 GeV", energy_max="100 GeV", selection_optional=None, reoptimize=True) result = estimator.run(fermi_datasets) assert_allclose(result["norm"], 0.989989, atol=1e-3) assert_allclose(result["ts"], 18729.907481, rtol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3)
def test_flux_estimator_fermi_with_reoptimization(fermi_datasets): estimator = FluxEstimator(0, selection_optional=None, reoptimize=True) datasets = fermi_datasets.slice_by_energy(energy_min="1 GeV", energy_max="100 GeV") datasets.models = fermi_datasets.models result = estimator.run(datasets) assert_allclose(result["norm"], 0.989989, atol=1e-3) assert_allclose(result["ts"], 18729.368105, rtol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3)
def test_flux_estimator_incorrect_energy_range(fermi_datasets): with pytest.raises(ValueError): FluxEstimator(source="Crab", energy_min=10 * u.TeV, energy_max=1 * u.TeV) fe = FluxEstimator(source="Crab Nebula", energy_min=0.18 * u.TeV, energy_max=0.2 * u.TeV) result = fe.run(fermi_datasets) assert np.isnan(result["norm"])
def test_flux_estimator_1d(hess_datasets): estimator = FluxEstimator(source="Crab", e_min=1 * u.TeV, e_max=10 * u.TeV, selection_optional=["errn-errp", "ul"]) result = estimator.run(hess_datasets) assert_allclose(result["norm"], 1.176789, atol=1e-3) assert_allclose(result["ts"], 693.111777, atol=1e-3) assert_allclose(result["norm_err"], 0.078087, atol=1e-3) assert_allclose(result["norm_errn"], 0.078046, atol=1e-3) assert_allclose(result["norm_errp"], 0.081665, atol=1e-3) assert_allclose(result["norm_ul"], 1.431722, atol=1e-3)
def test_flux_estimator_norm_range(): model = SkyModel.create("pl", "gauss", name="test") model.spectral_model.amplitude.min = 1e-15 model.spectral_model.amplitude.max = 1e-10 estimator = FluxEstimator(source="test", selection_optional=[], reoptimize=True) scale_model = estimator.get_scale_model(Models([model])) assert_allclose(scale_model.norm.min, 1e-3) assert_allclose(scale_model.norm.max, 1e2) assert scale_model.norm.interp == "log"
def test_flux_estimator_naima_model(): import naima ECPL = naima.models.ExponentialCutoffPowerLaw(1e36 * u.Unit("1/eV"), 1 * u.TeV, 2.1, 13 * u.TeV) IC = naima.models.InverseCompton(ECPL, seed_photon_fields=["CMB"]) naima_model = NaimaSpectralModel(IC) model = SkyModel(spectral_model=naima_model, name="test") estimator = FluxEstimator(source="test", selection_optional=[], reoptimize=True) scale_model = estimator.get_scale_model(Models([model])) assert_allclose(scale_model.norm.min, np.nan) assert_allclose(scale_model.norm.max, np.nan)
def test_flux_estimator_fermi_no_reoptimization(fermi_datasets): estimator = FluxEstimator(fermi_datasets, 0, norm_n_values=5, norm_min=0.5, norm_max=2, reoptimize=False) result = estimator.run("1 GeV", "100 GeV") assert_allclose(result["norm"], 0.970614, atol=1e-3) assert_allclose(result["delta_ts"], 29695.720611, atol=1e-3) assert_allclose(result["err"], 0.01998, atol=1e-3) assert_allclose(result["errn"], 0.0199, atol=1e-3) assert_allclose(result["errp"], 0.0199, atol=1e-3) assert len(result["norm_scan"]) == 5 assert_allclose(result["norm_scan"][0], 0.5) assert_allclose(result["norm_scan"][-1], 2)
def test_flux_estimator_compound_model(): pl = PowerLawSpectralModel() pl.amplitude.min = 1e-15 pl.amplitude.max = 1e-10 pln = PowerLawNormSpectralModel() pln.norm.value = 0.1 spectral_model = pl * pln model = SkyModel(spectral_model=spectral_model, name="test") estimator = FluxEstimator(source="test", selection_optional=[], reoptimize=True) scale_model = estimator.get_scale_model(Models([model])) assert_allclose(scale_model.norm.min, 1e-3) assert_allclose(scale_model.norm.max, 1e2)
def test_flux_estimator_1d(hess_datasets): estimator = FluxEstimator( source="Crab", energy_min=1 * u.TeV, energy_max=10 * u.TeV, selection_optional=["errn-errp", "ul"], ) result = estimator.run(hess_datasets) assert_allclose(result["norm"], 1.218139, atol=1e-3) assert_allclose(result["ts"], 527.492959, atol=1e-3) assert_allclose(result["norm_err"], 0.095496, atol=1e-3) assert_allclose(result["norm_errn"], 0.093204, atol=1e-3) assert_allclose(result["norm_errp"], 0.097818, atol=1e-3) assert_allclose(result["norm_ul"], 1.525773, atol=1e-3) assert_allclose(result["e_min"], 1 * u.TeV, atol=1e-3) assert_allclose(result["e_max"], 10 * u.TeV, atol=1e-3)
def test_inhomogeneous_datasets(fermi_datasets, hess_datasets): for dataset in hess_datasets: dataset.models = fermi_datasets.models datasets = Datasets() datasets.extend(fermi_datasets) datasets.extend(hess_datasets) estimator = FluxEstimator(source="Crab Nebula", e_min=1 * u.TeV, e_max=10 * u.TeV, selection_optional=None) result = estimator.run(datasets) assert_allclose(result["norm"], 1.022802, atol=1e-3) assert_allclose(result["ts"], 21584.515969, atol=1e-3) assert_allclose(result["norm_err"], 0.01966, atol=1e-3)
def test_flux_estimator_fermi_no_reoptimization(fermi_datasets): estimator = FluxEstimator( 0, energy_range=["1 GeV", "100 GeV"], norm_n_values=5, norm_min=0.5, norm_max=2, reoptimize=False, ) result = estimator.run(fermi_datasets) assert_allclose(result["norm"], 0.970614, atol=1e-3) assert_allclose(result["ts"], 29695.689216, atol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3) assert_allclose(result["norm_errn"], 0.0199, atol=1e-3) assert_allclose(result["norm_errp"], 0.0199, atol=1e-3) assert len(result["norm_scan"]) == 5 assert_allclose(result["norm_scan"][0], 0.5) assert_allclose(result["norm_scan"][-1], 2)
def test_flux_estimator_1d(hess_datasets): estimator = FluxEstimator( source="Crab", selection_optional=["errn-errp", "ul"], reoptimize=False ) datasets = hess_datasets.slice_by_energy( energy_min=1 * u.TeV, energy_max=10 * u.TeV, ) datasets.models = hess_datasets.models result = estimator.run(datasets) assert_allclose(result["norm"], 1.218139, atol=1e-3) assert_allclose(result["ts"], 527.492959, atol=1e-3) assert_allclose(result["norm_err"], 0.095496, atol=1e-3) assert_allclose(result["norm_errn"], 0.093204, atol=1e-3) assert_allclose(result["norm_errp"], 0.097818, atol=1e-3) assert_allclose(result["norm_ul"], 1.418475, atol=1e-3) assert_allclose(result["e_min"], 1 * u.TeV, atol=1e-3) assert_allclose(result["e_max"], 10 * u.TeV, atol=1e-3)
def test_flux_estimator_fermi_no_reoptimization(fermi_datasets): estimator = FluxEstimator( 0, e_min="1 GeV", e_max="100 GeV", norm_n_values=5, norm_min=0.5, norm_max=2, reoptimize=False, ) result = estimator.run(fermi_datasets) assert_allclose(result["norm"], 1.010983, atol=1e-3) assert_allclose(result["ts"], 28086.565, atol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3) assert_allclose(result["norm_errn"], 0.0199, atol=1e-3) assert_allclose(result["norm_errp"], 0.0199, atol=1e-3) assert len(result["norm_scan"]) == 5 assert_allclose(result["norm_scan"][0], 0.5) assert_allclose(result["norm_scan"][-1], 2)
def test_inhomogeneous_datasets(fermi_datasets, hess_datasets): datasets = Datasets() datasets.extend(fermi_datasets) datasets.extend(hess_datasets) datasets = datasets.slice_by_energy( energy_min=1 * u.TeV, energy_max=10 * u.TeV, ) datasets.models = fermi_datasets.models estimator = FluxEstimator(source="Crab Nebula", selection_optional=[], reoptimize=True) result = estimator.run(datasets) assert_allclose(result["norm"], 1.190622, atol=1e-3) assert_allclose(result["ts"], 612.50171, atol=1e-3) assert_allclose(result["norm_err"], 0.090744, atol=1e-3) assert_allclose(result["e_min"], 0.693145 * u.TeV, atol=1e-3) assert_allclose(result["e_max"], 10 * u.TeV, atol=1e-3)
def test_flux_estimator_fermi_no_reoptimization(fermi_datasets): estimator = FluxEstimator( 0, energy_min="1 GeV", energy_max="100 GeV", norm_n_values=5, norm_min=0.5, norm_max=2, reoptimize=False, ) result = estimator.run(fermi_datasets) assert_allclose(result["norm"], 0.982434, atol=1e-3) assert_allclose(result["ts"], 23856.262603, atol=1e-3) assert_allclose(result["norm_err"], 0.01998, atol=1e-3) assert_allclose(result["norm_errn"], 0.0199, atol=1e-3) assert_allclose(result["norm_errp"], 0.0199, atol=1e-3) assert len(result["norm_scan"]) == 5 assert_allclose(result["norm_scan"][0], 0.5) assert_allclose(result["norm_scan"][-1], 2) assert_allclose(result["e_min"], 10 * u.GeV, atol=1e-3) assert_allclose(result["e_max"], 83.255 * u.GeV, atol=1e-3)
def test_inhomogeneous_datasets(fermi_datasets, hess_datasets): for dataset in hess_datasets: dataset.models = fermi_datasets.models datasets = Datasets() datasets.extend(fermi_datasets) datasets.extend(hess_datasets) estimator = FluxEstimator( source="Crab Nebula", energy_min=1 * u.TeV, energy_max=10 * u.TeV, selection_optional=None, ) result = estimator.run(datasets) assert_allclose(result["norm"], 1.190622, atol=1e-3) assert_allclose(result["ts"], 612.500392, atol=1e-3) assert_allclose(result["norm_err"], 0.090744, atol=1e-3) assert_allclose(result["e_min"], 0.693145 * u.TeV, atol=1e-3) assert_allclose(result["e_max"], 2 * u.TeV, atol=1e-3)
def test_flux_estimator_incorrect_energy_range(): with pytest.raises(ValueError): FluxEstimator(source="Crab", energy_min=10 * u.TeV, energy_max=1 * u.TeV)
def test_inhomogeneous_datasets(fermi_datasets, hess_datasets): fermi_datasets.append(hess_datasets[0]) with pytest.raises(ValueError): estimator = FluxEstimator(source=0, energy_range=[1, 10] * u.TeV) estimator.run(fermi_datasets)
def test_inhomogeneous_datasets(fermi_datasets, hess_datasets): fermi_datasets.append(hess_datasets[0]) with pytest.raises(ValueError): FluxEstimator(fermi_datasets, source=0)