def trim_image(f, overscan_poly_order = 8):
"""
trim_image returns a trimmed version of the raw image. The ARCTIC detector is structured in four quadrants which can be read out individually (Quad Mode) or as a whole (Lower Left Mode) and trim_image identifies which readout mode was used and crops the image accordingly.
Parameters
----------
f : raw fits image from ARCTIC
overscan_poly_order : order of polynomial used to fit overscan
Returns
-------
alldat : a list with [the image in a numpy array, the astropy header]
"""
datfile = pyfits.getdata(f, header=True)
dat_raw = datfile[0]
dat_head = datfile[1]
amp = pyfits.open(f)[0].header['READAMPS']
if amp == "Quad":
# ll, ul, lr, ur
quads = ['DSEC11', 'DSEC21', 'DSEC12', 'DSEC22']
dat = [[],[],[],[]]
for i,quad in enumerate(quads):
idx_string = pyfits.open(f)[0].header[quad]
idx = re.split('[: ,]',idx_string.rstrip(']').lstrip('['))
dat[i] = dat_raw[int(idx[2])-1:int(idx[3]),int(idx[0])-1:int(idx[1])]
sci_lo = np.concatenate((dat[2], dat[3]), axis = 1)
sci_up = np.concatenate((dat[0], dat[1]), axis = 1)
sci = np.concatenate((sci_up, sci_lo), axis = 0)
if amp == 'LL':
idx_string = pyfits.open(f)[0].header['DSEC11']
idx = re.split('[: ,]',idx_string.rstrip(']').lstrip('['))
sci = dat_raw[int(idx[2])-1:int(idx[3]),int(idx[0])-1:int(idx[1])].astype(np.float64)
idx_over_string = pyfits.open(f)[0].header['BSEC11']
idx_over = re.split('[: ,]',idx_over_string.rstrip(']').lstrip('['))
over = dat_raw[int(idx_over[2])-1:int(idx_over[3]),int(idx_over[0])-1:int(idx_over[1])]
#Average along columns
avg_overscan = np.mean(over,axis=1)
#Index array, then fit!
row_idx = np.arange(len(avg_overscan))
p = np.polyfit(row_idx,avg_overscan,deg=overscan_poly_order)
#Calculate array from fit, then transpose into a column
fit_overscan = np.poly1d(p)(row_idx)
fit_overscan_col = fit_overscan[:,np.newaxis]
#Subtract column!
sci -= fit_overscan_col
alldat = [sci,dat_head]
return alldat
评论列表
文章目录