def make_matrices(self, db, header): matrices, vectors, scalars = match_matrix_names(header) for matrix, value in matrices.items(): a = [(i, j) for x, i, j, y in value] a.sort() arrays = [] for i, j in a: vname = "%s[%s,%s]" % (matrix, i, j) arrays.append(np.array(db.vardata[vname])[:, np.newaxis]) dims = db.vardata["%s[%s,%s]" % (matrix, i, j)].dims X = np.concatenate(arrays, 1) I, J = map(set, zip(*a)) X.shape = X.shape[:1] + (len(I), len(J)) db.vardata[matrix] = make_matrix(X, dims) idx = min([db.vardata.order.index("%s[%s,%s]" % (matrix, i, j)) for i, j in a]) for i, j in a: del db.vardata["%s[%s,%s]" % (matrix, i, j)] del db.vardata.order[db.vardata.order.index(matrix)] db.vardata.order.insert(idx, matrix) for matrix, value in vectors.items(): a = [(i,) for x, i, y in value] a.sort() fmt = "%s[%%s]" % (matrix,) arrays = [np.array(db.vardata[fmt % i])[:, np.newaxis] for i, in a] dims = db.vardata["%s[%s]" % (matrix, i)].dims X = np.concatenate(arrays, 1) X.shape = X.shape[:1] + (len(a),) db.vardata[matrix] = make_vector(X, dims) idx = min([db.vardata.order.index("%s[%s]" % (matrix, i)) for i, in a]) for (i,) in a: del db.vardata["%s[%s]" % (matrix, i)] del db.vardata.order[db.vardata.order.index(matrix)] db.vardata.order.insert(idx, matrix)
def combine_elements_to_matrix(data, name): reg = re.compile("%s([0-9])([0-9])" % name) i_idx = set() j_idx = set() vnames = [] for v in data.vardata: res = reg.match(v) if res: i_idx.add(int(res.groups()[0])) j_idx.add(int(res.groups()[1])) vnames.append(v) if vnames and len(i_idx) * len(j_idx) == len(vnames): i_indices = sorted(i_idx) j_indices = sorted(j_idx) ex = data["%s%d%d" % (name, list(i_idx)[0], list(j_idx)[0])] shape = ex.shape x = np.empty(shape + ( len(i_indices), len(j_indices), ), dtype=ex.dtype) for i, j in itertools.product(i_indices, j_indices): val = data["%s%d%d" % (name, i, j)] x[..., i_indices.index(i), j_indices.index(j), ] = val else: msg = "Can not build complete matrix using elements with name %r" raise Exception(msg % name) data[name] = make_matrix(np.array(x), dims=ex.dims) return data
def proc_info(info, f, data, fn, noisedata): info_list = info.upper().split() if len(info_list) == 5: info = freq_mult, twoporttype, datatype, rtype, z0 = info_list elif len(info_list) == 3: info = freq_mult, twoporttype, datatype = info_list z0 = 1. else: msg = ("# format should only have 5 values this one has %d" % len(info_list)) raise TouchstoneError(msg) z0 = float(z0) f = f * freqmultdict[freq_mult] if fn is not None: fn = fn * freqmultdict[freq_mult] convfunc = dict(RI=re_im_to_complex, DB=dB_angle_to_complex, MA=mag_angle_to_complex) if datatype not in convfunc: pars = datatype msg = "Unknown dataformat: %s, valid formats: RI, DB, MAG" % pars raise TouchstoneError(msg) out = np.empty((data.shape[0], data.shape[1] // 2), dtype=np.complex128) out[...] = convfunc[datatype](data[:, ::2], data[:, 1::2]) if out.shape[1] == 1: out.shape = (out.shape[0], 1, 1) elif out.shape[1] == 4: out.shape = (out.shape[0], 2, 2) out = out.transpose(0, 2, 1) else: N = int(sqrt(out.shape[1])) out.shape = (out.shape[0], N, N) dims = (DimSweep("freq", f, unit="Hz"), ) if fn is not None and len(f) == len(fn) and np.allclose(f, fn): noisedims = dims elif fn is None: noisedims = None else: noisedims = (DimSweep("freqn", fn, unit="Hz"), ) out = make_matrix(out, dims) f = hfarray(f, dims) db = DataBlock() db[info[1]] = out if noisedata is not None: db.Rn = hfarray(noisedata[..., -1], dims=noisedims) * z0 db.Fmin = 10 ** (hfarray(noisedata[..., 0], dims=noisedims) / 10) db.Gopt = hfarray(convfunc[datatype](noisedata[:, 1], noisedata[:, 2]), dims=noisedims) db.Z0 = hfarray(z0, unit="Ohm") return db
def proc_info(info, f, data, fn, noisedata): info_list = info.upper().split() if len(info_list) == 5: info = freq_mult, twoporttype, datatype, rtype, z0 = info_list elif len(info_list) == 3: info = freq_mult, twoporttype, datatype = info_list z0 = 1. else: msg = ("# format should only have 5 values this one has %d" % len(info_list)) raise TouchstoneError(msg) z0 = float(z0) f = f * freqmultdict[freq_mult] if fn is not None: fn = fn * freqmultdict[freq_mult] convfunc = dict(RI=re_im_to_complex, DB=dB_angle_to_complex, MA=mag_angle_to_complex) if datatype not in convfunc: pars = datatype msg = "Unknown dataformat: %s, valid formats: RI, DB, MAG" % pars raise TouchstoneError(msg) out = np.empty((data.shape[0], data.shape[1] // 2), dtype=np.complex128) out[...] = convfunc[datatype](data[:, ::2], data[:, 1::2]) if out.shape[1] == 1: out.shape = (out.shape[0], 1, 1) elif out.shape[1] == 4: out.shape = (out.shape[0], 2, 2) out = out.transpose(0, 2, 1) else: N = int(sqrt(out.shape[1])) out.shape = (out.shape[0], N, N) dims = (DimSweep("freq", f, unit="Hz"), ) if fn is not None and len(f) == len(fn) and np.allclose(f, fn): noisedims = dims elif fn is None: noisedims = None else: noisedims = (DimSweep("freqn", fn, unit="Hz"), ) out = make_matrix(out, dims) f = hfarray(f, dims) db = DataBlock() db[info[1]] = out if noisedata is not None: db.Rn = hfarray(noisedata[..., -1], dims=noisedims) * z0 db.Fmin = 10**(hfarray(noisedata[..., 0], dims=noisedims) / 10) db.Gopt = hfarray(convfunc[datatype](noisedata[:, 1], noisedata[:, 2]), dims=noisedims) db.Z0 = hfarray(z0, unit="Ohm") return db
def build_data(data): out = build_meas_state(data) for k, v in build_measmnt(data).items(): out[k] = hfarray(v) data = data["data"][0, 0] type = data["type"][0, 0][0] Z0 = float(data["reference"][0, 0][0][0]) freq = DimSweep("freq", data["freq"][0, 0][:, 0], unit="Hz") arraydata = data["data"][0, 0][0]["mtrx"][0].transpose((2, 0, 1)) if arraydata.dtype.name.startswith("unicode"): arraydata = np.char.encode(arraydata, "cp1252", errors="replace") if np.isrealobj(arraydata): arraydata = array(arraydata, np.float64) S = make_matrix(arraydata, (freq, )) Scov = data["datacov"][0, 0] out[type] = S out["Z0"] = hfarray(Z0) if "Date" in out: try: out["Date"] = hfarray( array(datetime.datetime.strptime(out["Date"].flatten()[0], "%d-%b-%Y %H:%M:%S"), dtype="M8[us]")) except ValueError: pass if Scov.size: Scov = make_matrix(Scov[0]["mtrx"][0].transpose((2, 0, 1)), (freq, )) out["%scov" % type] = Scov for k, v in out.vardata.items(): if k in ["V1", "V2", "V1_SET", "V2_SET"]: v.unit = "V" for k, v in out.vardata.items(): if k in ["I1", "I2", "I1_SET", "I2_SET"]: v.unit = "A" for k, v in out.vardata.items(): if k in ["Z0"]: v.unit = "Ohm" return out
def build_data(data): out = build_meas_state(data) for k, v in build_measmnt(data).items(): out[k] = hfarray(v) data = data["data"][0, 0] type = data["type"][0, 0][0] Z0 = float(data["reference"][0, 0][0][0]) freq = DimSweep("freq", data["freq"][0, 0][:, 0], unit="Hz") arraydata = data["data"][0, 0][0]["mtrx"][0].transpose((2,0,1)) if arraydata.dtype.name.startswith("unicode"): arraydata = np.char.encode(arraydata, "cp1252", errors="replace") if np.isrealobj(arraydata): arraydata = array(arraydata, np.float64) S = make_matrix(arraydata, (freq,)) Scov = data["datacov"][0, 0] out[type] = S out["Z0"] = hfarray(Z0) if "Date" in out: try: out["Date"] = hfarray(array(datetime.datetime.strptime(out["Date"].flatten()[0], "%d-%b-%Y %H:%M:%S"), dtype="M8[us]")) except ValueError: pass if Scov.size: Scov = make_matrix(Scov[0]["mtrx"][0].transpose((2,0,1)), (freq,)) out["%scov"%type] = Scov for k,v in out.vardata.items(): if k in ["V1", "V2", "V1_SET", "V2_SET"]: v.unit = "V" for k,v in out.vardata.items(): if k in ["I1", "I2", "I1_SET", "I2_SET"]: v.unit = "A" for k,v in out.vardata.items(): if k in ["Z0"]: v.unit = "Ohm" return out
def _make_matrix_from_block(self, block): matrices = {} for matcher in self.match_matrix_element_name: matrices.update( match_matrix_elements(block.vardata.keys(), matcher)) for vname, (elems, i_indices, j_indices) in matrices.items(): ex = block[elems[0]] shape = ex.shape x = np.empty(shape + (len(i_indices) * len(j_indices), ), dtype=ex.dtype) for idx, elem in enumerate(elems): x[..., idx] = block[elem] del block[elem] x.shape = shape + ( len(i_indices), len(j_indices), ) block[vname] = make_matrix(x, dims=ex.dims)
def make_matrices(self, db, header): matrices, vectors, scalars = match_matrix_names(header) for matrix, value in matrices.items(): a = [(i, j) for x, i, j, y in value] a.sort() arrays = [] for i, j in a: vname = "%s[%s,%s]" % (matrix, i, j) arrays.append(np.array(db.vardata[vname])[:, np.newaxis]) dims = db.vardata["%s[%s,%s]" % (matrix, i, j)].dims X = np.concatenate(arrays, 1) I, J = map(set, zip(*a)) X.shape = X.shape[:1] + (len(I), len(J)) db.vardata[matrix] = make_matrix(X, dims) idx = min([ db.vardata.order.index("%s[%s,%s]" % (matrix, i, j)) for i, j in a ]) for i, j in a: del db.vardata["%s[%s,%s]" % (matrix, i, j)] del db.vardata.order[db.vardata.order.index(matrix)] db.vardata.order.insert(idx, matrix) for matrix, value in vectors.items(): a = [(i, ) for x, i, y in value] a.sort() fmt = "%s[%%s]" % (matrix, ) arrays = [np.array(db.vardata[fmt % i])[:, np.newaxis] for i, in a] dims = db.vardata["%s[%s]" % (matrix, i)].dims X = np.concatenate(arrays, 1) X.shape = X.shape[:1] + (len(a), ) db.vardata[matrix] = make_vector(X, dims) idx = min( [db.vardata.order.index("%s[%s]" % (matrix, i)) for i, in a]) for i, in a: del db.vardata["%s[%s]" % (matrix, i)] del db.vardata.order[db.vardata.order.index(matrix)] db.vardata.order.insert(idx, matrix)