Parameter sweeps#

Use PyMieSim.Experiment and set classes when several values should be evaluated as a parameter grid.

import numpy as np

from PyMieSim import (
    Measure,
    Experiment,
    GaussianSet,
    PolarizationSet,
    SphereSet,
    ureg,
)

source = GaussianSet(
    wavelength=np.linspace(400, 800, 5) * ureg.nanometer,
    polarization=PolarizationSet(angles=[0] * ureg.degree),
    optical_power=[1e-3] * ureg.watt,
    numerical_aperture=[0.2],
)

scatterer = SphereSet(
    diameter=np.linspace(100, 500, 10) * ureg.nanometer,
    material=[1.5],
    medium=[1.0],
)

experiment = Experiment(scatterer_set=scatterer, source_set=source)
result = experiment.get(Measure.QSCA, Measure.QEXT)
result.isel(indexers={"measure": 0}).plot(x="source:wavelength", y="Qsca")

This grid contains five wavelengths and ten diameters. Requesting two measures adds a measure axis of length two; the parameter axes have lengths five and ten. Qsca and Qext are dimensionless. Curves at different diameters can move spectral resonances even when the refractive index is fixed.

The result is a unit-aware PyMieSim LabeledArray. Use .as_numpy() when a raw NumPy array is preferable, .as_dataframe() for tabular interoperability, or get_sequential for aligned sequential configurations.

Extracting NumPy and pandas data#

The experiment result remains labeled by default. Convert it explicitly when using libraries that expect a raw array or a pandas table:

result = experiment.get(Measure.QSCA)

values = result.as_numpy()
print(values.shape)

dataframe = result.as_dataframe()
print(dataframe[["source:wavelength", "scatterer:diameter", "Qsca"]])

For multiple measures, the labeled array contains a measure dimension and as_dataframe() creates one output column per measure:

result = experiment.get(Measure.QEXT, Measure.QSCA)
dataframe = result.as_dataframe()
# Columns: source:wavelength, scatterer:diameter, Qext, Qsca

See the experiment gallery for larger examples.