Source code for hendrics.save_as_xspec
# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""Functions to save data in a Xspec-readable format."""
import subprocess as sp
import numpy as np
from astropy import log
from .io import get_file_type
from .base import get_file_extension
[docs]
def save_as_xspec(fname, direct_save=False, save_lags=True):
"""Save frequency spectra in a format readable to FTOOLS and Xspec.
Parameters
----------
fname : str
Input HENDRICS frequency spectrum file name
direct_save : bool
If True, also call `flx2xsp` to produce the output .pha and .rsp files.
If False (default), flx2xsp has to be called from the user
Notes
-----
Uses method described here:
https://asd.gsfc.nasa.gov/XSPECwiki/fitting_timing_power_spectra_in_XSPEC
"""
ftype, contents = get_file_type(fname)
outroot = fname.replace(get_file_extension(fname), "")
outname = outroot + "_xsp.dat"
outroot_lags = outroot + "_lags"
outname_lags = outroot_lags + "_xsp.dat"
if ftype.endswith("pds"):
flo = contents.freq - contents.df / 2
fhi = contents.freq + contents.df / 2
power = contents.power.real * contents.df
power_err = contents.power_err.real * contents.df
else:
raise ValueError("Data type not supported for Xspec")
np.savetxt(outname, np.transpose([flo, fhi, power, power_err]))
if direct_save:
sp.check_call("flx2xsp {0} {1}.pha {1}.rsp".format(outname, outroot).split())
if save_lags and ftype == "cpds":
lags, lags_err = contents.time_lag()
np.savetxt(
outname_lags,
np.transpose([flo, fhi, lags * contents.df, lags_err * contents.df]),
)
if direct_save:
sp.check_call(
"flx2xsp {0} {1}.pha {1}.rsp".format(outname_lags, outroot_lags).split()
)
[docs]
def main(args=None):
"""Main function called by the `HEN2xspec` command line script."""
import argparse
from .base import _add_default_args, check_negative_numbers_in_args
description = (
"Save a frequency spectrum in a qdp file that can be "
"read by flx2xsp and produce a XSpec-compatible spectrum"
"file"
)
parser = argparse.ArgumentParser(description=description)
parser.add_argument("files", help="List of files", nargs="+")
parser.add_argument(
"--flx2xsp",
help="Also call flx2xsp at the end",
default=False,
action="store_true",
)
_add_default_args(parser, ["loglevel", "debug"])
args = check_negative_numbers_in_args(args)
args = parser.parse_args(args)
files = args.files
if args.debug:
args.loglevel = "DEBUG"
log.setLevel(args.loglevel)
with log.log_to_file("HEN2Xspec.log"):
for f in files:
save_as_xspec(f, direct_save=args.flx2xsp)