#!/usr/bin/env python
#
"""
This file is part of ESA's XMM-Newton Scientific Analysis System (SAS).
SAS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SAS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SAS. If not, see .
Name = 'mergeEPICflareBkgTS'
VERSION = '1.1';
author = 'Jose Vicente Perea';
date = '2021-02-19';
ChangeLog
=========
Version 1.1 - 2021-02-19 (JVP)
------------
+ Version output string fixed
Version 1.0 - 2020-12-02 (JVP)
------------
+ Initial version
Task to merge EPIC flare background time series
from different exposures for the same instrument
"""
__version__ = "1.1"
__author__ = "Jose V. Perea"
__copyright__ = "ESA (C) 2000-2020"
__license__ = "GPL"
version_num = __version__
###############################
# Input files
#
import sys, os, argparse
parser = argparse.ArgumentParser(description='Merge EPIC flare background timeseries',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--version', '-v', action='version', version=f'%(prog)s (%(prog)s-{version_num}) [-]')
parser.add_argument('--ratesFiles', help='Input EPIC flare bkg timeseries files', default='Exp1FBKTSR.fits,Exp2FBKTSR.fits')
parser.add_argument('--mergedRates', help='Output EPIC flare bkg timeseries files', default='X000FBKTSR.fits')
args = parser.parse_args()
files = []
for i in sorted(args.ratesFiles.split(',')):
files.append(i)
for f in files:
if not os.path.isfile(f):
print(f'Some of the input files does not exist: {f}. Exiting')
sys.exit(1)
outrates = args.mergedRates
###############################
from astropy.table import Table, vstack
from astropy.io import fits
instrument = []
all = {}
times = {}
for file in files:
with fits.open( file ) as hdul:
h0 = hdul[0].header
r = hdul['RATE'].data
h = hdul['RATE'].header
inst = h['INSTRUME']
exp = h['EXPIDSTR']
flare_cut = h['FLCUTTHR']
instrument.append(inst)
if instrument[0] != instrument[-1]:
print('You are trying to merge timeseries from different instruments. Exiting.')
sys.exit(1)
bs = h['BACKSCAL']
texp = h['EXPOSURE']
tdel = h['TIMEDEL']
print(f'TIMEDEL : {tdel}')
tsr = Table(r)
ntsr = tsr
ntsr['RATE'] = r.RATE/bs
ntsr['ERROR'] = r.ERROR/bs
all[exp] = {'bs': bs, 'texp': texp, 'table': ntsr, 't0': ntsr['TIME'][0], 'flare_cut': flare_cut}
times[exp] = ntsr['TIME'][0]
bs = sum([ s['bs']*s['texp'] for s in all.values() ]) / sum([ s['texp'] for s in all.values() ])
Texp = sum([ s['texp'] for s in all.values() ])
for exp,vals in all.items():
bsi = vals['bs']
texpi = vals['texp']
print(f'{inst}\t{exp}\tbckscal: {bsi:.2f}\ttexp: {texpi:.2f}\t\tGlobal bckscal: {bs:.2f}')
sortedExps = sorted( times, key=times.get )
allTables = [ all[exp]['table'] for exp in sortedExps ]
##
#for exp in sortedExps:
# T0 = all[exp]['table']['TIME'][0]
# Tn = all[exp]['table']['TIME'][-1]
# T = Tn - T0
# print(f'{exp} --> T0, Tn: {T0}, {Tn}\tTotal : {T}')
##
allTable = vstack( allTables ) # Optional option : ,metadata_conflicts='silent'
allTable['RATE'] = allTable['RATE']*bs
allTable['ERROR'] = allTable['ERROR']*bs
## print(allTable)
#
TSTART = allTable['TIME'][0] # First and last time values
TSTOP = allTable['TIME'][-1]
#
# Convert 'Table object' to 'BinTableHDU object'
allTableHDU = fits.table_to_hdu( allTable )
h['TSTART'] = TSTART
h['TSTOP'] = TSTOP
h['BACKSCAL'] = bs
h['EXPOSURE'] = Texp
h.pop('EXP_ID')
h.pop('EXPIDSTR')
h.pop('FLCUTTHR')
allTableHDU.header = h
# Create FITS:
hdul = []
hdu0 = fits.PrimaryHDU(header = h0)
hdul.append(hdu0)
hdul.append(allTableHDU)
## outrates = 'merged-fbktsr.fits'
hdul = fits.HDUList( hdul )
hdul.writeto(outrates, overwrite = True )
sys.exit(0)