AMS-BP 0.0.21__py3-none-any.whl → 0.0.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
AMS_BP/__init__.py CHANGED
@@ -10,4 +10,4 @@ Last updated: 2024-12-16
10
10
 
11
11
  """
12
12
 
13
- __version__ = "0.0.21"
13
+ __version__ = "0.0.24"
@@ -21,9 +21,7 @@ class MoleculeParameters(BaseModel):
21
21
  diffusion_coefficient: List[List[float]] = Field(
22
22
  description="Diffusion coefficients in um^2/s"
23
23
  )
24
- diffusion_track_amount: List[List[float]]
25
24
  hurst_exponent: List[List[float]]
26
- hurst_track_amount: List[List[float]]
27
25
  allow_transition_probability: List[bool]
28
26
  transition_matrix_time_step: List[int] = Field(description="Time step in ms")
29
27
  diffusion_transition_matrix: List[List[List[float]]]
@@ -33,9 +31,7 @@ class MoleculeParameters(BaseModel):
33
31
 
34
32
  @field_validator(
35
33
  "diffusion_coefficient",
36
- "diffusion_track_amount",
37
34
  "hurst_exponent",
38
- "hurst_track_amount",
39
35
  "state_probability_diffusion",
40
36
  "state_probability_hurst",
41
37
  )
@@ -324,11 +324,12 @@ class ConfigLoader:
324
324
  ):
325
325
  # Create PSFParameters instance
326
326
  parameters = PSFParameters(
327
- wavelength=wavelength,
327
+ emission_wavelength=wavelength,
328
328
  numerical_aperture=float(params_config["numerical_aperture"]),
329
329
  pixel_size=pixel_size,
330
330
  z_step=float(params_config["z_step"]) if z_step is None else z_step,
331
331
  refractive_index=float(params_config.get("refractive_index", 1.0)),
332
+ pinhole_diameter=params_config.get("pinhole_diameter", None),
332
333
  )
333
334
 
334
335
  # Create PSF engine
@@ -1,4 +1,4 @@
1
- from typing import Iterator, List, Literal, Union
1
+ from typing import Dict, Iterator, List, Literal, Union
2
2
 
3
3
  from pydantic import BaseModel
4
4
 
@@ -77,7 +77,7 @@ class MetaData(BaseModel):
77
77
  PhysicalSizeXUnit: Literal["nm", "m"]
78
78
  PhysicalSizeY: float
79
79
  PhysicalSizeYUnit: Literal["nm", "m"]
80
- # Channel: Dict[Literal["Name"], List[str]]
80
+ Channel: Dict[Literal["Name"], List[str]]
81
81
 
82
82
  def __post_init__(self):
83
83
  if isinstance(self.notes, (list, str)):
@@ -20,7 +20,6 @@ Usage:
20
20
  condensate(times, time_unit) -> dict{"Position":np.ndarray, "Scale":float}
21
21
  """
22
22
 
23
- import matplotlib.pyplot as plt
24
23
  import numpy as np
25
24
 
26
25
  from ..cells.rectangular_cell import RectangularCell
@@ -310,47 +309,3 @@ class Condensate:
310
309
  # make array of length time with the last scale
311
310
  scale = np.full(time.shape, last_scale)
312
311
  return scale
313
-
314
- def plot_condensate(self, ax, **kwargs):
315
- """
316
- Plots the condensate
317
-
318
- Parameters:
319
- -----------
320
- ax: plt.Axes
321
- Axes to plot the condensate on.
322
- **kwargs:
323
- Keyword arguments to pass to the plot function.
324
- """
325
- # check if the _condensate_positions exists
326
- if not hasattr(self, "_condensate_positions"):
327
- # if it doesn't then we need to generate the condensate positions
328
- self.times = np.array([self.initial_time])
329
- self.condensate_positions = np.array([self.initial_position])
330
- self.scale = np.array([self.initial_scale])
331
-
332
- # plot the condensate positions
333
- ax.plot(
334
- self.condensate_positions[:, 0], self.condensate_positions[:, 1], **kwargs
335
- )
336
-
337
- # plot a circle at all the positions with the scale as the radius
338
- for i in range(len(self.condensate_positions)):
339
- ax.add_patch(
340
- plt.Circle(
341
- self.condensate_positions[i], self.scale[i], color="r", fill=False
342
- )
343
- )
344
-
345
- # plot the initial position in a different colour
346
- ax.scatter(self.initial_position[0], self.initial_position[1], color="g")
347
- # plot the final position in a different colour
348
- ax.scatter(
349
- self.condensate_positions[-1][0],
350
- self.condensate_positions[-1][1],
351
- color="b",
352
- )
353
- if "save_path" in kwargs:
354
- plt.savefig(kwargs["save_path"])
355
- # plt.show()
356
- return ax
@@ -305,7 +305,7 @@ def create_binning_function(input_shape, binning_size, mode="sum"):
305
305
  numpy.ndarray
306
306
  Binned array
307
307
  """
308
- if array.shape != input_shape:
308
+ if array.shape != tuple(input_shape):
309
309
  raise ValueError(
310
310
  f"Input array shape {array.shape} does not match expected shape {input_shape}"
311
311
  )
@@ -96,7 +96,10 @@ class LaserParameters:
96
96
  Power in watts
97
97
  """
98
98
  if callable(self.power):
99
- return self.power(t)
99
+ power = self.power(t)
100
+ if power < 0:
101
+ raise ValueError("Laser Power Cannot be Negative")
102
+ return power
100
103
  return self.power
101
104
 
102
105
  def get_position(self, t: float) -> Tuple[float, float, float]:
@@ -5,52 +5,61 @@ from typing import Literal, Optional, Tuple
5
5
  import numpy as np
6
6
  from numpy.typing import NDArray
7
7
 
8
+ AIRYFACTOR = 1.0
9
+
8
10
 
9
11
  @dataclass(frozen=True)
10
12
  class PSFParameters:
11
- """Parameters for PSF (Point Spread Function) generation.
13
+ """Parameters for emission PSF (Point Spread Function) at the detector.
14
+
15
+
16
+ This class defines parameters that determine how light from a point source
17
+ (e.g., a fluorescent molecule) diffracts through the collection optics
18
+ to form a pattern at the detector.
12
19
 
13
20
  Attributes:
14
- wavelength: Light wavelength in nanometers
15
- numerical_aperture: Numerical aperture of the optical system
16
- pixel_size: Size of pixels in micrometers
21
+ emission_wavelength: Emission wavelength in nanometers
22
+ numerical_aperture: Numerical aperture of the collection objective
23
+ pixel_size: Size of pixels in micrometers at the detector
17
24
  z_step: Axial step size in micrometers
18
25
  refractive_index: Refractive index of the medium (default: 1.0 for air)
26
+ pinhole_diameter: Diameter of the pinhole in micrometers (default: None for widefield)
27
+ The pinhole spatially filters the emitted light before it reaches
28
+ the detector.
19
29
  """
20
30
 
21
- wavelength: float
31
+ emission_wavelength: float
22
32
  numerical_aperture: float
23
33
  pixel_size: float
24
34
  z_step: float
25
35
  refractive_index: float = 1.0
26
-
27
- # def __post_init__(self) -> None:
28
- # """Validate parameters after initialization."""
29
- # if any(
30
- # param <= 0
31
- # for param in (
32
- # self.wavelength,
33
- # self.numerical_aperture,
34
- # self.pixel_size,
35
- # self.z_step,
36
- # self.refractive_index,
37
- # )
38
- # ):
39
- # raise ValueError("All parameters must be positive numbers")
40
- # if self.numerical_aperture >= self.refractive_index:
41
- # raise ValueError("Numerical aperture must be less than refractive index")
36
+ pinhole_diameter: Optional[float] = None # um
42
37
 
43
38
  @cached_property
44
39
  def wavelength_um(self) -> float:
45
- """Wavelength in micrometers."""
46
- return self.wavelength / 1000.0
40
+ """Emission wavelength in micrometers."""
41
+ return self.emission_wavelength / 1000.0
42
+
43
+ @cached_property
44
+ def pinhole_radius(self) -> Optional[float]:
45
+ """Pinhole radius in micrometers."""
46
+ return (
47
+ self.pinhole_diameter / 2.0 if self.pinhole_diameter is not None else None
48
+ )
47
49
 
48
50
 
49
51
  class PSFEngine:
50
- """Engine for generating various microscope Point Spread Functions.
52
+ """Engine for calculating emission light PSF at the detector.
53
+
54
+ This class calculates how light from a point source (like a fluorescent molecule)
55
+ spreads due to diffraction through the collection optics to form a pattern at
56
+ the detector. For confocal systems, it can include the effect of a pinhole
57
+ that spatially filters the light before detection.
51
58
 
52
- This class implements calculations for both 2D and 3D Point Spread Functions
53
- using Gaussian approximations.
59
+ Note: This PSF describes only the diffraction of emitted light through the
60
+ collection optics. While a confocal microscope uses focused illumination to
61
+ excite molecules, that illumination pattern does not affect how the emitted
62
+ light diffracts to form the PSF we calculate here.
54
63
  """
55
64
 
56
65
  def __init__(self, params: PSFParameters):
@@ -79,34 +88,76 @@ class PSFEngine:
79
88
  self._norm_sigma_xy = self._sigma_xy / 2.355
80
89
  self._norm_sigma_z = self._sigma_z / 2.355
81
90
 
91
+ # Generate pinhole mask if specified
92
+ if self.params.pinhole_radius is not None:
93
+ if self.params.pinhole_radius < AIRYFACTOR * self._sigma_xy:
94
+ raise ValueError(
95
+ f"Pinhole size ({self.params.pinhole_radius} um) is smaller than {AIRYFACTOR} times the Airy lobe. This will diffract the emission light in the pinhole; an ideal pinhole size for this setup is {self._sigma_xy} um."
96
+ )
97
+ self._pinhole_mask = self._generate_pinhole_mask()
98
+ else:
99
+ self._pinhole_mask = None
100
+
101
+ def _generate_pinhole_mask(self) -> NDArray[np.float64]:
102
+ """Generate a binary mask representing the pinhole's spatial filtering.
103
+ The pinhole is centered on the grid, blocking emission light based on position
104
+ in the image plane, affecting what portion of the diffracted light reaches
105
+ the detector.
106
+ """
107
+ x, y = self._grid_xy
108
+
109
+ # Calculate the grid center
110
+ x_center = (x.max() + x.min()) / 2
111
+ y_center = (y.max() + y.min()) / 2
112
+
113
+ # Calculate radial distance from grid center
114
+ r = np.sqrt((x - x_center) ** 2 + (y - y_center) ** 2)
115
+
116
+ return (r <= self.params.pinhole_radius).astype(np.float64)
117
+
82
118
  @lru_cache(maxsize=128)
83
119
  def psf_z(self, z_val: float) -> NDArray[np.float64]:
84
- """Generate z=z_val Gaussian approximation of PSF.
120
+ """Calculate the PSF at the detector for a point source at z_val.
121
+
122
+ This represents how light from a point source at position z_val
123
+ diffracts through the collection optics to form a pattern at the
124
+ detector. If a pinhole is present, it spatially filters this pattern.
85
125
 
86
126
  Args:
87
- z_val: Z-position in micrometers
127
+ z_val: Z-position of the point source in micrometers
88
128
 
89
129
  Returns:
90
- 2D array containing the PSF at given z position
130
+ 2D array containing the light intensity pattern at the detector
91
131
  """
92
132
  x, y = self._grid_xy
93
133
 
94
- # Vectorized calculation
134
+ # Calculate how light from the point source diffracts through collection optics
95
135
  r_squared = (x / self._norm_sigma_xy) ** 2 + (y / self._norm_sigma_xy) ** 2
96
136
  z_term = (z_val / self._norm_sigma_z) ** 2
97
- return np.exp(-0.5 * (r_squared + z_term))
137
+ psf_at_detector = np.exp(-0.5 * (r_squared + z_term))
138
+
139
+ if self._pinhole_mask is not None:
140
+ # Apply pinhole's spatial filtering
141
+ return psf_at_detector * self._pinhole_mask
142
+
143
+ return psf_at_detector
98
144
 
99
145
  @lru_cache(maxsize=128)
100
146
  def psf_z_xy0(self, z_val: float) -> float:
101
- """Generate z=z_val Gaussian approximation of PSF with x=y=0.
147
+ """Calculate the PSF intensity at the center of the detector.
148
+
149
+ For a point source at z_val, this gives the intensity of light
150
+ that reaches the detector center (x=y=0). This point is always
151
+ within the pinhole if one is present.
102
152
 
103
153
  Args:
104
- z_val: Z-position in micrometers
154
+ z_val: Z-position of the point source in micrometers
105
155
 
106
156
  Returns:
107
- PSF value at x=y=0 and given z position
157
+ Light intensity at detector center
108
158
  """
109
- return np.exp(-0.5 * (z_val / self._norm_sigma_z) ** 2)
159
+ z_term = (z_val / self._norm_sigma_z) ** 2
160
+ return np.exp(-0.5 * z_term)
110
161
 
111
162
  @cache
112
163
  def _3d_normalization_A(
@@ -27,6 +27,7 @@ class StateTransitionCalculator:
27
27
  self.current_global_time = current_global_time # ms (oversample motion time)
28
28
  self.laser_intensity_generator = laser_intensity_generator
29
29
  self.fluorescent_state_history = {} # {fluorescent.state.name : [delta time (seconds), laser_intensites], ...}
30
+ self.current_global_time_s = self.current_global_time * 1e-3
30
31
 
31
32
  def __call__(
32
33
  self,
@@ -48,7 +49,9 @@ class StateTransitionCalculator:
48
49
  time = 0
49
50
  transitions = self.flurophoreobj.state_history[self.current_global_time][2]
50
51
  final_state_name = transitions[0].from_state
51
- laser_intensities = self._initialize_state_hist(self.current_global_time, time)
52
+ laser_intensities = self._initialize_state_hist(
53
+ self.current_global_time, time + self.current_global_time_s
54
+ )
52
55
 
53
56
  while time < self.time_duration:
54
57
  stateTransitionMatrixR = [
@@ -1,14 +1,14 @@
1
1
  """
2
2
  run_cell_simulation.py
3
3
 
4
- This file contains the command-line interface (CLI) for the SMS_BP package, which is used for simulating single molecule localization microscopy experiments.
4
+ This file contains the command-line interface (CLI) for the AMS_BP package.
5
5
 
6
6
  The CLI is built using Typer and provides two main commands:
7
7
  1. 'config': Generates a sample configuration file.
8
8
  2. 'runsim': Runs the cell simulation using a provided configuration file.
9
9
 
10
10
  Main Components:
11
- - typer_app_sms_bp: The main Typer application object.
11
+ - typer_app_asms_bp: The main Typer application object.
12
12
  - cell_simulation(): Callback function that displays the version information.
13
13
  - generate_config(): Command to generate a sample configuration file.
14
14
  - run_cell_simulation(): Command to run the cell simulation using a configuration file.
@@ -37,7 +37,7 @@ from .configio.saving import save_config_frames
37
37
 
38
38
  cli_help_doc = str(
39
39
  """
40
- CLI tool to run [underline]A[/underline]dvanced [underline]M[/underline]olecule [underline]S[/underline]imulation: [underline]ASMS[/underline]-BP. GitHub: [green]https://github.com/joemans3/AMS_BP[/green].
40
+ CLI tool to run [underline]A[/underline]dvanced [underline]M[/underline]olecule [underline]S[/underline]imulation: [underline]AMS[/underline]-BP. GitHub: [green]https://github.com/joemans3/AMS_BP[/green].
41
41
  [Version: [bold]{0}[/bold]]
42
42
  """.format(__version__)
43
43
  )
AMS_BP/sim_config.toml CHANGED
@@ -23,18 +23,8 @@ diffusion_coefficient = [
23
23
  0.0,
24
24
  ],
25
25
  ] # um^2/s, size of each index (eg. len(...[0]) is the # of diffusion coefficients the system can explore.
26
- diffusion_track_amount = [
27
- [
28
- 0.5,
29
- 0.5,
30
- ],
31
- [
32
- 0.5,
33
- 0.5,
34
- ],
35
- ] # only usefull for initial distribution of diffusion coefficients to trajectories.
26
+
36
27
  hurst_exponent = [[0.5], [0.5]]
37
- hurst_track_amount = [[1.0], [1.0]]
38
28
  allow_transition_probability = [true, true] # bool
39
29
  transition_matrix_time_step = [
40
30
  20,
@@ -193,12 +183,6 @@ to_state = "triplet"
193
183
  photon_dependent = false
194
184
  base_rate = 1 # 1/s
195
185
 
196
- [fluorophores.PAmCherry.transitions.triplet_to_bleached]
197
- from_state = "triplet"
198
- to_state = "bleached"
199
- photon_dependent = false
200
- base_rate = 1 # 1/s
201
-
202
186
  [fluorophores.PAmCherry.transitions.triplet_to_dark]
203
187
  from_state = "triplet"
204
188
  to_state = "dark"
@@ -275,6 +259,7 @@ custom_path = ""
275
259
  [psf.parameters]
276
260
  numerical_aperture = 1.4 # typical range: 0.1 - 1.5
277
261
  refractive_index = 1.0 # default is air (1.0)
262
+ #pinhole_diameter = 1.0 # Do not include for no pinhole else float in um units
278
263
 
279
264
  # Multiple Laser Configuration File
280
265
 
AMS_BP/sim_microscopy.py CHANGED
@@ -276,7 +276,7 @@ class VirtualMicroscope:
276
276
  PhysicalSizeXUnit="m",
277
277
  PhysicalSizeY=self.camera.pixel_size * 1e-6,
278
278
  PhysicalSizeYUnit="m",
279
- # Channel={"Name": self.channels.names},
279
+ Channel={"Name": self.channels.names},
280
280
  )
281
281
 
282
282
  # return frames in the format ZCTYX
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AMS_BP
3
- Version: 0.0.21
3
+ Version: 0.0.24
4
4
  Summary: Advanced Microscopy Simulations developed for the Weber Lab by Baljyot Singh Parmar
5
5
  Project-URL: Documentation, https://joemans3.github.io/AMS_BP/
6
6
  Project-URL: Source code, https://github.com/joemans3/AMS_BP
@@ -10,7 +10,6 @@ License-File: LICENSE
10
10
  Keywords: SMS
11
11
  Requires-Python: >=3.10
12
12
  Requires-Dist: jsonschema>=4.23.0
13
- Requires-Dist: matplotlib>=3.6.0
14
13
  Requires-Dist: numpy>=1.21.2
15
14
  Requires-Dist: pydantic>=2.9.2
16
15
  Requires-Dist: scikit-image>=0.18.3
@@ -172,3 +171,5 @@ frames, metadata = function_exp(microscope=microscope, config=config_exp)
172
171
  from AMS_BP.configio.saving import save_config_frames
173
172
  save_config_frames(metadata, frames, setup_config["base_config"].OutputParameters)
174
173
  ```
174
+
175
+ > A more detailed example is provided in the jupyter notebook in the examples. For starters refer to the [VisualizingIndividualModules](examples/VisualizingIndividualModules/modules_explained.ipynb)
@@ -1,40 +1,40 @@
1
- AMS_BP/__init__.py,sha256=gA3WHujyg_TRO9bQK9orLK8uNHSObJpmsLkv8GHRzLc,327
2
- AMS_BP/run_cell_simulation.py,sha256=fPU1Tuu7hBupGtMk07j2t8QYo_TjFLMJRU9fwmAgU9c,7502
3
- AMS_BP/sim_config.toml,sha256=FD-OcSDAgRuNIalFe0pC8sbsaSwM-9DV2DNswds2q54,11976
4
- AMS_BP/sim_microscopy.py,sha256=7JQ6NQlgNZCvFE-FC1f9Ehh6DoJgn7bLzeqS_Mamq9Y,18619
1
+ AMS_BP/__init__.py,sha256=_0wRoFCXiDI2esMHAgmC0k46izWDlMXa_aqJ_MoW48g,327
2
+ AMS_BP/run_cell_simulation.py,sha256=7InopFikjo0HfaLO2siXskBIbyCIte9avG4YXjjaWCI,7420
3
+ AMS_BP/sim_config.toml,sha256=3IqOQIJYmP5g4okk15nqQiNZb3ij7Pt63HbpI-5tySw,11672
4
+ AMS_BP/sim_microscopy.py,sha256=0UZfyT44nrB4JdfnFnRPTVBm3tPbCyOnPXiBBZs8xIc,18617
5
5
  AMS_BP/cells/__init__.py,sha256=yWFScBC1uOGDkeC8i1m1ZBtIREcyt4JHxYa72LxbBZU,177
6
6
  AMS_BP/cells/base_cell.py,sha256=FIPB9J8F40tb53vv7C6qG-SaAFLOI8-MGIk1mmZ-gnI,1503
7
7
  AMS_BP/cells/rectangular_cell.py,sha256=5yGxvTXYvgldLXyWXpE_SD9Zx2NLerC-I2j02reHsJ0,2515
8
8
  AMS_BP/cells/rod_cell.py,sha256=jQ1kLEk74Pv2rcXPRJ6-QJJhux-mYiDSytzqlxCNWfA,3181
9
9
  AMS_BP/cells/spherical_cell.py,sha256=n3ou3tW0nCxXIwv6uLkVKHkYCfgoNn8VI6CVTLBIll0,2140
10
10
  AMS_BP/configio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- AMS_BP/configio/configmodels.py,sha256=Isc6THk3RAIVdjEUBW4c_OD0I122dYufgEvAcGJQ5uo,3046
12
- AMS_BP/configio/convertconfig.py,sha256=lS7FTDheESdbpaZ0K1LcE8rkdJOKLjzIvcmWpjeebSs,34654
11
+ AMS_BP/configio/configmodels.py,sha256=Gd2Qdut0u5zS0IpjPwGIB3ur-b4Dfa9e8SbhotBKymc,2894
12
+ AMS_BP/configio/convertconfig.py,sha256=Fg9pOCZSxmWuHnrg-5xZRvhPEK6Qc1kXqu6LL9e9QYw,34741
13
13
  AMS_BP/configio/experiments.py,sha256=HdfaSi0gPPJ_wLF87XcW5ICja19Uezx7-ygFEwNzi30,3995
14
14
  AMS_BP/configio/saving.py,sha256=596QgAadV32rzsN4B2FngGFcBWCzCDnLFN-qtQsv3bM,857
15
15
  AMS_BP/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- AMS_BP/metadata/metadata.py,sha256=_FwbSRsUhGwigY6YYffMgEx5hlXTT_vu-9AldMFPa6w,2923
16
+ AMS_BP/metadata/metadata.py,sha256=YDumjc5sI3lY_UZx8f0ZhMqbG2qKQkysXwl7CY4ZtnY,2927
17
17
  AMS_BP/motion/__init__.py,sha256=cy3W-wCRjjlN1DrTqYc-JltYwcE8SZCXMVPJ2o6q_BQ,178
18
- AMS_BP/motion/condensate_movement.py,sha256=cGLHIOL7VUJ7U-JrJXetcnUF2v9SepIBznoqu6AQPxU,13252
18
+ AMS_BP/motion/condensate_movement.py,sha256=eig4WtD7o1cvIafWMjOk6pqxyhe_IIucgLcBEoDvasU,11648
19
19
  AMS_BP/motion/track_gen.py,sha256=Z3QJLVMP1gX4SlgOXFxBg8sJhBG0Xq25ixnBoEHEAZI,19462
20
20
  AMS_BP/motion/movement/__init__.py,sha256=PqovpG4dAuFFIP9M2_kt-6egQJX3P5ig4MMWVzNaswg,278
21
21
  AMS_BP/motion/movement/boundary_conditions.py,sha256=jpfK3AEUY8btrTsu19bpUfx-jri7_HfyxqMFjMoxAVM,2200
22
22
  AMS_BP/motion/movement/fbm_BP.py,sha256=dH-JZiAInnIaZXH1wAAo8dOIX9zafclqnZ4dOhKtnO0,9327
23
23
  AMS_BP/optics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  AMS_BP/optics/camera/__init__.py,sha256=eCoDUFHcoCWgbgYdLn8EH7AULM53A3XWTXNZnV8QxeY,182
25
- AMS_BP/optics/camera/detectors.py,sha256=UJqi7owESw9nkFiQhoAe7Q1LIi_fYCzuvZLgtM3yAPk,10348
25
+ AMS_BP/optics/camera/detectors.py,sha256=_815Ovo7Aj375OZh5Xim8pFuZEEcSVtSdnLRYFqb3_8,10355
26
26
  AMS_BP/optics/camera/quantum_eff.py,sha256=ZCvJ8dJESOUbjwblsJIBcCg_b-_DNdhDlkzd7HeGMDg,2378
27
27
  AMS_BP/optics/filters/__init__.py,sha256=oYPk2_wuL4KrwbaZy3gktvO5biQUfdQLUColWhkU1lw,337
28
28
  AMS_BP/optics/filters/filters.py,sha256=-iw7eqmDO77SEqlFTv5jJNVwpA8y93TLsjy5hhsAfiI,6406
29
29
  AMS_BP/optics/filters/channels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  AMS_BP/optics/filters/channels/channelschema.py,sha256=SConyA5yVdfnI_8sgcxVC8SV7S8tGUJYPPC6jn7lglU,906
31
31
  AMS_BP/optics/lasers/__init__.py,sha256=T7dHohhyLf_pBw4TidarYHWmiwxVXGE71-Bf1aeBbuc,564
32
- AMS_BP/optics/lasers/laser_profiles.py,sha256=J9czY646XcW8GzXx9Eb16mG7tQdWw4oVYveOrihZCeY,22745
32
+ AMS_BP/optics/lasers/laser_profiles.py,sha256=dLnobLB-zZIG9EyMkU4E2P9CDl3n3OLzgR8Tx5EAd2c,22864
33
33
  AMS_BP/optics/psf/__init__.py,sha256=ezrKPgpTeR4gTHOvF0mhF6u2zMMTd8Bgp8PGeOf11fA,121
34
- AMS_BP/optics/psf/psf_engine.py,sha256=ejmTwAKtEpXvKeMuUFcuz6HjJbEjQa_NvkE6a3hkVzk,6769
34
+ AMS_BP/optics/psf/psf_engine.py,sha256=Do54D1jMbSrj5uljdTrrEttCvxq3qbVT74acRuOk15c,9434
35
35
  AMS_BP/photophysics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  AMS_BP/photophysics/photon_physics.py,sha256=QRG_QIZ4csJ3g5qGP9Wtk7kzqm8_MUbVHfFef6cMtHQ,6671
37
- AMS_BP/photophysics/state_kinetics.py,sha256=0cc7Vc4LtAbEdGDeg22IJmRGLsONOty4c32hXHO-TSU,5281
37
+ AMS_BP/photophysics/state_kinetics.py,sha256=IdZtlHCLs--iSjLwDu2IQA617qXC4la8VpqosrM-vgQ,5401
38
38
  AMS_BP/probabilityfuncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  AMS_BP/probabilityfuncs/markov_chain.py,sha256=LV6KGr8Lv4NIvBPJqsR0CEynssa_mPH30qLaK85GObA,4339
40
40
  AMS_BP/probabilityfuncs/probability_functions.py,sha256=j_rIxrupGBf_FKkQBh1TvEa34A44jAasaZQRg2u3FuY,11793
@@ -48,8 +48,8 @@ AMS_BP/utils/decorators.py,sha256=4qFdvzPJne0dhkhD1znPxRln1Rfr5NX8rdcCDcbATRU,62
48
48
  AMS_BP/utils/errors.py,sha256=7BOd-L4_YeKmWn3Q4EOdTnNF3Bj_exDa3eg5X0yCZrc,759
49
49
  AMS_BP/utils/maskMaker.py,sha256=2ca3n2nc8rFtUh1LurKXOJJsUmhrOpWbRnVX7fjRVvs,335
50
50
  AMS_BP/utils/util_functions.py,sha256=jI6WBh09_khdABnEoVK7SK1WRvCLHuw40f5ALyflzlc,9478
51
- ams_bp-0.0.21.dist-info/METADATA,sha256=RhM8C7dT2SXt-rbPFdQdo_EaiOFUx-7uC7uvic8IpvU,5316
52
- ams_bp-0.0.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
- ams_bp-0.0.21.dist-info/entry_points.txt,sha256=MFUK9bZWW61djfsavqopMqiVPVn4lJtt6v8qzyEFyNM,76
54
- ams_bp-0.0.21.dist-info/licenses/LICENSE,sha256=k_-JV1DQKvO0FR8WjvOisqdTl0kp6VJ7RFM3YZhao0c,1071
55
- ams_bp-0.0.21.dist-info/RECORD,,
51
+ ams_bp-0.0.24.dist-info/METADATA,sha256=s8z9bcI32yK1EZINiomMaexx3UFZ1gGJZLDc7412oqk,5483
52
+ ams_bp-0.0.24.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
+ ams_bp-0.0.24.dist-info/entry_points.txt,sha256=MFUK9bZWW61djfsavqopMqiVPVn4lJtt6v8qzyEFyNM,76
54
+ ams_bp-0.0.24.dist-info/licenses/LICENSE,sha256=k_-JV1DQKvO0FR8WjvOisqdTl0kp6VJ7RFM3YZhao0c,1071
55
+ ams_bp-0.0.24.dist-info/RECORD,,