Source code for fiberlab.plot


from IPython import embed

import numpy
from matplotlib import pyplot, ticker

[docs] def frd_plot(files, nas=None, labels=None, colors=None, theta_lim=None, dtheta_lim=None, fratio_lim=None, dfratio_lim=None, ofile=None): for f in files: if not f.exists(): raise FileNotFoundError(f'{f} does not exist!') n = len(files) if any([o is not None and len(o) != n for o in [files, nas, labels, colors]]): raise ValueError('Mismatch in lists') if colors is None: colors = [f'C{i}' for i in range(n)] # Assume index of refraction for air is 1. # alpha = numpy.degrees(numpy.arcsin(nas)) fratio = None if nas is None else 1/2/numpy.asarray(nas) w,h = pyplot.figaspect(1) fig = pyplot.figure(figsize=(1.5*w,1.5*h)) tdt_ax = fig.add_axes([0.1, 0.14, 0.36, 0.36]) tdt_ax.minorticks_on() tdt_ax.tick_params(which='both', direction='in', top=True, right=True) tdt_ax.grid(True, which='major', color='0.8', zorder=0, ls='-', lw=0.5) tdt_ax.text(-0.15, 0.5, r'$\Delta\theta$ [deg]', ha='center', va='center', transform=tdt_ax.transAxes, rotation='vertical') tdt_ax.text(0.5, -0.12, r'$\theta$ [deg]', ha='center', va='center', transform=tdt_ax.transAxes) f_ax = fig.add_axes([0.59, 0.5, 0.36, 0.36]) f_ax.minorticks_on() f_ax.tick_params(which='both', direction='in', top=True, right=True) f_ax.grid(True, which='major', color='0.8', zorder=0, ls='-', lw=0.5) f_ax.xaxis.set_major_formatter(ticker.NullFormatter()) f_ax.text(-0.15, 0.5, r'Output f-ratio', ha='center', va='center', transform=f_ax.transAxes, rotation='vertical') fdf_ax = fig.add_axes([0.59, 0.14, 0.36, 0.36]) fdf_ax.minorticks_on() fdf_ax.tick_params(which='both', direction='in', top=True, right=True) fdf_ax.grid(True, which='major', color='0.8', zorder=0, ls='-', lw=0.5) fdf_ax.text(-0.15, 0.5, r'$\delta$ f-ratio', ha='center', va='center', transform=fdf_ax.transAxes, rotation='vertical') fdf_ax.text(0.5, -0.12, r'Input f-ratio', ha='center', va='center', transform=fdf_ax.transAxes) _theta_lim = [100, -1] _dtheta_lim = [100, -1] _fratio_lim = [100, -1] _dfratio_lim = [100, -1] for i in range(n): db = numpy.genfromtxt(str(files[i]), dtype=str) theta = db[:,4].astype(float) dtheta = db[:,5].astype(float) indx = theta > 1. theta = theta[indx] dtheta = dtheta[indx] srt = numpy.argsort(theta) theta = theta[srt] dtheta = dtheta[srt] in_fratio = 1 / 2 / numpy.tan(numpy.radians(theta)) out_fratio = 1 / 2 / numpy.tan(numpy.radians(theta + dtheta/2)) dfratio = in_fratio/out_fratio - 1. _theta_lim = [min(_theta_lim[0], numpy.amin(theta)), max(_theta_lim[1], numpy.amax(theta))] _dtheta_lim = [min(_dtheta_lim[0], numpy.amin(dtheta)), max(_dtheta_lim[1], numpy.amax(dtheta))] _fratio_lim = [min(_fratio_lim[0], numpy.amin(numpy.append(in_fratio, out_fratio))), max(_fratio_lim[1], numpy.amax(numpy.append(in_fratio, out_fratio)))] _dfratio_lim = [min(_dfratio_lim[0], numpy.amin(dfratio)), max(_dfratio_lim[1], numpy.amax(dfratio))] gpm = numpy.ones_like(in_fratio, dtype=bool) if fratio is None else in_fratio > fratio[i] bpm = numpy.logical_not(gpm) if any(bpm): indx = numpy.where(bpm)[0] bpm[indx[0]-1] = True tdt_ax.scatter(theta[gpm], dtheta[gpm], marker='.', s=20, lw=0, c=colors[i], zorder=6) tdt_ax.plot(theta[gpm], dtheta[gpm], c=colors[i], lw=0.5, zorder=5) tdt_ax.plot(theta[bpm], dtheta[bpm], c=colors[i], lw=0.5, zorder=4, ls='--') f_ax.scatter(in_fratio[gpm], out_fratio[gpm], marker='.', s=20, lw=0, c=colors[i], zorder=6) f_ax.plot(in_fratio[gpm], out_fratio[gpm], c=colors[i], lw=0.5, zorder=5) f_ax.plot(in_fratio[bpm], out_fratio[bpm], c=colors[i], lw=0.5, zorder=4, ls='--') fdf_ax.scatter(in_fratio[gpm], dfratio[gpm], marker='.', s=20, lw=0, c=colors[i], zorder=6) fdf_ax.plot(in_fratio[gpm], dfratio[gpm], c=colors[i], lw=0.5, zorder=5) fdf_ax.plot(in_fratio[bpm], dfratio[bpm], c=colors[i], lw=0.5, zorder=4, ls='--') if labels is not None: tdt_ax.text(-0.1, 2.0 - i*0.15, labels[i], color=colors[i], transform=tdt_ax.transAxes, ha='left', va='top', weight='bold') if theta_lim is None: theta_lim = _theta_lim if dtheta_lim is None: dtheta_lim = _dtheta_lim if fratio_lim is None: fratio_lim = _fratio_lim if dfratio_lim is None: dfratio_lim = _dfratio_lim theta_lim = numpy.sign(theta_lim)*(numpy.absolute(theta_lim)*numpy.array([1/1.1, 1.1])) dtheta_lim = numpy.sign(dtheta_lim)*(numpy.absolute(dtheta_lim)*numpy.array([1/1.1, 1.1])) fratio_lim = numpy.sign(fratio_lim)*(numpy.absolute(fratio_lim)*numpy.array([1/1.1, 1.1])) dfratio_lim = numpy.sign(dfratio_lim)*(numpy.absolute(dfratio_lim)*numpy.array([1/1.1, 1.1])) tdt_ax.set_xlim(theta_lim) tdt_ax.set_ylim(dtheta_lim) f_ax.set_xlim(fratio_lim[::-1]) f_ax.set_ylim(fratio_lim[::-1]) f_ax.plot(fratio_lim, fratio_lim, color='k', zorder=2, ls='--', lw=0.5) fdf_ax.set_xlim(fratio_lim[::-1]) fdf_ax.set_ylim(dfratio_lim) if ofile is None: pyplot.show() else: fig.canvas.print_figure(ofile, bbox_inches='tight') fig.clear() pyplot.close(fig)