Skip to content

measurement

PV_Circuit_Model.measurement

Measurement

Bases: Artifact

Base class for measurement data and simulation comparison.

__init__(measurement_condition=None, measurement_data=None, json_filepath=None, device=None, key_parameters=None, measurement_time=None)

Initialize a measurement instance.

Loads from a JSON file or uses provided measurement data.

Parameters:

Name Type Description Default
measurement_condition Optional[Dict[str, Any]]

Condition metadata.

None
measurement_data Optional[ndarray]

Measurement data array.

None
json_filepath Optional[str]

Path to JSON file to read.

None
device Optional[Any]

Parent device for simulation.

None
key_parameters Optional[Dict[str, Any]]

Precomputed key parameters.

None
measurement_time Optional[datetime]

Timestamp of measurement.

None
Example
import numpy as np
from PV_Circuit_Model.measurement import Measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = Measurement(measurement_condition={"temperature": 25}, measurement_data=data)

simulate(device=None)

Simulate the measurement using the parent device.

Subclasses should implement device-specific simulation logic.

Warning

This is a stub meant to be implemented in subclasses.

Parameters:

Name Type Description Default
device Optional[Any]

Device to simulate; defaults to parent.

None

IV_measurement

Bases: Measurement

IV measurement with Voc, Isc, and Pmax parameters.

__init__(Suns=None, IV_curve=None, temperature=25, measurement_cond_kwargs=None, IL=None, JL=None, json_filepath=None, key_parameters=None, **kwargs)

Initialize an IV measurement.

Normalizes IV curve orientation and populates conditions.

Parameters:

Name Type Description Default
Suns Optional[float]

Irradiance multiplier.

None
IV_curve Optional[ndarray]

IV curve array (2xN or Nx2).

None
temperature float

Temperature in Celsius.

25
measurement_cond_kwargs Optional[Dict[str, Any]]

Extra condition fields.

None
IL Optional[float]

Light current for explicit setting.

None
JL Optional[float]

Light current density for explicit setting.

None
json_filepath Optional[str]

Path to JSON file to read.

None
key_parameters Optional[Dict[str, Any]]

Precomputed key parameters.

None
**kwargs Any

Forwarded to Measurement.

{}

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = IV_measurement(IV_curve=data)

derive_key_parameters(data, key_parameters, conditions) staticmethod

Derive Voc, Isc, and Pmax from IV data.

This updates the key_parameters dict in place.

Parameters:

Name Type Description Default
data ndarray

IV curve array.

required
key_parameters Dict[str, Any]

Output dict for key parameters.

required
conditions Dict[str, Any]

Measurement conditions.

required

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
params = {}
IV_measurement.derive_key_parameters(data, params, {})
"Voc" in params

simulate(device=None)

Simulate IV measurement for a given device.

This updates simulated data and key parameters.

Parameters:

Name Type Description Default
device Optional[Any]

Device to simulate; defaults to parent.

None

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import IV_measurement
from PV_Circuit_Model.device import make_solar_cell
cell = make_solar_cell()
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = IV_measurement(IV_curve=data)
meas.simulate(cell)

plot_func(data, color='black', ax=None, title=None, kwargs=None)

Plot IV data for this measurement.

This uses voltage on the x-axis and current on the y-axis.

Warning

The default kwargs argument is mutable; pass a dict to avoid reuse.

Parameters:

Name Type Description Default
data ndarray

IV curve array.

required
color str

Line color.

'black'
ax Optional[Any]

Matplotlib Axes to draw into.

None
title Optional[str]

Plot title.

None
kwargs Optional[Dict[str, Any]]

Matplotlib plot kwargs.

None

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = IV_measurement(IV_curve=data)
meas.plot_func(data)

Light_IV_measurement

Bases: IV_measurement

Light IV measurement (inherits IV_measurement).

Uses standard IV metrics for illuminated conditions.

Example
import numpy as np
from PV_Circuit_Model.measurement import Light_IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = Light_IV_measurement(IV_curve=data)
meas.keys

Dark_IV_measurement

Bases: IV_measurement

Dark IV measurement with shunt conductance extraction.

Adds log_shunt_cond and I_bias key parameters.

Example
import numpy as np
from PV_Circuit_Model.measurement import Dark_IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = Dark_IV_measurement(IV_curve=data)
meas.keys

__init__(Suns=None, IV_curve=None, temperature=25, measurement_cond_kwargs=None, IL=None, JL=None, json_filepath=None)

Initialize a dark IV measurement.

Normalizes IV curve orientation and computes base point.

Parameters:

Name Type Description Default
Suns Optional[float]

Irradiance multiplier.

None
IV_curve Optional[ndarray]

IV curve array (2xN or Nx2).

None
temperature float

Temperature in Celsius.

25
measurement_cond_kwargs Optional[Dict[str, Any]]

Extra condition fields.

None
IL Optional[float]

Light current for explicit setting.

None
JL Optional[float]

Light current density for explicit setting.

None
json_filepath Optional[str]

Path to JSON file to read.

None

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Dark_IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = Dark_IV_measurement(IV_curve=data)
meas.keys

derive_key_parameters(data, key_parameters, conditions) staticmethod

Derive shunt conductance and bias current from IV data.

This updates the key_parameters dict in place.

Parameters:

Name Type Description Default
data ndarray

IV curve array.

required
key_parameters Dict[str, Any]

Output dict for key parameters.

required
conditions Dict[str, Any]

Measurement conditions.

required

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Dark_IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
params = {}
Dark_IV_measurement.derive_key_parameters(data, params, {"base_point": 0.0})
"log_shunt_cond" in params

plot_func(data, color='black', ax=None, title=None, kwargs=None)

Plot a focused region of the dark IV curve.

This highlights the near-zero voltage region for shunt estimation.

Warning

The default kwargs argument is mutable; pass a dict to avoid reuse.

Parameters:

Name Type Description Default
data ndarray

IV curve array.

required
color str

Line color.

'black'
ax Optional[Any]

Matplotlib Axes to draw into.

None
title Optional[str]

Plot title.

None
kwargs Optional[Dict[str, Any]]

Matplotlib plot kwargs.

None

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Dark_IV_measurement
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = Dark_IV_measurement(IV_curve=data)
meas.plot_func(data)

Suns_Voc_measurement

Bases: Measurement

Suns-Voc measurement with optional subcell data.

Stores Voc and optional subcell Suns/Isc rows.

Example
import numpy as np
from PV_Circuit_Model.measurement import Suns_Voc_measurement
data = np.array([[0.7], [1.0], [0.03]])
meas = Suns_Voc_measurement(Suns_Isc_Voc_curve=data)
meas.keys

__init__(Suns_Isc_Voc_curve=None, temperature=25, measurement_cond_kwargs=None, json_filepath=None, **kwargs)

Initialize a Suns-Voc measurement.

Populates condition fields and derives data row labels.

Parameters:

Name Type Description Default
Suns_Isc_Voc_curve Optional[ndarray]

Suns/Isc/Voc data array.

None
temperature float

Temperature in Celsius.

25
measurement_cond_kwargs Optional[Dict[str, Any]]

Extra condition fields.

None
json_filepath Optional[str]

Path to JSON file to read.

None
**kwargs Any

Forwarded to Measurement.

{}

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Suns_Voc_measurement
data = np.array([[0.7], [1.0], [0.03]])
meas = Suns_Voc_measurement(Suns_Isc_Voc_curve=data)
meas.keys

derive_key_parameters(data, key_parameters, conditions) staticmethod

Derive Voc array from Suns-Voc data.

This updates the key_parameters dict in place.

Parameters:

Name Type Description Default
data ndarray

Suns/Isc/Voc data array.

required
key_parameters Dict[str, Any]

Output dict for key parameters.

required
conditions Dict[str, Any]

Measurement conditions.

required

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Suns_Voc_measurement
params = {}
data = np.array([[0.7], [1.0], [0.03]])
Suns_Voc_measurement.derive_key_parameters(data, params, {})
"Voc" in params

simulate(device=None)

Simulate Suns-Voc measurement for a given device.

This updates simulated data and key parameters.

Parameters:

Name Type Description Default
device Optional[Any]

Device to simulate; defaults to parent.

None

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Suns_Voc_measurement
from PV_Circuit_Model.device import make_solar_cell
cell = make_solar_cell()
data = np.array([[0.7], [1.0], [0.03]])
meas = Suns_Voc_measurement(Suns_Isc_Voc_curve=data)
meas.simulate(cell)

plot_func(data, color='black', ax=None, title=None, kwargs=None)

Plot Suns-Voc data as log10 current or Suns.

Uses Voc on the x-axis and log10 current or Suns on y-axis.

Parameters:

Name Type Description Default
data ndarray

Suns/Isc/Voc data array.

required
color str

Line color.

'black'
ax Optional[Any]

Matplotlib Axes to draw into.

None
title Optional[str]

Plot title.

None
kwargs Optional[Dict[str, Any]]

Matplotlib plot kwargs.

None

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Suns_Voc_measurement
data = np.array([[0.7], [1.0], [0.03]])
meas = Suns_Voc_measurement(Suns_Isc_Voc_curve=data)
meas.plot_func(data)

assign_measurements(device, measurements)

Attach measurements to a device and set parent references.

This updates each measurement's parent_device and the device list.

Parameters:

Name Type Description Default
device Device

Device to attach measurements to.

required
measurements Sequence[Measurement]

Measurements to assign.

required

Returns:

Type Description
None

None

Example
import numpy as np
from PV_Circuit_Model.measurement import Measurement, assign_measurements
from PV_Circuit_Model.device import make_solar_cell
data = np.array([[0.0, 0.1], [0.0, -1.0]])
meas = Measurement(measurement_condition={"temperature": 25}, measurement_data=data)
cell = make_solar_cell()
assign_measurements(cell, [meas])

collate_device_measurements(devices, measurement_class=None, include_tags=None, exclude_tags=None)

Collect measurements from one or more devices.

This flattens device.measurements into a single list.

Parameters:

Name Type Description Default
devices Union[Any, Sequence[Any]]

Device or list of devices.

required
measurement_class Optional[type]

Filter by measurement class.

None
include_tags Optional[Sequence[str]]

Only include these tags.

None
exclude_tags Optional[Sequence[str]]

Exclude these tags.

None

Returns:

Type Description
List[Measurement]

List[Measurement]: Collected measurements.

simulate_device_measurements(devices, measurement_class=None, include_tags=None, exclude_tags=None, show_progress=False)

Simulate measurements for a list of devices.

This calls simulate on each selected measurement.

Parameters:

Name Type Description Default
devices Sequence[Any]

Devices with measurement lists.

required
measurement_class Optional[type]

Filter by measurement class.

None
include_tags Optional[Sequence[str]]

Only include these tags.

None
exclude_tags Optional[Sequence[str]]

Exclude these tags.

None
show_progress bool

If True, show a progress bar.

False

Returns:

Type Description
None

None

simulate_Suns_Voc(cell, Suns=None, Iscs=None)

Simulate Suns-Voc curves for a cell or multi-junction cell.

Sweeps Suns or Isc values and computes Voc for each point.

Parameters:

Name Type Description Default
cell Any

Cell or MultiJunctionCell instance.

required
Suns Optional[ndarray]

Suns array for subcells.

None
Iscs Optional[ndarray]

Isc array for subcells.

None

Returns:

Type Description
Tuple[ndarray, Union[float, List[float]]]

Tuple[np.ndarray, Union[float, List[float]]]: Suns/Isc/Voc array and Voc(s).

Raises:

Type Description
AssertionError

If Suns or Iscs shape does not match subcell count.

Example
from PV_Circuit_Model.measurement import simulate_Suns_Voc
from PV_Circuit_Model.device import make_solar_cell
cell = make_solar_cell()
simulate_Suns_Voc(cell)

get_measurements(measurements_directory)

Read measurement JSON files from a directory.

Supports Suns_Voc_measurement, Light_IV_measurement, and Dark_IV_measurement.

Parameters:

Name Type Description Default
measurements_directory str

Directory containing JSON files.

required

Returns:

Type Description
List[Measurement]

List[Measurement]: List of measurement instances.

Example
import tempfile
from PV_Circuit_Model.measurement import get_measurements
with tempfile.TemporaryDirectory() as folder:
    get_measurements(folder)