def fit_nominal_lens_2d(thickness, pixelsize, radius4fit, p0=[20e-6, 1.005e-6, -.005e-6, -.005e-6], bounds=([10e-6, -2.05e-6, -2.05e-6, -2.05e-6], [50e-6, 2.05e-6, 2.05e-6, 2.05e-6]), saveFigFlag=False, str4title='', kwargs4fit={}): # thickness = center_CM_2darray(thickness) xmatrix, ymatrix = wpu.grid_coord(thickness, pixelSize) r2 = np.sqrt(xmatrix**2 + ymatrix**2) args4fit = np.where(r2.flatten() < radius4fit) mask = xmatrix * np.nan mask[np.where(r2 < radius4fit)] = 1.0 data2fit = thickness.flatten()[args4fit] xxfit = xmatrix.flatten()[args4fit] yyfit = ymatrix.flatten()[args4fit] xyfit = [xxfit, yyfit] # FIT popt, pcov = curve_fit(_2Dparabol_4_fit, xyfit, data2fit, p0=p0, bounds=bounds, method='trf', **kwargs4fit) wpu.print_blue("Nominal Parabolic 2D Fit") wpu.print_blue("Curv Radius, xo, yo, offset") wpu.print_blue(popt) wpu.print_blue("Nominal Parabolic 2D Fit: Radius of 1 face / nfaces, " + "x direction: {:.4g} um".format(popt[0] * 1e6)) lim_x = np.argwhere(xmatrix[0, :] <= -radius4fit * 1.01)[-1, 0] lim_y = np.argwhere(ymatrix[:, 0] <= -radius4fit * 1.01)[-1, 0] fitted = _2Dparabol_4_fit([xmatrix, ymatrix], popt[0], popt[1], popt[2], popt[3]) if (lim_x <= 1 or lim_y <= 1): thickness_cropped = thickness * mask fitted_cropped = fitted * mask else: thickness_cropped = (thickness[lim_y:-lim_y + 1, lim_x:-lim_x + 1] * mask[lim_y:-lim_y + 1, lim_x:-lim_x + 1]) fitted_cropped = (fitted[lim_y:-lim_y + 1, lim_x:-lim_x + 1] * mask[lim_y:-lim_y + 1, lim_x:-lim_x + 1]) return (thickness_cropped, fitted_cropped, popt)
def center_lens_array_max(array, pixelSize, radius): ''' crop the array in order to have the max at the center of the array ''' array = np.copy(array) xx, yy = wpu.grid_coord(array, pixelSize) r2 = np.sqrt(xx**2 + yy**2) mask = 0 * xx mask[np.where((r2 < radius * 1.1) & (r2 > radius * .9))] = 1.0 mean_at_r2 = np.mean(array * mask) mask2 = 0 * xx mask2[np.where(array > mean_at_r2)] = 1.0 i, j = np.mgrid[0:array.shape[0], 0:array.shape[1]] center_i = int(np.average(i, weights=array * mask2)) center_j = int(np.average(j, weights=array * mask2)) if 2 * center_i > array.shape[0]: array = array[2 * center_i - array.shape[0]:, :] else: array = array[0:2 * center_i, :] if 2 * center_j > array.shape[1]: array = array[:, 2 * center_j - array.shape[1]:] else: array = array[:, 0:2 * center_j] return array
def center_lens_array_max_fit(array, pixelSize, radius4fit=100e-6): ''' crop the array in order to have the max at the center of the array. It uses a fitting procedure of a 2D parabolic function to determine the center ''' radius4fit = _biggest_radius(array, pixelSize, radius4fit * .8) array = np.copy(array) xx, yy = wpu.grid_coord(array, pixelSize) (_, _, fitParameters) = fit_parabolic_lens_2d(array, pixelSize, radius4fit=radius4fit) center_i = np.argmin(np.abs(yy[:, 0] - fitParameters[2])) center_j = np.argmin(np.abs(xx[0, :] - fitParameters[1])) if 2 * center_i > array.shape[0]: array = array[2 * center_i - array.shape[0]:, :] else: array = array[0:2 * center_i, :] if 2 * center_j > array.shape[1]: array = array[:, 2 * center_j - array.shape[1]:] else: array = array[:, 0:2 * center_j] return array
def _plot_profile(data, pixelsize, title, arg4main={'cmap': 'viridis'}): xxGrid, yyGrid = wpu.grid_coord(data, pixelsize) wpu.plot_profile(xxGrid*1e6, yyGrid*1e6, data[::-1, :], xlabel=r'$x [\mu m]$', ylabel=r'$y [\mu m]$', title=title, xunit='\mu m', yunit='\mu m', arg4main=arg4main)
def _lsq_fit_parabola(zz, pixelsize, mode='2D'): xx, yy = wpu.grid_coord(zz, pixelsize) if np.all(np.isfinite(zz)): # if there is no nan f = zz.flatten() x = xx.flatten() y = yy.flatten() else: argNotNAN = np.isfinite(zz) f = zz[argNotNAN].flatten() x = xx[argNotNAN].flatten() y = yy[argNotNAN].flatten() if '2D' in mode: X_matrix = np.vstack([x**2 + y**2, x, y, x * 0.0 + 1]).T beta_matrix = np.linalg.lstsq(X_matrix, f)[0] fit = (beta_matrix[0] * (xx**2 + yy**2) + beta_matrix[1] * xx + beta_matrix[2] * yy + beta_matrix[3]) elif '1Dx' in mode: X_matrix = np.vstack([x**2, x, y, x * 0.0 + 1]).T beta_matrix = np.linalg.lstsq(X_matrix, f)[0] fit = (beta_matrix[0] * (xx**2) + beta_matrix[1] * xx + beta_matrix[2] * yy + beta_matrix[3]) elif '1Dy' in mode: X_matrix = np.vstack([y**2, x, y, x * 0.0 + 1]).T beta_matrix = np.linalg.lstsq(X_matrix, f)[0] fit = (beta_matrix[0] * (yy**2) + beta_matrix[1] * xx + beta_matrix[2] * yy + beta_matrix[3]) if np.all(np.isfinite(zz)): mask = zz * 0.0 + 1.0 else: mask = zz * 0.0 + 1.0 mask[~argNotNAN] = np.nan R_o = 1 / 2 / beta_matrix[0] x_o = -beta_matrix[1] / beta_matrix[0] / 2 y_o = -beta_matrix[2] / beta_matrix[0] / 2 offset = beta_matrix[3] popt = [R_o, x_o, y_o, offset] return fit * mask, popt
def _fit_lin_surface(zz, pixelsize): from numpy.polynomial import polynomial xx, yy = wpu.grid_coord(zz, pixelsize) f = zz.flatten() deg = np.array([1, 1]) vander = polynomial.polyvander2d(xx.flatten(), yy.flatten(), deg) vander = vander.reshape((-1, vander.shape[-1])) f = f.reshape((vander.shape[0],)) c = np.linalg.lstsq(vander, f)[0] print(c) return polynomial.polyval2d(xx, yy, c.reshape(deg+1))
def fit_parabolic_lens_2d(thickness, pixelsize, radius4fit, mode='2D'): # FIT xx, yy = wpu.grid_coord(thickness, pixelSize) mask = xx * np.nan lim_x = np.argwhere(xx[0, :] <= -radius4fit * 1.01)[-1, 0] lim_y = np.argwhere(yy[:, 0] <= -radius4fit * 1.01)[-1, 0] if '2D' in mode: r2 = np.sqrt(xx**2 + yy**2) mask[np.where(r2 < radius4fit)] = 1.0 elif '1Dx' in mode: mask[np.where(xx**2 < radius4fit)] = 1.0 lim_y = 2 elif '1Dy' in mode: mask[np.where(yy**2 < radius4fit)] = 1.0 lim_x = 2 fitted, popt = _lsq_fit_parabola(thickness * mask, pixelSize, mode=mode) wpu.print_blue("Parabolic 2D Fit") wpu.print_blue("Curv Radius, xo, yo, offset") wpu.print_blue(popt) wpu.print_blue("Parabolic 2D Fit: Radius of 1 face / nfaces, " + "x direction: {:.4g} um".format(popt[0] * 1e6)) if (lim_x <= 1 or lim_y <= 1): thickness_cropped = thickness * mask fitted_cropped = fitted * mask else: thickness_cropped = (thickness[lim_y:-lim_y + 1, lim_x:-lim_x + 1] * mask[lim_y:-lim_y + 1, lim_x:-lim_x + 1]) fitted_cropped = (fitted[lim_y:-lim_y + 1, lim_x:-lim_x + 1] * mask[lim_y:-lim_y + 1, lim_x:-lim_x + 1]) return (thickness_cropped, fitted_cropped, popt)
def plot_integration(integrated, pixelsize, titleStr='Title', ctitle=' ', max3d_grid_points=101, plotProfile=True, plot3dFlag=True, saveFigFlag=False, saveFileSuf='graph', **kwarg4surf): ''' TODO: Write Docstring ''' xxGrid, yyGrid = wpu.grid_coord(integrated, pixelsize) factor_x, unit_x = wpu.choose_unit(xxGrid) factor_y, unit_y = wpu.choose_unit(yyGrid) # Plot Integration 2 if plot3dFlag: fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') rstride = integrated.shape[0] // max3d_grid_points + 1 cstride = integrated.shape[1] // max3d_grid_points + 1 surf = ax.plot_surface(xxGrid * factor_x, yyGrid * factor_y, integrated[::-1, :], rstride=rstride, cstride=cstride, cmap='viridis', linewidth=0.1, **kwarg4surf) ax_lim = np.max([np.abs(xxGrid * factor_x), np.abs(yyGrid * factor_y)]) ax.set_xlim3d(-ax_lim, ax_lim) ax.set_ylim3d(-ax_lim, ax_lim) if 'vmin' in kwarg4surf: ax.set_zlim3d(bottom=kwarg4surf['vmin']) if 'vmax' in kwarg4surf: ax.set_zlim3d(top=kwarg4surf['vmax']) plt.xlabel(r'$x [' + unit_x + ' m]$', fontsize=24) plt.ylabel(r'$y [' + unit_y + ' m]$', fontsize=24) plt.title(titleStr, fontsize=24, weight='bold') cbar = plt.colorbar(surf, shrink=.8, aspect=20) cbar.ax.set_title(ctitle, y=1.01) plt.tight_layout(rect=[0, 0, 1, 1]) ax.text2D(0.05, 0.9, 'strides = {}, {}'.format(rstride, cstride), transform=ax.transAxes) if saveFigFlag: ax.view_init(elev=30, azim=60) wpu.save_figs_with_idx(saveFileSuf) ax.view_init(elev=30, azim=-120) wpu.save_figs_with_idx(saveFileSuf) plt.pause(.5) plt.show(block=False) if plotProfile: wpu.plot_profile(xxGrid * factor_x, yyGrid * factor_y, integrated[::-1, :], xlabel=r'$x [' + unit_x + ' m]$', ylabel=r'$y [' + unit_y + ' m]$', title=titleStr, xunit='\mu m', yunit='\mu m', arg4main={ 'cmap': 'viridis', 'lw': 3 }) if saveFigFlag: plt.ioff() plt.figure(figsize=(10, 8)) plt.imshow(integrated[::-1, :], cmap='viridis', extent=wpu.extent_func(integrated, pixelsize) * factor_x, **kwarg4surf) plt.xlabel(r'$x [' + unit_x + ' m]$', fontsize=24) plt.ylabel(r'$y [' + unit_x + ' m]$', fontsize=24) plt.title(titleStr, fontsize=18, weight='bold') cbar = plt.colorbar() cbar.ax.set_title(ctitle, y=1.01) wpu.save_figs_with_idx(saveFileSuf) plt.close() plt.ion()
def plot_residual_parabolic_lens_2d(thickness, pixelsize, fitted, fitParameters, saveFigFlag=False, savePickle=False, str4title='', saveSdfData=False, vlimErrSigma=1, plotProfileFlag=True, plot3dFlag=True, makeAnimation=False): xmatrix, ymatrix = wpu.grid_coord(thickness, pixelsize) errorThickness = thickness - fitted argNotNAN = np.isfinite(errorThickness) factorx, unitx = wpu.choose_unit(xmatrix) factory, unity = wpu.choose_unit(ymatrix) factorz, unitz = wpu.choose_unit(errorThickness[argNotNAN]) ptp = np.ptp(errorThickness[argNotNAN].flatten() * factorz) wpu.print_red('PV: {0:4.3g} '.format(ptp) + unitz[-1] + 'm') sigmaError = np.std(errorThickness[argNotNAN].flatten() * factorz) wpu.print_red('SDV: {0:4.3g} '.format(sigmaError) + unitz[-1] + 'm') str4title += r'Residual, ' + \ r'R $= {:.4g} \mu m$,'.format(fitParameters[0]*1e6) + '\n' + \ r'PV $= {0:.2f}$ '.format(ptp) + '$' + unitz + ' m$, '\ 'SDV $= {0:.2f}$ '.format(sigmaError) + '$' + unitz + ' m$' # Plot Histogram plt.figure(figsize=(7, 8)) plt.hist(errorThickness[argNotNAN] * factorz, 100, color='r', histtype='step') plt.xlabel(r'Residual [$' + unitz + ' m$ ]') plt.title(str4title) if saveFigFlag: wpu.save_figs_with_idx(fname2save, extension='png') plt.show(block=False) # Plot Profiles vlimErr = wpu.mean_plus_n_sigma(errorThickness[argNotNAN] * factorz, vlimErrSigma / 2) cmap4graph = plt.cm.Spectral_r cmap4graph.set_over('m') cmap4graph.set_under('c') if plotProfileFlag: wpu.plot_profile(xmatrix * factorx, ymatrix * factory, errorThickness * factorz, title=str4title, xlabel=r'[$' + unitx + ' m$ ]', ylabel=r'[$' + unity + ' m$ ]', zlabel=r'[$' + unitz + ' m$ ]', arg4main={ 'cmap': 'Spectral_r', 'vmin': -vlimErr, 'vmax': vlimErr, 'extend': 'both' }) if savePickle or saveFigFlag: fig = plt.figure(figsize=(10, 7)) cf = plt.contourf(xmatrix * factorx, ymatrix * factory, errorThickness * factorz, 256, cmap=cmap4graph, extend='both') plt.clim(-vlimErr, vlimErr) plt.contour(cf, levels=cf.levels[::32], colors='gray') plt.xlabel(r'[$' + unitx + ' m$ ]', fontsize=22) plt.ylabel(r'[$' + unity + ' m$ ]', fontsize=22) plt.title(str4title, fontsize=22) cbar = plt.colorbar(cf, shrink=.8, aspect=20) # cbar.set_clim(-vlimErr, vlimErr) cbar.ax.set_title(r'[$' + unitz + ' m$ ]', y=1.01) plt.gca().set_aspect('equal', adjustable='box') plt.grid(color='grey') if saveFigFlag: wpu.save_figs_with_idx(fname2save, extension='png') if savePickle: wpu.save_figs_with_idx_pickle(fig, fname2save) plt.show(block=True) # Plot 3D if plot3dFlag: wpu.print_red('MESSAGE: Ploting 3d in the background') fig = plt.figure(figsize=(10, 7), facecolor="white") ax = fig.gca(projection='3d') plt.tight_layout(pad=2.5) surf = ax.plot_trisurf(xmatrix[argNotNAN].flatten() * factorx, ymatrix[argNotNAN].flatten() * factory, errorThickness[argNotNAN].flatten() * factorz, vmin=-vlimErr, vmax=vlimErr, cmap=cmap4graph, linewidth=0.1, shade=False) ax.view_init(azim=-120, elev=40) plt.xlabel(r'$x$ [$' + unitx + ' m$ ]') plt.ylabel(r'$y$ [$' + unity + ' m$ ]') plt.title(str4title) cbar = plt.colorbar(surf, shrink=.8, aspect=20, extend='both') cbar.ax.set_title(r'[$' + unitz + ' m$ ]', y=1.01) plt.tight_layout() if saveFigFlag: wpu.save_figs_with_idx(fname2save, extension='png') ax.view_init(azim=690, elev=40) wpu.save_figs_with_idx(fname2save, extension='png') if makeAnimation: # plt.show(block=False) plt.pause(1.0) wpu.rocking_3d_figure(ax, wpu.get_unique_filename(fname2save, 'gif'), elevOffset=45, azimOffset=60, elevAmp=0, azimAmpl=-1, dpi=80, npoints=5) plt.pause(1.0) plt.close('all') # plt.show(block=True) if saveSdfData: mask_for_sdf = errorThickness * 0.0 mask_for_sdf[~argNotNAN] = 1.0 errorThickness[~argNotNAN] = 00000000 wpu.save_sdf_file( errorThickness, pixelsize, wpu.get_unique_filename(fname2save + '_residual', 'sdf')) wpu.save_sdf_file( mask_for_sdf, pixelsize, wpu.get_unique_filename(fname2save + '_residual_mask', 'sdf')) return sigmaError / factorz, ptp / factorz
(thickness_cropped, fitted, fitParameters) = fit_nominal_lens_2d(thickness, pixelSize, radius4fit=radius4fit, p0=p0, bounds=bounds, saveFigFlag=saveFigFlag, str4title=str4graphs, kwargs4fit={ 'verbose': 2, 'ftol': 1e-12, 'gtol': 1e-12 }) xmatrix, ymatrix = wpu.grid_coord(thickness_cropped, pixelSize) isNotNAN = np.isfinite(thickness_cropped[thickness_cropped.shape[0] // 2, :]) plot_residual_1d( xmatrix[0, isNotNAN], thickness_cropped[thickness_cropped.shape[0] // 2, isNotNAN], fitted[thickness_cropped.shape[0] // 2, isNotNAN], str4title=str4graphs + '\nFit center profile Horizontal, ' + ' R = {:.4g} um'.format(fitParameters[0] * 1e6), saveFigFlag=True, saveAsciiFlag=True) isNotNAN = np.isfinite( thickness_cropped[:, thickness_cropped.shape[1] // 2]) plot_residual_1d(
def _n_profiles_H_V(arrayH, arrayV, virtual_pixelsize, zlabel=r'z', titleH='Horiz', titleV='Vert', nprofiles=5, filter_width=0, remove2ndOrder=False, saveFileSuf='', saveFigFlag=True): xxGrid, yyGrid = wpu.grid_coord(arrayH, virtual_pixelsize) fit_coefs = [[], []] data2saveH = None data2saveV = None labels_H = None labels_V = None plt.rcParams['lines.markersize'] = 4 plt.rcParams['lines.linewidth'] = 2 # Horizontal if np.all(np.isfinite(arrayH)): plt.figure(figsize=(12, 12 * 9 / 16)) xvec = xxGrid[0, :] data2saveH = np.c_[xvec] header = ['x [m]'] ls_cycle, lc_jet = wpu.line_style_cycle(['-'], ['o', 's', 'd', '^'], ncurves=nprofiles, cmap_str='gist_rainbow_r') lc = [] labels_H = [] for i, row in enumerate( np.linspace(filter_width // 2, np.shape(arrayV)[0] - filter_width // 2 - 1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue if filter_width != 0: yvec = arrayH[row - filter_width:row + filter_width, :] yvec = np.sum(yvec, 0) / filter_width / 2 else: yvec = arrayH[row, :] lc.append(next(lc_jet)) p01 = np.polyfit(xvec, yvec, 1) fit_coefs[0].append(p01) if remove2ndOrder: yvec -= p01[0] * xvec + p01[1] plt.plot(xvec * 1e6, yvec, next(ls_cycle), color=lc[i - 1], label=str(row)) if not remove2ndOrder: plt.plot(xvec * 1e6, p01[0] * xvec + p01[1], '--', color=lc[i - 1], lw=3) data2saveH = np.c_[data2saveH, yvec] header.append(str(row)) labels_H.append(str(row)) if remove2ndOrder: titleH = titleH + ', 2nd order removed' plt.legend(title='Pixel Y', loc=0, fontsize=12) plt.xlabel(r'x [$\mu m$]', fontsize=18) plt.ylabel(zlabel, fontsize=18) plt.title(titleH + ', Filter Width = {:d} pixels'.format(filter_width), fontsize=20) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_H') plt.show(block=False) header.append(zlabel + ', Filter Width = {:d} pixels'.format(filter_width)) wpu.save_csv_file(data2saveH, wpu.get_unique_filename( saveFileSuf + '_WF_profiles_H', 'csv'), headerList=header) plt.figure(figsize=(12, 12 * 9 / 16)) plt.imshow(arrayH, cmap='RdGy', vmin=wpu.mean_plus_n_sigma(arrayH, -3), vmax=wpu.mean_plus_n_sigma(arrayH, 3)) plt.xlabel('Pixel') plt.ylabel('Pixel') plt.title(titleH + ', Profiles Position') currentAxis = plt.gca() _, lc_jet = wpu.line_style_cycle(['-'], ['o', 's', 'd', '^'], ncurves=nprofiles, cmap_str='gist_rainbow_r') for i, row in enumerate( np.linspace(filter_width // 2, np.shape(arrayV)[0] - filter_width // 2 - 1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue currentAxis.add_patch( Rectangle((-.5, row - filter_width // 2 - .5), np.shape(arrayH)[1], filter_width, facecolor=lc[i - 1], alpha=.5)) plt.axhline(row, color=lc[i - 1]) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_H') plt.show(block=True) # Vertical if np.all(np.isfinite(arrayV)): plt.figure(figsize=(12, 12 * 9 / 16)) xvec = yyGrid[:, 0] data2saveV = np.c_[xvec] header = ['y [m]'] ls_cycle, lc_jet = wpu.line_style_cycle(['-'], ['o', 's', 'd', '^'], ncurves=nprofiles, cmap_str='gist_rainbow_r') lc = [] labels_V = [] for i, col in enumerate( np.linspace(filter_width // 2, np.shape(arrayH)[1] - filter_width // 2 - 1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue if filter_width != 0: yvec = arrayV[:, col - filter_width:col + filter_width] yvec = np.sum(yvec, 1) / filter_width / 2 else: yvec = arrayV[:, col] lc.append(next(lc_jet)) p10 = np.polyfit(xvec, yvec, 1) fit_coefs[1].append(p10) if remove2ndOrder: yvec -= p10[0] * xvec + p10[1] plt.plot(xvec * 1e6, yvec, next(ls_cycle), color=lc[i - 1], label=str(col)) if not remove2ndOrder: plt.plot(xvec * 1e6, p10[0] * xvec + p10[1], '--', color=lc[i - 1], lw=3) data2saveV = np.c_[data2saveV, yvec] header.append(str(col)) labels_V.append(str(col)) if remove2ndOrder: titleV = titleV + ', 2nd order removed' plt.legend(title='Pixel X', loc=0, fontsize=12) plt.xlabel(r'y [$\mu m$]', fontsize=18) plt.ylabel(zlabel, fontsize=18) plt.title(titleV + ', Filter Width = {:d} pixels'.format(filter_width), fontsize=20) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_Y') plt.show(block=False) header.append(zlabel + ', Filter Width = {:d} pixels'.format(filter_width)) wpu.save_csv_file(data2saveV, wpu.get_unique_filename( saveFileSuf + '_WF_profiles_V', 'csv'), headerList=header) plt.figure(figsize=(12, 12 * 9 / 16)) plt.imshow(arrayV, cmap='RdGy', vmin=wpu.mean_plus_n_sigma(arrayV, -3), vmax=wpu.mean_plus_n_sigma(arrayV, 3)) plt.xlabel('Pixel') plt.ylabel('Pixel') plt.title(titleV + ', Profiles Position') currentAxis = plt.gca() for i, col in enumerate( np.linspace(filter_width // 2, np.shape(arrayH)[1] - filter_width // 2 - 1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue currentAxis.add_patch( Rectangle((col - filter_width // 2 - .5, -.5), filter_width, np.shape(arrayV)[0], facecolor=lc[i - 1], alpha=.5)) plt.axvline(col, color=lc[i - 1]) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_Y') plt.show(block=True) return data2saveH, data2saveV, labels_H, labels_V, fit_coefs
def _n_profiles_H_V(arrayH, arrayV, virtual_pixelsize, zlabel=r'z', titleH='Horiz', titleV='Vert', nprofiles=5, filter_width=0, remove1stOrderDPC=False, saveFileSuf='', saveFigFlag=True): xxGrid, yyGrid = wpu.grid_coord(arrayH, virtual_pixelsize) fit_coefs = [[], []] data2saveH = None data2saveV = None labels_H = None labels_V = None plt.rcParams['lines.markersize'] = 4 plt.rcParams['lines.linewidth'] = 2 # Horizontal if np.all(np.isfinite(arrayH)): plt.figure(figsize=(12, 12*9/16)) xvec = xxGrid[0, :] data2saveH = np.c_[xvec] header = ['x [m]'] if filter_width != 0: arrayH_filtered = uniform_filter1d(arrayH, filter_width, 0) else: arrayH_filtered = arrayH ls_cycle, lc_jet = wpu.line_style_cycle(['-'], ['o', 's', 'd', '^'], ncurves=nprofiles, cmap_str='gist_rainbow_r') lc = [] labels_H = [] for i, row in enumerate(np.linspace(filter_width//2, np.shape(arrayV)[0]-filter_width//2-1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue yvec = arrayH_filtered[row, :] lc.append(next(lc_jet)) p01 = np.polyfit(xvec, yvec, 1) fit_coefs[0].append(p01) if remove1stOrderDPC: yvec -= p01[0]*xvec + p01[1] plt.plot(xvec*1e6, yvec, next(ls_cycle), color=lc[i-1], label=str(row)) if not remove1stOrderDPC: plt.plot(xvec*1e6, p01[0]*xvec + p01[1], '--', color=lc[i-1], lw=3) data2saveH = np.c_[data2saveH, yvec] header.append(str(row)) labels_H.append(str(row)) if remove1stOrderDPC: titleH = titleH + ', 2nd order removed' plt.legend(title='Pixel Y', loc=0, fontsize=12) plt.xlabel(r'x [$\mu m$]', fontsize=18) plt.ylabel(zlabel, fontsize=18) plt.title(titleH + ', Filter Width = {:d} pixels'.format(filter_width), fontsize=20) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_H') plt.show(block=False) header.append(zlabel + ', Filter Width = {:d} pixels'.format(filter_width)) wpu.save_csv_file(data2saveH, wpu.get_unique_filename(saveFileSuf + '_WF_profiles_H', 'csv'), headerList=header) plt.figure(figsize=(12, 12*9/16)) plt.imshow(arrayH, cmap='RdGy', vmin=wpu.mean_plus_n_sigma(arrayH, -3), vmax=wpu.mean_plus_n_sigma(arrayH, 3)) plt.xlabel('Pixel') plt.ylabel('Pixel') plt.title(titleH + ', Profiles Position') currentAxis = plt.gca() _, lc_jet = wpu.line_style_cycle(['-'], ['o', 's', 'd', '^'], ncurves=nprofiles, cmap_str='gist_rainbow_r') for i, row in enumerate(np.linspace(filter_width//2, np.shape(arrayV)[0]-filter_width//2-1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue currentAxis.add_patch(Rectangle((-.5, row - filter_width//2 - .5), np.shape(arrayH)[1], filter_width, facecolor=lc[i-1], alpha=.5)) plt.axhline(row, color=lc[i-1]) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_H') plt.show(block=True) # Vertical if np.all(np.isfinite(arrayV)): plt.figure(figsize=(12, 12*9/16)) xvec = yyGrid[:, 0] data2saveV = np.c_[xvec] header = ['y [m]'] if filter_width != 0: arrayV_filtered = uniform_filter1d(arrayV, filter_width, 1) else: arrayV_filtered = arrayV ls_cycle, lc_jet = wpu.line_style_cycle(['-'], ['o', 's', 'd', '^'], ncurves=nprofiles, cmap_str='gist_rainbow_r') lc = [] labels_V = [] for i, col in enumerate(np.linspace(filter_width//2, np.shape(arrayH)[1]-filter_width//2-1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue yvec = arrayV_filtered[:, col] lc.append(next(lc_jet)) p10 = np.polyfit(xvec, yvec, 1) fit_coefs[1].append(p10) if remove1stOrderDPC: yvec -= p10[0]*xvec + p10[1] plt.plot(xvec*1e6, yvec, next(ls_cycle), color=lc[i-1], label=str(col)) if not remove1stOrderDPC: plt.plot(xvec*1e6, p10[0]*xvec + p10[1], '--', color=lc[i-1], lw=3) data2saveV = np.c_[data2saveV, yvec] header.append(str(col)) labels_V.append(str(col)) if remove1stOrderDPC: titleV = titleV + ', 2nd order removed' plt.legend(title='Pixel X', loc=0, fontsize=12) plt.xlabel(r'y [$\mu m$]', fontsize=18) plt.ylabel(zlabel, fontsize=18) plt.title(titleV + ', Filter Width = {:d} pixels'.format(filter_width), fontsize=20) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_Y') plt.show(block=False) header.append(zlabel + ', Filter Width = {:d} pixels'.format(filter_width)) wpu.save_csv_file(data2saveV, wpu.get_unique_filename(saveFileSuf + '_WF_profiles_V', 'csv'), headerList=header) plt.figure(figsize=(12, 12*9/16)) plt.imshow(arrayV, cmap='RdGy', vmin=wpu.mean_plus_n_sigma(arrayV, -3), vmax=wpu.mean_plus_n_sigma(arrayV, 3)) plt.xlabel('Pixel') plt.ylabel('Pixel') plt.title(titleV + ', Profiles Position') currentAxis = plt.gca() for i, col in enumerate(np.linspace(filter_width//2, np.shape(arrayH)[1]-filter_width//2-1, nprofiles + 2, dtype=int)): if i == 0 or i == nprofiles + 1: continue currentAxis.add_patch(Rectangle((col - filter_width//2 - .5, -.5), filter_width, np.shape(arrayV)[0], facecolor=lc[i-1], alpha=.5)) plt.axvline(col, color=lc[i-1]) if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf + '_Y') plt.show(block=True) return data2saveH, data2saveV, labels_H, labels_V, fit_coefs
def plot_integration(integrated, pixelsize, titleStr='Title', ctitle=' ', max3d_grid_points=101, plotProfile=True, plot3dFlag=True, saveFigFlag=False, saveFileSuf='graph', **kwarg4surf): ''' TODO: Write Docstring ''' xxGrid, yyGrid = wpu.grid_coord(integrated, pixelsize) factor_x, unit_x = wpu.choose_unit(xxGrid) factor_y, unit_y = wpu.choose_unit(yyGrid) # Plot Integration 2 if plot3dFlag: fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') rstride = integrated.shape[0] // max3d_grid_points + 1 cstride = integrated.shape[1] // max3d_grid_points + 1 surf = ax.plot_surface(xxGrid*factor_x, yyGrid*factor_y, integrated[::-1, :], rstride=rstride, cstride=cstride, cmap='viridis', linewidth=0.1, **kwarg4surf) ax_lim = np.max([np.abs(xxGrid*factor_x), np.abs(yyGrid*factor_y)]) ax.set_xlim3d(-ax_lim, ax_lim) ax.set_ylim3d(-ax_lim, ax_lim) if 'vmin' in kwarg4surf: ax.set_zlim3d(bottom=kwarg4surf['vmin']) if 'vmax' in kwarg4surf: ax.set_zlim3d(top=kwarg4surf['vmax']) plt.xlabel(r'$x [' + unit_x + ' m]$', fontsize=24) plt.ylabel(r'$y [' + unit_y + ' m]$', fontsize=24) plt.title(titleStr, fontsize=24, weight='bold') cbar = plt.colorbar(surf, shrink=.8, aspect=20) cbar.ax.set_title(ctitle, y=1.01) plt.tight_layout(rect=[0, 0, 1, 1]) ax.text2D(0.05, 0.9, 'strides = {}, {}'.format(rstride, cstride), transform=ax.transAxes) if saveFigFlag: ax.view_init(elev=30, azim=60) wpu.save_figs_with_idx(saveFileSuf) ax.view_init(elev=30, azim=-120) wpu.save_figs_with_idx(saveFileSuf) plt.pause(.5) plt.show(block=False) if plotProfile: wpu.plot_profile(xxGrid*factor_x, yyGrid*factor_y, integrated[::-1, :], xlabel=r'$x [' + unit_x + ' m]$', ylabel=r'$y [' + unit_y + ' m]$', title=titleStr, xunit='\mu m', yunit='\mu m', arg4main={'cmap': 'viridis', 'lw': 3}) if saveFigFlag: plt.ioff() plt.figure(figsize=(10, 8)) plt.imshow(integrated[::-1, :], cmap='viridis', extent=wpu.extent_func(integrated, pixelsize)*factor_x, **kwarg4surf) plt.xlabel(r'$x [' + unit_x + ' m]$', fontsize=24) plt.ylabel(r'$y [' + unit_x + ' m]$', fontsize=24) plt.title(titleStr, fontsize=18, weight='bold') cbar = plt.colorbar() cbar.ax.set_title(ctitle, y=1.01) wpu.save_figs_with_idx(saveFileSuf) plt.close() plt.ion()
def plot_integration(integrated, pixelsize, titleStr='Title', ctitle=' ', saveFigFlag=False, saveFileSuf='graph'): ''' TODO: Write Docstring ''' xxGrid, yyGrid = wpu.grid_coord(integrated, pixelsize) factor_x, unit_x = wpu.choose_unit(xxGrid) factor_y, unit_y = wpu.choose_unit(yyGrid) wpu.plot_profile(xxGrid*factor_x, yyGrid*factor_y, integrated[::-1, :], xlabel=r'$x [' + unit_x + ' m]$', ylabel=r'$y [' + unit_y + ' m]$', title=titleStr, xunit='\mu m', yunit='\mu m', arg4main={'cmap': 'viridis', 'lw': 3}) if saveFigFlag: plt.ioff() plt.figure(figsize=(10, 8)) plt.imshow(integrated[::-1, :], cmap='viridis', extent=wpu.extent_func(integrated, pixelsize)*factor_x) plt.xlabel(r'$x [' + unit_x + ' m]$', fontsize=24) plt.ylabel(r'$y [' + unit_x + ' m]$', fontsize=24) plt.title(titleStr, fontsize=18, weight='bold') cbar = plt.colorbar() cbar.ax.set_title(ctitle, y=1.01) wpu.save_figs_with_idx(saveFileSuf) # plt.show(block=False) plt.close(plt.gcf()) plt.ion() # Plot Integration 2 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') rstride = integrated.shape[0] // 101 + 1 cstride = integrated.shape[1] // 101 + 1 surf = ax.plot_surface(xxGrid*factor_x, yyGrid*factor_y, integrated[::-1, :], rstride=rstride, cstride=cstride, cmap='viridis', linewidth=0.1) ax_lim = np.max([np.abs(xxGrid*factor_x), np.abs(yyGrid*factor_y)]) ax.set_xlim3d(-ax_lim, ax_lim) ax.set_ylim3d(-ax_lim, ax_lim) plt.xlabel(r'$x [' + unit_x + ' m]$', fontsize=24) plt.ylabel(r'$y [' + unit_y + ' m]$', fontsize=24) plt.title(titleStr, fontsize=24, weight='bold') cbar = plt.colorbar(surf, shrink=.8, aspect=20) cbar.ax.set_title(ctitle, y=1.01) fig.tight_layout() plt.tight_layout() if saveFigFlag: wpu.save_figs_with_idx(saveFileSuf) ax.text2D(0.05, 0.9, 'strides = {}, {}'.format(rstride, cstride), transform=ax.transAxes) plt.show(block=False) return ax