def process(self, obs): """Estimate background for one observation.""" all_events = obs.events.select_circular_region(self.on_region) self.on_phase = self._check_intervals(self.on_phase) self.off_phase = self._check_intervals(self.off_phase) # Loop over all ON- and OFF- phase intervals to filter the ON- and OFF- events list_on_events = [ self.filter_events(all_events, each_on_phase) for each_on_phase in self.on_phase ] list_off_events = [ self.filter_events(all_events, each_off_phase) for each_off_phase in self.off_phase ] # Loop over all ON- and OFF- phase intervals to compute the normalization factors a_on and a_off a_on = np.sum([_[1] - _[0] for _ in self.on_phase]) a_off = np.sum([_[1] - _[0] for _ in self.off_phase]) on_events = EventList.stack(list_on_events) off_events = EventList.stack(list_off_events) return BackgroundEstimate( on_region=self.on_region, on_events=on_events, off_region=None, off_events=off_events, a_on=a_on, a_off=a_off, method="Phase Bkg Estimator", )
def run(self, dataset, observation=None): """Run the event sampler, applying IRF corrections. Parameters ---------- dataset : `~gammapy.cube.MapDataset` Map dataset observation : `~gammapy.data.Observation` In memory observation. edisp : Bool It allows to include or exclude the Edisp in the simulation. Returns ------- events : `~gammapy.data.EventList` Event list. """ if len(dataset.models) > 1: events_src = self.sample_sources(dataset) if len(events_src.table) > 0: if dataset.psf: events_src = self.sample_psf(dataset.psf, events_src) else: events_src.table["RA"] = events_src.table["RA_TRUE"] events_src.table["DEC"] = events_src.table["DEC_TRUE"] if dataset.edisp: events_src = self.sample_edisp(dataset.edisp, events_src) else: events_src.table["ENERGY"] = events_src.table[ "ENERGY_TRUE"] if dataset.background_model: events_bkg = self.sample_background(dataset) events = EventList.stack([events_bkg, events_src]) else: events = events_src if len(dataset.models) == 1 and dataset.background_model is not None: events_bkg = self.sample_background(dataset) events = EventList.stack([events_bkg]) events = self.event_det_coords(observation, events) events.table["EVENT_ID"] = np.arange(len(events.table)) events.table.meta = self.event_list_meta(dataset, observation) geom = dataset._geom selection = geom.contains(events.map_coord(geom)) return events.select_row_subset(selection)
def sample_sources(self, dataset): """Sample source model components. Parameters ---------- dataset : `~gammapy.cube.MapDataset` Map dataset. Returns ------- events : `~gammapy.data.EventList` Event list """ events_all = [] for idx, evaluator in enumerate(dataset._evaluators): evaluator = copy.deepcopy(evaluator) evaluator.edisp = None evaluator.psf = None npred = evaluator.compute_npred() temporal_model = ConstantTemporalModel() table = self._sample_coord_time(npred, temporal_model, dataset.gti) table["MC_ID"] = idx + 1 events_all.append(EventList(table)) return EventList.stack(events_all)
def sample_sources(self, dataset): """Sample source model components. Parameters ---------- dataset : `~gammapy.cube.MapDataset` Map dataset. Returns ------- events : `~gammapy.data.EventList` Event list """ events_all = [] for idx, model in enumerate(dataset.models): if isinstance(model, BackgroundModel): continue evaluator = dataset.evaluators.get(model.name) evaluator = copy.deepcopy(evaluator) evaluator.model.apply_irf["psf"] = False evaluator.model.apply_irf["edisp"] = False npred = evaluator.compute_npred() temporal_model = ConstantTemporalModel() table = self._sample_coord_time(npred, temporal_model, dataset.gti) table["MC_ID"] = idx + 1 events_all.append(EventList(table)) return EventList.stack(events_all)
def _make_counts(dataset, observation, phases): event_lists = [] for interval in phases: events = observation.events.select_parameter(parameter="PHASE", band=interval) event_lists.append(events) events = EventList.stack(event_lists) counts = RegionNDMap.from_geom(dataset.counts.geom) counts.fill_events(events) return counts
def _make_counts(dataset, observation, phases): events = observation.events.select_region(dataset.counts.region) event_lists = [] for interval in phases: events = events.select_parameter(parameter="PHASE", band=interval) event_lists.append(events) events_off = EventList.stack(event_lists) edges = dataset.counts.energy.edges counts = CountsSpectrum(energy_hi=edges[1:], energy_lo=edges[:-1]) counts.fill_events(events_off) return counts
def sample_sources(self, dataset): """Sample source model components. Parameters ---------- dataset : `~gammapy.cube.MapDataset` Map dataset. Returns ------- events : `~gammapy.data.EventList` Event list """ events_all = [] for idx, model in enumerate(dataset.models): if isinstance(model, BackgroundModel): continue evaluator = dataset.evaluators.get(model.name) evaluator = copy.deepcopy(evaluator) evaluator.model.apply_irf["psf"] = False evaluator.model.apply_irf["edisp"] = False npred = evaluator.compute_npred() if hasattr(model, "temporal_model"): if getattr(model, "temporal_model") is None: temporal_model = ConstantTemporalModel() else: temporal_model = model.temporal_model else: temporal_model = ConstantTemporalModel() table = self._sample_coord_time(npred, temporal_model, dataset.gti) if len(table) > 0: table["MC_ID"] = idx + 1 else: mcid = table.Column(name="MC_ID", length=0, dtype=int) table.add_column(mcid) events_all.append(EventList(table)) return EventList.stack(events_all)
def run(self, dataset, observation=None): """Run the event sampler, applying IRF corrections. Parameters ---------- dataset : `~gammapy.cube.MapDataset` Map dataset observation : `~gammapy.data.Observation` In memory observation. edisp : Bool It allows to include or exclude the Edisp in the simulation. Returns ------- events : `~gammapy.data.EventList` Event list. """ events_src = self.sample_sources(dataset) if dataset.psf: events_src = self.sample_psf(dataset.psf, events_src) else: events_src.table["RA"] = events_src.table["RA_TRUE"] events_src.table["DEC"] = events_src.table["DEC_TRUE"] if dataset.edisp: events_src = self.sample_edisp(dataset.edisp, events_src) else: events_src.table["ENERGY"] = events_src.table["ENERGY_TRUE"] if dataset.background_model: events_bkg = self.sample_background(dataset) events = EventList.stack([events_bkg, events_src]) else: events = events_src events.table["EVENT_ID"] = np.arange(len(events.table)) events.table.meta = self.event_list_meta(dataset, observation) return events
def test_stack(self): event_lists = [self.events] * 3 stacked_list = EventList.stack(event_lists) assert len(stacked_list.table) == 49 * 3