from qolab.file_utils import save_table_with_header import numpy as np class Trace: def __init__(self, label): self.label = label self.values = None self.unit = None self.tags = {} def plot(self): import matplotlib.pyplot as plt plt.plot(self.values, label=self.descr) plt.legend() def header(self, prefix=''): header = [] if self.label is not None: header.append(f'label = {self.label}') if self.unit is not None: header.append(f'unit = {self.unit}') for k, v in self.tags.items(): header.append(f'{k} = {v}') prefixed_header = [prefix+l for l in header] return prefixed_header def save(self, fname, item_format='e'): save_table_with_header(fname, self.values, self.header(), item_format=item_format) class TraceXY: def __init__(self, label): self.label = label self.tags = {} self.x = None self.y = None def plot(self): import matplotlib.pyplot as plt plt.plot(self.x.values, self.y.values, label=self.label) plt.legend() plt.xlabel(self.x.label) def header(self, prefix=''): header = [] if self.label is not None: header.append(f'label = {self.label}') for k, v in self.tags.items(): header.append(f'{k} = {v}') header.extend(self.x.header(prefix='x_info: ')) header.extend(self.y.header(prefix='y_info: ')) prefixed_header = [prefix+l for l in header] return prefixed_header def save(self, fname, item_format='e'): data=np.concatenate((self.x.values, self.y.values), 1) save_table_with_header(fname, data, self.header(), item_format=item_format) class TraceSetSameX: def __init__(self, label): self.label = label self.tags = {} self.x = None self.traces={} def addTrace(self, tr): if len(self.traces) == 0: self.x = tr.x trY = tr.y self.traces[tr.label]=trY def plot(self): import matplotlib.pyplot as plt nplots = len(self.traces.keys()) cnt=0 for k, tr in self.traces.items(): cnt+=1 if cnt == 1: ax1=plt.subplot(nplots, 1, cnt) else: plt.subplot(nplots, 1, cnt, sharex=ax1) plt.plot(self.x.values, tr.values, label=tr.label) plt.xlabel(self.x.label) plt.legend() def items(self): return (self.traces.items()) def keys(self): return (self.traces.keys()) def getTrace(self, label): tr = TraceXY(label) tr.x = self.x tr.y = self.traces[label] return (tr) def header(self, prefix=''): header = [] if self.label is not None: header.append(f'label = {self.label}') for k, v in self.tags.items(): header.append(f'{k} = {v}') header.extend(self.x.header(prefix='x_info: ')) for k, v in self.traces.items(): header.extend(v.header(prefix=f'{k}_info: ')) prefixed_header = [prefix+l for l in header] return prefixed_header def save(self, fname, item_format='e'): data=self.x.values for k,v in self.traces.items(): data=np.concatenate((data, v.values), 1) save_table_with_header(fname, data, self.header(), item_format=item_format) if __name__ == '__main__': print("Testing trace") x=Trace('x trace') x.values = np.random.normal(2,2,(4,1)) x.values = np.array(x.values, int) x.unit='s' x.tags['x_tag'] = 'xxxx' x.tags['x_tag2'] = 'xxxx' x.write('xtrace.dat') y=Trace('y trace') y.values = np.random.normal(2,2,(4,1)) y.unit='V' y.tags['y_tag'] = 'yyyy' xy=TraceXY('xy trace') xy.tags['xy tag']= 'I am xy tag' xy.x = x xy.y = y xy.write('xytrace.dat') print(xy.header()) xyn = TraceSetSameX('many ys trace') xyn.tags['descr'] = 'I am many ys trace' xy.label='y1' xyn.addTrace(xy) xy.label='y2' xyn.addTrace(xy) xy.label='y3' xyn.addTrace(xy) xyn.write('xyntrace.dat') print(xyn.header())