Detectors
Documentation for detectors.py
#
Overview#
The detectors.py
module provides a framework for simulating different types of microscopy camera detectors, such as EMCCD and CMOS detectors. It includes functionality for calculating photon noise, converting electrons to digital counts (ADU), and capturing frames with various detector parameters.
Functions#
photon_noise
#
@overload
def photon_noise(photons: float) -> float: ...
@overload
def photon_noise(photons: np.ndarray) -> np.ndarray: ...
def photon_noise(photons: np.ndarray | float) -> np.ndarray | float:
"""
Calculate photons with Poisson noise.
"""
# non-negative floats
return np.random.poisson(lam=photons)
Description#
The photon_noise
function calculates photons with Poisson noise, which is a common model for photon detection in microscopy. The function supports both scalar and array inputs.
Parameters#
- photons:
float
ornp.ndarray
The number of photons (or array of photon counts) to which Poisson noise will be applied.
Returns#
float
ornp.ndarray
The photon count(s) with Poisson noise added.
Classes#
Detector
#
class Detector(ABC):
"""Base class for microscopy camera detectors."""
Description#
The Detector
class is an abstract base class that defines the common interface and behavior for all types of microscopy camera detectors. It includes methods for initializing detector parameters, converting electrons to digital counts, and capturing frames.
Attributes#
- pixel_size:
float
Size of each pixel in microns. - dark_current:
float
Dark current in electrons/pixel/second. - readout_noise:
float
RMS readout noise in electrons. - pixel_count:
Tuple[int, int]
Tuple of (width, height) in pixels. - pixel_detector_size:
float | int
Size of the detector in microns. - magnification:
float | int
Magnification of the microscope. - bit_depth:
int
(default:16
)
Number of bits for analog-to-digital conversion. - sensitivity:
float
(default:1.0
)
Conversion gain in electrons/ADU. - base_adu:
int
(default:100
)
Base ADU to avoid negative values due to photon arrival rate. - binning_size:
int
(default:1
)
Binning size for combining pixels.
Methods#
__init__
python
def __init__(
self,
pixel_size: float,
dark_current: float,
readout_noise: float,
pixel_count: Tuple[int, int],
pixel_detector_size: float | int,
magnification: float | int,
bit_depth: int = 16,
sensitivity: float = 1.0,
base_adu: int = 100,
binning_size: int = 1,
):
Initializes the detector with the given parameters.
base_frame
python
def base_frame(self, base_adu: int) -> np.ndarray:
Creates a base frame with the specified base ADU value.
electrons_to_counts
python
def electrons_to_counts(self, electrons: np.ndarray) -> np.ndarray:
Converts electrons to digital counts (ADU).
clipADU
python
def clipADU(self, counts: np.ndarray) -> np.ndarray:
Clips the digital counts to the valid range based on the bit depth.
capture_frame
(Abstract Method)
python
@abstractmethod
def capture_frame(self, photons: np.ndarray, exposure_time: float) -> np.ndarray:
Captures a frame with the detector. This method must be implemented by subclasses.
EMCCDDetector
#
class EMCCDDetector(Detector):
"""Electron Multiplying CCD detector implementation."""
Description#
The EMCCDDetector
class extends the Detector
class to implement an Electron Multiplying CCD (EMCCD) detector. It includes additional parameters and functionality specific to EMCCD detectors, such as electron multiplication gain and clock-induced charge.
Attributes#
- em_gain:
float
Electron multiplication gain. - clock_induced_charge:
float
Clock-induced charge in electrons/pixel/frame.
Methods#
__init__
python
def __init__(
self,
pixel_size: float,
dark_current: float,
readout_noise: float,
pixel_count: Tuple[int, int],
em_gain: float,
clock_induced_charge: float,
pixel_detector_size: float | int,
magnification: float | int,
sensitivity: float = 1.0,
bit_depth: int = 16,
base_adu: int = 0,
binning_size: int = 1,
):
Initializes the EMCCD detector with the given parameters.
capture_frame
python
def capture_frame(self, photons: np.ndarray, exposure_time: float) -> np.ndarray:
Captures a frame with the EMCCD detector, applying electron multiplication gain and clock-induced charge.
CMOSDetector
#
class CMOSDetector(Detector):
"""CMOS detector implementation."""
Description#
The CMOSDetector
class extends the Detector
class to implement a CMOS detector. It includes functionality specific to CMOS detectors.
Methods#
__init__
python
def __init__(
self,
pixel_size: float,
dark_current: float,
readout_noise: float,
pixel_count: Tuple[int, int],
pixel_detector_size: float | int,
magnification: float | int,
sensitivity: float = 1.0,
bit_depth: int = 16,
base_adu: int = 0,
binning_size: int = 1,
):
Initializes the CMOS detector with the given parameters.
capture_frame
python
def capture_frame(self, photons: np.ndarray, exposure_time: float) -> np.ndarray:
Captures a frame with the CMOS detector.
create_binning_function
#
def create_binning_function(input_shape, binning_size, mode="sum"):
Description#
Creates an optimized partial function for binning arrays of a specific shape.
Parameters#
- input_shape:
tuple
Shape of the input arrays that will be binned. - binning_size:
int
Size of the binning window (e.g., 2 for 2x2 binning). - mode:
str
(default:"sum"
)
Method for binning. Currently only supports"sum"
.
Returns#
function
A specialized function that only takes an array as input and performs binning.