def spline_coeff_eval(raw_img,hcenters,hc_ref,vcenters,vc_ref,invar,r_breakpoints,spline_poly_coeffs,s_scale,sigmas,powers,cpad=5,bp_space=2,full_image=True,view_plot=False,sp_coeffs=None,ecc_pa_coeffs=None): """ Another highly specialized function. Evaluates coeffs found in sf.interpolate_coeffs. Right now, displays images of the fit compared to data. Returns spline_fit """ voff = 1 for k in range(len(vcenters)): if full_image: hmean = hcenters[k] vmean = vcenters[k] small_img = raw_img small_inv = invar else: harr = np.arange(-cpad,cpad+1)+hcenters[k] varr = np.arange(-cpad,cpad+1)+vcenters[k] small_img = raw_img[varr[0]:varr[-1]+1,harr[0]:harr[-1]+1] small_inv = invar[varr[0]:varr[-1]+1,harr[0]:harr[-1]+1] hmean, hheight, hbg = sf.fit_mn_hght_bg(harr,small_img[cpad,:],small_inv[cpad,:],sigmas[k],hcenters[k],sigmas[k],powj=powers[k]) vmean, vheight, vbg = sf.fit_mn_hght_bg(varr+voff,small_img[:,cpad],small_inv[:,cpad],sigmas[k],vcenters[k],sigmas[k],powj=powers[k]) hdec, hint = math.modf(hmean) vdec, vint = math.modf(vmean) # small_img = recenter_img(small_img,[vmean,hmean],[varr[0]+cpad,harr[0]+cpad]) # print "Mean is [", vmean, hmean, "]" # plt.imshow(small_img,extent=(-cpad+hcenters[k],cpad+hcenters[k]+1,-cpad+vcenters[k],cpad+vcenters[k]+1),interpolation='none') # plt.show() # plt.close() # r_breakpoints = [0, 1, 2, 3, 4, 5, 9] # r_breakpoints = [0, 1.2, 2.5, 3.5, 5, 9] # theta_orders=[0,-2,2] theta_orders = [0] # spline_fit = spline.spline_2D_radial(small_img,small_inv,) # v_bpts = varr[np.mod(np.arange(len(varr)),bp_space)==0]-vcenters[k] # h_bpts = harr[np.mod(np.arange(len(harr)),bp_space)==0]-hcenters[k] spline_coeffs = np.zeros((len(spline_poly_coeffs[0]))) for l in range(len(spline_poly_coeffs[0])): spline_coeffs[l] = sf.eval_polynomial_coeffs(hcenters[k],spline_poly_coeffs[:,l]) ecc_pa = np.ones((2)) if ecc_pa_coeffs is not None: for m in range(2): ecc_pa[m] = sf.eval_polynomial_coeffs(hcenters[k],ecc_pa_coeffs[m]) # if k==0: # print spline_coeffs params = lmfit.Parameters() params.add('vc', value = vmean-vc_ref) params.add('hc', value = hmean-hc_ref) params.add('q',ecc_pa[0]) params.add('PA',ecc_pa[1]) spline_fit = spline.spline_2D_radial(small_img,small_inv,r_breakpoints,params,theta_orders=theta_orders,spline_coeffs=spline_coeffs,sscale=s_scale[k]) if view_plot: plt.close() res = (small_img-spline_fit)*np.sqrt(small_inv) print("Chi^2 reduced = {}".format(np.sum(res**2)/(np.size(res)-2-len(spline_poly_coeffs[0])))) vis = np.vstack((small_img,spline_fit,res)) plt.imshow(vis,interpolation='none') # plt.imshow(spline_fit,interpolation='none') plt.show() plt.close() plt.plot(spline_fit[:,5]) plt.show() plt.close() ## plt.figure() ## plt.hist(np.ravel((small_img-spline_fit)*np.sqrt(small_inv))) ## plt.imshow((small_img-spline_fit)*small_inv,interpolation='none') # chi2 = np.sum((small_img-spline_fit)**2*small_inv)/(np.size(small_img)-len(spline_coeffs)) # print("Chi^2 = {}".format(chi2)) # plt.show() # plt.close() return spline_fit
def spline_coeff_fit(raw_img,hcenters,vcenters,invar,r_breakpoints,sigmas,powers,theta_orders=[0],cpad=5,bp_space=2,return_new_centers=False): """ Highly specialized function. Might want to re-write later for generality. Takes an arc image and the horizontal/vertical centers of known "good" peaks with known std (sigmas) and gauss power (powers) Fits a spline to each peak and returns and array with the spline coefficients (which can later be used for 2D extraction) """ new_hcenters = np.zeros(len(hcenters)) new_vcenters = np.zeros(len(vcenters)) fit_params = np.zeros((2,len(vcenters))) scale_fit = zeros((len(vcenters))) voff = 1 for k in range(len(vcenters)): harr = np.arange(-cpad,cpad+1)+hcenters[k] varr = np.arange(-cpad,cpad+1)+int(np.floor(vcenters[k])) harr = harr[harr>=0] harr = harr[harr<raw_img.shape[1]] varr = varr[varr>=0] varr = varr[varr<raw_img.shape[0]] small_img = raw_img[varr[0]:varr[-1]+1,harr[0]:harr[-1]+1] small_inv = invar[varr[0]:varr[-1]+1,harr[0]:harr[-1]+1] hcut = int(np.mod(np.argmax(small_img),small_img.shape[1])) vcut = int(np.floor(np.argmax(small_img)/small_img.shape[1])) hmean, hheight, hbg = sf.fit_mn_hght_bg(harr,small_img[vcut,:],small_inv[vcut,:],sigmas[k],hcenters[k],sigmas[k],powj=powers[k]) vmean, vheight, vbg = sf.fit_mn_hght_bg(varr+voff,small_img[:,hcut],small_inv[:,hcut],sigmas[k],vcenters[k],sigmas[k],powj=powers[k]) hdec, hint = math.modf(hmean) vdec, vint = math.modf(vmean) # small_img = recenter_img(small_img,[vmean,hmean],[varr[0]+cpad,harr[0]+cpad]) # print "Mean is [", vmean, hmean, "]" # plt.imshow(small_img,extent=(-cpad+hcenters[k],cpad+hcenters[k]+1,-cpad+vcenters[k],cpad+vcenters[k]+1),interpolation='none') # plt.show() # plt.close() # r_breakpoints = [0, 1, 2, 2.5, 3, 3.5, 4, 5, 10] # r_breakpoints = [0, 1, 2, 3, 4, 5, 9] # theta_orders=[0,-2,2] args = (small_img,small_inv,r_breakpoints) kws = dict() kws['theta_orders'] = theta_orders params = lmfit.Parameters() params.add('vc', value = vmean-varr[0]) params.add('hc', value = hmean-harr[0]) params.add('q',value = 0.85, min=0) params.add('PA',value = 0) minimizer_results = lmfit.minimize(spline.spline_residuals,params,args=args,kws=kws) ecc = minimizer_results.params['q'].value pos_ang = minimizer_results.params['PA'].value if ecc > 1: ecc = 1/ecc pos_ang -= (np.pi/2) pos_ang = pos_ang % (2*np.pi) # print "Eccentricity = ", ecc # print "Position Angle = ", pos_ang*180/(np.pi) # center=[vmean-varr[0],hmean-harr[0]] # print center spline_fit, s_coeffs, s_scale = spline.spline_2D_radial(small_img,small_inv,r_breakpoints,minimizer_results.params,theta_orders=theta_orders,return_coeffs=True) # v_bpts = varr[np.mod(np.arange(len(varr)),bp_space)==0]-vcenters[k] # h_bpts = harr[np.mod(np.arange(len(harr)),bp_space)==0]-hcenters[k] # spline_fit, s_coeffs, s_scale = spline.spline_2D(small_img,1/(small_img+readnoise**2),h_bpts,v_bpts,return_coeffs=True) # if k == 0: # vis = np.hstack((small_img,spline_fit,small_img-spline_fit)) # plt.imshow(vis,interpolation='none') ## # plt.figure() ## # plt.hist(np.ravel((small_img-spline_fit)*small_inv)) # plt.show() # plt.close() if k==0: spline_coeffs = zeros((len(vcenters),len(s_coeffs))) spline_coeffs[k] = s_coeffs scale_fit[k] = s_scale new_hcenters[k] = hmean new_vcenters[k] = vmean fit_params[:,k] = np.array(([ecc,pos_ang])) if return_new_centers: return spline_coeffs, scale_fit, fit_params, new_hcenters, new_vcenters else: return spline_coeffs, scale_fit, fit_params