Source code for pyspi.utils.function_utils

import numpy as np
from astropy.time.core import Time, TimeDelta
from datetime import datetime
import h5py
import os

from pyspi.io.package_data import get_path_of_internal_data_dir


[docs]def get_time_object(time): """ Transform the input into a time object. Input can either be a time object or a string with the format "YYMMDD HHMMSS" :param time: time object or a string with the format "YYMMDD HHMMSS" :returns: time object """ if not isinstance(time, Time): time = datetime.strptime(time, '%y%m%d %H%M%S') time = Time(time) return time
[docs]def leapseconds(time_object): """ Hard coded leap seconds from start of INTEGRAL to time of time_object :param time_object: Time object to which the number of leapseconds should be detemined :returns: TimeDelta object of the needed leap seconds """ time_object = get_time_object(time_object) if time_object < Time(datetime.strptime('060101 000000', '%y%m%d %H%M%S')): lsec = 0 elif time_object < Time(datetime.strptime('090101 000000', '%y%m%d %H%M%S')): lsec = 1 elif time_object < Time(datetime.strptime('120701 000000', '%y%m%d %H%M%S')): lsec = 2 elif time_object < Time(datetime.strptime('150701 000000', '%y%m%d %H%M%S')): lsec = 3 elif time_object < Time(datetime.strptime('170101 000000', '%y%m%d %H%M%S')): lsec = 4 else: lsec = 5 return TimeDelta(lsec, format='sec')
[docs]def find_response_version(time): """ Find the correct response version number for a given time :param time: time of interest :returns: response version number """ time = get_time_object(time) if time < Time(datetime.strptime('031206 060000', '%y%m%d %H%M%S')): version = 0 elif time < Time(datetime.strptime('040717 082006', '%y%m%d %H%M%S')): version = 1 elif time < Time(datetime.strptime('090219 095957', '%y%m%d %H%M%S')): version = 2 elif time < Time(datetime.strptime('100527 124500', '%y%m%d %H%M%S')): version = 3 else: version = 4 return version
[docs]def find_needed_ids(time): """ Get the pointing id of the needed data to cover the GRB time :returns: Needed pointing id """ time = get_time_object(time) # Path to file, which contains id information and start and stop # time id_file_path = os.path.join(get_path_of_internal_data_dir(), 'id_data_time.hdf5') # Get GRB time in ISDC_MJD time_of_GRB_ISDC_MJD = (time).tt.mjd-51544 # Get which id contain the needed time. When the wanted time is # too close to the boundarie also add the pervious or following # observation id id_file = h5py.File(id_file_path, 'r') start_id = id_file['Start'][()] stop_id = id_file['Stop'][()] ids = id_file['ID'][()] mask_larger = start_id < time_of_GRB_ISDC_MJD mask_smaller = stop_id > time_of_GRB_ISDC_MJD try: id_number = list(mask_smaller*mask_larger).index(True) except: raise Exception('No pointing id contains this time...') return ids[id_number].decode("utf-8")
[docs]def ISDC_MJD(time_object): """ Get INTEGRAL MJD time from a given time object :param time_object: Astropy time object of grb time :returns: Time in Integral MJD time """ time_object = get_time_object(time_object) return time_object.tt.mjd-51544
[docs]def ISDC_MJD_to_cxcsec(ISDC_MJD_time): """ Convert ISDC_MJD to UTC :param ISDC_MJD_time: time in ISDC_MJD time format :returns: time in cxcsec format (seconds since 1998-01-01 00:00:00) """ return Time(ISDC_MJD_time+51544, format='mjd', scale='utc').cxcsec