Skip to content
Snippets Groups Projects
Commit 83865f08 authored by Jan Dinkelbach's avatar Jan Dinkelbach
Browse files

renaming meas_value to meas_value_ideal and mval to meas_value

parent 9923b0e9
No related branches found
No related tags found
No related merge requests found
......@@ -23,14 +23,14 @@ class MeasType(Enum):
S2_imag = 12 # Reactive Power flow at branch, measured at final node (S2.imag)
class Measurement():
def __init__(self, element, element_type, meas_type, meas_value, unc):
class Measurement:
def __init__(self, element, element_type, meas_type, meas_value_ideal, unc):
"""
Creates a measurement, which is used by the estimation module. Possible types of measurements are: v, p, q, i, Vpmu and Ipmu
@element: pointer to the topology_node / topology_branch (object of class network.Node / network.Branch)
@element_type: clarifies which type of element is considered (object of enum ElemType, e.g. ElemType.Node)
@meas_type: clarifies which quantity is measured (object of enum MeasType, e.g. MeasType.V_mag)
@meas_value: actual measurement value
@meas_value_ideal: ideal measurement value (usually result of a powerflow calculation)
@unc: measurement uncertainty in percent
"""
......@@ -43,33 +43,33 @@ class Measurement():
self.element = element
self.element_type = element_type
self.meas_type = meas_type
self.meas_value = meas_value
self.meas_value_ideal = meas_value_ideal
self.std_dev = unc / 300
self.mval = 0.0 # measured values (affected by uncertainty)
self.meas_value = 0.0 # measured values (affected by uncertainty)
class MeasurementSet():
class MeasurementSet:
def __init__(self):
self.measurements = [] # array with all measurements
def create_measurement(self, element, element_type, meas_type, meas_value, unc):
def create_measurement(self, element, element_type, meas_type, meas_value_ideal, unc):
"""
to add elements to the measurements array
"""
self.measurements.append(Measurement(element, element_type, meas_type, meas_value, unc))
self.measurements.append(Measurement(element, element_type, meas_type, meas_value_ideal, unc))
def update_measurement(self, element_uuid, meas_type, meas_data, value_in_pu=True):
"""
to update the meas_value of a measurment in the measurements array
to update meas_value of a specific measurement object in the measurements array
"""
for meas in self.measurements:
if meas.element.uuid == element_uuid and meas.meas_type == meas_type:
if not value_in_pu:
if meas.meas_type == MeasType.Vpmu_mag:
mval = meas_data / (meas.element.baseVoltage * 1000 / np.sqrt(
meas_value = meas_data / (meas.element.baseVoltage * 1000 / np.sqrt(
3)) # TODO - Fix phase-to-phase voltage problem
meas.mval = mval
meas.meas_value = meas_value
def read_measurements_from_file(self, powerflow_results, file_name):
"""
......@@ -86,80 +86,80 @@ class MeasurementSet():
for uuid in value['uuid']:
pf_node = powerflow_results.get_node(uuid=uuid)
element = pf_node.topology_node
meas_value = np.abs(pf_node.voltage_pu)
self.create_measurement(element, ElemType.Node, MeasType.V_mag, meas_value, unc)
meas_value_ideal = np.abs(pf_node.voltage_pu)
self.create_measurement(element, ElemType.Node, MeasType.V_mag, meas_value_ideal, unc)
elif key == "Imag":
unc = float(value['unc'])
for uuid in value['uuid']:
pf_branch = powerflow_results.get_branch(uuid=uuid)
element = pf_branch.topology_branch
meas_value = np.abs(pf_branch.current_pu)
self.create_measurement(element, ElemType.Branch, MeasType.I_mag, meas_value, unc)
meas_value_ideal = np.abs(pf_branch.current_pu)
self.create_measurement(element, ElemType.Branch, MeasType.I_mag, meas_value_ideal, unc)
elif key == "Pinj":
unc = float(value['unc'])
for uuid in value['uuid']:
pf_node = powerflow_results.get_node(uuid=uuid)
element = pf_node.topology_node
meas_value = pf_node.power_pu.real
self.create_measurement(element, ElemType.Node, MeasType.Sinj_real, meas_value, unc)
meas_value_ideal = pf_node.power_pu.real
self.create_measurement(element, ElemType.Node, MeasType.Sinj_real, meas_value_ideal, unc)
elif key == "Qinj":
unc = float(value['unc'])
for uuid in value['uuid']:
pf_node = powerflow_results.get_node(uuid=uuid)
element = pf_node.topology_node
meas_value = pf_node.power_pu.imag
self.create_measurement(element, ElemType.Node, MeasType.Sinj_imag, meas_value, unc)
meas_value_ideal = pf_node.power_pu.imag
self.create_measurement(element, ElemType.Node, MeasType.Sinj_imag, meas_value_ideal, unc)
elif key == "P1":
unc = float(value['unc'])
for uuid in value['uuid']:
pf_branch = powerflow_results.get_branch(uuid=uuid)
element = pf_branch.topology_branch
meas_value = pf_branch.power_pu.real
self.create_measurement(element, ElemType.Branch, MeasType.S1_real, meas_value, unc)
meas_value_ideal = pf_branch.power_pu.real
self.create_measurement(element, ElemType.Branch, MeasType.S1_real, meas_value_ideal, unc)
elif key == "Q1":
unc = float(value['unc'])
for uuid in value['uuid']:
pf_branch = powerflow_results.get_branch(uuid=uuid)
element = pf_branch.topology_branch
meas_value = pf_branch.power_pu.imag
self.create_measurement(element, ElemType.Branch, MeasType.S1_imag, meas_value, unc)
meas_value_ideal = pf_branch.power_pu.imag
self.create_measurement(element, ElemType.Branch, MeasType.S1_imag, meas_value_ideal, unc)
elif key == "P2":
unc = float(value['unc'])
for uuid in value['uuid']:
pf_branch = powerflow_results.get_branch(uuid=uuid)
element = pf_branch.topology_branch
meas_value = pf_branch.power2_pu.real
self.create_measurement(element, ElemType.Branch, MeasType.S2_real, meas_value, unc)
meas_value_ideal = pf_branch.power2_pu.real
self.create_measurement(element, ElemType.Branch, MeasType.S2_real, meas_value_ideal, unc)
elif key == "Q2":
unc = float(value['unc'])
for uuid in value['uuid']:
pf_branch = powerflow_results.get_branch(uuid=uuid)
element = pf_branch.topology_branch
meas_value = pf_branch.power2_pu.imag
self.create_measurement(element, ElemType.Branch, MeasType.S2_imag, meas_value, unc)
meas_value_ideal = pf_branch.power2_pu.imag
self.create_measurement(element, ElemType.Branch, MeasType.S2_imag, meas_value_ideal, unc)
elif key == "Vpmu":
unc_mag = float(value['unc_mag'])
unc_phase = float(value['unc_phase'])
for uuid in value['uuid']:
pf_node = powerflow_results.get_node(uuid=uuid)
element = pf_node.topology_node
meas_value_mag = np.abs(pf_node.voltage_pu)
self.create_measurement(element, ElemType.Node, MeasType.Vpmu_mag, meas_value_mag, unc_mag)
meas_value_ideal_mag = np.abs(pf_node.voltage_pu)
self.create_measurement(element, ElemType.Node, MeasType.Vpmu_mag, meas_value_ideal_mag, unc_mag)
for uuid in value['uuid']:
pf_node = powerflow_results.get_node(uuid=uuid)
element = pf_node.topology_node
meas_value_phase = np.angle(pf_node.voltage_pu)
self.create_measurement(element, ElemType.Node, MeasType.Vpmu_phase, meas_value_phase, unc_phase)
meas_value_ideal_phase = np.angle(pf_node.voltage_pu)
self.create_measurement(element, ElemType.Node, MeasType.Vpmu_phase, meas_value_ideal_phase, unc_phase)
elif key == "Ipmu":
unc_mag = float(value['unc_mag'])
unc_phase = float(value['unc_phase'])
for uuid in value['uuid']:
pf_branch = powerflow_results.get_branch(uuid=uuid)
element = pf_branch.topology_branch
meas_value_mag = np.abs(pf_branch.current_pu)
meas_value_phase = np.angle(pf_branch.current_pu)
self.create_measurement(element, ElemType.Branch, MeasType.Ipmu_mag, meas_value_mag, unc_mag)
self.create_measurement(element, ElemType.Branch, MeasType.Ipmu_phase, meas_value_phase, unc_phase)
meas_value_ideal_mag = np.abs(pf_branch.current_pu)
meas_value_ideal_phase = np.angle(pf_branch.current_pu)
self.create_measurement(element, ElemType.Branch, MeasType.Ipmu_mag, meas_value_ideal_mag, unc_mag)
self.create_measurement(element, ElemType.Branch, MeasType.Ipmu_phase, meas_value_ideal_phase, unc_phase)
def meas_creation(self, dist="normal", seed=None):
"""
......@@ -176,18 +176,18 @@ class MeasurementSet():
err_pu = np.random.normal(0, 1, len(self.measurements))
for index, measurement in enumerate(self.measurements):
if measurement.meas_type not in [MeasType.Ipmu_phase, MeasType.Vpmu_phase]:
zdev = measurement.meas_value * measurement.std_dev
zdev = measurement.meas_value_ideal * measurement.std_dev
elif measurement.meas_type in [MeasType.Ipmu_phase, MeasType.Vpmu_phase]:
zdev = measurement.std_dev
measurement.mval = measurement.meas_value + zdev * err_pu[index]
measurement.meas_value = measurement.meas_value_ideal + zdev * err_pu[index]
elif dist == "uniform":
err_pu = np.random.uniform(-1, 1, len(self.measurements))
for index, measurement in enumerate(self.measurements):
if measurement.meas_type not in [MeasType.Ipmu_phase, MeasType.Vpmu_phase]:
zdev = (measurement.meas_value * measurement.std_dev)
zdev = (measurement.meas_value_ideal * measurement.std_dev)
elif measurement.meas_type in [MeasType.Ipmu_phase, MeasType.Vpmu_phase]:
zdev = measurement.std_dev
measurement.mval = measurement.meas_value + np.multiply(3 * zdev, err_pu[index])
measurement.meas_value = measurement.meas_value_ideal + np.multiply(3 * zdev, err_pu[index])
def meas_creation_test(self, err_pu):
"""
......@@ -197,12 +197,12 @@ class MeasurementSet():
"""
for index, measurement in enumerate(self.measurements):
if measurement.meas_type not in [MeasType.Ipmu_phase, MeasType.Vpmu_phase]:
measurement.std_dev = np.absolute(measurement.meas_value) * measurement.std_dev
measurement.std_dev = np.absolute(measurement.meas_value_ideal) * measurement.std_dev
elif measurement.meas_type in [MeasType.Ipmu_phase, MeasType.Vpmu_phase]:
measurement.std_dev = measurement.std_dev
measurement.mval = measurement.meas_value + measurement.std_dev * err_pu[index]
measurement.meas_value = measurement.meas_value_ideal + measurement.std_dev * err_pu[index]
# measurement.mval = measurement.meas_value + measurement.std_dev*err_pu[index]
# measurement.meas_value = measurement.meas_value_ideal + measurement.std_dev*err_pu[index]
def getMeasurements(self, type):
"""
......@@ -252,24 +252,24 @@ class MeasurementSet():
return weights
def getmVal(self):
def getMeasValues(self):
"""
returns an array with all measured values (affected by uncertainty)
"""
mVal = np.zeros(len(self.measurements))
meas_real = np.zeros(len(self.measurements))
for index, measurement in enumerate(self.measurements):
mVal[index] = measurement.mval
meas_real[index] = measurement.meas_value
""" Replace in mVal amplitude and phase of Vpmu by real and imaginary part """
""" Replace in meas_real amplitude and phase of Vpmu by real and imaginary part """
# get all measurements of type MeasType.Vpmu_mag
Vpmu_mag_idx = self.getIndexOfMeasurements(type=MeasType.Vpmu_mag)
# get all measurements of type MeasType.Vpmu_phase
Vpmu_phase_idx = self.getIndexOfMeasurements(type=MeasType.Vpmu_phase)
for vpmu_mag_index, vpmu_phase_index in zip(Vpmu_mag_idx, Vpmu_phase_idx):
vamp = self.measurements[vpmu_mag_index].mval
vtheta = self.measurements[vpmu_phase_index].mval
mVal[vpmu_mag_index] = vamp * np.cos(vtheta)
mVal[vpmu_phase_index] = vamp * np.sin(vtheta)
vamp = self.measurements[vpmu_mag_index].meas_value
vtheta = self.measurements[vpmu_phase_index].meas_value
meas_real[vpmu_mag_index] = vamp * np.cos(vtheta)
meas_real[vpmu_phase_index] = vamp * np.sin(vtheta)
""" Replace in z amplitude and phase of Ipmu by real and imaginary part """
# get all measurements of type MeasType.Ipmu_mag
......@@ -277,12 +277,12 @@ class MeasurementSet():
# get all measurements of type MeasType.Ipmu_phase
Ipmu_phase_idx = self.getIndexOfMeasurements(type=MeasType.Ipmu_phase)
for ipmu_mag_index, ipmu_phase_index in zip(Ipmu_mag_idx, Ipmu_phase_idx):
iamp = self.measurements[ipmu_mag_index].mval
itheta = self.measurements[ipmu_phase_index].mval
mVal[ipmu_mag_index] = iamp * np.cos(itheta)
mVal[ipmu_phase_index] = iamp * np.sin(itheta)
iamp = self.measurements[ipmu_mag_index].meas_value
itheta = self.measurements[ipmu_phase_index].meas_value
meas_real[ipmu_mag_index] = iamp * np.cos(itheta)
meas_real[ipmu_phase_index] = iamp * np.sin(itheta)
return mVal
return meas_real
def getStd_Dev(self):
"""
......@@ -295,7 +295,7 @@ class MeasurementSet():
return std_dev
def getMeasValues(self, type=None):
def getIdealMeasValues(self, type=None):
"""
for test purposes
returns an array with all measured values
......@@ -303,34 +303,34 @@ class MeasurementSet():
if type is None:
meas_val = np.zeros(len(self.measurements))
for index, measurement in enumerate(self.measurements):
meas_val[index] = measurement.meas_value
meas_val[index] = measurement.meas_value_ideal
else:
meas_val = np.zeros(self.getNumberOfMeasurements(type=type))
idx = 0
for index, measurement in enumerate(self.measurements):
if measurement.meas_type is type:
meas_val[idx] = measurement.meas_value
meas_val[idx] = measurement.meas_value_ideal
idx += 1
return meas_val
def getmVal_test(self, type=None):
def getMeasValuesTest(self, type=None):
"""
returns an array with all measured values (affected by uncertainty)
"""
if type is None:
mVal = np.zeros(len(self.measurements))
meas_real = np.zeros(len(self.measurements))
for index, measurement in enumerate(self.measurements):
mVal[index] = measurement.mval
meas_real[index] = measurement.meas_value
else:
mVal = np.zeros(self.getNumberOfMeasurements(type=type))
meas_real = np.zeros(self.getNumberOfMeasurements(type=type))
idx = 0
for index, measurement in enumerate(self.measurements):
if measurement.meas_type is type:
mVal[idx] = measurement.mval
meas_real[idx] = measurement.meas_value
idx += 1
return mVal
return meas_real
@staticmethod
def mergeMeasurementSets(meas_set_1, meas_set_2):
......
......@@ -95,7 +95,7 @@ def DsseTrad(nodes_num, measurements, Gmatrix, Bmatrix, Yabs_matrix, Yphase_matr
q2br = measurements.getIndexOfMeasurements(type=MeasType.S2_imag)
# get an array with all measured values (affected by uncertainty)
z = measurements.getmVal()
z = measurements.getMeasValues()
V = np.ones(nodes_num) + 1j * np.zeros(nodes_num)
State = np.concatenate((np.ones(nodes_num), np.zeros(nodes_num)), axis=0)
......@@ -187,7 +187,7 @@ def DssePmu(nodes_num, measurements, Gmatrix, Bmatrix, Adj):
W = update_W_matrix(measurements, weights, W, "Ipmu")
# get an array with all measured values (affected by uncertainty)
z = measurements.getmVal()
z = measurements.getMeasValues()
H = np.concatenate((H2, H3, H4, H5, H7, H8, H9, H10), axis=0)
WH = np.inner(W, H.transpose())
......@@ -205,7 +205,7 @@ def DssePmu(nodes_num, measurements, Gmatrix, Bmatrix, Adj):
q2br = measurements.getIndexOfMeasurements(type=MeasType.S2_imag)
# get an array with all measured values (affected by uncertainty)
z = measurements.getmVal()
z = measurements.getMeasValues()
V = np.ones(nodes_num) + 1j * np.zeros(nodes_num)
State = np.concatenate((np.ones(nodes_num), np.zeros(nodes_num)), axis=0)
......@@ -291,7 +291,7 @@ def DsseMixed(nodes_num, measurements, Gmatrix, Bmatrix, Yabs_matrix, Yphase_mat
q2br = measurements.getIndexOfMeasurements(type=MeasType.S2_imag)
# get an array with all measured values (affected by uncertainty)
z = measurements.getmVal()
z = measurements.getMeasValues()
V = np.ones(nodes_num) + 1j * np.zeros(nodes_num)
State = np.concatenate((np.ones(nodes_num), np.zeros(nodes_num)), axis=0)
......@@ -499,8 +499,8 @@ def calculateJacobiVoltagePmu(measurements, nodes_num, Gmatrix, Bmatrix):
# TODO: index of Vmag = index of Vphase???
for index, measurement in enumerate(Vpmu_mag_meas):
vamp = measurement.meas_value
vtheta = Vpmu_phase_meas[index].meas_value
vamp = measurement.meas_value_ideal
vtheta = Vpmu_phase_meas[index].meas_value_ideal
m = measurement.element.index
H7[index][m] = 1
m2 = m + nodes_num
......@@ -530,8 +530,8 @@ def calculateJacobiCurrentPmu(measurements, nodes_num, Gmatrix, Bmatrix):
H10 = np.zeros((len(Ipmu_mag_meas), 2 * nodes_num))
for index, measurement in enumerate(Ipmu_mag_meas):
iamp = measurement.meas_value
itheta = Ipmu_phase_meas[index].meas_value
iamp = measurement.meas_value_ideal
itheta = Ipmu_phase_meas[index].meas_value_ideal
m = measurement.element.start_node.index
n = measurement.element.end_node.index
H9[index][m] = - Gmatrix[m][n]
......@@ -571,8 +571,8 @@ def update_W_matrix(measurements, weights, W, type):
index_phase = measurements.getIndexOfMeasurements(MeasType.Ipmu_phase)
for index, (idx_mag, idx_theta) in enumerate(zip(index_mag, index_phase)):
value_amp = measurements.measurements[idx_mag].mval
value_theta = measurements.measurements[idx_theta].mval
value_amp = measurements.measurements[idx_mag].meas_value
value_theta = measurements.measurements[idx_theta].meas_value
rot_mat = np.array([[np.cos(value_theta), - value_amp * np.sin(value_theta)],
[np.sin(value_theta), value_amp * np.cos(value_theta)]])
starting_cov = np.array([[weights[idx_mag], 0], [0, weights[idx_theta]]])
......@@ -693,16 +693,16 @@ def convertSinjMeasIntoCurrents(measurements, V, z, pidx, qidx):
@param measurements: Vector of measurements in Input (voltages, currents, powers)
@param V: vector of the estimated voltages
@param z: array with all measured values (affected by uncertainty) --> MeasurementSet.getmVal
@param z: array with all measured values (affected by uncertainty) --> MeasurementSet.getMeasValues
@param pidx: array which contains the index of measurements type Sinj_real in measurements.measurements
@param qidx: array which contains the index of measurements type Sinj_imag in measurements.measurements
returns: updated z array
"""
for p_index, q_index in zip(pidx, qidx):
# get values of the measurements p_inj and q_inj (affected by uncertainty-->mval)
p_inj = measurements.measurements[p_index].mval
q_inj = measurements.measurements[q_index].mval
# get values of the measurements p_inj and q_inj (affected by uncertainty-->meas_value)
p_inj = measurements.measurements[p_index].meas_value
q_inj = measurements.measurements[q_index].meas_value
# get index of the node
node_index = measurements.measurements[
p_index].element.index # == measurements.measurements[q_index].element.index
......@@ -720,7 +720,7 @@ def convertSbranchMeasIntoCurrents(measurements, V, z, p1br, q1br, p2br, q2br):
@param measurements: Vector of measurements in Input (voltages, currents, powers)
@param V: vector of the estimated voltages
@param z: array with all measured values (affected by uncertainty) --> MeasurementSet.getmVal
@param z: array with all measured values (affected by uncertainty) --> MeasurementSet.getMeasValues
@param p1br: array which contains the index of measurements type S1_real in measurements.measurements
@param q1br: array which contains the index of measurements type S1_imag in measurements.measurements
@param p2br: array which contains the index of measurements type S2_real in measurements.measurements
......@@ -728,9 +728,9 @@ def convertSbranchMeasIntoCurrents(measurements, V, z, p1br, q1br, p2br, q2br):
returns: updated z array
"""
for pbr_index, qbr_index in zip(p1br, q1br):
# get values of the measurements pbr_inj and qbr_inj (affected by uncertainty-->mval)
p_br = measurements.measurements[pbr_index].mval
q_br = measurements.measurements[qbr_index].mval
# get values of the measurements pbr_inj and qbr_inj (affected by uncertainty-->meas_value)
p_br = measurements.measurements[pbr_index].meas_value
q_br = measurements.measurements[qbr_index].meas_value
# get index of the start node
node_index = measurements.measurements[
pbr_index].element.start_node.index # == measurements.measurements[qbr_index].element.start_node.index
......@@ -738,9 +738,9 @@ def convertSbranchMeasIntoCurrents(measurements, V, z, p1br, q1br, p2br, q2br):
z[qbr_index] = (p_br * V[node_index].imag - q_br * V[node_index].real) / (np.absolute(V[node_index]) ** 2)
for pbr_index, qbr_index in zip(p2br, q2br):
# get values of the measurements pbr_inj and qbr_inj (affected by uncertainty-->mval)
p_br = measurements.measurements[pbr_index].mval
q_br = measurements.measurements[qbr_index].mval
# get values of the measurements pbr_inj and qbr_inj (affected by uncertainty-->meas_value)
p_br = measurements.measurements[pbr_index].meas_value
q_br = measurements.measurements[qbr_index].meas_value
# get index of the start node
node_index = measurements.measurements[
pbr_index].element.end_node.index # == measurements.measurements[qbr_index].element.start_node.index
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment