def get_wavelength_offsets(fibers, binsize, wvstep=0.2, colsize=300):
bins = np.hstack([np.arange(0,fibers[0].D,binsize),fibers[0].D])
mn = np.min([fiber.wavelength.min() for fiber in fibers])
mx = np.min([fiber.wavelength.max() for fiber in fibers])
yf = []
wv = np.arange(mn,mx,wvstep)
pd = []
nbins = len(bins)-1
for fiber in fibers:
y = fiber.spectrum
w = fiber.wavelength
x = np.arange(fiber.D)
s = -999*np.ones((nbins,fiber.D))
for i in np.arange(nbins):
x0 = int(np.max([0,(bins[i]+bins[i+1])/2 - colsize/2]))
x1 = int(np.min([1032,(bins[i]+bins[i+1])/2 + colsize/2]))
s[i,x0:x1], flag = polynomial_normalization(x, y, x0, x1)
s = np.ma.array(s,mask=s==-999.)
ym = s.mean(axis=0)
ym = biweight_filter(ym, 5, ignore_central=1)
pr, ph = find_maxima(w, -1.*(y/ym-1)+1, interp_window=3)
pd.append(pr[~np.isnan(pr)])
yf.append(np.interp(wv,w,-1.*(y/ym-1)+1,left=0.0,right=0.0))
master = biweight_location(yf,axis=(0,))
pr,ph = find_maxima(wv, master, y_window=10, interp_window=2.5,
repeat_length=3, first_order_iter=5,
max_to_min_dist=15)
sel = (ph>1.03) * (~np.isnan(pr))
pr = pr[sel]
ph = ph[sel]
wk = []
for p,fiber in zip(pd,fibers):
c = p[:,None] - pr
a = np.where(np.abs(c)<4.)
x = pr[a[1]]
y = p[a[0]] - pr[a[1]]
sel = np.argsort(x)
x = x[sel]
y = y[sel]
m = medfilt(y,15)
good = ~is_outlier(y-m)
p0 = np.polyfit(x[good],y[good],3)
wk.append(np.polyval(p0,fiber.wavelength))
return wk
评论列表
文章目录