Exemplo n.º 1
0
def test_excess_map_estimator_map_dataset_on_off_reco_exposure(
    simple_dataset_on_off, ):

    # TODO: this has never worked...
    model = SkyModel(
        PowerLawSpectralModel(amplitude="1e-9 cm-2 s-1TeV-1"),
        GaussianSpatialModel(lat_0=0.0 * u.deg,
                             lon_0=0.0 * u.deg,
                             sigma=0.1 * u.deg,
                             frame="icrs"),
        name="sky_model",
    )

    simple_dataset_on_off.models = [model]

    spectral_model = PowerLawSpectralModel(index=15)
    estimator_mod = ExcessMapEstimator(
        0.11 * u.deg,
        correlate_off=True,
        spectral_model=spectral_model,
    )
    result_mod = estimator_mod.run(simple_dataset_on_off)

    assert result_mod["flux"].unit == "cm-2s-1"
    assert_allclose(result_mod["flux"].data.sum(), 5.254442e-06, rtol=1e-3)

    reco_exposure = estimate_exposure_reco_energy(
        simple_dataset_on_off, spectral_model=spectral_model)
    assert_allclose(reco_exposure.data.sum(), 7.977796e12, rtol=0.001)
Exemplo n.º 2
0
def test_significance_map_estimator_map_dataset_on_off_with_correlation(
    simple_dataset_on_off, ):
    exposure = simple_dataset_on_off.exposure
    exposure.data += 1e6

    # First without exposure
    simple_dataset_on_off.exposure = None

    estimator = ExcessMapEstimator(0.11 * u.deg,
                                   energy_edges=[0.1, 1, 10] * u.TeV,
                                   correlate_off=True)
    result = estimator.run(simple_dataset_on_off)

    assert result["counts"].data.shape == (2, 20, 20)
    assert_allclose(result["counts"].data[:, 10, 10], 194)
    assert_allclose(result["excess"].data[:, 10, 10], 97)
    assert_allclose(result["background"].data[:, 10, 10], 97)
    assert_allclose(result["sqrt_ts"].data[:, 10, 10], 5.741116, atol=1e-5)
    assert_allclose(result["flux"].data[:, 10, 10], np.nan)

    # Test with exposure
    simple_dataset_on_off.exposure = exposure
    estimator_image = ExcessMapEstimator(0.11 * u.deg,
                                         energy_edges=[0.1, 1] * u.TeV,
                                         correlate_off=True)

    result_image = estimator_image.run(simple_dataset_on_off)
    assert result_image["counts"].data.shape == (1, 20, 20)
    assert_allclose(result_image["counts"].data[0, 10, 10], 194)
    assert_allclose(result_image["excess"].data[0, 10, 10], 97)
    assert_allclose(result_image["background"].data[0, 10, 10], 97)
    assert_allclose(result_image["sqrt_ts"].data[0, 10, 10],
                    5.741116,
                    atol=1e-3)
    assert_allclose(result_image["flux"].data[:, 10, 10], 9.7e-9, atol=1e-5)

    # Test with mask fit
    mask_fit = Map.from_geom(
        simple_dataset_on_off._geom,
        data=np.ones(simple_dataset_on_off.counts.data.shape, dtype=bool),
    )
    mask_fit.data[:, :, 10] = False
    mask_fit.data[:, 10, :] = False
    simple_dataset_on_off.mask_fit = mask_fit

    estimator_image = ExcessMapEstimator(0.11 * u.deg,
                                         apply_mask_fit=True,
                                         correlate_off=True)

    result_image = estimator_image.run(simple_dataset_on_off)
    assert result_image["counts"].data.shape == (1, 20, 20)

    assert_allclose(result_image["sqrt_ts"].data[0, 10, 10], np.nan, atol=1e-3)
    assert_allclose(result_image["counts"].data[0, 10, 10], np.nan)
    assert_allclose(result_image["excess"].data[0, 10, 10], np.nan)
    assert_allclose(result_image["background"].data[0, 10, 10], np.nan)
    assert_allclose(result_image["sqrt_ts"].data[0, 9, 9], 7.186745, atol=1e-3)
    assert_allclose(result_image["counts"].data[0, 9, 9], 304)
    assert_allclose(result_image["excess"].data[0, 9, 9], 152)
    assert_allclose(result_image["background"].data[0, 9, 9], 152)

    assert result_image["flux"].unit == u.Unit("cm-2s-1")
    assert_allclose(result_image["flux"].data[0, 9, 9], 1.52e-8, rtol=1e-3)

    simple_dataset_on_off.psf = None

    # TODO: this has never worked...
    model = SkyModel(
        PowerLawSpectralModel(amplitude="1e-9 cm-2 s-1TeV-1"),
        GaussianSpatialModel(lat_0=0.0 * u.deg,
                             lon_0=0.0 * u.deg,
                             sigma=0.1 * u.deg,
                             frame="icrs"),
        name="sky_model",
    )

    simple_dataset_on_off.models = [model]

    estimator_mod = ExcessMapEstimator(0.11 * u.deg,
                                       apply_mask_fit=False,
                                       correlate_off=True)
    result_mod = estimator_mod.run(simple_dataset_on_off)
    assert result_mod["counts"].data.shape == (1, 20, 20)

    assert_allclose(result_mod["sqrt_ts"].data[0, 10, 10], 8.899278, atol=1e-3)

    assert_allclose(result_mod["counts"].data[0, 10, 10], 388)
    assert_allclose(result_mod["excess"].data[0, 10, 10], 190.68057)
    assert_allclose(result_mod["background"].data[0, 10, 10], 197.31943)

    assert result_mod["flux"].unit == "cm-2s-1"
    assert_allclose(result_mod["flux"].data[0, 10, 10],
                    1.906806e-08,
                    rtol=1e-3)
    assert_allclose(result_mod["flux"].data.sum(), 5.920642e-06, rtol=1e-3)

    spectral_model = PowerLawSpectralModel(index=15)
    estimator_mod = ExcessMapEstimator(
        0.11 * u.deg,
        apply_mask_fit=False,
        correlate_off=True,
        spectral_model=spectral_model,
    )
    result_mod = estimator_mod.run(simple_dataset_on_off)

    assert result_mod["flux"].unit == "cm-2s-1"
    assert_allclose(result_mod["flux"].data.sum(), 5.920642e-06, rtol=1e-3)

    reco_exposure = estimate_exposure_reco_energy(
        simple_dataset_on_off, spectral_model=spectral_model)
    assert_allclose(reco_exposure.data.sum(), 7.977796e+12, rtol=0.001)