def Plot_transfer(F, RR, Sd, fn, R, channel_id, starttime, endtime, location,
                  _format):
    lw = 1.5
    if location == '10':
        var = 'aceleracion'
        units = 'cuentas/(m/s^2)'
    else:
        var = 'velocidad'
        units = 'cuentas/(m/s)'

    xmin = min(F)
    xmax = max(F)
    ymin = min(abs(RR))
    ymax = max(abs(RR)) + 1e1
    xmin, xmax = xmin - (xmax - xmin) / 20., xmax + (xmax - xmin) / 20.
    ymin, ymax = ymin - (ymax - ymin) / 20., ymax + (ymax - ymin) / 20.

    fig = plt.figure()

    ax1 = fig.add_subplot(211)
    ax1.loglog(F, abs(RR), lw=lw)
    ax1.scatter(fn,
                ymax,
                linewidth=2,
                s=30,
                marker='o',
                color='b',
                label='fn = %s Hz' % fn)
    ax1.axvline(x=fn, ymax=max(abs(RR)), linewidth=2, linestyle='--')
    ax1.grid(True)
    ax1.set_xlim([xmin, xmax])
    ax1.set_ylim([ymin, ymax])
    plt.xlabel('')
    plt.ylabel('Sensibilidad %s' % units)
    ax1.xaxis.set_major_formatter(mtick.NullFormatter())
    ax1.yaxis.set_major_locator(
        mtick.LogLocator(base=10, subs=[1, 2, 3, 4, 5, 6, 7, 8, 9]))
    ax1.text(xmax - .05 * (xmax - xmin),
             ymin + .05 * (ymax - ymin),
             'Sensibilidad: %13.3e %s' % (Sd, units),
             size=15,
             horizontalalignment='right')
    plt.title('Respuesta en %s: %s %s - %s' %
              (var, channel_id, starttime, endtime))

    # Phase
    ax2 = fig.add_subplot(212)
    ax2.semilogx(F, np.angle(RR), lw=lw)
    ax2.scatter(fn,
                0,
                linewidth=2,
                s=30,
                marker='o',
                color='b',
                label='fn = %s Hz' % fn)
    plt.legend(loc=1, scatterpoints=1, markerscale=1)
    ax2.grid(True)
    ax2.set_xlim([xmin, xmax])
    plt.xlabel('frecuencia [Hz]')
    plt.ylabel('Fase [Radianes]')
    minmax2 = ax2.yaxis.get_data_interval()
    yticks2 = np.arange(minmax2[0] - minmax2[0] % (np.pi / 2),
                        minmax2[1] - minmax2[1] % (np.pi / 2) + np.pi,
                        np.pi / 2)
    ax2.set_yticks(yticks2)
    ax2.set_yticklabels([_pitick2latex(x) for x in yticks2])
    name_fig = '%s_%s.%s' % (channel_id, starttime, _format)
    plt.savefig(name_fig, dpi=fig.dpi)
    print "%s saved" % name_fig
    plt.show()
Example #2
0
 def test_pitick2latex(self):
     self.assertEqual(_pitick2latex(3 * pi / 2), r'$\frac{3\pi}{2}$')
     self.assertEqual(_pitick2latex(2 * pi / 2), r'$\pi$')
     self.assertEqual(_pitick2latex(1 * pi / 2), r'$\frac{\pi}{2}$')
     self.assertEqual(_pitick2latex(0 * pi / 2), r'$0$')
     self.assertEqual(_pitick2latex(-1 * pi / 2), r'$-\frac{\pi}{2}$')
     self.assertEqual(_pitick2latex(-2 * pi / 2), r'$-\pi$')
     self.assertEqual(_pitick2latex(0.5), r'0.500')
     self.assertEqual(_pitick2latex(3 * pi + 0.01), r'9.43')
     self.assertEqual(_pitick2latex(30 * pi + 0.01), r'94.3')
     self.assertEqual(_pitick2latex(300 * pi + 0.01), r'942.')
     self.assertEqual(_pitick2latex(3000 * pi + 0.01), r'9.42e+03')
Example #3
0
def pi_ticks(ax2):
	minmax2 = ax2.yaxis.get_data_interval()
   	yticks2 = np.arange(minmax2[0] - minmax2[0] % (np.pi / 2), minmax2[1] - minmax2[1] % (np.pi / 2) + np.pi, np.pi / 2)
    	ax2.set_yticks(yticks2)
    	ax2.set_yticklabels([_pitick2latex(x) for x in yticks2])
Example #4
0
 def test_pitick2latex(self):
     self.assertEqual(_pitick2latex(3 * pi / 2), r'$\frac{3\pi}{2}$')
     self.assertEqual(_pitick2latex(2 * pi / 2), r'$\pi$')
     self.assertEqual(_pitick2latex(1 * pi / 2), r'$\frac{\pi}{2}$')
     self.assertEqual(_pitick2latex(0 * pi / 2), r'$0$')
     self.assertEqual(_pitick2latex(-1 * pi / 2), r'$-\frac{\pi}{2}$')
     self.assertEqual(_pitick2latex(-2 * pi / 2), r'$-\pi$')
     self.assertEqual(_pitick2latex(0.5), r'0.500')
     self.assertEqual(_pitick2latex(3 * pi + 0.01), r'9.43')
     self.assertEqual(_pitick2latex(30 * pi + 0.01), r'94.3')
     self.assertEqual(_pitick2latex(300 * pi + 0.01), r'942.')
     self.assertEqual(_pitick2latex(3000 * pi + 0.01), r'9.42e+03')
Example #5
0
 def test_pitick2latex(self):
     assert _pitick2latex(3 * pi / 2) == r'$\frac{3\pi}{2}$'
     assert _pitick2latex(2 * pi / 2) == r'$\pi$'
     assert _pitick2latex(1 * pi / 2) == r'$\frac{\pi}{2}$'
     assert _pitick2latex(0 * pi / 2) == r'$0$'
     assert _pitick2latex(-1 * pi / 2) == r'$-\frac{\pi}{2}$'
     assert _pitick2latex(-2 * pi / 2) == r'$-\pi$'
     assert _pitick2latex(0.5) == r'0.500'
     assert _pitick2latex(3 * pi + 0.01) == r'9.43'
     assert _pitick2latex(30 * pi + 0.01) == r'94.3'
     assert _pitick2latex(300 * pi + 0.01) == r'942.'
     assert _pitick2latex(3000 * pi + 0.01) == r'9.42e+03'
Example #6
0
def plot_response(info):
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    mpl.use('Agg')
    from matplotlib.ticker import FuncFormatter

    # set up figure
    fig = plt.figure(figsize=(7, 10), dpi=200)
    gs = fig.add_gridspec(3, 1)
    gs.update(wspace=0.05, hspace=0.10)
    color = {"color": "0.7"}

    # stuff to plot
    amplitude = np.abs(info['resp']) / info['value']
    freqs = info['freqs']
    xmin = freqs[0]
    xmax = freqs[-1]

    # plot Response
    ax1 = fig.add_subplot(gs[0, 0])
    ax1.loglog(freqs, amplitude, linewidth=2, color='black')
    minmax = ax1.get_ylim()
    ax1.set_xlim(xmin, xmax)
    ax1.set_ylim(amplitude[0] * .1, minmax[1])

    # find low freq corner
    lowc, highc = find_flatband2(info['resp'], info['value'])
    if not lowc and not highc:
        lowc, highc = find_flatband(info['resp'], info['value'])
    try:
        lowcf = info['freqs'][lowc]
        highcf = info['freqs'][highc]
    except Exception as e:
        print(f'problem with flatband\n\t{e}')
        lowcf = 0
        highcf = 0
        pass

    # add lines to plot
    ax1.axvline(x=lowcf, ymin=0, ymax=1)
    ax1.axvline(x=highcf, ymin=0, ymax=1)
    # add text
    txt = f"{lowcf:0.3f} Hz"
    ax1.text(x=lowcf,
             y=amplitude[0],
             s=txt,
             fontsize=8,
             ha='center',
             va='top',
             bbox=dict(facecolor='white', edgecolor='black'))
    txt = f"{highcf:0.3f} Hz"
    ax1.text(x=highcf,
             y=amplitude[0],
             s=txt,
             fontsize=8,
             ha='center',
             va='top',
             bbox=dict(facecolor='white', edgecolor='black'))

    # make things look good
    formatter = FuncFormatter(lambda y, _: '{:.16g}'.format(y))
    ax1.xaxis.set_major_formatter(formatter)
    ax1.xaxis.grid(b=True, which="major", **color)
    ax1.yaxis.grid(b=True, which="major", **color)
    ax1.set_ylabel('Amplitude')
    ax1.set_title(info['SEEDid'], fontsize=12)

    # Plot phase
    ax2 = fig.add_subplot(gs[1, 0], sharex=ax1)
    ax2.semilogx()
    ax2.plot(info['freqs'],
             np.angle(info['resp'], deg=False),
             linewidth=2,
             color='black')
    # make pretty labels
    minmax2 = ax2.yaxis.get_data_interval()
    yticks2 = np.arange(minmax2[0] - minmax2[0] % (np.pi / 2),
                        minmax2[1] - minmax2[1] % (np.pi / 2) + np.pi,
                        np.pi / 2)
    ax2.set_yticks(yticks2)
    ax2.set_yticklabels([_pitick2latex(x) for x in yticks2])
    ax2.xaxis.set_major_formatter(formatter)
    ax2.xaxis.grid(b=True, which="major", **color)
    ax2.yaxis.grid(b=True, which="major", **color)
    ax2.set_xlabel('Frequency (Hz)')
    ax2.set_ylabel('Phase [rad]')

    # legend
    pos1 = ax2.get_position()
    newax = [pos1.x0, pos1.y0, pos1.width * .58, pos1.height * .35]
    fig = ax2.get_figure()
    ax4 = fig.add_axes(newax)
    ax4.patch.set_facecolor('lightgray')
    ax4.patch.set_alpha(0.8)
    ax4.xaxis.set_visible(False)
    ax4.yaxis.set_visible(False)
    ax4.set_xlim(0, 10)
    ax4.set_ylim(0, 10)

    in_units, value = convert_units(info['in_units'], info['value'])
    txt = f"ncalib: {value:16.9g} x counts = {in_units}"
    ax4.text(x=0.4, y=8, s=txt, ha="left", fontsize=10)
    txt = f"ncalib evaluated at {info['freq']} Hz"
    ax4.text(x=0.4, y=6, s=txt, ha="left", fontsize=10)
    txt = f'Flatband $(\pm 1\sigma)$: {lowcf:0.3f} - {highcf:0.3f} Hz'
    #    txt+=r"$ (\pm 5 \%)$"
    ax4.text(x=.4, y=4, s=txt, ha="left", fontsize=10)
    txt = f"Nyquist: {info['sps']/2:0.2f} Hz"
    ax4.text(x=.4, y=2, s=txt, ha="left", fontsize=10)

    info['value'] = value
    info['in_units'] = in_units
    plt.savefig(info['outpng'], bbox_inches='tight')
    return info