ridge/scripts/_00_scan_detcnts.py
2024-11-01 12:29:19 +03:00

220 lines
7.0 KiB
Python

#!/usr/bin/env python
__author__ = "Roman Krivonos"
__copyright__ = "Space Research Institute (IKI)"
""" Работает только в архиве """
import re
import sys
from glob import glob
from astropy.io import fits
from astropy.io.fits import getheader
from astropy.coordinates import SkyCoord # High-level coordinates
from astropy.coordinates import ICRS, Galactic, FK4, FK5 # Low-level frames
from astropy.coordinates import Angle, Latitude, Longitude # Angles
import astropy.units as u
def file_grep(pattern=None, filename=None, filt=None):
fl = open(filename, "r")
for line in fl:
if re.search(pattern, line):
if(filt):
if(filt in line):
return(line.replace("\n", ""))
else:
return(line.replace("\n", ""))
return(None)
bands={
'E01':'25.00 60.00',
'E02':'17.00 22.10',
'E03':'22.10 28.73',
'E04':'28.73 37.35',
'E05':'37.35 48.55',
'E06':'48.55 63.12',
'E07':'63.12 82.06',
'E08':'82.06 106.67',
'E09':'106.67 138.67',
'E10':'138.67 180.28',
'E11':'180.28 234.36',
'E12':'234.36 304.67',
}
crab_crd = SkyCoord(83.6287, 22.0147, frame=FK5(), unit="deg")
key = sys.argv[1]
do_mjd = False
revs = sorted(glob("????", recursive = False))
erange = bands[key]
fout="detcnts.{}.fits".format(key)
obs_id=[]
ra=[]
dec=[]
rota=[]
lon=[]
lat=[]
t_start=[]
t_stop=[]
exposure=[]
ph1=[]
ph2=[]
ph=[]
raw=[]
src=[]
clean=[]
npix=[]
rms=[]
orbit=[]
tstart=[]
tstop=[]
mjd=[]
crab_sep=[]
for rev in revs:
logs = sorted(glob(rev+"/????????????.log", recursive = False))
for log in logs:
res = file_grep(pattern="rev_phase1",filename=log)
phase1 = float(res.split()[1]) if(res) else 0.0
res = file_grep(pattern="rev_phase2",filename=log)
phase2 = float(res.split()[1]) if(res) else 0.0
res = file_grep(pattern="Final FSD RMS",filename=log)
rms0 = float(res.split()[-1]) if(res) else None
res = file_grep(pattern="OBTMISDC",filename=log)
obtmisdc = float(res.split()[-1]) if(res) else None
res = file_grep(pattern="DETCNTS2",filename=log,filt=erange)
d = res.split() if(res) else None
if not (d):
continue
# ['DETCNTS2', '011000130010', '00001', '266.570', '-26.994', '89.359', '2639.38', '28148860.0', '28152310.0', '3.55128E-03', '8.53612E-04', '2.69767E-03', '1.27125E+04', '28.73', '37.35']
obsid=d[1]
ra0=float(d[3])
dec0=float(d[4])
rota0=float(d[5])
texp=float(d[6])
t1=float(d[7])
t2=float(d[8])
raw0=float(d[9])
src0=float(d[10])
clean0=float(d[11])
npix0=float(d[12])
e1=float(d[13])
e2=float(d[14])
if not (raw0 > 0.0):
continue
obs_id.append(obsid)
orbit.append(int(obsid[:4]))
ra.append(ra0)
dec.append(dec0)
rota.append(rota0)
sc = SkyCoord(ra0, dec0, frame=FK5(), unit="deg")
lon.append(sc.galactic.l.value if(sc.galactic.l.value<180) else sc.galactic.l.value-360)
lat.append(sc.galactic.b.value)
crab_sep.append(crab_crd.separation(sc).deg)
t_start.append(t1)
t_stop.append(t2)
exposure.append(texp)
raw.append(raw0)
src.append(src0)
clean.append(clean0)
npix.append(npix0)
ph1.append(phase1)
ph2.append(phase2)
ph.append((phase1+phase2)/2.0)
rms.append(rms0)
if(do_mjd):
# ~/results1/osa11/scw/0101/010100040010.001/isgri_cor_events.fits.gz
corfile="/afs/mpa/project/integral/data1/scw/{}/{}.001/swg.fits".format(obsid[:4],obsid)
d = getheader(corfile, 1)
mjdref=float(d['MJDREF'])
# tjd2/86400+obtmisdc+mjdref-40000
tj1=float(d['TSTART'])
tj2=float(d['TSTOP'])
tstart.append(tj1)
tstop.append(tj2)
mjd.append((tj1+tj2)/2.0+mjdref)
#print(obtmisdc,mjdref)
#print("{} {} {} {}".format(log,phase1,phase2,obsid))
else:
mjd.append(0.0)
indices = sorted(
range(len(t_start)),
key=lambda index: t_start[index]
)
coldefs = fits.ColDefs([
fits.Column(name='REV', format='J', array=[orbit[index] for index in indices]),
fits.Column(name='OBSID', format='12A', array=[obs_id[index] for index in indices]),
fits.Column(name='RA', format='D', unit='deg', array=[ra[index] for index in indices]),
fits.Column(name='DEC', format='D', unit='deg', array=[dec[index] for index in indices]),
fits.Column(name='ROTA', format='D', unit='deg', array=[rota[index] for index in indices]),
fits.Column(name='LON', format='D', unit='deg', array=[lon[index] for index in indices]),
fits.Column(name='LAT', format='D', unit='deg', array=[lat[index] for index in indices]),
#fits.Column(name='SC_TSTART', format='D', unit='s', array=[t_start[index] for index in indices]),
#fits.Column(name='SC_TSTOP', format='D', unit='s', array=[t_stop[index] for index in indices]),
#fits.Column(name='TSTART', format='D', unit='day', array=[tstart[index] for index in indices]),
#fits.Column(name='TSTOP', format='D', unit='day', array=[tstop[index] for index in indices]),
fits.Column(name='MJD', format='D', unit='day', array=[mjd[index] for index in indices]),
fits.Column(name='EXPOSURE', format='D', unit='s', array=[exposure[index] for index in indices]),
#fits.Column(name='PHASE1', format='D', unit='', array=[ph1[index] for index in indices]),
#fits.Column(name='PHASE2', format='D', unit='', array=[ph2[index] for index in indices]),
fits.Column(name='PHASE', format='D', unit='', array=[ph[index] for index in indices]),
#fits.Column(name='NROWS', format='J', unit='', array=[nrows[index] for index in indices]),
#fits.Column(name='LIVETIME', format='D', unit='s', array=[livetime[index] for index in indices]),
fits.Column(name='RAW', format='D', unit='cts/s', array=[raw[index] for index in indices]),
fits.Column(name='SRC', format='D', unit='', array=[src[index] for index in indices]),
fits.Column(name='CLEAN', format='D', unit='', array=[clean[index] for index in indices]),
fits.Column(name='RMS', format='D', unit='', array=[rms[index] for index in indices]),
fits.Column(name='CRAB_SEP', format='D', unit='deg', array=[crab_sep[index] for index in indices]),
])
hdu = fits.BinTableHDU.from_columns(coldefs, name='RATE')
hdu.header['MISSION'] = ('INTEGRAL', '')
hdu.header['ERANGE'] = (key, '')
hdu.header['E1'] = (erange.split()[0], '')
hdu.header['E2'] = (erange.split()[1], '')
hdu.header['TELESCOP'] = (key, '')
hdu.header['INSTITUT'] = ('IKI', 'Affiliation')
hdu.header['AUTHOR'] = ('Roman Krivonos', 'Responsible person')
hdu.header['EMAIL'] = ('krivonos@cosmos.ru', 'E-mail')
#hdu.add_checksum()
print(hdu.columns)
hdu.writeto(fout, overwrite=True)
with fits.open(fout, mode='update') as hdus:
hdus[1].add_checksum()