From 910f7743b1de63f373a75b238802c3af556e27c1 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 25 Jul 2018 18:18:20 -0700 Subject: [PATCH] Roughed out cadence results plotting code. --- .gitignore | 2 +- cadenceResults.py | 92 +++++++++++++++++++++++++++++++++ parsePy.py | 129 ++++++++++++++++++++++++++++++++++++++++++++++ tankPlot.py | 10 +++- 4 files changed, 231 insertions(+), 2 deletions(-) create mode 100755 cadenceResults.py create mode 100644 parsePy.py diff --git a/.gitignore b/.gitignore index f09f725..646d465 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Figures directory figures* -fromMat +from* # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/cadenceResults.py b/cadenceResults.py new file mode 100755 index 0000000..24bc9de --- /dev/null +++ b/cadenceResults.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +import os +import argparse +import numpy as np +import matplotlib +################################################################################ +args_parser = argparse.ArgumentParser() +args_parser.add_argument('-n', type=int, default=1, + help='plot testing number') +args_parser.add_argument('--save','-s', action='store_true', + help='save to files') +args_parser.add_argument('--raster','-r', action='store_true', + help='save as raster') +args_parser.add_argument('--debug','-d', action='store_true', + help='hold for debugging') +args_parser.add_argument('--headless','-q', action='store_true', + help='Remain neadless even if we aren\'t saving files.') +args = args_parser.parse_args() + +################################################################################ +if args.raster: + args.save = True + fig_ext = 'png' +else: + fig_ext = 'pdf' + +################################################################################ +HEADLESS = not 'DISPLAY' in os.environ.keys() +if args.headless: HEADLESS = True # Override Manually if request +if HEADLESS: matplotlib.use('Agg') + +from matplotlib import rcParams, pyplot as pp +from collections import namedtuple +import LPRDefaultPlotting +################################################################################ + +# Override the defaults for this script +figScaleSize = 1.0 if args.save else 1.6 +rcParams['figure.figsize'] = [3.4*figScaleSize,3*figScaleSize] +default_window_position=['+20+80', '+120+80'] +################################################################################ + +search_curves = ( + ['2018-05-21',3.19], + ['2018-05-25',3.13] + ) + +currentBiasTable = np.load('fromCadence/current_bias.npy') +bias_t_mV = currentBiasTable[0,:]*1e3 +bias_t_mA = currentBiasTable[1,:]*1e3 + +bufferPerformanceTable = np.load('fromCadence/buffer_arrays.npz') +[buffer_bias,buffer_freq,buffer_gain,buffer_phase] = \ + [item[1] for item in bufferPerformanceTable.iteritems()] + +for curve in search_curves: + ind = np.argmin(np.abs(bias_t_mA-curve[1])) + curve.append(ind) + curve.append(bias_t_mV[ind]*1e-3) + +h=[pp.figure() for x in range(2)] +ax=[hT.subplots(1,1) for hT in h] +ax.append(ax[1].twinx()) + + +ax[0].set_xlabel('Gate Bias (mV)') +ax[0].set_ylabel('Current (mA)') +ax[0].plot(bias_t_mV, bias_t_mA) + +ax[1].set_xlabel('Frequency (GHz)') +ax[1].set_ylabel('Gain (dB)') +ax[2].set_ylabel('Phase (deg)') +inds = [curve[2] for curve in search_curves] +bw = 28 +freq_synthetic = np.linspace(-bw/2,bw/2,201)+28 +print(search_curves) +for ind in inds: + GP=np.polyfit(buffer_freq, buffer_gain[:,ind], 2) + PP=np.polyfit(buffer_freq, buffer_phase[:,ind], 2) + #print(" %.2fe-3 x^2 + %.2fe-3 x + %.2fe-3 " % tuple(1e3*P)) + print(ind) + print(GP) + print(PP) + ax[1].plot(freq_synthetic, np.polyval(GP,freq_synthetic)) + ax[2].plot(freq_synthetic, np.polyval(PP,freq_synthetic)) + +ax[1].plot(buffer_freq, buffer_gain[:,inds]) +ax[2].plot(buffer_freq, buffer_phase[:,inds]) + +[aT.grid() for aT in ax] +[hT.tight_layout() for hT in h] +[hT.show() for hT in h] diff --git a/parsePy.py b/parsePy.py new file mode 100644 index 0000000..34ca300 --- /dev/null +++ b/parsePy.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +import os +import argparse +import numpy as np +import matplotlib +################################################################################ +args_parser = argparse.ArgumentParser() +args_parser.add_argument('-n', type=int, default=1, + help='plot testing number') +args_parser.add_argument('--save','-s', action='store_true', + help='save to files') +args_parser.add_argument('--raster','-r', action='store_true', + help='save as raster') +args_parser.add_argument('--debug','-d', action='store_true', + help='hold for debugging') +args_parser.add_argument('--headless','-q', action='store_true', + help='Remain neadless even if we aren\'t saving files.') +args = args_parser.parse_args() + +################################################################################ +if args.raster: + args.save = True + fig_ext = 'png' +else: + fig_ext = 'pdf' + +################################################################################ +HEADLESS = not 'DISPLAY' in os.environ.keys() +if args.headless: HEADLESS = True # Override Manually if request +if HEADLESS: matplotlib.use('Agg') + +from matplotlib import rcParams, pyplot as pp +import skrf as rf +from scipy.io import loadmat +from collections import namedtuple +import LPRDefaultPlotting +################################################################################ + +# Override the defaults for this script +figScaleSize = 1.0 if args.save else 1.6 +rcParams['figure.figsize'] = [3.4*figScaleSize,3*figScaleSize] +default_window_position=['+20+80', '+120+80'] + +################################################################################ + +SRC_DATA_NAMES = [\ + 'Data_2018-05-15-clean', + 'Data_2018-05-16-clean', + 'Data_2018-05-21-clean', + 'Data_2018-05-25-clean'] +SRC_DATA_INDEX = 2 +SRC_DATA_NAME = SRC_DATA_NAMES[SRC_DATA_INDEX] +SRC_DATA_LOC = '/media/ramdisk/' + SRC_DATA_NAME + '/'; +SRC_DATA_SUMMARY = 'dat_clean/' + SRC_DATA_NAME + '_sum.json'; + +FILE_PAT = '%s-trunk2.s2p'; +figdir = 'figures-measured' + +class MeasurementConfig(namedtuple('config', ['r','c','inv','bias'])): + __slots__ = () + @property + def fn_str(self): + return "C%02d_R%1d_I%1d_B%0.4f" % (self.c, self.r, self.inv, self.bias) +Measurement = namedtuple('measurement', ['cfg','gain','phase','f','s21']) + +def dB20(x): + return 20*np.log10(np.abs(x)) +def ang_deg(x): + return 180/np.pi*np.angle(x) +def ang(x): + return np.angle(x) + +# 2018-05-21 +PolyGain=np.array( [ 4.08875413e-03, -5.13017311e-01, 2.54047949e+01]) +PolyPhase=np.array([-1.29541398e-03, 6.74431785e-01, -1.80127388e+02]) +# 2018-05-25 +#PolyGain=np.array( [ 4.06488853e-03, -5.11527396e-01, 2.53053550e+01]) +#PolyPhase=np.array([-1.62202706e-03, 6.94343608e-01, -1.80381551e+02]) + +source_directory='fromMat/Data_2018-05-21-clean_mat/' +source_data_list=['fromMat/Data_2018-05-21-clean_mat/S02bB_C+01dB_M0.mat'] +for filename in os.listdir(source_directory): + filename=source_directory+filename + group_filename_string = filename.split('/')[-1][:-4] + src = loadmat(filename, struct_as_record=False) + + collectedData=[] + for sample in src['data'][0]: + tmp = [sample.__getattribute__(key)[0,0] for key in ['r', 'c', 'inv', 'bias_dp_set']] + pt = MeasurementConfig(r=tmp[0], c=tmp[1], inv=tmp[2], bias=np.float(tmp[3])) + s2p_file = rf.Network(SRC_DATA_LOC + (FILE_PAT % pt.fn_str) ) + + freq = np.squeeze(s2p_file.f*1e-9) + buffer_gain = np.polyval(PolyGain,freq) + buffer_phase = np.polyval(PolyPhase,freq) + buffer_phase = buffer_phase - np.mean(buffer_phase) + sdat = np.squeeze(s2p_file.s21.s) + index = np.squeeze(np.argwhere(freq==28)) + collectedData.append(Measurement(pt, + dB20(sdat[index])-buffer_gain[index], + ang_deg(sdat[index])-buffer_phase[index], + freq, sdat)) + + h=pp.figure() + ax=h.add_subplot(1,1,1, projection='polar') + print("---------------------||------------------------------") + print(" _C R I _Bias_ || Gain Phase ") + print("---------------------||------------------------------") + for imeas in collectedData: + ax.plot(ang(imeas.s21)-buffer_phase, dB20(imeas.s21)-buffer_gain) + print(" %2d %d %d %.4f || %+7.1f dB %+9.2f deg" % \ + (imeas.cfg.c, imeas.cfg.r, imeas.cfg.inv, imeas.cfg.bias, \ + imeas.gain, imeas.phase)) + print("---------------------||------------------------------") + ax.set_ylim(-20,-6) + ax.set_title('Measured Performance') + + old_pos = ax.title.get_position() + ax.title.set_position((old_pos[0], 1.1)) + + h.tight_layout() + if args.save: + h.savefig('%s/%s.%s' % (figdir, + 'PolarGain-%s' % group_filename_string, fig_ext)) + if HEADLESS: + pp.close() + else: + h.show() + break diff --git a/tankPlot.py b/tankPlot.py index 4f7544e..44248d4 100755 --- a/tankPlot.py +++ b/tankPlot.py @@ -266,7 +266,7 @@ if 4 in plot_list or 14 in plot_list: [hT.show() for hT in h4] if 5 in plot_list: - h5 = [pp.figure(figsize=(3.4,3.4)) for x in range(2)] + h5 = [pp.figure(figsize=(3.4,3)) for x in range(2)] ax5 = [] ax5.append(h5[0].add_subplot(1,1,1, projection='smith')) ax5.append(h5[1].add_subplot(1,1,1, projection='polar')) @@ -277,9 +277,17 @@ if 5 in plot_list: ax5[0].set_title('Tank Impedance') ax5[1].set_title('Transfer Function') + # Adjust placement of smith plot + old_pos = ax5[0].title.get_position() + ax5[0].title.set_position((old_pos[0], 1.06)) + p = ax5[0].get_position() + p.set_points([[0, 0.07],[1, 0.86]]) + ax5[0].set_position(p) + old_pos = ax5[1].title.get_position() ax5[1].title.set_position((old_pos[0], 1.1)) h5[1].tight_layout() + #[hT.tight_layout() for hT in h5] if args.save: h5[0].savefig('%s/%s.%s' % (figdir,