Source code for cosmogrb.instruments.gbm.gbm_lightcurve

import numba as nb
import numpy as np

from cosmogrb.lightcurve.lightcurve import LightCurve
from cosmogrb.utils.tte_file import TTEFile

import coloredlogs, logging
import cosmogrb.utils.logging

logger = logging.getLogger("cosmogrb.lightcurve.gbm_lighcurve")


[docs]class GBMLightCurve(LightCurve): def __init__(self, source, background, response, name, grb_name, tstart, tstop): """FIXME! briefly describe function :param source: :param background: :param response: :param name: :param grb_name: :param verbose: :returns: :rtype: """ super(GBMLightCurve, self).__init__( source=source, background=background, response=response, name=name, grb_name=grb_name, tstart=tstart, tstop=tstop, instrument="GBM", ) # let us keep track of the seperation angle self._extra_info["angle"] = self._response.separation_angle def _filter_deadtime(self): n_intervals = len(self._times) time, pha, selection = _gbm_dead_time(self._times, self._pha, n_intervals) selection = np.array(selection, dtype=bool) logger.debug( f"{self._grb_name} {self._name}: now has {sum(selection)} from {len(selection)} counts" ) self._times = time[selection] self._pha = pha[selection]
[docs] def write_tte(self): tstart = self._background.tstart + self._response.T0 tstop = self._background.tstop + self._response.T0 tte_file = TTEFile( det_name=self._response.detector_name, tstart=tstart, tstop=tstop, trigger_time=self._response.trigger_time, ra=self._response.ra, dec=self._response.dec, channel=np.arange(0, 128, dtype=np.int16), emin=self._response.channel_edges[:-1], emax=self._response.channel_edges[1:], pha=self._pha.astype(np.int16), time=self._times + self._response.T0, ) tte_file.writeto(f"{self._grb_name}_{self._name}.fits", overwrite=True)
@nb.njit(fastmath=True) def _gbm_dead_time(time, pha, n_intervals): dead_time = 2.6e-6 overflow_dead_Time = 10.6e-6 par_dead_time = 0.5e-6 filtered_time = np.zeros(n_intervals) filtered_pha = np.zeros(n_intervals) selection = np.zeros(n_intervals) filtered_time[0] = time[0] filtered_pha[0] = pha[0] selection[0] = True if pha[0] == 127: t_end = time[0] + overflow_dead_Time else: t_end = time[0] + dead_time t_end_par = time[0] + par_dead_time for i in range(1, n_intervals): if time[i] > t_end: filtered_time[i] = time[i] filtered_pha[i] = pha[i] selection[i] = True if pha[i] == 127: t_end = time[i] + overflow_dead_Time return filtered_time, filtered_pha, selection