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)