Esempio n. 1
0
    def setup(self):
        ra = [0., 0., 0., 10.]*u.deg
        dec = [0.,0.9, 10., 10.]*u.deg
        energy = [1.,1.5, 1.5, 10.]*u.TeV

        evt_table = Table([ra,dec,energy], names=['RA','DEC','ENERGY'])
        self.evt_list = EventListBase(evt_table)

        center = SkyCoord(0.,0., frame='icrs', unit='deg')
        self.on_region = CircleSkyRegion(center,radius=1.0*u.deg)
Esempio n. 2
0
    def _spectrum_extraction(self):
        """Run all steps for the spectrum extraction."""
        region = self.settings["datasets"]["geom"]["region"]
        log.info("Reducing spectrum datasets.")
        on_lon = Angle(region["center"][0])
        on_lat = Angle(region["center"][1])
        on_center = SkyCoord(on_lon, on_lat, frame=region["frame"])
        on_region = CircleSkyRegion(on_center, Angle(region["radius"]))

        maker_config = {}
        if "containment_correction" in self.settings["datasets"]:
            maker_config["containment_correction"] = self.settings["datasets"][
                "containment_correction"
            ]
        params = self.settings["datasets"]["geom"]["axes"][0]
        e_reco = MapAxis.from_bounds(**params).edges
        maker_config["e_reco"] = e_reco

        # TODO: remove hard-coded e_true and make it configurable
        maker_config["e_true"] = np.logspace(-2, 2.5, 109) * u.TeV
        maker_config["region"] = on_region

        dataset_maker = SpectrumDatasetMaker(**maker_config)
        bkg_maker_config = {}
        background = self.settings["datasets"]["background"]

        if "exclusion_mask" in background:
            map_hdu = {}
            filename = background["exclusion_mask"]["filename"]
            if "hdu" in background["exclusion_mask"]:
                map_hdu = {"hdu": background["exclusion_mask"]["hdu"]}
            exclusion_region = Map.read(filename, **map_hdu)
            bkg_maker_config["exclusion_mask"] = exclusion_region
        if background["background_estimator"] == "reflected":
            reflected_bkg_maker = ReflectedRegionsBackgroundMaker(**bkg_maker_config)
        else:
            # TODO: raise error?
            log.info("Background estimation only for reflected regions method.")

        safe_mask_maker = SafeMaskMaker(methods=["aeff-default", "aeff-max"])

        datasets = []
        for obs in self.observations:
            selection = ["counts", "aeff", "edisp"]
            dataset = dataset_maker.run(obs, selection=selection)
            dataset = reflected_bkg_maker.run(dataset, obs)
            dataset = safe_mask_maker.run(dataset, obs)
            datasets.append(dataset)

        self.datasets = Datasets(datasets)

        if self.settings["datasets"]["stack-datasets"]:
            stacked = self.datasets.stack_reduce()
            stacked.name = "stacked"
            self.datasets = Datasets([stacked])
def simulate():

    irfs = load_cta_irfs(
        "$GAMMAPY_DATA/cta-1dc/caldb/data/cta/1dc/bcf/South_z20_50h/irf_file.fits"
    )

    # Reconstructed and true energy axis
    center = SkyCoord(0.0, 0.0, unit="deg", frame="galactic")
    energy_axis = MapAxis.from_edges(
        np.logspace(-0.5, 1.0, 10), unit="TeV", name="energy", interp="log",
    )
    energy_axis_true = MapAxis.from_edges(
        np.logspace(-1.2, 2.0, 31), unit="TeV", name="energy_true", interp="log",
    )

    on_region_radius = Angle("0.11 deg")
    on_region = CircleSkyRegion(center=center, radius=on_region_radius)

    pointing = SkyCoord(0.5, 0.5, unit="deg", frame="galactic")

    spectral_model = PowerLawSpectralModel(
        index=3, amplitude="1e-11 cm-2 s-1 TeV-1", reference="1 TeV"
    )
    temporal_model = ExpDecayTemporalModel(t0="6 h", t_ref=gti_t0.mjd * u.d)
    model_simu = SkyModel(
        spectral_model=spectral_model, temporal_model=temporal_model, name="model-simu",
    )

    lvtm = np.ones(N_OBS) * 1.0 * u.hr
    tstart = 1.0 * u.hr

    datasets = []
    for i in range(N_OBS):
        obs = Observation.create(
            pointing=pointing,
            livetime=lvtm[i],
            tstart=tstart,
            irfs=irfs,
            reference_time=gti_t0,
        )
        empty = SpectrumDataset.create(
            e_reco=energy_axis,
            e_true=energy_axis_true,
            region=on_region,
            name=f"dataset_{i}",
        )
        maker = SpectrumDatasetMaker(selection=["aeff", "background", "edisp"])
        dataset = maker.run(empty, obs)
        dataset.models = model_simu
        dataset.fake()
        datasets.append(dataset)
        tstart = tstart + 2.0 * u.hr

    return datasets
Esempio n. 4
0
    def estimate_reflected(self, EXCLUSION_FILE, size):

        #just extracts the reflected background
        on_size=0.11 * u.deg #0.11 for point source cuts...
        allsky_mask = SkyImage.read(EXCLUSION_FILE)
        exclusion_mask = allsky_mask.cutout(position=self.obspos,size=size)
        on_region=CircleSkyRegion(self.obspos,on_size)         
        background_estimator = ReflectedRegionsBackgroundEstimator(obs_list=self.obslist, on_region=on_region, exclusion_mask = exclusion_mask)

        background_estimator.run()
        return background_estimator.result[0]
Esempio n. 5
0
 def write_region(cls, coords, filename, **kwargs):
     try:
         iter(coords)
     except TypeError as te:
         raise Exception('Coords must be iterable')
     circles = []
     for coord in coords:
         center = utils.get_skycoord(coord)
         rad = utils.get_angle(coord['rad'])
         circles.append(CircleSkyRegion(center=center, radius=rad, visual=kwargs))
     write_ds9(circles, filename)
Esempio n. 6
0
 def test_xmatch_query_with_cone_area(self, xmatch):
     try:
         table = xmatch.query(cat1='vizier:II/311/wise',
                              cat2='vizier:II/246/out',
                              max_distance=5 * arcsec,
                              area=CircleSkyRegion(center=SkyCoord(
                                  10, 10, unit='deg', frame='icrs'),
                                                   radius=12 * arcmin))
     except ReadTimeout:
         pytest.xfail("xmatch query timed out.")
     assert len(table) == 185
Esempio n. 7
0
    def test_field_l_param(self, field_l):
        center = coordinates.SkyCoord(ra=10.8, dec=32.2, unit="deg")
        radius = coordinates.Angle(1.5, unit="deg")

        cone_region = CircleSkyRegion(center, radius)

        table = cds.query_region(region=cone_region,
                                 fields=field_l,
                                 get_query_payload=False)
        assert isinstance(table, Table)
        assert set(table.colnames).issubset(set(field_l))
Esempio n. 8
0
    def test_region(self):
        pos = SkyCoord(81, 21, unit='deg', frame='icrs')
        radius = Angle(1, 'deg')
        circ = CircleSkyRegion(pos, radius)

        idx = circ.contains(self.events.radec)
        table = self.events.table[idx]

        assert_allclose(table[4]['RA'], 81, rtol=1)
        assert_allclose(table[2]['DEC'], 21, rtol=1)
        assert len(table) == 5
Esempio n. 9
0
def test_integrate_geom():
    center = SkyCoord("0d", "0d", frame="icrs")
    model = GaussianSpatialModel(lon="0d", lat="0d", sigma=0.1 * u.deg, frame="icrs")

    radius_large = 1 * u.deg
    circle_large = CircleSkyRegion(center, radius_large)
    radius_small = 0.1 * u.deg
    circle_small = CircleSkyRegion(center, radius_small)

    geom_large, geom_small = (
        RegionGeom(region=circle_large, binsz_wcs="0.01deg"),
        RegionGeom(region=circle_small, binsz_wcs="0.01deg"),
    )

    integral_large, integral_small = (
        model.integrate_geom(geom_large).data,
        model.integrate_geom(geom_small).data,
    )

    assert_allclose(integral_large[0], 1, rtol=0.01)
    assert_allclose(integral_small[0], 0.3953, rtol=0.01)
Esempio n. 10
0
def test_cone_search_spatial_request(RA, DEC, RADIUS):
    center = coordinates.SkyCoord(ra=RA, dec=DEC, unit="deg")
    radius = coordinates.Angle(RADIUS, unit="deg")
    cone_region = CircleSkyRegion(center=center, radius=radius)

    request_payload = cds.query_region(region=cone_region,
                                       get_query_payload=True,
                                       intersect='overlaps')

    assert (request_payload['DEC'] == str(DEC)) and \
           (request_payload['RA'] == str(RA)) and \
           (request_payload['SR'] == str(RADIUS))
Esempio n. 11
0
def test_intersect_param(intersect):
    center = coordinates.SkyCoord(ra=10.8, dec=32.2, unit="deg")
    radius = coordinates.Angle(1.5, unit="deg")

    cone_region = CircleSkyRegion(center, radius)
    request_payload = cds.query_region(region=cone_region,
                                       intersect=intersect,
                                       get_query_payload=True)
    if intersect == 'encloses':
        assert request_payload['intersect'] == 'enclosed'
    else:
        assert request_payload['intersect'] == intersect
Esempio n. 12
0
 def _gaia_galex_xmatch(cats, ra, dec, radius):
     galex = cats['II/312/ais']
     coord = SkyCoord(ra=ra * u.deg, dec=dec * u.deg, frame='icrs')
     region = CircleSkyRegion(coord, radius=radius)
     xm = XMatch.query(cat1='vizier:I/345/gaia2',
                       cat2=galex,
                       colRA2='RAJ2000',
                       colDec2='DEJ2000',
                       area=region,
                       max_distance=radius)
     xm.sort('angDist')
     return xm
def data_prep():
    data_store = DataStore.from_dir("$GAMMAPY_DATA/hess-dl3-dr1/")
    OBS_ID = 23523
    obs_ids = OBS_ID * np.ones(N_OBS)
    observations = data_store.get_observations(obs_ids)

    target_position = SkyCoord(ra=83.63308, dec=22.01450, unit="deg")

    e_reco = MapAxis.from_bounds(0.1, 40, nbin=40, interp="log",
                                 unit="TeV").edges
    e_true = MapAxis.from_bounds(0.05, 100, nbin=200, interp="log",
                                 unit="TeV").edges

    on_region_radius = Angle("0.11 deg")
    on_region = CircleSkyRegion(center=target_position,
                                radius=on_region_radius)

    dataset_maker = SpectrumDatasetMaker(containment_correction=True,
                                         selection=["counts", "aeff", "edisp"])

    empty = SpectrumDatasetOnOff.create(region=on_region,
                                        e_reco=e_reco,
                                        e_true=e_true)

    bkg_maker = ReflectedRegionsBackgroundMaker()
    safe_mask_masker = SafeMaskMaker(methods=["aeff-max"], aeff_percent=10)

    spectral_model = PowerLawSpectralModel(index=2.6,
                                           amplitude=2.0e-11 *
                                           u.Unit("1 / (cm2 s TeV)"),
                                           reference=1 * u.TeV)
    spectral_model.index.frozen = False

    model = spectral_model.copy()
    model.name = "crab"

    datasets_1d = []

    for observation in observations:

        dataset = dataset_maker.run(dataset=empty.copy(),
                                    observation=observation)

        dataset_on_off = bkg_maker.run(dataset, observation)
        dataset_on_off = safe_mask_masker.run(dataset_on_off, observation)
        datasets_1d.append(dataset_on_off)

    for dataset in datasets_1d:
        model = spectral_model.copy()
        model.name = "crab"
        dataset.model = model

    return datasets_1d
Esempio n. 14
0
    def evaluation_region(self):
        """Evaluation region"""

        if hasattr(self, "to_region"):
            return self.to_region()
        elif self.evaluation_radius is not None:
            return CircleSkyRegion(
                center=self.position,
                radius=self.evaluation_radius,
            )
        else:
            return None
Esempio n. 15
0
 def _gaia_mermilliod_xmatch(cats, ra, dec, radius):
     mermilliod = cats['II/168/ubvmeans']
     coord = SkyCoord(ra=ra * u.deg, dec=dec * u.deg, frame='icrs')
     region = CircleSkyRegion(coord, radius=radius)
     xm = XMatch.query(cat1='vizier:I/345/gaia2',
                       cat2=mermilliod,
                       colRA2='_RA',
                       colDec2='_DE',
                       area=region,
                       max_distance=radius)
     xm.sort('angDist')
     return xm
Esempio n. 16
0
 def _gaia_hauck_xmatch(cats, ra, dec, radius):
     mermilliod = cats['J/A+A/580/A23/catalog']
     coord = SkyCoord(ra=ra * u.deg, dec=dec * u.deg, frame='icrs')
     region = CircleSkyRegion(coord, radius=radius)
     xm = XMatch.query(cat1='vizier:I/345/gaia2',
                       cat2=mermilliod,
                       colRA2='_RA.icrs',
                       colDec2='_DE.icrs',
                       area=region,
                       max_distance=radius)
     xm.sort('angDist')
     return xm
Esempio n. 17
0
def exclusion_mask():
    exclusion_region = CircleSkyRegion(
        center=SkyCoord(183.604, -8.708, unit="deg", frame="galactic"),
        radius=0.5 * u.deg,
    )

    skydir = SkyCoord(ra=83.63, dec=22.01, unit="deg", frame="icrs")
    geom = WcsGeom.create(
        npix=(150, 150), binsz=0.05, skydir=skydir, proj="TAN", frame="icrs"
    )

    return ~geom.region_mask([exclusion_region])
Esempio n. 18
0
def make_mask(datasets,
              source_pos,
              source_radius=0.3*u.deg):
    # Make the exclusion mask

    geom = datasets[0].counts.geom
    energy_axis = datasets[0].counts.geom.axes["energy"]
    geom_image = geom.to_image().to_cube([energy_axis.squash()])

    regions = CircleSkyRegion(center=source_pos, radius=source_radius)
    exclusion_mask = Map.from_geom(geom_image)
    exclusion_mask.data = geom_image.region_mask([regions], inside=False)
    return exclusion_mask
Esempio n. 19
0
def test_find_reflected_regions(mask):
    pos = SkyCoord(80.2, 23.5, unit='deg', frame='icrs')
    radius = Angle(0.4, 'deg')
    region = CircleSkyRegion(pos, radius)
    center = SkyCoord(83.2, 22.7, unit='deg', frame='icrs')
    regions = find_reflected_regions(region,
                                     center,
                                     mask,
                                     min_distance_input=Angle('0 deg'))
    assert (len(regions)) == 20
    assert_quantity_allclose(regions[3].center.icrs.ra,
                             Angle('81.752 deg'),
                             rtol=1e-2)
Esempio n. 20
0
def test_make_region_mask():
    from regions import CircleSkyRegion
    geom = WcsGeom.create(npix=(3, 3), binsz=2, proj='CAR', coordsys='GAL')
    m = WcsNDMap(geom)
    region = CircleSkyRegion(SkyCoord(0, 0, unit='deg', frame='galactic'),
                             1.0 * u.deg)
    maskmap = m.make_region_mask(region)

    assert maskmap.data.dtype == bool
    assert np.sum(maskmap.data) == 1

    maskmap = m.make_region_mask(region, inside=False)
    assert np.sum(maskmap.data) == 8
Esempio n. 21
0
def test_EventList_region():
    filename = gammapy_extra.filename(
        'test_datasets/unbundled/hess/run_0023037_hard_eventlist.fits.gz')
    event_list = EventList.read(filename, hdu='EVENTS')

    pos = SkyCoord(81, 21, unit='deg', frame='icrs')
    radius = Angle(1, 'deg')
    circ = CircleSkyRegion(pos, radius)
    idx = circ.contains(event_list.radec)
    filtered_list = event_list[idx]

    assert_allclose(filtered_list[4]['RA'], 81, rtol=1)
    assert_allclose(filtered_list[2]['DEC'], 21, rtol=1)
    assert len(filtered_list) == 5
Esempio n. 22
0
def test_hpx_geom_region_mask():
    geom = HpxGeom.create(nside=256, region="DISK(0.,0.,5.)")

    circle = CircleSkyRegion(center=SkyCoord("0d", "0d"), radius=3 * u.deg)

    mask = geom.region_mask(circle)

    assert_allclose(mask.data.sum(), 534)
    assert mask.geom.nside == 256

    solid_angle = (mask.data * geom.solid_angle()).sum()
    assert_allclose(solid_angle,
                    2 * np.pi * (1 - np.cos(3 * u.deg)) * u.sr,
                    rtol=0.01)
Esempio n. 23
0
def test_fov_bkg_maker_mask_fit_handling(obs_dataset, exclusion_mask):
    fov_bkg_maker = FoVBackgroundMaker(method="scale", exclusion_mask=exclusion_mask)
    test_dataset = obs_dataset.copy(name="test-fov")
    region = CircleSkyRegion(obs_dataset._geom.center_skydir, Angle(0.4, "deg"))
    mask_fit = obs_dataset._geom.region_mask(regions=[region])
    test_dataset.mask_fit = mask_fit

    dataset = fov_bkg_maker.run(test_dataset)
    assert np.all(test_dataset.mask_fit == mask_fit) == True

    model = dataset.models[f"{dataset.name}-bkg"].spectral_model
    assert_allclose(model.norm.value, 0.9975, rtol=1e-3)
    assert_allclose(model.norm.error, 0.1115, rtol=1e-3)
    assert_allclose(model.tilt.value, 0.0, rtol=1e-2)
Esempio n. 24
0
    def setup_class(self):
        table = Table()
        table["RA"] = [0.0, 0.0, 0.0, 10.0] * u.deg
        table["DEC"] = [0.0, 0.9, 10.0, 10.0] * u.deg
        table["ENERGY"] = [1.0, 1.5, 1.5, 10.0] * u.TeV
        table["OFFSET"] = [0.1, 0.5, 1.0, 1.5] * u.deg

        self.events = EventListBase(table)

        center1 = SkyCoord(0.0, 0.0, frame="icrs", unit="deg")
        on_region1 = CircleSkyRegion(center1, radius=1.0 * u.deg)
        center2 = SkyCoord(0.0, 10.0, frame="icrs", unit="deg")
        on_region2 = RectangleSkyRegion(center2, width=0.5 * u.deg, height=0.3 * u.deg)
        self.on_regions = [on_region1, on_region2]
Esempio n. 25
0
    def setup(self):
        ra = [0.0, 0.0, 0.0, 10.0] * u.deg
        dec = [0.0, 0.9, 10.0, 10.0] * u.deg
        energy = [1.0, 1.5, 1.5, 10.0] * u.TeV

        evt_table = Table([ra, dec, energy], names=["RA", "DEC", "ENERGY"])
        self.evt_list = EventListBase(evt_table)

        center1 = SkyCoord(0.0, 0.0, frame="icrs", unit="deg")
        on_region1 = CircleSkyRegion(center1, radius=1.0 * u.deg)
        center2 = SkyCoord(0.0, 10.0, frame="icrs", unit="deg")
        on_region2 = RectangleSkyRegion(center2,
                                        width=0.5 * u.deg,
                                        height=0.3 * u.deg)
        self.on_regions = [on_region1, on_region2]
Esempio n. 26
0
def test_integrate_geom():
    model = GaussianSpatialModel(lon="0d", lat="0d", sigma=0.1 * u.deg, frame="icrs")
    spectral_model = PowerLawSpectralModel(amplitude="1e-11 cm-2 s-1 TeV-1")
    sky_model = SkyModel(spectral_model=spectral_model, spatial_model=model)

    center = SkyCoord("0d", "0d", frame="icrs")
    radius = 0.3 * u.deg
    square = CircleSkyRegion(center, radius)

    axis = MapAxis.from_energy_bounds("1 TeV", "10 TeV", nbin=3, name="energy_true")
    geom = RegionGeom(region=square, axes=[axis], binsz_wcs="0.01deg")

    integral = sky_model.integrate_geom(geom).data

    assert_allclose(integral / 1e-12, [[[5.299]], [[2.460]], [[1.142]]], rtol=1e-3)
Esempio n. 27
0
def test_hpx_map_to_region_nd_map():
    axis = MapAxis.from_energy_bounds("10 GeV", "2 TeV", nbin=10)
    m = HpxNDMap.create(nside=128, axes=[axis])
    m.data += 1

    circle = CircleSkyRegion(center=SkyCoord("0d", "0d"), radius=10 * u.deg)

    spec = m.to_region_nd_map(region=circle)
    assert_allclose(spec.data.sum(), 14660)

    spec_mean = m.to_region_nd_map(region=circle, func=np.mean)
    assert_allclose(spec_mean.data, 1)

    spec_interp = m.to_region_nd_map(region=circle.center, func=np.mean)
    assert_allclose(spec_interp.data, 1)
Esempio n. 28
0
def get_spectrumdataset(name):
    target_position = SkyCoord(ra=83.63, dec=22.01, unit="deg", frame="icrs")
    on_region_radius = Angle("0.11 deg")
    on_region = CircleSkyRegion(center=target_position, radius=on_region_radius)

    energy_axis = MapAxis.from_energy_bounds(
        0.1, 40, nbin=15, per_decade=True, unit="TeV", name="energy"
    )
    energy_axis_true = MapAxis.from_energy_bounds(
        0.05, 100, nbin=20, per_decade=True, unit="TeV", name="energy_true"
    )

    geom = RegionGeom.create(region=on_region, axes=[energy_axis])
    return SpectrumDataset.create(
        geom=geom, energy_axis_true=energy_axis_true, name=name
    )
Esempio n. 29
0
    def _spectrum_extraction(self):
        """Run all steps for the spectrum extraction."""
        region = self.settings["datasets"]["geom"]["region"]
        log.info("Reducing spectrum datasets.")
        on_lon = Angle(region["center"][0])
        on_lat = Angle(region["center"][1])
        on_center = SkyCoord(on_lon, on_lat, frame=region["frame"])
        on_region = CircleSkyRegion(on_center, Angle(region["radius"]))
        background_params = {"on_region": on_region}
        background = self.settings["datasets"]["background"]
        if "exclusion_mask" in background:
            map_hdu = {}
            filename = background["exclusion_mask"]["filename"]
            if "hdu" in background["exclusion_mask"]:
                map_hdu = {"hdu": background["exclusion_mask"]["hdu"]}
            exclusion_region = Map.read(filename, **map_hdu)
            background_params["exclusion_mask"] = exclusion_region
        if background["background_estimator"] == "reflected":
            self.background_estimator = ReflectedRegionsBackgroundEstimator(
                observations=self.observations, **background_params
            )
            self.background_estimator.run()
        else:
            # TODO: raise error?
            log.info("Background estimation only for reflected regions method.")

        extraction_params = {}
        if "containment_correction" in self.settings["datasets"]:
            extraction_params["containment_correction"] = self.settings["datasets"][
                "containment_correction"
            ]
        params = self.settings["datasets"]["geom"]["axes"][0]
        e_reco = MapAxis.from_bounds(**params).edges
        extraction_params["e_reco"] = e_reco
        extraction_params["e_true"] = None
        self.extraction = SpectrumExtraction(
            observations=self.observations,
            bkg_estimate=self.background_estimator.result,
            **extraction_params,
        )
        self.extraction.run()
        self.datasets = Datasets(self.extraction.spectrum_observations)
        if self.settings["datasets"]["stack-datasets"]:
            stacked = self.datasets.stack_reduce()
            stacked.name = "stacked"
            self.datasets = Datasets([stacked])
Esempio n. 30
0
def test_contributes(models):
    center_sky = SkyCoord(3, 4, unit="deg", frame="galactic")
    circle_sky_12 = CircleSkyRegion(center=center_sky, radius=1 * u.deg)
    axis = MapAxis.from_edges(np.logspace(-1, 1, 3), unit=u.TeV, name="energy")
    geom = WcsGeom.create(skydir=(3, 4), npix=(5, 4), frame="galactic", axes=[axis])

    mask = geom.region_mask([circle_sky_12])
    spatial_model = GaussianSpatialModel(
        lon_0="0 deg", lat_0="0 deg", sigma="0.9 deg", frame="galactic"
    )
    assert spatial_model.evaluation_region.height == 2 * spatial_model.evaluation_radius
    model4 = SkyModel(
        spatial_model=spatial_model,
        spectral_model=PowerLawSpectralModel(),
        name="source-4",
    )
    assert model4.contributes(mask, margin=0 * u.deg)