import numpy as np
class AbstractTrap:
def __init__(self, density=1.0, release_timescale=1.0):
self.density = density
self.release_timescale = release_timescale
@property
def delta_ellipticity(self):
raise NotImplementedError
[docs]class TrapInstantCapture(AbstractTrap):
[docs] def __init__(
self,
density: float = 1.0,
release_timescale=1.0,
fractional_volume_none_exposed=0.0,
fractional_volume_full_exposed=0.0,
):
super().__init__(density, release_timescale)
self.fractional_volume_none_exposed = fractional_volume_none_exposed
self.fractional_volume_full_exposed = fractional_volume_full_exposed
@property
def delta_ellipticity(self):
a = 0.05333
d_a = -0.03357
d_p = 1.628
d_w = 0.2951
g_a = 0.09901
g_p = 0.4553
g_w = 0.4132
return (
4.0
* self.density
* (
a
+ d_a * (np.arctan((np.log10(self.release_timescale) - d_p) / d_w))
+ (
g_a
* np.exp(
-((np.log10(self.release_timescale) - g_p) ** 2.0)
/ (2 * g_w**2.0)
)
)
)
)
def poisson_density_from(self, total_pixels, seed=-1):
if seed == -1:
seed = np.random.randint(0, int(1e9))
np.random.seed(seed)
density_pixels = self.density * total_pixels
poisson_density_pixels = np.random.poisson(density_pixels)
poisson_density_per_pixel = poisson_density_pixels / total_pixels
return TrapInstantCapture(
density=poisson_density_per_pixel, release_timescale=self.release_timescale
)
[docs]class TrapSlowCapture(AbstractTrap):
[docs] def __init__(self, density=1.0, release_timescale=1.0, capture_timescale=0.0):
super().__init__(density, release_timescale)
self.capture_timescale = capture_timescale
[docs]class TrapInstantCaptureContinuum(AbstractTrap):
[docs] def __init__(self, density=1.0, release_timescale=1.0, release_timescale_sigma=0.0):
super().__init__(density, release_timescale)
self.release_timescale_sigma = release_timescale_sigma
class TrapSlowCaptureContinuum(TrapSlowCapture):
def __init__(
self,
density=1.0,
release_timescale=1.0,
release_timescale_sigma=0.0,
capture_timescale=0.0,
):
super().__init__(density, release_timescale)
self.release_timescale_sigma = release_timescale_sigma
self.capture_timescale = capture_timescale