Source code for baseband_tasks.phases.pint_toas
# Licensed under the GPLv3 - see LICENSE
"""Utilities for converting times to PINT times of arrival.
See https://github.com/nanograv/PINT
"""
import numpy as np
__all__ = ['PintToas']
[docs]class PintToas:
"""Convert time samples to PINT TOAs using given ephemeris, etc.
The class is initialized with parameters common to all arrival times.
When the instances is called on a list of times, it uses
`pint.toa.get_TOAs_list` to create a `pint.toa.TOAs` instance
(for which in turn phases can be calculated).
Parameters
----------
observatory : str
The observatory code or names
frequency : `~astropy.units.Quantity`.
Observing frequency. If not a scalar, one has to ensure it can be
broadcast properly against time arrays for which lists of TOAs are
calculated.
ephemeris : str, optinal
Solar system dynamic model file. Default is astropy's 'jpl'
(see `~astropy.coordinates.solar_system_ephemeris`). For consistency
with PINT, this argument can also be passed in as ``ephem``.
include_bipm : bool, optional
Flag to include the TT BIPM correction. Default is True.
bipm_version : str, optional
TT BIPM version. Default is 'BIPM2015'
include_gps : bool, optional
Flag to include the gps clock correction. Default is True.
planets : bool, optional
Flag to compute the planets' positions and velocities. Default is
False.
tdb_method : str, optional
The method to compute the TDB time scale. Default is using astropy
time objects' method.
**kwargs
Any further arguments to be passed on to `pint.toa.get_TOAs_list`.
Notes
-----
A TOA (time of arrival) represents the pulse time of arrival.
Combined with metadata, it can be considered a timestamp
(e.g., observatory, observing frequency, etc.)
"""
def __init__(self, observatory, frequency, *,
ephemeris='jpl', include_bipm=True, bipm_version='BIPM2015',
include_gps=True, planets=False, tdb_method="default",
**kwargs):
self.observatory = observatory
self.frequency = frequency
self.control_params = {'ephem': ephemeris,
'bipm_version': bipm_version,
'include_bipm': include_bipm,
'bipm_version': bipm_version,
'include_gps': include_gps,
'planets': planets,
'tdb_method': tdb_method}
self.control_params.update(kwargs)
[docs] def __call__(self, time):
"""Create list of TOAs for one or more times.
Parameters
----------
time : `~astropy.time.Time`
Input time stamps.
Returns
-------
toas : `~pint.toa.TOAs`
Combining all TOAs.
"""
# local import since we cannot count on PINT being present,
# and doing it globally messes up sphinx.
from pint import toa
if time.scale == 'utc':
time = time.replicate(format='pulsar_mjd')
freq, _ = np.broadcast_arrays(self.frequency, time.jd1, subok=True)
time = time._apply(np.broadcast_to, freq.shape)
toa_list = []
for t, f in zip(time.ravel(), freq.ravel()):
# This format converting should be done by PINT in the future.
toa_entry = toa.TOA(t, obs=self.observatory, freq=f)
toa_list.append(toa_entry)
toas = toa.get_TOAs_list(toa_list, **self.control_params)
toas.shape = time.shape
return toas