2
0
forked from xmm/arches
This commit is contained in:
2026-01-28 13:53:52 +03:00
parent 777c92ef2e
commit 9bedea505c
19 changed files with 316 additions and 123 deletions

View File

@@ -23,11 +23,14 @@ inargs = ['--version']
t = w('sasver', inargs)
t.run()
files = glob.glob(archive_dir+'/0862*')
files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if not (obsid in after2020):
continue
local_ccf=f'{events_dir}/{obsid}/ccf.cif'
work_dir=f'{events_dir}/{obsid}'

View File

@@ -23,18 +23,26 @@ inargs = ['--version']
t = w('sasver', inargs)
t.run()
files = glob.glob(archive_dir+'/0862*')
# Какие наклоны разрешены для какой температуры
# W1 жесткость от центра? Муно и др.
# есть ли двойные системы? Кларк и др.
files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if not (obsid in good):
continue
local_ccf=f'{events_dir}/{obsid}/ccf.cif'
work_dir=f'{events_dir}/{obsid}'
# downloads data
#inargs = [f'odfid={obsid}',f'workdir={work_dir}']
#w('startsas', inargs).run()
os.environ['SAS_ODF'] = f'{archive_dir}/{obsid}'
os.environ['SAS_ODF'] = f'{archive_dir}/{obsid}/odf' # ???
create_folder(work_dir)

View File

@@ -29,7 +29,7 @@ events_dir=root_path+'/data/processed'
products_dir=root_path+'/products/sas'
ds9reg_dir=root_path+'/data/ds9reg'
imos=1
imos=2
create_folder(products_dir)
@@ -42,14 +42,17 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)
os.chdir(work_dir)
search_str = f'{events_dir}/{obsid}/????_{obsid}_EMOS{imos}_S???_ImagingEvts.ds'
search_str = f'{events_dir}/{obsid}/????_{obsid}_EMOS{imos}_????_ImagingEvts.ds'
print(search_str)
emfiles = glob.glob(search_str)
if not (emfiles):
@@ -312,33 +315,34 @@ for obsid in files:
# Create Clean Events image
xmax=np.amax(gti_evt_data['X'])
xmin=np.amin(gti_evt_data['X'])
xmid=(xmax-xmin)/2.+xmin
ymax=np.amax(gti_evt_data['Y'])
ymin=np.amin(gti_evt_data['Y'])
xbin_size=80
ybin_size=80
NBINS = (int((xmax-xmin)/xbin_size),int((ymax-ymin)/ybin_size))
if(len(gti_evt_data['X'])>10):
xmax=np.amax(gti_evt_data['X'])
xmin=np.amin(gti_evt_data['X'])
xmid=(xmax-xmin)/2.+xmin
ymax=np.amax(gti_evt_data['Y'])
ymin=np.amin(gti_evt_data['Y'])
xbin_size=80
ybin_size=80
NBINS = (int((xmax-xmin)/xbin_size),int((ymax-ymin)/ybin_size))
plt.subplot(1, 2, pl)
plt.subplot(1, 2, pl)
img_zero_mpl = plt.hist2d(gti_evt_data['X'], gti_evt_data['Y'], NBINS, cmap='GnBu', norm=LogNorm())
img_zero_mpl = plt.hist2d(gti_evt_data['X'], gti_evt_data['Y'], NBINS, cmap='GnBu', norm=LogNorm())
cbar = plt.colorbar(ticks=[10.,100.,1000.])
cbar.ax.set_yticklabels(['10','100','1000'])
cbar = plt.colorbar(ticks=[10.,100.,1000.])
cbar.ax.set_yticklabels(['10','100','1000'])
plt.title(out_clean_evtFile)
plt.xlabel('x')
plt.ylabel('y')
plt.title(out_clean_evtFile)
plt.xlabel('x')
plt.ylabel('y')
plt.text(xmid, ymin-0.1*(ymax-ymin), expression, ha='center')
plt.text(xmid, ymin-0.1*(ymax-ymin), expression, ha='center')
pl=pl+1
pl=pl+1
gti_hdu_list.close()
hdu_list.close()
plt.show()
gti_hdu_list.close()
hdu_list.close()
plt.show()
###############################################################################
# Define some parameters to produce the image and the name of the output file #

View File

@@ -35,23 +35,25 @@ inargs = ['--version']
t = w('sasver', inargs)
t.run()
files = glob.glob(archive_dir+'/0862*')
files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)
os.chdir(work_dir)
search_str = f'{events_dir}/{obsid}/????_{obsid}_EPN_S???_ImagingEvts.ds'
search_str = f'{events_dir}/{obsid}/????_{obsid}_EPN_????_ImagingEvts.ds'
print(search_str)
epfiles = glob.glob(search_str)
if not (epfiles):
print("*** run 01_init_events.py ***")
#w('epproc', []).run()
#w('epproc', []).run()
continue
eventfile = epfiles[0]
print("Checking for EPIC-pn Event Files ..... \n")

View File

@@ -41,7 +41,7 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)

View File

@@ -39,7 +39,7 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)

View File

@@ -47,7 +47,7 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)

View File

@@ -40,16 +40,16 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)
os.chdir(work_dir)
eventfile=f'{products_dir}/{obsid}/EPIC_pn_gtiFilteredEvts.ds'
eventfile=f'{products_dir}/{obsid}/EPIC_PN_gtiFilteredEvts.ds'
if(os.path.isfile(eventfile)==False):
print("*** run 02_filter_flares_pn.py ***")
print("*** run 02_sas_flares_pn.py ***")
sys.exit()
# EPIC_pn_gtiFilteredEvts.ds
@@ -64,7 +64,7 @@ for obsid in files:
# Visualize the image with ds9
src_fn=f'{ds9reg_dir}/{obsid}/src.reg'
bkg_fn=f'{ds9reg_dir}/{obsid}/bkg.reg'
bkg_fn=f'{ds9reg_dir}/{obsid}/ann.reg'
x_source,y_source,r_source,x_bkg,y_bkg,r_bkg,r2_bkg = get_ds9_regions(out_IMFile, src_fn, bkg_fn)
#########################################

View File

@@ -41,7 +41,7 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)
@@ -55,7 +55,7 @@ for obsid in files:
bkg=[]
resp=[]
arf=[]
for imos in [1,2]:
for imos in [2]:
in_SPSRCFile = work_dir+f'/EPIC_MOS{imos}_source_spectrum.fits' # Name of the output source spectrum
in_SPBKGFile = work_dir+f'/EPIC_MOS{imos}_background_spectrum.fits' # Name of the output background spectrum
in_RESPFile = work_dir+f'/EPIC_MOS{imos}.rmf' # Name of the output redistribution

View File

@@ -41,7 +41,7 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)
@@ -55,7 +55,8 @@ for obsid in files:
attfile = get_first_file(events_dir+f'/{obsid}/*{obsid}_AttHk.ds')
#for imos in [1,2]:
for key in ['MOS1','MOS2','PN']:
#for key in ['MOS1','MOS2','PN']:
for key in ['MOS2']:
evtfile = get_first_file(events_dir+f'/{obsid}/*{obsid}_E{key}*_ImagingEvts.ds')
# first element contains all energies

View File

@@ -43,7 +43,7 @@ files = glob.glob(archive_dir+'/*')
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = init_work_dir(obsid, products_dir=products_dir)
@@ -55,8 +55,11 @@ for obsid in files:
attfile = get_first_file(events_dir+f'/{obsid}/*{obsid}_AttHk.ds')
for key in ['MOS1','MOS2','PN']:
#for key in ['MOS1','MOS2','PN']:
for key in ['MOS2']:
evtfile = get_first_file(events_dir+f'/{obsid}/*{obsid}_E{key}*_ImagingEvts.ds')
if not (os.path.isfile(evtfile)==True):
continue
fwcfile = get_first_file(fwc_dir+f'/{key}_closed_FF_2025_v1.fits')
pimin=" ".join(emin)
pimax=" ".join(emax)

View File

@@ -29,8 +29,9 @@ archive_dir=root_path+'/data/archive'
events_dir=root_path+'/data/processed'
products_dir=root_path+'/products/sas'
create_folder(products_dir)
mosaic_dir=root_path+'/products/mosaic'
create_folder(mosaic_dir)
mdir=root_path+'/products/mosaic_2021-2024'
create_folder(mdir)
ds9reg_dir=root_path+'/data/ds9reg'
@@ -44,6 +45,9 @@ files = glob.glob(archive_dir+'/*')
# run over energies
for idx,e in enumerate(emin):
#if not (idx==1):
# continue
label=f"_{idx}"
e1=emin[idx]
e2=emax[idx]
@@ -75,24 +79,28 @@ for idx,e in enumerate(emin):
for obsid in files:
obsid = os.path.basename(obsid)
if(obsid in skip):
if not (obsid in good):
continue
work_dir = f'{products_dir}/{obsid}'
for ikey,key in enumerate(['MOS1','MOS2','PN']):
shortkey = key.replace("OS","")
expkey=f'S00{ikey+1}'
#expkey=f'00{ikey+1}'
#expkey=f'00{ikey+1}'
# sci and qpb image are produced by 06_sas_QPB.py
sci_image=work_dir+f'/EPIC_{key}_sci_image{label}.fits'
test_file(sci_image)
if not (test_file(sci_image, alive=True)):
continue
qpb_image=work_dir+f'/EPIC_{key}_qpb_image{label}.fits'
test_file(qpb_image)
if not (test_file(qpb_image, alive=True)):
continue
# exposure image is produced by eimageget (07_sas_eimageget.py)
# example: P0862470801PNS003_ima_4exp.fits
exp_image=work_dir+f'/P{obsid}{shortkey}{expkey}_ima{label}exp.fits'
test_file(exp_image)
exp_image = get_first_file(work_dir+f'/P{obsid}{shortkey}?00?_ima{label}exp.fits', alive=True)
if not (exp_image):
continue
ima.append(sci_image)
qpb.append(qpb_image)
exp.append(exp_image)
@@ -114,36 +122,26 @@ for idx,e in enumerate(emin):
mos_qpb.append(qpb_image)
mos_exp.append(exp_image)
print("MOS1 ",len(m1_ima))
print(m1_ima)
print("MOS2 ",len(m2_ima))
print(m2_ima)
print("MOS1+2 ",len(mos_ima))
print(mos_ima)
print("PN ",len(pn_ima))
print(pn_ima)
print("All ",len(ima))
print(ima)
run_mosaic(out_cts=mdir+f'/m1_cts{label}.fits', out_exp=mdir+f'/m1_exp{label}.fits', out_qpb=mdir+f'/m1_qpb{label}.fits', out_sub=mdir+f'/m1_sub{label}.fits', out_flx=mdir+f'/m1_flx{label}.fits', out_pix=mdir+f'/m1_pix{label}.fits', cts=m1_ima,qpb=m1_qpb,exp=m1_exp)
run_mosaic(out_cts=mdir+f'/m2_cts{label}.fits', out_exp=mdir+f'/m2_exp{label}.fits', out_qpb=mdir+f'/m2_qpb{label}.fits', out_sub=mdir+f'/m2_sub{label}.fits', out_flx=mdir+f'/m2_flx{label}.fits', cts=m2_ima,qpb=m2_qpb,exp=m2_exp)
run_mosaic(out_cts=mdir+f'/mos_cts{label}.fits', out_exp=mdir+f'/mos_exp{label}.fits', out_qpb=mdir+f'/mos_qpb{label}.fits', out_sub=mdir+f'/mos_sub{label}.fits', out_flx=mdir+f'/mos_flx{label}.fits', cts=mos_ima,qpb=mos_qpb,exp=mos_exp)
run_mosaic(out_cts=mdir+f'/pn_cts{label}.fits', out_exp=mdir+f'/pn_exp{label}.fits', out_qpb=mdir+f'/pn_qpb{label}.fits', out_sub=mdir+f'/pn_sub{label}.fits', out_flx=mdir+f'/pn_flx{label}.fits', cts=pn_ima,qpb=pn_qpb,exp=pn_exp)
run_mosaic(out_cts=mdir+f'/cts{label}.fits', out_exp=mdir+f'/exp{label}.fits', out_qpb=mdir+f'/qpb{label}.fits', out_sub=mdir+f'/sub{label}.fits', out_flx=mdir+f'/flx{label}.fits', cts=ima,qpb=qpb,exp=exp)
run_mosaic(outfile_cts=mosaic_dir+f'/m1_cts{label}.fits',
outfile_exp=mosaic_dir+f'/m1_exp{label}.fits',
outfile_qpb=mosaic_dir+f'/m1_qpb{label}.fits',
outfile_sub=mosaic_dir+f'/m1_sub{label}.fits',
outfile_flx=mosaic_dir+f'/m1_flx{label}.fits',
outfile_pix=mosaic_dir+f'/m1_pix{label}.fits',
cts=m1_ima,qpb=m1_qpb,exp=m1_exp)
run_mosaic(outfile_cts=mosaic_dir+f'/m2_cts{label}.fits',
outfile_exp=mosaic_dir+f'/m2_exp{label}.fits',
outfile_qpb=mosaic_dir+f'/m2_qpb{label}.fits',
outfile_sub=mosaic_dir+f'/m2_sub{label}.fits',
outfile_flx=mosaic_dir+f'/m2_flx{label}.fits',
cts=m2_ima,qpb=m2_qpb,exp=m2_exp)
run_mosaic(outfile_cts=mosaic_dir+f'/mos_cts{label}.fits',
outfile_exp=mosaic_dir+f'/mos_exp{label}.fits',
outfile_qpb=mosaic_dir+f'/mos_qpb{label}.fits',
outfile_sub=mosaic_dir+f'/mos_sub{label}.fits',
outfile_flx=mosaic_dir+f'/mos_flx{label}.fits',
cts=mos_ima,qpb=mos_qpb,exp=mos_exp)
run_mosaic(outfile_cts=mosaic_dir+f'/pn_cts{label}.fits',
outfile_exp=mosaic_dir+f'/pn_exp{label}.fits',
outfile_qpb=mosaic_dir+f'/pn_qpb{label}.fits',
outfile_sub=mosaic_dir+f'/pn_sub{label}.fits',
outfile_flx=mosaic_dir+f'/pn_flx{label}.fits',
cts=pn_ima,qpb=pn_qpb,exp=pn_exp)
run_mosaic(outfile_cts=mosaic_dir+f'/cts{label}.fits',
outfile_exp=mosaic_dir+f'/exp{label}.fits',
outfile_qpb=mosaic_dir+f'/qpb{label}.fits',
outfile_sub=mosaic_dir+f'/sub{label}.fits',
outfile_flx=mosaic_dir+f'/flx{label}.fits',
cts=ima,qpb=qpb,exp=exp)

101
scripts/09_sas_convol.py Executable file
View File

@@ -0,0 +1,101 @@
#!/usr/bin/env python
from pysas.wrapper import Wrapper as w
import os, sys
from os.path import dirname
import inspect
import glob
import os.path
from os import path
import subprocess
import numpy as np
import matplotlib.pyplot as plt
from astropy.io import fits
from astropy.table import Table
from matplotlib.colors import LogNorm
from astropy.convolution import interpolate_replace_nans, convolve, convolve_fft
from astropy.convolution import Gaussian2DKernel
import re
import pyds9
import arches
from arches.utils import *
from arches.config import *
root_path=dirname(dirname(dirname(inspect.getfile(arches))))
print("Arches root path: {}".format(root_path))
archive_dir=root_path+'/data/archive'
events_dir=root_path+'/data/processed'
products_dir=root_path+'/products/sas'
create_folder(products_dir)
mdir=root_path+'/products/mosaic'
create_folder(mdir)
ds9reg_dir=root_path+'/data/ds9reg'
inargs = ['--version']
t = w('sasver', inargs)
t.run()
# run over energies
for idx,e in enumerate(emin):
label=f"_{idx}"
e1=emin[idx]
e2=emax[idx]
for ikey,key in enumerate(['','m1_','m2_','mos_','pn_']):
in_cts=f'{mdir}/{key}cts{label}.fits'
if not (test_file(in_cts,alive=True)):
continue
hdul0 = fits.open(in_cts)
c_data = hdul0[0].data
c_header = hdul0[0].header
c_wcs = WCS(c_header)
hdul0.close()
in_exp=f'{mdir}/{key}exp{label}.fits'
if not (test_file(in_exp,alive=True)):
continue
hdul0 = fits.open(in_exp)
e_data = hdul0[0].data
e_header = hdul0[0].header
e_wcs = WCS(e_header)
hdul0.close()
in_qpb=f'{mdir}/{key}qpb{label}.fits'
if not (test_file(in_qpb,alive=True)):
continue
hdul0 = fits.open(in_qpb)
q_data = hdul0[0].data
q_header = hdul0[0].header
q_wcs = WCS(q_header)
hdul0.close()
gauss2d = Gaussian2DKernel(x_stddev=0.530785)
convol_cts = convolve(c_data, gauss2d)
out_cts = f'{mdir}/{key}cts{label}_gauss.fits'
hdul0[0].data=convol_cts
hdul0.writeto(out_cts,overwrite=True)
convol_qpb = convolve(q_data, gauss2d)
out_qpb = f'{mdir}/{key}qpb{label}_gauss.fits'
hdul0[0].data=convol_qpb
hdul0.writeto(out_qpb,overwrite=True)
(nx,ny) = c_data.shape
map_flx = np.zeros(c_data.shape,dtype=np.float64)
index = e_data > 0
map_flx[index]=(convol_cts[index]-convol_qpb[index])/e_data[index]
out_flx = f'{mdir}/{key}flx{label}_gauss.fits'
hdul0[0].data=map_flx
hdul0.writeto(out_flx,overwrite=True)