def _peak_gauss_method( i, npix, u, v, filt, index_mask, pixelsize, innerpix, innerpix_center, fw_splodge=0.7, hole_diam=0.8, ): mf = np.zeros([npix, npix]) n_holes = index_mask.n_holes l_B = np.sqrt(u**2 + v**2) minbl = np.min(l_B) * filt[0] if n_holes >= 15: sampledisk_r = minbl / 2 / filt[0] * pixelsize * npix * 0.9 else: sampledisk_r = minbl / 2.0 / filt[0] * pixelsize * npix * fw_splodge xspot = float(np.round(v[i] * pixelsize * npix + npix / 2.0)) yspot = float(np.round(u[i] * pixelsize * npix + npix / 2.0)) mf = plot_circle(mf, xspot, yspot, sampledisk_r, display=False) mf = np.roll(mf, npix // 2, axis=0) mf = np.roll(mf, npix // 2, axis=1) X = [np.arange(npix), np.arange(npix), 1] splodge_fwhm = hole_diam / filt[0] * pixelsize * npix / 1.9 param = { "A": 1, "x0": -npix // 2 + yspot, "y0": -npix // 2 + xspot, "fwhm_x": splodge_fwhm, "fwhm_y": splodge_fwhm, "theta": 0, } gauss = gauss_2d_asym(X, param) gauss = np.roll(gauss, npix // 2, axis=0) gauss = np.roll(gauss, npix // 2, axis=1) mfg = gauss / np.sum(gauss) mf_gain_flat = mfg.ravel() mf_gain_centered = norm_max(np.fft.fftshift(mfg).ravel()) mf_flat = norm_max(mf.ravel()) mf_centered = norm_max(np.fft.fftshift(mf).ravel()) mf_flat[innerpix] = 0.0 mf_gain_flat[innerpix] = 0.0 mf_centered[innerpix_center] = 0.0 mf_gain_centered[innerpix_center] = 0.0 mf = { "flat": mf_flat, "centered": mf_centered, "gain_f": mf_gain_flat, "gain_c": mf_gain_centered, } return dict2class(mf)
def _peak_gauss_method(i, npix, u, v, filt, index_mask, pixelsize, innerpix, innerpix_center, fw_splodge=0.7, hole_diam=0.8): mf = np.zeros([npix, npix]) n_holes = index_mask.n_holes l_B = np.sqrt(u**2 + v**2) minbl = np.min(l_B) * filt[0] if n_holes >= 15: sampledisk_r = minbl / 2 / filt[0] * pixelsize * npix * 0.9 else: sampledisk_r = minbl / 2. / \ filt[0] * pixelsize * npix * fw_splodge xspot = float(np.round((v[i] * pixelsize * npix + npix / 2.))) yspot = float(np.round((u[i] * pixelsize * npix + npix / 2.))) mf = plot_circle(mf, xspot, yspot, sampledisk_r, display=False) mf = np.roll(mf, npix // 2, axis=0) mf = np.roll(mf, npix // 2, axis=1) X = [np.arange(npix), np.arange(npix), 1] splodge_fwhm = hole_diam / filt[0] * pixelsize * npix / 1.9 param = { 'A': 1, 'x0': -npix // 2 + yspot, 'y0': -npix // 2 + xspot, 'fwhm_x': splodge_fwhm, 'fwhm_y': splodge_fwhm, 'theta': 0 } gauss = gauss_2d_asym(X, param) gauss = np.roll(gauss, npix // 2, axis=0) gauss = np.roll(gauss, npix // 2, axis=1) mfg = gauss / np.sum(gauss) mf_gain_flat = mfg.ravel() mf_gain_centered = norm_max(np.fft.fftshift(mfg).ravel()) mf_flat = norm_max(mf.ravel()) mf_centered = norm_max(np.fft.fftshift(mf).ravel()) mf_flat[innerpix] = 0. mf_gain_flat[innerpix] = 0. mf_centered[innerpix_center] = 0. mf_gain_centered[innerpix_center] = 0. mf = { 'flat': mf_flat, 'centered': mf_centered, 'gain_f': mf_gain_flat, 'gain_c': mf_gain_centered } return dict2class(mf)
def tri_pix(array_size, sampledisk_r, verbose=True, display=True): """Compute all combination of triangle for a given splodge size""" if array_size % 2 == 1: cprint("\n! Warnings: image dimension must be even (%i)" % array_size, "red") cprint("Possible triangle inside the splodge should be incorrect.\n", "red") d = np.zeros([array_size, array_size]) d = plot_circle(d, array_size // 2, array_size // 2, sampledisk_r, display=False) pvct_flat = np.where(d.ravel() > 0) npx = len(pvct_flat[0]) for px1 in range(npx): thispix1 = np.array(array_coords(pvct_flat[0][px1], array_size)) roll1 = np.roll(d, int(array_size // 2 - thispix1[0]), axis=0) roll2 = np.roll(roll1, int(array_size // 2 - thispix1[1]), axis=1) xcor_12 = d + roll2 valid_b12_vct = np.where(xcor_12.T.ravel() > 1) thisntriv = len(valid_b12_vct[0]) thistrivct = np.zeros([3, thisntriv]) for px2 in range(thisntriv): thispix2 = array_coords(valid_b12_vct[0][px2], array_size) thispix3 = array_size * 1.5 - (thispix1 + thispix2) bl3_px = thispix3[1] * array_size + (thispix3[0]) thistrivct[:, px2] = [pvct_flat[0][px1], valid_b12_vct[0][px2], bl3_px] if px1 == 0: l_pix1 = list(thistrivct[0, :]) l_pix2 = list(thistrivct[1, :]) l_pix3 = list(thistrivct[2, :]) else: l_pix1.extend(list(thistrivct[0, :])) l_pix2.extend(list(thistrivct[1, :])) l_pix3.extend(list(thistrivct[2, :])) closing_tri_pix = np.array([l_pix1, l_pix2, l_pix3]).astype(int) n_trip = closing_tri_pix.shape[1] if verbose: print("Closing triangle in r = %2.1f: %i" % (sampledisk_r, n_trip)) cl_unique = clos_unique(closing_tri_pix) c0 = array_size // 2 fw = 2 * sampledisk_r if display: import matplotlib.pyplot as plt plt.figure(figsize=(5, 5)) plt.title( "Splodge + unique triangle (tri = %i/%i, d = %i, r = %2.1f pix)" % (cl_unique.shape[1], n_trip, array_size, sampledisk_r), fontsize=10, ) plt.imshow(d) for i in range(cl_unique.shape[1]): trip1 = cl_unique[:, i] X, Y = array_coords(trip1, array_size) X = list(X) Y = list(Y) X.append(X[0]) Y.append(Y[0]) plt.plot(X, Y, "-", lw=1) plt.axis([c0 - fw, c0 + fw, c0 - fw, c0 + fw]) plt.tight_layout() plt.show(block=False) return closing_tri_pix