-
Notifications
You must be signed in to change notification settings - Fork 0
09. API Reference
Complete technical reference for all public APIs in HoloGen.
- Module Organization
- Type Definitions
- Shape Generators
- Converters
- Holography Strategies
- Noise Models
- Utility Modules
- Exception Classes
HoloGen is organized into the following modules:
- hologen.types: Core type definitions, protocols, and dataclasses
- hologen.shapes: Object-domain shape generators
- hologen.converters: Pipeline components for dataset generation
- hologen.holography: Holography strategy implementations
- hologen.noise: Noise and aberration models
- hologen.utils.fields: Field representation utilities
- hologen.utils.io: Dataset I/O operations
- hologen.utils.math: Mathematical utilities
Enumeration of supported holography sampling approaches.
Values:
-
INLINE = "inline": Inline holography method -
OFF_AXIS = "off_axis": Off-axis holography method
Example:
from hologen import HolographyMethod
method = HolographyMethod.INLINE
print(method.value) # "inline"Enumeration of field representation types.
Values:
-
INTENSITY: Intensity representation (|field|²) -
AMPLITUDE: Amplitude representation (|field|) -
PHASE: Phase representation (∠field) -
COMPLEX: Complex representation (amplitude + phase)
Example:
from hologen.types import FieldRepresentation
rep = FieldRepresentation.INTENSITY
print(rep.value) # "intensity"Type alias for NumPy arrays containing 64-bit floating-point values.
ArrayFloat = npt.NDArray[np.float64]Type alias for NumPy arrays containing 128-bit complex values.
ArrayComplex = npt.NDArray[np.complex128]Sampling definition for a two-dimensional grid.
Parameters:
-
height(int): Number of pixels along the vertical axis -
width(int): Number of pixels along the horizontal axis -
pixel_pitch(float): Sampling interval between adjacent pixels in meters
Example:
from hologen import GridSpec
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
print(f"Grid: {grid.height}x{grid.width}, pitch={grid.pixel_pitch}")Physical parameters for hologram generation and reconstruction.
Parameters:
-
wavelength(float): Illumination wavelength in meters -
propagation_distance(float): Distance between object and sensor planes in meters
Example:
from hologen import OpticalConfig
optics = OpticalConfig(wavelength=532e-9, propagation_distance=0.1)
print(f"λ={optics.wavelength*1e9:.0f}nm, z={optics.propagation_distance*1e3:.0f}mm")Carrier modulation parameters for off-axis holography.
Parameters:
-
frequency_x(float): Spatial carrier frequency along horizontal axis in cycles per meter -
frequency_y(float): Spatial carrier frequency along vertical axis in cycles per meter -
gaussian_width(float): Standard deviation of Gaussian filter for reconstruction in cycles per meter
Example:
from hologen import OffAxisCarrier
carrier = OffAxisCarrier(
frequency_x=1000.0,
frequency_y=1000.0,
gaussian_width=500.0
)Configuration bundle for holography strategies.
Parameters:
-
grid(GridSpec): Spatial sampling description of the sensor plane -
optics(OpticalConfig): Optical parameters governing propagation -
method(HolographyMethod): Holography method to employ -
carrier(OffAxisCarrier | None): Optional carrier configuration for off-axis holography
Example:
from hologen import GridSpec, OpticalConfig, HolographyConfig, HolographyMethod
config = HolographyConfig(
grid=GridSpec(height=512, width=512, pixel_pitch=5.5e-6),
optics=OpticalConfig(wavelength=532e-9, propagation_distance=0.1),
method=HolographyMethod.INLINE
)Configuration for output field representations.
Parameters:
-
object_representation(FieldRepresentation): Field representation for object domain (default: INTENSITY) -
hologram_representation(FieldRepresentation): Field representation for hologram (default: INTENSITY) -
reconstruction_representation(FieldRepresentation): Field representation for reconstruction (default: INTENSITY)
Example:
from hologen.types import OutputConfig, FieldRepresentation
output_config = OutputConfig(
object_representation=FieldRepresentation.AMPLITUDE,
hologram_representation=FieldRepresentation.INTENSITY,
reconstruction_representation=FieldRepresentation.AMPLITUDE
)Object-domain sample representation (legacy format).
Parameters:
-
name(str): Identifier of the shape generator that produced the sample -
pixels(ArrayFloat): Binary amplitude distribution of the object domain
Example:
from hologen.types import ObjectSample
import numpy as np
sample = ObjectSample(
name="circle",
pixels=np.ones((512, 512), dtype=np.float64)
)Object-domain sample with complex field representation.
Parameters:
-
name(str): Identifier of the shape generator -
field(ArrayComplex): Complex-valued field (amplitude + phase) -
representation(FieldRepresentation): Field representation type
Example:
from hologen.types import ComplexObjectSample, FieldRepresentation
import numpy as np
sample = ComplexObjectSample(
name="circle",
field=np.ones((512, 512), dtype=np.complex128),
representation=FieldRepresentation.AMPLITUDE
)Full holography sample including forward and reconstructed domains (legacy format).
Parameters:
-
object_sample(ObjectSample): Reference to the originating object-domain sample -
hologram(ArrayFloat): Intensity hologram generated from the object sample -
reconstruction(ArrayFloat): Recovered object-domain amplitude from the hologram
Example:
from hologen.types import HologramSample, ObjectSample
import numpy as np
sample = HologramSample(
object_sample=ObjectSample(name="circle", pixels=np.ones((512, 512))),
hologram=np.ones((512, 512)),
reconstruction=np.ones((512, 512))
)Hologram sample with complex field support.
Parameters:
-
object_sample(ComplexObjectSample): Reference to the originating complex object-domain sample -
hologram_field(ArrayComplex): Complex hologram field -
hologram_representation(FieldRepresentation): Field representation type for hologram -
reconstruction_field(ArrayComplex): Complex reconstruction field -
reconstruction_representation(FieldRepresentation): Field representation type for reconstruction
Configuration for hologram recording noise simulation.
Parameters:
-
sensor_read_noise(float): Standard deviation of Gaussian read noise (default: 0.0) -
sensor_shot_noise(bool): Enable Poisson shot noise simulation (default: False) -
sensor_dark_current(float): Mean dark current in intensity units (default: 0.0) -
sensor_bit_depth(int | None): ADC bit depth for quantization (default: None) -
speckle_contrast(float): Speckle contrast ratio 0.0-1.0 (default: 0.0) -
speckle_correlation_length(float): Speckle correlation length in pixels (default: 1.0) -
aberration_defocus(float): Defocus aberration coefficient (default: 0.0) -
aberration_astigmatism_x(float): Astigmatism x coefficient (default: 0.0) -
aberration_astigmatism_y(float): Astigmatism y coefficient (default: 0.0) -
aberration_coma_x(float): Coma x coefficient (default: 0.0) -
aberration_coma_y(float): Coma y coefficient (default: 0.0)
Example:
from hologen.types import NoiseConfig
noise_config = NoiseConfig(
sensor_read_noise=0.01,
sensor_shot_noise=True,
speckle_contrast=0.3,
aberration_defocus=0.5
)Protocol for object-domain shape generators.
Properties:
-
name(str): Return the canonical name of the generator
Methods:
-
generate(grid: GridSpec, rng: Generator) -> ArrayFloat: Create a binary object-domain image
Example:
from hologen.types import ObjectShapeGenerator, GridSpec
import numpy as np
class CustomGenerator:
@property
def name(self) -> str:
return "custom"
def generate(self, grid: GridSpec, rng: np.random.Generator) -> np.ndarray:
return np.random.rand(grid.height, grid.width)
# CustomGenerator satisfies the ObjectShapeGenerator protocolProtocol describing hologram generation and reconstruction operations.
Methods:
-
create_hologram(object_field: ArrayComplex, config: HolographyConfig) -> ArrayComplex: Create a hologram from an object-domain complex field -
reconstruct(hologram: ArrayComplex, config: HolographyConfig) -> ArrayComplex: Recover an object-domain complex field from a hologram
Example:
from hologen.types import HolographyStrategy, HolographyConfig
import numpy as np
class CustomStrategy:
def create_hologram(self, object_field, config):
# Custom hologram generation logic
return object_field
def reconstruct(self, hologram, config):
# Custom reconstruction logic
return hologram
# CustomStrategy satisfies the HolographyStrategy protocolProtocol for hologram noise simulation models.
Methods:
-
apply(hologram: ArrayFloat, config: HolographyConfig, rng: Generator) -> ArrayFloat: Apply noise to a hologram
Parameters:
-
hologram: Perfect hologram intensity distribution -
config: Holography configuration containing grid and optical parameters -
rng: Random number generator for stochastic noise
Returns:
- Noisy hologram intensity distribution
Protocol for persisting generated holography samples.
Methods:
-
save(samples: Iterable[HologramSample], output_dir: Path) -> None: Persist a sequence of hologram samples
Protocol for dataset generation routines.
Methods:
-
generate(count: int, config: HolographyConfig, rng: Generator) -> Iterable[HologramSample]: Produce holography samples
Abstract base for object-domain shape generators.
Parameters:
-
name(str): Canonical name used when recording generated samples
Methods:
Create a binary object-domain image.
Parameters:
-
grid: Grid specification describing the desired output resolution -
rng: Random number generator providing stochastic parameters
Returns:
- Binary amplitude image with values in {0.0, 1.0}
Raises:
-
NotImplementedError: If the subclass does not override the method
generate_complex(grid: GridSpec, rng: Generator, phase_shift: float = 0.0, mode: str = "amplitude") -> ArrayComplex
Generate a complex-valued object field.
Parameters:
-
grid: Grid specification describing the desired output resolution -
rng: Random number generator providing stochastic parameters -
phase_shift: Phase modulation in radians for phase-only objects (default: 0.0) -
mode: Generation mode - "amplitude" (shape with zero phase) or "phase" (uniform amplitude with phase modulation)
Returns:
- Complex-valued field with amplitude and phase components
Raises:
-
ValueError: If mode is not "amplitude" or "phase" -
PhaseRangeError: If generated phase values are outside [-π, π]
Example:
from hologen.shapes import CircleGenerator
from hologen import GridSpec
import numpy as np
generator = CircleGenerator(name="circle", min_radius=0.1, max_radius=0.2)
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
rng = np.random.default_rng(42)
# Generate amplitude-only object
amplitude_field = generator.generate_complex(grid, rng, mode="amplitude")
# Generate phase-only object with π/2 phase shift
phase_field = generator.generate_complex(grid, rng, phase_shift=np.pi/2, mode="phase")Generator producing filled discs.
Parameters:
-
name(str): Canonical name for the generator -
min_radius(float): Minimum radius as fraction of grid dimension -
max_radius(float): Maximum radius as fraction of grid dimension
Example:
from hologen import CircleGenerator, GridSpec
import numpy as np
generator = CircleGenerator(name="circle", min_radius=0.08, max_radius=0.18)
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
rng = np.random.default_rng(42)
circle = generator.generate(grid, rng)
print(f"Generated circle: {circle.shape}, values in [{circle.min()}, {circle.max()}]")Generator producing filled rectangles.
Parameters:
-
name(str): Canonical name for the generator -
min_scale(float): Minimum size as fraction of grid dimension -
max_scale(float): Maximum size as fraction of grid dimension
Example:
from hologen import RectangleGenerator, GridSpec
import numpy as np
generator = RectangleGenerator(name="rectangle", min_scale=0.1, max_scale=0.35)
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
rng = np.random.default_rng(42)
rectangle = generator.generate(grid, rng)Generator producing annular rings.
Parameters:
-
name(str): Canonical name for the generator -
min_radius(float): Minimum outer radius as fraction of grid dimension -
max_radius(float): Maximum outer radius as fraction of grid dimension -
min_thickness(float): Minimum thickness as fraction of outer radius -
max_thickness(float): Maximum thickness as fraction of outer radius
Example:
from hologen.shapes import RingGenerator
from hologen import GridSpec
import numpy as np
generator = RingGenerator(
name="ring",
min_radius=0.12,
max_radius=0.25,
min_thickness=0.1,
max_thickness=0.3
)
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
rng = np.random.default_rng(42)
ring = generator.generate(grid, rng)Generator producing filled discs with a checkerboard pattern inside.
Parameters:
-
name(str): Canonical name for the generator -
min_radius(float): Minimum radius as fraction of grid dimension -
max_radius(float): Maximum radius as fraction of grid dimension -
checker_size(int): Size of checkerboard squares in pixels (default: 8)
Example:
from hologen.shapes import CircleCheckerGenerator
from hologen import GridSpec
import numpy as np
generator = CircleCheckerGenerator(
name="circle_checker",
min_radius=0.1,
max_radius=0.2,
checker_size=16
)
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
rng = np.random.default_rng(42)
checker_circle = generator.generate(grid, rng)Generator producing filled rectangles with a checkerboard pattern inside.
Parameters:
-
name(str): Canonical name for the generator -
min_scale(float): Minimum size as fraction of grid dimension -
max_scale(float): Maximum size as fraction of grid dimension -
checker_size(int): Size of checkerboard squares in pixels (default: 8)
Generator producing filled ellipses with a checkerboard pattern inside.
Parameters:
-
name(str): Canonical name for the generator -
min_radius_y(float): Minimum vertical radius as fraction of grid height -
max_radius_y(float): Maximum vertical radius as fraction of grid height -
min_radius_x(float): Minimum horizontal radius as fraction of grid width -
max_radius_x(float): Maximum horizontal radius as fraction of grid width -
checker_size(int): Size of checkerboard squares in pixels (default: 8)
Generator producing filled triangles with a checkerboard pattern inside.
Parameters:
-
name(str): Canonical name for the generator -
min_scale(float): Minimum size as fraction of grid dimension -
max_scale(float): Maximum size as fraction of grid dimension -
checker_size(int): Size of checkerboard squares in pixels (default: 8)
Return the default suite of shape generators.
Returns:
- Iterable of pre-configured shape generators including Circle, Rectangle, Ring, CircleChecker, RectangleChecker, and EllipseChecker
Example:
from hologen.shapes import available_generators
generators = list(available_generators())
print(f"Available generators: {[g.name for g in generators]}")
# Output: ['circle', 'rectangle', 'ring', 'circle_checker', 'rectangle_checker', 'ellipse_checker']Generate object-domain samples using registered shape generators.
Parameters:
-
shape_generators(tuple[ObjectShapeGenerator, ...]): Tuple of shape generator implementations to sample from
Methods:
Produce a new object-domain sample.
Parameters:
-
grid: Grid specification describing the required output resolution -
rng: Random number generator providing stochastic parameters
Returns:
- ObjectSample containing the generated amplitude image
Example:
from hologen.converters import ObjectDomainProducer, default_object_producer
from hologen import GridSpec
import numpy as np
producer = default_object_producer()
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
rng = np.random.default_rng(42)
sample = producer.generate(grid, rng)
print(f"Generated {sample.name} with shape {sample.pixels.shape}")generate_complex(grid: GridSpec, rng: Generator, phase_shift: float = 0.0, mode: str = "amplitude") -> ComplexObjectSample
Produce a new complex object-domain sample.
Parameters:
-
grid: Grid specification describing the required output resolution -
rng: Random number generator providing stochastic parameters -
phase_shift: Phase modulation in radians for phase-only objects (default: 0.0) -
mode: Generation mode - "amplitude" or "phase"
Returns:
- ComplexObjectSample containing the generated complex field
Convert object-domain amplitudes into hologram representations.
Parameters:
-
strategy_mapping(dict[HolographyMethod, HolographyStrategy]): Mapping from holography methods to strategy implementations -
noise_model(NoiseModel | None): Optional noise model to apply to generated holograms -
output_config(OutputConfig): Configuration for output field representations
Methods:
create_hologram(sample: ObjectSample | ComplexObjectSample, config: HolographyConfig, rng: Generator | None = None) -> ArrayFloat | ArrayComplex
Generate a hologram for the provided object sample.
Parameters:
-
sample: Object-domain sample to transform -
config: Holography configuration specifying physical parameters -
rng: Random number generator for noise application (optional)
Returns:
- Hologram field (intensity for legacy ObjectSample, complex for ComplexObjectSample)
Example:
from hologen.converters import default_converter
from hologen import HolographyConfig, GridSpec, OpticalConfig, HolographyMethod
from hologen.types import ObjectSample
import numpy as np
converter = default_converter()
config = HolographyConfig(
grid=GridSpec(height=512, width=512, pixel_pitch=5.5e-6),
optics=OpticalConfig(wavelength=532e-9, propagation_distance=0.1),
method=HolographyMethod.INLINE
)
sample = ObjectSample(name="circle", pixels=np.ones((512, 512)))
rng = np.random.default_rng(42)
hologram = converter.create_hologram(sample, config, rng)
print(f"Hologram shape: {hologram.shape}")reconstruct(hologram: ArrayFloat | ArrayComplex, config: HolographyConfig) -> ArrayFloat | ArrayComplex
Reconstruct an object-domain field from a hologram.
Parameters:
-
hologram: Hologram field (intensity for legacy, complex for new) -
config: Holography configuration specifying physical parameters
Returns:
- Reconstructed field (amplitude for legacy, complex for new)
Generate full hologram samples from object-domain sources.
Parameters:
-
object_producer(ObjectDomainProducer): Producer responsible for creating object samples -
converter(ObjectToHologramConverter): Converter performing hologram generation and reconstruction
Methods:
generate(count: int, config: HolographyConfig, rng: Generator, phase_shift: float = 0.0, mode: str = "amplitude", use_complex: bool = False) -> Iterable[HologramSample | ComplexHologramSample]
Yield hologram samples as an iterable sequence.
Parameters:
-
count: Number of samples to generate -
config: Holography configuration applied to all samples -
rng: Random number generator used throughout the pipeline -
phase_shift: Phase modulation in radians for phase-only objects (default: 0.0) -
mode: Generation mode - "amplitude" or "phase" (default: "amplitude") -
use_complex: If True, generate ComplexHologramSample; if False, generate legacy HologramSample (default: False)
Yields:
- Sequential hologram samples containing object, hologram, and reconstruction data
Example:
from hologen.converters import HologramDatasetGenerator, default_object_producer, default_converter
from hologen import HolographyConfig, GridSpec, OpticalConfig, HolographyMethod
import numpy as np
generator = HologramDatasetGenerator(
object_producer=default_object_producer(),
converter=default_converter()
)
config = HolographyConfig(
grid=GridSpec(height=512, width=512, pixel_pitch=5.5e-6),
optics=OpticalConfig(wavelength=532e-9, propagation_distance=0.1),
method=HolographyMethod.INLINE
)
rng = np.random.default_rng(42)
samples = list(generator.generate(count=5, config=config, rng=rng))
print(f"Generated {len(samples)} samples")Create the default object domain producer with built-in shapes.
Returns:
- ObjectDomainProducer configured with all available shape generators
Example:
from hologen.converters import default_object_producer
producer = default_object_producer()Create the default converter with inline and off-axis strategies.
Parameters:
-
noise_model: Optional noise model to apply to generated holograms
Returns:
- ObjectToHologramConverter configured with inline and off-axis strategies
Example:
from hologen.converters import default_converter, create_noise_model
from hologen.types import NoiseConfig
noise_config = NoiseConfig(sensor_read_noise=0.01, speckle_contrast=0.3)
noise_model = create_noise_model(noise_config)
converter = default_converter(noise_model=noise_model)generate_dataset(count: int, config: HolographyConfig, rng: Generator, writer: DatasetWriter, generator: HologramDatasetGenerator | None = None, output_dir: Path | None = None) -> None
Generate and persist a holography dataset using the pipeline.
Parameters:
-
count: Number of samples to produce -
config: Holography configuration applied to all samples -
rng: Random number generator used for stochastic steps -
writer: Dataset writer responsible for persisting results -
generator: Optional pre-configured generator to reuse -
output_dir: Optional output directory override for writer
Example:
from hologen.converters import generate_dataset
from hologen import HolographyConfig, GridSpec, OpticalConfig, HolographyMethod, NumpyDatasetWriter
import numpy as np
from pathlib import Path
config = HolographyConfig(
grid=GridSpec(height=512, width=512, pixel_pitch=5.5e-6),
optics=OpticalConfig(wavelength=532e-9, propagation_distance=0.1),
method=HolographyMethod.INLINE
)
rng = np.random.default_rng(42)
writer = NumpyDatasetWriter(save_preview=True)
generate_dataset(
count=10,
config=config,
rng=rng,
writer=writer,
output_dir=Path("my_dataset")
)Create a composite noise model from configuration.
Parameters:
-
config: Noise configuration specifying all noise parameters
Returns:
- Composite noise model or None if all noise is disabled
Example:
from hologen.converters import create_noise_model
from hologen.types import NoiseConfig
noise_config = NoiseConfig(
sensor_read_noise=0.01,
sensor_shot_noise=True,
speckle_contrast=0.3,
aberration_defocus=0.5
)
noise_model = create_noise_model(noise_config)
if noise_model:
print(f"Created noise model: {noise_model.name}")Implement inline hologram generation and reconstruction.
Methods:
Generate an inline hologram from an object-domain complex field.
Parameters:
-
object_field: Complex-valued object field -
config: Holography configuration
Returns:
- Complex hologram field after propagation
Example:
from hologen.holography.inline import InlineHolographyStrategy
from hologen import HolographyConfig, GridSpec, OpticalConfig, HolographyMethod
import numpy as np
strategy = InlineHolographyStrategy()
config = HolographyConfig(
grid=GridSpec(height=512, width=512, pixel_pitch=5.5e-6),
optics=OpticalConfig(wavelength=532e-9, propagation_distance=0.1),
method=HolographyMethod.INLINE
)
object_field = np.ones((512, 512), dtype=np.complex128)
hologram = strategy.create_hologram(object_field, config)Reconstruct the object domain from an inline hologram.
Parameters:
-
hologram: Complex hologram field -
config: Holography configuration
Returns:
- Reconstructed complex object field
Implement off-axis hologram generation and reconstruction.
Methods:
Generate an off-axis hologram from an object-domain complex field.
Parameters:
-
object_field: Complex-valued object field -
config: Holography configuration (must include carrier configuration)
Returns:
- Complex hologram field with carrier modulation
Raises:
-
ValueError: If carrier configuration is not provided
Example:
from hologen.holography.off_axis import OffAxisHolographyStrategy
from hologen import HolographyConfig, GridSpec, OpticalConfig, HolographyMethod, OffAxisCarrier
import numpy as np
strategy = OffAxisHolographyStrategy()
config = HolographyConfig(
grid=GridSpec(height=512, width=512, pixel_pitch=5.5e-6),
optics=OpticalConfig(wavelength=532e-9, propagation_distance=0.1),
method=HolographyMethod.OFF_AXIS,
carrier=OffAxisCarrier(frequency_x=1000.0, frequency_y=1000.0, gaussian_width=500.0)
)
object_field = np.ones((512, 512), dtype=np.complex128)
hologram = strategy.create_hologram(object_field, config)Reconstruct the object domain from an off-axis hologram.
Parameters:
-
hologram: Complex hologram field -
config: Holography configuration (must include carrier configuration)
Returns:
- Reconstructed complex object field
Raises:
-
ValueError: If carrier configuration is not provided
angular_spectrum_propagate(field: ArrayComplex, grid: GridSpec, optics: OpticalConfig, distance: float) -> ArrayComplex
Propagate a complex optical field using the angular spectrum method.
The angular spectrum method models propagation by decomposing the source field into plane waves (its spatial frequency spectrum), applying the appropriate phase (or evanescent decay) for a given propagation distance, and recomposing the field in the observation plane.
Parameters:
-
field: Complex field distribution sampled in the source plane with shape (grid.height, grid.width) -
grid: Spatial sampling specification for the field -
optics: Optical parameters describing the illumination -
distance: Propagation distance along the optical axis in meters (positive advances, negative back-propagates)
Returns:
- Complex field after propagation over the requested distance
Raises:
-
ValueError: If the supplied field shape is incompatible with the grid or if Nyquist criterion is violated
Example:
from hologen.holography.propagation import angular_spectrum_propagate
from hologen import GridSpec, OpticalConfig
import numpy as np
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
optics = OpticalConfig(wavelength=532e-9, propagation_distance=0.1)
field = np.ones((512, 512), dtype=np.complex128)
propagated = angular_spectrum_propagate(field, grid, optics, distance=0.1)
print(f"Propagated field shape: {propagated.shape}")Abstract base for noise model implementations.
Parameters:
-
name(str): Identifier for the noise model
Methods:
Apply noise to a hologram.
Parameters:
-
hologram: Perfect hologram intensity distribution -
config: Holography configuration containing grid and optical parameters -
rng: Random number generator for stochastic noise
Returns:
- Noisy hologram intensity distribution
Raises:
-
NotImplementedError: If the subclass does not override the method
Simulate sensor recording noise including read, shot, dark current, and quantization.
Parameters:
-
name(str): Identifier for the noise model -
read_noise(float): Standard deviation of Gaussian read noise (default: 0.0) -
shot_noise(bool): Enable Poisson shot noise simulation (default: False) -
dark_current(float): Mean dark current in intensity units (default: 0.0) -
bit_depth(int | None): ADC bit depth for quantization (default: None)
Example:
from hologen.noise import SensorNoiseModel
from hologen import HolographyConfig, GridSpec, OpticalConfig, HolographyMethod
import numpy as np
noise_model = SensorNoiseModel(
name="sensor",
read_noise=0.01,
shot_noise=True,
dark_current=0.005,
bit_depth=12
)
config = HolographyConfig(
grid=GridSpec(height=512, width=512, pixel_pitch=5.5e-6),
optics=OpticalConfig(wavelength=532e-9, propagation_distance=0.1),
method=HolographyMethod.INLINE
)
rng = np.random.default_rng(42)
hologram = np.ones((512, 512))
noisy_hologram = noise_model.apply(hologram, config, rng)Simulate multiplicative speckle noise from coherent illumination.
Parameters:
-
name(str): Identifier for the noise model -
contrast(float): Speckle contrast ratio 0.0-1.0 (default: 0.5) -
correlation_length(float): Speckle correlation length in pixels (default: 2.0)
Example:
from hologen.noise import SpeckleNoiseModel
import numpy as np
noise_model = SpeckleNoiseModel(
name="speckle",
contrast=0.3,
correlation_length=2.5
)
hologram = np.ones((512, 512))
rng = np.random.default_rng(42)
noisy_hologram = noise_model.apply(hologram, config, rng)Simulate optical aberrations using Zernike polynomials.
Parameters:
-
name(str): Identifier for the noise model -
defocus(float): Defocus coefficient (Zernike Z_2^0) (default: 0.0) -
astigmatism_x(float): Astigmatism x coefficient (Zernike Z_2^-2) (default: 0.0) -
astigmatism_y(float): Astigmatism y coefficient (Zernike Z_2^2) (default: 0.0) -
coma_x(float): Coma x coefficient (Zernike Z_3^-1) (default: 0.0) -
coma_y(float): Coma y coefficient (Zernike Z_3^1) (default: 0.0)
Example:
from hologen.noise import AberrationNoiseModel
import numpy as np
noise_model = AberrationNoiseModel(
name="aberration",
defocus=0.5,
astigmatism_x=0.2,
coma_x=0.1
)
hologram = np.ones((512, 512))
rng = np.random.default_rng(42)
noisy_hologram = noise_model.apply(hologram, config, rng)Combine multiple noise models in sequence.
Parameters:
-
name(str): Identifier for the noise model -
models(tuple[NoiseModel, ...]): Tuple of noise models to apply in order
Example:
from hologen.noise import CompositeNoiseModel, SensorNoiseModel, SpeckleNoiseModel
import numpy as np
composite = CompositeNoiseModel(
name="composite",
models=(
SpeckleNoiseModel(name="speckle", contrast=0.3),
SensorNoiseModel(name="sensor", read_noise=0.01, shot_noise=True)
)
)
hologram = np.ones((512, 512))
rng = np.random.default_rng(42)
noisy_hologram = composite.apply(hologram, config, rng)complex_to_representation(field: ArrayComplex, representation: FieldRepresentation) -> ArrayFloat | ArrayComplex
Convert a complex field to the requested representation.
Parameters:
-
field: Complex-valued optical field -
representation: Target representation type
Returns:
- Field in the requested representation (ArrayFloat for intensity/amplitude/phase, ArrayComplex for complex)
Raises:
-
FieldRepresentationError: If the representation type is invalid
Example:
from hologen.utils.fields import complex_to_representation
from hologen.types import FieldRepresentation
import numpy as np
field = np.array([[1+1j, 2+0j]], dtype=np.complex128)
intensity = complex_to_representation(field, FieldRepresentation.INTENSITY)
amplitude = complex_to_representation(field, FieldRepresentation.AMPLITUDE)
phase = complex_to_representation(field, FieldRepresentation.PHASE)
print(f"Intensity: {intensity}")
print(f"Amplitude: {amplitude}")
print(f"Phase: {phase}")Construct a complex field from separate amplitude and phase arrays.
Uses the formula: field = amplitude * exp(i * phase)
Parameters:
-
amplitude: Amplitude values (non-negative) -
phase: Phase values in radians
Returns:
- Complex field with the specified amplitude and phase
Example:
from hologen.utils.fields import amplitude_phase_to_complex
import numpy as np
amplitude = np.array([[1.0, 2.0]], dtype=np.float64)
phase = np.array([[0.0, np.pi/2]], dtype=np.float64)
field = amplitude_phase_to_complex(amplitude, phase)
print(f"Complex field: {field}")Validate that all phase values are within the valid [-π, π] range.
Parameters:
-
phase: Phase array in radians
Raises:
-
PhaseRangeError: If any phase values are outside [-π, π] or non-finite
Example:
from hologen.utils.fields import validate_phase_range
import numpy as np
phase = np.array([[0.0, np.pi/2, -np.pi/2]], dtype=np.float64)
validate_phase_range(phase) # No error
invalid_phase = np.array([[4.0]], dtype=np.float64)
try:
validate_phase_range(invalid_phase)
except PhaseRangeError as e:
print(f"Error: {e}")Persist holography samples in NumPy archives and optional PNG previews.
Parameters:
-
save_preview(bool): Whether to generate PNG previews for each domain (default: True)
Methods:
Write hologram samples to disk.
Parameters:
-
samples: Iterable of hologram samples produced by the pipeline -
output_dir: Target directory for serialized dataset artifacts
Raises:
-
IOError: If the dataset cannot be written to the storage path
Example:
from hologen import NumpyDatasetWriter
from hologen.types import HologramSample, ObjectSample
from pathlib import Path
import numpy as np
writer = NumpyDatasetWriter(save_preview=True)
samples = [
HologramSample(
object_sample=ObjectSample(name="circle", pixels=np.ones((512, 512))),
hologram=np.ones((512, 512)),
reconstruction=np.ones((512, 512))
)
]
writer.save(samples, Path("output_dataset"))Persist complex holography samples in NumPy archives and optional PNG previews.
Parameters:
-
save_preview(bool): Whether to generate PNG previews for each domain (default: True) -
phase_colormap(str): Matplotlib colormap name for phase visualization (default: "twilight")
Methods:
Write complex hologram samples to disk.
Parameters:
-
samples: Iterable of complex hologram samples produced by the pipeline -
output_dir: Target directory for serialized dataset artifacts
Raises:
-
IOError: If the dataset cannot be written to the storage path
Example:
from hologen.utils.io import ComplexFieldWriter
from hologen.types import ComplexHologramSample, ComplexObjectSample, FieldRepresentation
from pathlib import Path
import numpy as np
writer = ComplexFieldWriter(save_preview=True, phase_colormap="twilight")
samples = [
ComplexHologramSample(
object_sample=ComplexObjectSample(
name="circle",
field=np.ones((512, 512), dtype=np.complex128),
representation=FieldRepresentation.AMPLITUDE
),
hologram_field=np.ones((512, 512), dtype=np.complex128),
hologram_representation=FieldRepresentation.INTENSITY,
reconstruction_field=np.ones((512, 512), dtype=np.complex128),
reconstruction_representation=FieldRepresentation.AMPLITUDE
)
]
writer.save(samples, Path("complex_dataset"))Load a sample from a NumPy archive with automatic format detection.
Detects whether the file contains complex field data (new format with 'real'/'imag' keys) or legacy intensity data ('object' key) and returns the appropriate sample type.
Parameters:
-
path: Path to the .npz file
Returns:
- ComplexObjectSample if the file contains complex field data, ObjectSample if it contains legacy intensity data
Raises:
-
ValueError: If the file format is not recognized -
IOError: If the file cannot be read
Example:
from hologen.utils.io import load_complex_sample
from pathlib import Path
# Load complex field data
sample = load_complex_sample(Path("complex_object.npz"))
print(f"Loaded {sample.name}: {type(sample).__name__}")
# Load legacy intensity data
legacy_sample = load_complex_sample(Path("legacy_object.npz"))
print(f"Loaded {legacy_sample.name}: {type(legacy_sample).__name__}")Normalize an image to the range [0.0, 1.0].
Parameters:
-
image: Arbitrary floating-point image
Returns:
- Normalized image or zeros when the input is constant
Example:
from hologen.utils.math import normalize_image
import numpy as np
image = np.array([[10, 20], [30, 40]], dtype=np.float64)
normalized = normalize_image(image)
print(f"Normalized: {normalized}")
# Output: [[0.0, 0.333...], [0.666..., 1.0]]Frequency-domain sampling constructed for a spatial grid.
Parameters:
-
fx(NDArray[np.float64]): Two-dimensional array of spatial frequencies along the x axis -
fy(NDArray[np.float64]): Two-dimensional array of spatial frequencies along the y axis
Create Fourier-domain sampling coordinates for a spatial grid.
Parameters:
-
grid: Spatial grid specification defining the sampling resolution
Returns:
- FourierGrid containing spatial frequency meshes along both axes
Example:
from hologen.utils.math import make_fourier_grid
from hologen import GridSpec
grid = GridSpec(height=512, width=512, pixel_pitch=5.5e-6)
fourier_grid = make_fourier_grid(grid)
print(f"Frequency grid shape: {fourier_grid.fx.shape}")Apply an isotropic Gaussian blur to a two-dimensional image.
Parameters:
-
image: Input image to filter -
sigma: Standard deviation of the Gaussian kernel in pixel units
Returns:
- Blurred image with identical shape to the input
Example:
from hologen.utils.math import gaussian_blur
import numpy as np
image = np.random.rand(512, 512)
blurred = gaussian_blur(image, sigma=2.0)
print(f"Blurred image shape: {blurred.shape}")Raised when field representation is invalid or incompatible.
Base Class: ValueError
Example:
from hologen.utils.fields import FieldRepresentationError
try:
# Invalid operation
raise FieldRepresentationError("Invalid representation type")
except FieldRepresentationError as e:
print(f"Error: {e}")Raised when phase values are outside the valid [-π, π] range.
Base Class: ValueError
Example:
from hologen.utils.fields import PhaseRangeError, validate_phase_range
import numpy as np
try:
invalid_phase = np.array([[4.0]], dtype=np.float64)
validate_phase_range(invalid_phase)
except PhaseRangeError as e:
print(f"Error: {e}")- Quickstart Guide: Get started with HoloGen in 5 minutes
- Shape Generators: Detailed documentation of shape generators
- Holography Methods: Inline and off-axis holography explained
- Pipeline Architecture: Understanding the dataset generation pipeline
- I/O Formats: File formats and data loading
- Noise Simulation: Realistic noise and aberration modeling
- Complex Fields: Working with complex-valued optical fields
- CLI Reference: Command-line interface documentation