Source code for ewoksfluo.tasks.example_data.deadtime

from typing import Dict, Optional
import numpy
from numpy.typing import DTypeLike


[docs]def apply_extendable_deadtime( photons, elapsed_time, max_dt_percentage, integral_type: Optional[DTypeLike] = numpy.uint32, ): """Number of counts measured by a digital signal processor with extendable a.k.a. paralyzable deadtime for a given number of incoming photons.""" r = photons / elapsed_time max_r = r.max() tau = -numpy.log(1 - max_dt_percentage / 100) / max_r dt = 1 - numpy.exp(-tau * photons / elapsed_time) measured = photons * (1 - dt) if integral_type is None: return measured return (measured + 0.5).astype(integral_type)
[docs]def apply_dualchannel_signal_processing( spectra: numpy.ndarray, max_dt_fast=0.1, max_dt_slow=20, elapsed_time=0.1, counting_noise: bool = True, integral_type: Optional[DTypeLike] = numpy.uint32, ) -> Dict[str, numpy.ndarray]: """MCA spectra with statistics measured by a dual-channel digital signal processor: one channel with low deadtime and low energy precision and one channel with high deadtime and high energy precision. The last dimension of `spectra` is the MCA channel/energy dimension. An MCA spectrum (multi-channel analyzer) contains measured photons binned by their energy. """ shape = spectra.shape[:-1] if integral_type: spectra = spectra.astype(integral_type) if counting_noise: spectra = numpy.random.poisson(spectra) photons = spectra.sum(axis=-1) elapsed_time = numpy.full(shape, elapsed_time) events = apply_extendable_deadtime( photons, elapsed_time, max_dt_slow, integral_type ) triggers = apply_extendable_deadtime(photons, elapsed_time, max_dt_fast) fractional_dead_time = 1 - events / photons event_count_rate = events / elapsed_time trigger_live_time = elapsed_time * triggers / photons live_time = elapsed_time * events / photons trigger_count_rate = triggers / trigger_live_time spectra = spectra * (events / photons)[..., numpy.newaxis] if integral_type: spectra = spectra.astype(integral_type) return { "spectrum": spectra, "events": events, "triggers": triggers, "event_count_rate": event_count_rate, "trigger_count_rate": trigger_count_rate, "live_time": live_time, "trigger_live_time": trigger_live_time, "elapsed_time": elapsed_time, "fractional_dead_time": fractional_dead_time, }