Source code for maltpynt.read_events

# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""Read and save event lists from FITS files."""
from __future__ import (absolute_import, unicode_literals, division,
                        print_function)

from .base import mp_root, read_header_key, ref_mjd, _assign_value_if_none
from .io import save_events, load_events_and_gtis
from .io import MP_FILE_EXTENSION
import numpy as np
import logging
import warnings
import os


[docs]def treat_event_file(filename, noclobber=False, gti_split=False, min_length=4, gtistring=None): """Read data from an event file, with no external GTI information. Parameters ---------- filename : str Other Parameters ---------------- noclobber: bool if a file is present, do not overwrite it gtistring: str comma-separated set of GTI strings to consider gti_split: bool split the file in multiple chunks, containing one GTI each min_length: float minimum length of GTIs accepted (only if gti_split is True) """ gtistring = _assign_value_if_none(gtistring, 'GTI,STDGTI') logging.info('Opening %s' % filename) outfile = mp_root(filename) + '_ev' + MP_FILE_EXTENSION if noclobber and os.path.exists(outfile) and (not gti_split): warnings.warn( '{0} exists, and noclobber option used. Skipping'.format(outfile)) return instr = read_header_key(filename, 'INSTRUME') additional_columns = ['PI'] if instr == 'PCA': additional_columns.append('PCUID') mjdref = ref_mjd(filename) data = load_events_and_gtis(filename, additional_columns=additional_columns, gtistring=gtistring) events = data.ev_list gtis = data.gti_list additional = data.additional_data tstart = data.t_start tstop = data.t_stop pis = additional['PI'] out = {'time': events, 'GTI': gtis, 'PI': pis, 'MJDref': mjdref, 'Tstart': tstart, 'Tstop': tstop, 'Instr': instr } if instr == "PCA": out['PCU'] = np.array(additional['PCUID'], dtype=np.byte) if gti_split: for ig, g in enumerate(gtis): length = g[1] - g[0] if length < min_length: print("GTI shorter than {0} s; skipping".format(min_length)) continue outfile_local = \ '{0}_{1}'.format(outfile.replace(MP_FILE_EXTENSION, ''), ig) + \ MP_FILE_EXTENSION if noclobber and os.path.exists(outfile_local): warnings.warn('{0} exists, '.format(outfile_local) + 'and noclobber option used. Skipping') return out_local = out.copy() good = np.logical_and(events >= g[0], events < g[1]) if not np.any(good): print("This GTI has no valid events; skipping") continue out_local['time'] = events[good] out_local['Tstart'] = g[0] out_local['Tstop'] = g[1] out_local['PI'] = pis[good] out_local['GTI'] = np.array([g], dtype=np.longdouble) save_events(out_local, outfile_local) pass else: save_events(out, outfile)
def _wrap_fun(arglist): f, kwargs = arglist return treat_event_file(f, **kwargs)
[docs]def main(args=None): """Main function called by the `MPreadevents` command line script.""" import argparse from multiprocessing import Pool description = ('Read a cleaned event files and saves the relevant ' 'information in a standard format') parser = argparse.ArgumentParser(description=description) parser.add_argument("files", help="List of files", nargs='+') parser.add_argument("--loglevel", help=("use given logging level (one between INFO, " "WARNING, ERROR, CRITICAL, DEBUG; " "default:WARNING)"), default='WARNING', type=str) parser.add_argument("--nproc", help=("Number of processors to use"), default=1, type=int) parser.add_argument("--noclobber", help=("Do not overwrite existing event files"), default=False, action='store_true') parser.add_argument("-g", "--gti-split", help="Split event list by GTI", default=False, action="store_true") parser.add_argument("--min-length", type=int, help="Minimum length of GTIs to consider", default=0) parser.add_argument("--gti-string", type=str, help="GTI string", default=None) parser.add_argument("--debug", help="use DEBUG logging level", default=False, action='store_true') args = parser.parse_args(args) files = args.files if args.debug: args.loglevel = 'DEBUG' numeric_level = getattr(logging, args.loglevel.upper(), None) logging.basicConfig(filename='MPreadevents.log', level=numeric_level, filemode='w') argdict = {"noclobber": args.noclobber, "gti_split": args.gti_split, "min_length": args.min_length, "gtistring": args.gti_string} arglist = [[f, argdict] for f in files] if os.name == 'nt' or args.nproc == 1: [_wrap_fun(a) for a in arglist] else: pool = Pool(processes=args.nproc) for i in pool.imap_unordered(_wrap_fun, arglist): pass pool.close()