def select_sky_circle(self, center, radius, inverted=False): """Make an observation table, applying a cone selection. Apply a selection based on the separation between the cone center and the observation pointing stored in the table. If the inverted flag is activated, the selection is applied to keep all elements outside the selected range. Parameters ---------- center : `~astropy.coordinate.SkyCoord` Cone center coordinate. radius : `~astropy.coordinate.Angle` Cone opening angle. The maximal separation allowed between the center and the observation pointing direction. inverted : bool, optional Invert selection: keep all entries outside the cone. Returns ------- obs_table : `~gammapy.data.ObservationTable` Observation table after selection. """ region = SphericalCircleSkyRegion(center=center, radius=radius) mask = region.contains(self.pointing_radec) if inverted: mask = np.invert(mask) return self[mask]
class TestSphericalCircleSkyRegion: def setup(self): self.region = SphericalCircleSkyRegion(center=SkyCoord( 10 * u.deg, 20 * u.deg), radius=10 * u.deg) def test_contains(self): coord = SkyCoord([20.1, 22] * u.deg, 20 * u.deg) mask = self.region.contains(coord) assert_equal(mask, [True, False])
def select_observations(self, selection=None): """Select subset of observations. Returns a new observation table representing the subset. There are 3 main kinds of selection criteria, according to the value of the **type** keyword in the **selection** dictionary: - sky regions - time intervals (min, max) - intervals (min, max) on any other parameter present in the observation table, that can be casted into an `~astropy.units.Quantity` object Allowed selection criteria are interpreted using the following keywords in the **selection** dictionary under the **type** key. - ``sky_circle`` is a circular region centered in the coordinate marked by the **lon** and **lat** keywords, and radius **radius**; uses `~gammapy.catalog.select_sky_circle` - ``time_box`` is a 1D selection criterion acting on the observation start time (**TSTART**); the interval is set via the **time_range** keyword; uses `~gammapy.data.ObservationTable.select_time_range` - ``par_box`` is a 1D selection criterion acting on any parameter defined in the observation table that can be casted into an `~astropy.units.Quantity` object; the parameter name and interval can be specified using the keywords **variable** and **value_range** respectively; min = max selects exact values of the parameter; uses `~gammapy.data.ObservationTable.select_range` In all cases, the selection can be inverted by activating the **inverted** flag, in which case, the selection is applied to keep all elements outside the selected range. A few examples of selection criteria are given below. Parameters ---------- selection : dict Dictionary with a few keywords for applying selection cuts. Returns ------- obs_table : `~gammapy.data.ObservationTable` Observation table after selection. Examples -------- >>> selection = dict(type='sky_circle', frame='galactic', ... lon=Angle(0, 'deg'), ... lat=Angle(0, 'deg'), ... radius=Angle(5, 'deg'), ... border=Angle(2, 'deg')) >>> selected_obs_table = obs_table.select_observations(selection) >>> selection = dict(type='time_box', ... time_range=Time(['2012-01-01T01:00:00', '2012-01-01T02:00:00'])) >>> selected_obs_table = obs_table.select_observations(selection) >>> selection = dict(type='par_box', variable='ALT', ... value_range=Angle([60., 70.], 'deg')) >>> selected_obs_table = obs_table.select_observations(selection) >>> selection = dict(type='par_box', variable='OBS_ID', ... value_range=[2, 5]) >>> selected_obs_table = obs_table.select_observations(selection) >>> selection = dict(type='par_box', variable='N_TELS', ... value_range=[4, 4]) >>> selected_obs_table = obs_table.select_observations(selection) """ if "inverted" not in selection: selection["inverted"] = False if selection["type"] == "sky_circle": lon = Angle(selection["lon"], "deg") lat = Angle(selection["lat"], "deg") radius = Angle(selection["radius"]) border = Angle(selection["border"]) region = SphericalCircleSkyRegion( center=SkyCoord(lon, lat, frame=selection["frame"]), radius=radius + border, ) mask = region.contains(self.pointing_radec) if selection["inverted"]: mask = np.invert(mask) return self[mask] elif selection["type"] == "time_box": return self.select_time_range("TSTART", selection["time_range"], selection["inverted"]) elif selection["type"] == "par_box": return self.select_range(selection["variable"], selection["value_range"], selection["inverted"]) else: raise ValueError(f"Invalid selection type: {selection['type']}")