115 lines
3.9 KiB
Python
115 lines
3.9 KiB
Python
"""
|
|
Module to handle a Qucs Dataset result file.
|
|
"""
|
|
|
|
import re
|
|
import numpy as np
|
|
import pprint as pp
|
|
|
|
class QucsData:
|
|
"""
|
|
Read an store a result file writen by Qucsator.
|
|
"""
|
|
def __init__(self, filename):
|
|
# source dataset
|
|
self.filename = filename
|
|
# qucsator version that generated the data
|
|
self.version = ''
|
|
# list of all variable names
|
|
self.names = []
|
|
# data[name] = array
|
|
self.data = {}
|
|
# data dependent[name]=list(names)
|
|
self.dependent = {}
|
|
|
|
# parse
|
|
self.read(self.filename)
|
|
|
|
def __str__(self):
|
|
"""
|
|
Print self.
|
|
"""
|
|
pr = ''
|
|
pr += 'File name: %s\n' %self.filename
|
|
pr += 'names:\n'
|
|
for name in self.names:
|
|
pr += ' \'%s\': shape %s\n' %(name, self.data[name].shape)
|
|
pr += 'dependent: \n'
|
|
pr += pp.pformat(self.dependent, indent=4)
|
|
pr += '\n'
|
|
return pr
|
|
|
|
def read(self,fileName):
|
|
"""
|
|
Qucs Dataset parser.
|
|
"""
|
|
variable = ''
|
|
with open(fileName) as qucsdata:
|
|
for line in qucsdata:
|
|
# header
|
|
r = re.match(r'\<Qucs Dataset (\d+\.\d+\.\d+)\>', line)
|
|
if r:
|
|
self.version = r.group(1)
|
|
|
|
if '<indep' in line:
|
|
# independent variables
|
|
stripbrackets = str.maketrans(dict.fromkeys("<>"))
|
|
r = re.match(r'(\S+) (\S+) (\d+)', line.translate(stripbrackets))
|
|
kind, identifier, size = r.groups()
|
|
# collect identifiers
|
|
self.names.append(identifier)
|
|
variable = identifier
|
|
continue # next line
|
|
|
|
if '<dep' in line:
|
|
# dependent variables
|
|
# one or more independent, y=f(v,w,...)
|
|
stripbrackets = str.maketrans(dict.fromkeys("<>"))
|
|
r = re.findall('(\S+)', line.translate(stripbrackets))
|
|
identifier = r[1]
|
|
self.dependent[identifier]= r[2:]
|
|
self.names.append(identifier)
|
|
variable = identifier
|
|
continue # next line
|
|
|
|
if '</indep' in line:
|
|
# reached end of independent variable
|
|
# cast from list to numpy array
|
|
values = np.array(self.data[variable])
|
|
self.data[variable] = values
|
|
variable = ''
|
|
continue # next line
|
|
|
|
if '</dep' in line:
|
|
# reached end of dependent variable
|
|
# dependencies are stacked on a single column
|
|
# cast from list to 2D array
|
|
# TODO check for multidimensional ndim > 2
|
|
# <dep Variable axis1 axis2 axis3 ...>
|
|
shape = []
|
|
for dep in self.dependent[variable]:
|
|
size = len(self.data[dep])
|
|
shape.append (size)
|
|
values = np.array(self.data[variable])
|
|
self.data[variable] = values.reshape(tuple(shape),order='F')
|
|
variable = ''
|
|
continue # next line
|
|
|
|
if variable:
|
|
# collect data from line into temporary list
|
|
if variable not in self.data.keys():
|
|
self.data[variable] = []
|
|
value = line.strip()
|
|
if ('j' in value):
|
|
# put imaginary to the end
|
|
value = value.replace("j","")
|
|
value = value+'j'
|
|
value = complex(value)
|
|
else:
|
|
value = float(value)
|
|
self.data[variable].append(value)
|
|
|
|
|
|
|
|
|