Skip to content

Commit 5d19a72

Browse files
Add support for reading Fermi/gbm fits file in Eventlist.read
1 parent a91c031 commit 5d19a72

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

stingray/events.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from .base import StingrayTimeseries
1515
from .filters import get_deadtime_mask
1616
from .gti import generate_indices_of_boundaries
17-
from .io import pi_to_energy, get_file_extension
17+
from .io import pi_to_energy, get_file_extension, read_header_key, read_gbm_data
1818
from .io import FITSTimeseriesReader
1919
from .lightcurve import Lightcurve
2020
from .utils import simon, njit
@@ -627,6 +627,14 @@ def read(cls, filename, fmt=None, rmf_file=None, **kwargs):
627627
if fits_ext in get_file_extension(filename).lower():
628628
fmt = "hea"
629629
break
630+
631+
source = read_header_key(filename, "INSTRUME")
632+
if source == "GBM":
633+
emin = kwargs.pop("emin")
634+
emax = kwargs.pop("emax")
635+
evt = read_gbm_data(filename, emin=emin, emax=emax)
636+
return evt
637+
630638
if fmt is not None and fmt.lower() in ("hea", "ogip"):
631639
additional_columns = kwargs.pop("additional_columns", None)
632640

stingray/io.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from astropy.io import fits as pf
1515
from astropy import units as u
1616

17+
from stingray.events import EventList
1718
import stingray.utils as utils
1819
from stingray.loggingconfig import setup_logger
1920

@@ -1550,3 +1551,51 @@ def _can_serialize_meta(probe_file: str, fmt: str) -> bool:
15501551
)
15511552
yes_it_can = False
15521553
return yes_it_can
1554+
1555+
1556+
def read_gbm_data(filename, emin=None, emax=None):
1557+
"""
1558+
Read Fermi/GBM detector data.
1559+
1560+
Parameters
1561+
----------
1562+
filename: str
1563+
Path to the fits file, Only TTE files are supported.
1564+
1565+
emin, emax : float
1566+
The minimum and maximum energies to use
1567+
1568+
Returns
1569+
-------
1570+
ev: :class:`EventList` object
1571+
The :class:`EventList` object reconstructed from file
1572+
"""
1573+
hdulist = fits.open(filename)
1574+
header = hdulist[0].header
1575+
1576+
elower = hdulist[1].data.field("E_MIN")
1577+
ehigher = hdulist[1].data.field("E_MAX")
1578+
emid = elower + (ehigher - elower) / 2.0
1579+
1580+
time = hdulist[2].data.field("TIME")
1581+
channels = hdulist[2].data.field("PHA")
1582+
1583+
if emin is None:
1584+
emin = np.min(elower)
1585+
if emax is None:
1586+
emax = np.max(ehigher)
1587+
for c in channels:
1588+
emid[c]
1589+
1590+
energy = np.array([emid[c] for c in channels])
1591+
mask = (energy > emin) & (energy < emax)
1592+
1593+
time = time[mask]
1594+
energy = energy[mask]
1595+
trigtime = hdulist[0].header["TRIGTIME"]
1596+
1597+
hdulist.close()
1598+
1599+
evt = EventList(time, energy, header)
1600+
evt.trigtime = trigtime
1601+
return evt

0 commit comments

Comments
 (0)