Commit ac59766f authored by littlebubbles's avatar littlebubbles
Browse files

update flux calibration

parent 1d33af51
...@@ -14,8 +14,9 @@ from astropy.wcs.utils import proj_plane_pixel_scales ...@@ -14,8 +14,9 @@ from astropy.wcs.utils import proj_plane_pixel_scales
from .. import PACKAGE_PATH from .. import PACKAGE_PATH
from ..core.processor import CsstProcessor from ..core.processor import CsstProcessor
from naming import CsstMscNamingRules as nr
# Edited on Jun. 17, 2016 # Edited on Jun. 17, 2022
# add color term # add color term
__author__ = 'ZZM' __author__ = 'ZZM'
...@@ -171,14 +172,15 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -171,14 +172,15 @@ class CsstProcFluxCalibration(CsstProcessor):
return mags, magerr, gimedian, refc return mags, magerr, gimedian, refc
def read_inputcat(self, image, outcat='refcat.fits', refdir='', silent=True): def read_inputcat(self, dm, ccdid, outcat='refcat.fits', silent=True):
# imname=os.path.split(image)[-1] # # imname=os.path.split(image)[-1]
if refdir == '': # if refdir == '':
refdir = os.path.split(image)[0] # refdir = os.path.split(image)[0]
# catname='MSC_'+imname[7:]+'.cat' # # catname='MSC_'+imname[7:]+'.cat'
catid = image[image.rfind('_') - 10:image.rfind('_')] # catid = image[image.rfind('_') - 10:image.rfind('_')]
catname = 'MSC_210525120000_' + catid + '.cat' # catname = 'MSC_210525120000_' + catid + '.cat'
cat = os.path.join(refdir, catname) # cat = os.path.join(refdir, catname)
cat = dm.l0_cat(ccd_id)
data = table.Table.read(cat, format='ascii') data = table.Table.read(cat, format='ascii')
data.write(outcat, format='fits', overwrite=True) data.write(outcat, format='fits', overwrite=True)
...@@ -237,7 +239,7 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -237,7 +239,7 @@ class CsstProcFluxCalibration(CsstProcessor):
pathsplit = os.path.split(filename) pathsplit = os.path.split(filename)
if workdir == '': if workdir == '':
workdir = pathsplit[0] workdir = pathsplit[0]
headname = os.path.join(workdir, pathsplit[1] + '.whead.fits') headname = os.path.join(workdir, pathsplit[1] + '_whead.fits')
wheader = head[i].header wheader = head[i].header
prihdu = fits.PrimaryHDU(header=wheader) prihdu = fits.PrimaryHDU(header=wheader)
prihdu.writeto(headname, overwrite=True) prihdu.writeto(headname, overwrite=True)
...@@ -269,22 +271,32 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -269,22 +271,32 @@ class CsstProcFluxCalibration(CsstProcessor):
return cat return cat
def prepare(self, image, wcsdir, workdir, usewcsresult=False, newcat=False): def prepare(self, dm, ccdid, usewcsresult=False, newcat=False):
# make calibration files: Obs. cat (SExtractor), PSF model (PSFex) # make calibration files: Obs. cat (SExtractor), PSF model (PSFex)
# sex_zp=str(25.5+2.5*np.log10(exptime)) # sex_zp=str(25.5+2.5*np.log10(exptime))
if not os.path.exists(workdir):
os.mkdir(workdir) # imag_file_ename = os.path.split(image)[-1]
imag_file_ename = os.path.split(image)[-1] # imname = imag_file_ename[0:imag_file_ename.find('.fits')]
imname = imag_file_ename[0:imag_file_ename.find('.fits')] # imname0 = imag_file_ename[0:imag_file_ename.find('_img') - 3]
imname0 = imag_file_ename[0:imag_file_ename.find('_img') - 3] # wcscat0 = os.path.join(wcsdir, imname0 + '.acat.fits')
wcscat0 = os.path.join(wcsdir, imname0 + '.acat.fits') # wcscat1 = os.path.join(wcsdir, imname + '.acat')
wcscat1 = os.path.join(wcsdir, imname + '.acat') # wcshead0 = os.path.join(wcsdir, imname0 + '.acat.head.fits')
wcshead0 = os.path.join(wcsdir, imname0 + '.acat.head.fits') # wcshead0txt = wcshead0[:wcshead0.rfind('.fits')]
wcshead0txt = wcshead0[:wcshead0.rfind('.fits')] # wcshead1 = os.path.join(wcsdir, imname + '.acat.head.fits')
wcshead1 = os.path.join(wcsdir, imname + '.acat.head.fits') # cat = os.path.join(workdir, imname + '.acat')
cat = os.path.join(workdir, imname + '.acat') # ref = os.path.join(workdir, imname + '.rcat')
ref = os.path.join(workdir, imname + '.rcat') # wcshead2 = os.path.join(workdir, imname + '.whead.fits')
wcshead2 = os.path.join(workdir, imname + '.whead.fits') #
workdir = dm.l1_dir
wcscat0 = dm.pc_combined_cat
wcscat1 = dm.l1_sci(ccd_id, suffix="img", ext="acat")
cat = dm.l1_sci(ccd_id, suffix="img", ext="acat")
ref = dm.l1_sci(ccd_id, suffix="img", ext="rcat")
wcshead2 = dm.l1_sci(ccd_id, suffix="img_whead", ext="fits")
wcshead0 = dm.pc_combined_head_fits
wcshead0txt = dm.pc_combined_head
wcshead1 = dm.l1_sci(ccd_id, suffix="img.acat.head", ext="fits")
# cali_ref='GAIA' #calibration reference data # cali_ref='GAIA' #calibration reference data
...@@ -489,21 +501,22 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -489,21 +501,22 @@ class CsstProcFluxCalibration(CsstProcessor):
# print('crefm.min,max=',refm.min(),refm.max()) # print('crefm.min,max=',refm.min(),refm.max())
return coeff0, cstd, csize, cobsm, crefm, ccdraoff, ccddecoff, fwhm return coeff0, cstd, csize, cobsm, crefm, ccdraoff, ccddecoff, fwhm
def calib(self, image, imgdata, whtdata, flgdata, wcsdir='./', L1dir='./', workdir='./', refdir='', addhead=False, def calib(self, dm, ccdid, image, imgdata, whtdata, flgdata, addhead=False,
morehead=True, plot=False, nodel=True, update=False, upcat=True): morehead=True, plot=False, update=False, upcat=True):
# wcsdir='./', L1dir='./', workdir='./', refdir='',
print('calibration for:', image) print('calibration for:', image)
L1dir = dm.dir_l1()
workdir = dm.dir_l1()
refdir = dm.dir_l0()
if not os.path.exists(L1dir): if not os.path.exists(L1dir):
os.mkdir(L1dir) os.mkdir(L1dir)
if not os.path.exists(workdir): if not os.path.exists(workdir):
os.mkdir(workdir) os.mkdir(workdir)
imag_file_ename = os.path.split(image)[-1] #imag_file_ename = os.path.split(image)[-1]
imname = imag_file_ename[0:imag_file_ename.rfind('.')] #imname = imag_file_ename[0:imag_file_ename.rfind('.')]
image_head_file = os.path.join(workdir, imname + '.head') #image_head_file = os.path.join(workdir, imname + '.head')
# if os.path.exists(image_head_file) and (not update):
# print((image+' has been calibrated.'))
# return
psname = os.path.join(workdir, imname + '_calib.png') psname = os.path.join(workdir, imname + '_calib.png')
if plot and os.path.isfile(psname) and (not update): if plot and os.path.isfile(psname) and (not update):
...@@ -518,7 +531,7 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -518,7 +531,7 @@ class CsstProcFluxCalibration(CsstProcessor):
cali_ref = 'GAIA' # calibration reference data cali_ref = 'GAIA' # calibration reference data
# Get the photometric catalog, astrometry head # Get the photometric catalog, astrometry head
cat, newcat, ref, header = self.prepare(image, wcsdir, workdir, newcat=False) cat, newcat, ref, header = self.prepare(dm, ccdid, newcat=False)
# get obs. Information from header # get obs. Information from header
# k=list(header.keys()) # k=list(header.keys())
...@@ -527,8 +540,8 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -527,8 +540,8 @@ class CsstProcFluxCalibration(CsstProcessor):
# !#airmass=header['AIRMASS'] # !#airmass=header['AIRMASS']
# exptime=header['EXPTIME'] # exptime=header['EXPTIME']
exptime = 150.0 exptime = 150.0
naxis1 = 9216 # header['NAXIS1'] naxis1 = header['NAXIS1']
naxis2 = 9232 # header['NAXIS2'] naxis2 = header['NAXIS2']
# gain=header['GAIN1'] # gain=header['GAIN1']
pixsize = np.mean(proj_plane_pixel_scales(w)) * 3600.0 # pixsize=0.33 pixsize = np.mean(proj_plane_pixel_scales(w)) * 3600.0 # pixsize=0.33
imr0, imd0 = w.all_pix2world(naxis1 / 2., naxis2 / 2., 0) imr0, imd0 = w.all_pix2world(naxis1 / 2., naxis2 / 2., 0)
...@@ -582,8 +595,7 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -582,8 +595,7 @@ class CsstProcFluxCalibration(CsstProcessor):
# get reference catalog # get reference catalog
# ps=self.read_gaiacat(r,d,outcat=ref,silent=True) # ps=self.read_gaiacat(r,d,outcat=ref,silent=True)
ps = self.read_inputcat(image, outcat=ref, refdir=refdir) ps = self.read_inputcat(dm, ccdid, outcat=ref)
# remove tmp file: cat & ref
if np.size(ps) < 1: if np.size(ps) < 1:
wcscheck = open(ckf, "a") wcscheck = open(ckf, "a")
...@@ -716,10 +728,10 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -716,10 +728,10 @@ class CsstProcFluxCalibration(CsstProcessor):
header.set('FLUX_V', '1.3', vernum_com) header.set('FLUX_V', '1.3', vernum_com)
header.set('FLUX_TOL', opetime, 'flux calibration operation time') header.set('FLUX_TOL', opetime, 'flux calibration operation time')
if morehead: if morehead or (not addhead):
# catroot=cat[:cat.rfind('phot.fits')] image_L1_head = dm.l1_sci(ccd_id=ccdid, suffix="img_L1_head", ext=".fits")
prihdu = fits.PrimaryHDU(header=header) prihdu = fits.PrimaryHDU(header=header)
prihdu.writeto(image_head_file, overwrite=True) prihdu.writeto(image_L1_head, overwrite=True)
# chead = fits.open(image_head_file,mode='update') # chead = fits.open(image_head_file,mode='update')
# imh=chead[0].header # imh=chead[0].header
# imh.extend(header,unique=True,update=True) # imh.extend(header,unique=True,update=True)
...@@ -732,20 +744,22 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -732,20 +744,22 @@ class CsstProcFluxCalibration(CsstProcessor):
if addhead: if addhead:
# print(('add head for ',image)) # print(('add head for ',image))
imwht = image.replace('_img', '_wht') #imwht = image.replace('_img', '_wht')
imflg = image.replace('_img', '_flg') #imflg = image.replace('_img', '_flg')
for img, im in zip([image, imwht, imflg], [imgdata, whtdata, flgdata]): image_L1 = dm.l1_sci(ccd_id=ccdid, suffix="img_L1", ext=".fits")
newimage = os.path.join(L1dir, os.path.split(img)[-1]) imwht_L1 = dm.l1_sci(ccd_id=ccdid, suffix="wht_L1", ext=".fits")
newimage = newimage.replace('.fits', '_L1.fits') imflg_L1 = dm.l1_sci(ccd_id=ccdid, suffix="flg_L1", ext=".fits")
# im = fits.open(img,mode='readonly')
for img, im in zip([image_L1, imwht_L1, imflg_L1], [imgdata, whtdata, flgdata]):
#newimage = os.path.join(L1dir, os.path.split(img)[-1])
#newimage = newimage.replace('.fits', '_L1.fits')
newimage = img
h0 = fits.PrimaryHDU(data=im[0].data, header=im[0].header) h0 = fits.PrimaryHDU(data=im[0].data, header=im[0].header)
h1 = fits.ImageHDU(data=im[1].data, header=header) h1 = fits.ImageHDU(data=im[1].data, header=header)
hdulist = fits.HDUList([h0, h1]) hdulist = fits.HDUList([h0, h1])
hdulist.writeto(newimage, overwrite=True) hdulist.writeto(newimage, overwrite=True)
# im.writeto(newimage, overwrite=True)
# print the calibrated image name to QC1 list file
print(newimage, file=qc1) print(newimage, file=qc1)
# close the QC1 list file
qc1.close() qc1.close()
# plot # plot
...@@ -781,42 +795,46 @@ class CsstProcFluxCalibration(CsstProcessor): ...@@ -781,42 +795,46 @@ class CsstProcFluxCalibration(CsstProcessor):
return coeff, std, match return coeff, std, match
def run(self, fn_list, img_list=[], wht_list=[], flg_list=[], wcsdir='./', L1dir='./', workdir='./', refdir='', def run(self, dm, img_list=[], wht_list=[], flg_list=[], wcsdir='./', L1dir='./', workdir='./', refdir='',
addhead=True, morehead=False, plot=False, nodel=True, update=False, upcat=True): addhead=True, plot=False, update=False, upcat=True):
if len(fn_list) == 0: ccdids = dm.available_ccd_ids
if len(ccdids) == 0:
print('Flux calibration: No input images in img_list!') print('Flux calibration: No input images in img_list!')
return return
# time1=time.time() # time1=time.time()
print('\n\n############### run flux calibration ###############') print('\n\n############### run flux calibration ###############')
for i in range(len(fn_list)): for i,ccdid in enumerate(ccdids):
image = workdir + fn_list[i] image = dm.l1_sci(ccd_id=ccdid, suffix="img", ext=".fits")
if len(img_list) == len(fn_list): imwht = dm.l1_sci(ccd_id=ccdid, suffix="wht", ext=".fits")
imflg = dm.l1_sci(ccd_id=ccdid, suffix="flg", ext=".fits")
if len(img_list) == len(ccdids):
imgdata = img_list[i] imgdata = img_list[i]
whtdata = wht_list[i] whtdata = wht_list[i]
flgdata = flg_list[i] flgdata = flg_list[i]
else: else:
print("Image data is not defined, will be read from files") print("Image data is not defined, will be read from files")
imgdata = fits.open(image, mode='readonly') imgdata = fits.open(image, mode='readonly')
whtdata = fits.open(image.replace('_img', '_wht'), mode='readonly') whtdata = fits.open(imwht, mode='readonly')
flgdata = fits.open(image.replace('_img', '_flg'), mode='readonly') flgdata = fits.open(imflg, mode='readonly')
# print(('flux calibration: '+image)) # print(('flux calibration: '+image))
if not os.path.isfile(image): if not os.path.isfile(image):
print(('cannot find the file:' + image)) print(('cannot find the file:' + image))
else: else:
self.calib(image, imgdata, whtdata, flgdata, wcsdir=wcsdir, L1dir=L1dir, workdir=workdir, refdir=refdir, self.calib(dm,ccdid,image, imgdata, whtdata, flgdata, addhead=addhead, morehead=morehead, plot=plot, update=update)
addhead=addhead, morehead=morehead, plot=plot, nodel=nodel, update=update) # wcsdir=wcsdir, L1dir=L1dir, workdir=workdir, refdir=refdir,
# time2=time.time() # time2=time.time()
print('\n############### flux calibration done #############\n') print('\n############### flux calibration done #############\n')
def cleanup(self, fn_list, workdir, nodel=False): def cleanup(self, dm, workdir, nodel=False):
ccdids = dm.available_ccd_ids
# clean up environment # clean up environment
for image in fn_list: for ccdid in ccdids:
cat = os.path.join(workdir, image[:-5] + '.acat') cat = dm.l1_sci(ccd_id=ccdid, suffix="img", ext=".acat")
ref = os.path.join(workdir, image[:-5] + '.rcat') ref = dm.l1_sci(ccd_id=ccdid, suffix="img", ext=".rcat")
whead = os.path.join(workdir, image[:-5] + '.whead.fits') whead = dm.l1_sci(ccd_id=ccdid, suffix="img_whead", ext=".fits")
# psname =os.path.join(workdir,image+'_calib.png')
if not nodel: if not nodel:
try: try:
os.remove(cat) os.remove(cat)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment