Add new source data for TIA measurements + plotting
This commit is contained in:
parent
1f629bbadd
commit
77f5ef1b67
45 changed files with 542843 additions and 11 deletions
|
@ -1,4 +1,5 @@
|
|||
|
||||
import os
|
||||
import sys
|
||||
import io
|
||||
import re
|
||||
|
@ -12,7 +13,6 @@ from matplotlib.ticker import EngFormatter
|
|||
|
||||
import colorsys
|
||||
|
||||
import os
|
||||
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
class Re(object):
|
||||
|
@ -40,6 +40,73 @@ def setup_step(plot_data, key):
|
|||
plot_data[key] = next_step;
|
||||
plot_data['steps'].append(next_step);
|
||||
|
||||
def read_simplecsv(filename, plot_config):
|
||||
print(f"Reading CSV file {filename}...");
|
||||
|
||||
series_values = plot_config.get('load_values', ['x', 'y']);
|
||||
series_tags = plot_config.get('load_tags', None);
|
||||
|
||||
plot_data = {
|
||||
'steps': []
|
||||
};
|
||||
|
||||
with io.open(filename, mode='r') as file:
|
||||
column_names = file.readline().rstrip("\n").split(',');
|
||||
|
||||
for line in file:
|
||||
line = line.rstrip("\n").split(',');
|
||||
|
||||
line_data = {};
|
||||
for entry in enumerate(line):
|
||||
column = column_names[entry[0]];
|
||||
|
||||
if(column in series_values):
|
||||
line_data[column] = float(entry[1]);
|
||||
elif(column in (series_tags or [])):
|
||||
line_data[column] = entry[1];
|
||||
|
||||
series_name = "default"
|
||||
if(not (series_tags is None)):
|
||||
series_name = ""
|
||||
for tag in series_tags:
|
||||
series_name = series_name + ' ' + line_data[tag];
|
||||
|
||||
if(not (series_name in plot_data)):
|
||||
new_series = { "step": series_name };
|
||||
for value_name in series_values:
|
||||
new_series[value_name] = [];
|
||||
|
||||
plot_data[series_name] = new_series;
|
||||
plot_data['steps'].append(new_series);
|
||||
|
||||
series = plot_data[series_name];
|
||||
|
||||
for value_name in series_values:
|
||||
series[value_name].append(line_data[value_name]);
|
||||
|
||||
return plot_data
|
||||
|
||||
def read_multicsv(plot_config):
|
||||
series_collection = {
|
||||
'steps': []
|
||||
}
|
||||
|
||||
print("Reading multiple CSV files...")
|
||||
print(plot_config['load'])
|
||||
|
||||
plot_list = plot_config['load']
|
||||
|
||||
for plot_key in plot_list:
|
||||
single_plot_data = read_simplecsv(os.path.join(YAML_DIR, plot_list[plot_key]), plot_config)
|
||||
single_plot_data = single_plot_data['steps'][0]
|
||||
|
||||
single_plot_data['step'] = plot_key
|
||||
|
||||
series_collection[plot_key] = single_plot_data
|
||||
series_collection['steps'].append(single_plot_data)
|
||||
|
||||
return series_collection
|
||||
|
||||
def read_ltspice_file(filename, plot_config):
|
||||
print(f"Reading LTSpice .txt file {filename}...");
|
||||
|
||||
|
@ -100,9 +167,14 @@ def decorate_ax(ax, plot_config):
|
|||
ax.set_xscale(plot_config['xscale']);
|
||||
|
||||
if('xmin' in plot_config):
|
||||
ax.set_xlim(left=plot_config['xmin']);
|
||||
ax.set_xlim(left=plot_config['xmin'])
|
||||
if('xmax' in plot_config):
|
||||
ax.set_xlim(right=plot_config['xmax']);
|
||||
ax.set_xlim(right=plot_config['xmax'])
|
||||
|
||||
if('ymin' in plot_config):
|
||||
ax.set_ylim(bottom=plot_config['ymin']);
|
||||
if('ymax' in plot_config):
|
||||
ax.set_ylim(top=plot_config['ymax']);
|
||||
|
||||
if('xformatter' in plot_config):
|
||||
if('engineering' == plot_config['xformatter']):
|
||||
|
@ -124,6 +196,24 @@ def decorate_ax(ax, plot_config):
|
|||
|
||||
ax.grid(True);
|
||||
|
||||
def plot_single_graph(fig, plot_config, plot_data):
|
||||
ax = fig.add_subplot();
|
||||
|
||||
x_key = plot_config['x_key'] or 'x'
|
||||
y_key = plot_config['y_key'] or 'y'
|
||||
|
||||
plot_data = plot_data['steps'][0]
|
||||
|
||||
x_data = plot_data[x_key];
|
||||
y_data = plot_data[y_key];
|
||||
|
||||
ax.plot(x_data, y_data);
|
||||
|
||||
if(not 'xformatter' in plot_config):
|
||||
plot_config['xformatter'] = 'engineering';
|
||||
|
||||
decorate_ax(ax, plot_config)
|
||||
|
||||
def plot_lt_sweep(fig, plot_config, plot_data):
|
||||
step_keys = plot_data.keys();
|
||||
|
||||
|
@ -139,17 +229,18 @@ def plot_lt_sweep(fig, plot_config, plot_data):
|
|||
y_key = plot_config['y_key'];
|
||||
|
||||
if(y_key == None):
|
||||
raise RuntimeError("No Y-Data Key (`y_key`) specified for plot!");
|
||||
raise RuntimeError("No Y-Data Key (`y_key`) specified for plot!")
|
||||
|
||||
num_steps = len(plot_data['steps']);
|
||||
cmap = plt.cm.coolwarm;
|
||||
|
||||
custom_lines = [matplotlib.lines.Line2D([0], [0], color=cmap(0.), lw=4),
|
||||
matplotlib.lines.Line2D([0], [0], color=cmap(.5), lw=4),
|
||||
matplotlib.lines.Line2D([0], [0], color=cmap(1.), lw=4)];
|
||||
if(plot_config.get('colourmap', 'coolwarm') == 'coolwarm'):
|
||||
num_steps = len(plot_data['steps'])
|
||||
cmap = plt.cm.coolwarm
|
||||
|
||||
for idx, step in enumerate(plot_data['steps']):
|
||||
ax.plot(step[x_key], step[y_key], color=cmap(idx/(num_steps-1)), label=step['step']);
|
||||
for idx, step in enumerate(plot_data['steps']):
|
||||
ax.plot(step[x_key], step[y_key], color=cmap(idx/(num_steps-1)), label=step['step']);
|
||||
else:
|
||||
for idx, step in enumerate(plot_data['steps']):
|
||||
ax.plot(step[x_key], step[y_key], label=step['step']);
|
||||
|
||||
if(not 'xformatter' in plot_config):
|
||||
plot_config['xformatter'] = 'engineering';
|
||||
|
@ -163,6 +254,22 @@ def plot_lt_sweep(fig, plot_config, plot_data):
|
|||
|
||||
decorate_ax(ax, plot_config);
|
||||
|
||||
def perform_bandwidth_normalization(plot_data, plot_config):
|
||||
print("Normalizing bandwidth for all steps...")
|
||||
|
||||
for step in plot_data['steps']:
|
||||
y_data = step[plot_config['y_key']]
|
||||
new_y_data = []
|
||||
|
||||
for datapoint in y_data:
|
||||
new_y_data.append(datapoint - y_data[0])
|
||||
|
||||
step[plot_config['y_key']] = new_y_data
|
||||
|
||||
def perform_processing_step(data_process_step, plot_data, plot_config):
|
||||
if(data_process_step == 'normalize_bandwidth'):
|
||||
perform_bandwidth_normalization(plot_data, plot_config)
|
||||
|
||||
def generate_plot(plot_config):
|
||||
global YAML_DIR;
|
||||
|
||||
|
@ -174,14 +281,28 @@ def generate_plot(plot_config):
|
|||
if(plot_config['loadtype'] == 'ltspice'):
|
||||
plot_data = read_ltspice_file(os.path.join(YAML_DIR, plot_config['load']), plot_config);
|
||||
|
||||
if(plot_config['loadtype'] == 'simplecsv'):
|
||||
plot_data = read_simplecsv(os.path.join(YAML_DIR, plot_config['load']), plot_config);
|
||||
|
||||
if(plot_config['loadtype'] == 'multicsv'):
|
||||
plot_data = read_multicsv(plot_config)
|
||||
|
||||
for data_process_step in plot_config.get('data_processing_steps', []):
|
||||
perform_processing_step(data_process_step, plot_data, plot_config)
|
||||
|
||||
fig = plt.figure();
|
||||
|
||||
if(plot_config['type'] == 'lt_sweep'):
|
||||
plot_lt_sweep(fig, plot_config, plot_data);
|
||||
|
||||
if(plot_config['type'] == 'single'):
|
||||
plot_single_graph(fig, plot_config, plot_data);
|
||||
|
||||
fig.subplots_adjust(0.15, 0.12, 0.96, 0.9)
|
||||
|
||||
fig.savefig(os.path.join(YAML_DIR, plot_config['ofile']), dpi=plot_config.get('dpi', 300));
|
||||
|
||||
matplotlib.pyplot.close()
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue