AMS-BP 0.0.25__py3-none-any.whl → 0.0.31__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.25"
13
+ __version__ = "0.0.31"
@@ -1,6 +1,7 @@
1
1
  import numpy as np
2
- from .boundary_conditions import _refecting_boundary, _absorbing_boundary
2
+
3
3
  from ...probabilityfuncs.markov_chain import MCMC_state_selection
4
+ from .boundary_conditions import _absorbing_boundary, _refecting_boundary
4
5
 
5
6
  BOUNDARY_CONDITIONS = {
6
7
  "reflecting": _refecting_boundary,
@@ -161,10 +162,8 @@ class FBM_BP:
161
162
  phi = np.zeros(self.n)
162
163
  psi = np.zeros(self.n)
163
164
  # construct a gaussian noise vector
164
- gn = (
165
- np.random.normal(0, 1, self.n)
166
- * np.sqrt(self.dt * 2 * self._diff_a_n)
167
- * (self.dt ** (2 * self._hurst_n))
165
+ gn = np.random.normal(0, 1, self.n) * np.sqrt(
166
+ 2 * self._diff_a_n * (self.dt ** (2 * self._hurst_n))
168
167
  )
169
168
  # catch is all hurst are 0.5 then use the gaussian noise vector corresponding to the scale defined by the diffusion parameter
170
169
  if np.all(self._hurst_n == 0.5):
@@ -124,12 +124,12 @@ class Track_generator:
124
124
  rel_space_lim[i] = self.space_lim[i] - initials[i]
125
125
 
126
126
  # convert the diffusion_coefficients
127
- diffusion_coefficient = self._convert_diffcoef_um2s_um2xms(
128
- diffusion_coefficient
129
- )
127
+ # diffusion_coefficient = self._convert_diffcoef_um2s_um2xms(
128
+ # diffusion_coefficient
129
+ # )
130
130
  fbm = FBM_BP(
131
131
  n=track_length,
132
- dt=1,
132
+ dt=self.oversample_motion_time / 1000.0,
133
133
  hurst_parameters=[hurst_exponent],
134
134
  diffusion_parameters=[diffusion_coefficient],
135
135
  diffusion_parameter_transition_matrix=[1],
@@ -216,11 +216,11 @@ class Track_generator:
216
216
  for i in range(3):
217
217
  rel_space_lim[i] = self.space_lim[i] - initials[i]
218
218
  # convert the diffusion_coefficients
219
- diffusion_parameters = self._convert_diffcoef_um2s_um2xms(diffusion_parameters)
219
+ # diffusion_parameters = self._convert_diffcoef_um2s_um2xms(diffusion_parameters)
220
220
  # initialize the fbm class
221
221
  fbm = FBM_BP(
222
222
  n=track_length,
223
- dt=1,
223
+ dt=self.oversample_motion_time / 1000.0,
224
224
  hurst_parameters=hurst_parameters,
225
225
  diffusion_parameters=diffusion_parameters,
226
226
  diffusion_parameter_transition_matrix=diffusion_transition_matrix,
@@ -371,15 +371,16 @@ class WidefieldBeam(LaserProfile):
371
371
  Returns:
372
372
  Intensity scaling factor between 0 and 1
373
373
  """
374
- # Use error function for smooth transition at DoF boundaries
375
- # Scale factor determines how sharp the transition is
376
- scale_factor = 2.0 # Adjust this to change transition sharpness
377
-
378
- # Normalize z by DoF and create smooth falloff
379
- normalized_z = scale_factor * (np.abs(z) - self.dof / 2) / self.dof
380
-
381
- # Use sigmoid function for smooth transition
382
- return 1 / (1 + np.exp(normalized_z))
374
+ # # Use error function for smooth transition at DoF boundaries
375
+ # # Scale factor determines how sharp the transition is
376
+ # scale_factor = 2.0 # Adjust this to change transition sharpness
377
+ #
378
+ # # Normalize z by DoF and create smooth falloff
379
+ # normalized_z = scale_factor * (np.abs(z)) / self.dof
380
+ #
381
+ # # Use sigmoid function for smooth transition
382
+ # return 1 / (1 + np.exp(normalized_z))
383
+ return 1.0
383
384
 
384
385
  def calculate_intensity(
385
386
  self,
@@ -416,7 +417,7 @@ class WidefieldBeam(LaserProfile):
416
417
  base_intensity = power / (np.pi * self.max_radius**2)
417
418
 
418
419
  # Apply radial intensity profile with smooth falloff at edges
419
- edge_width = self.max_radius * 0.01 # 10% of max radius
420
+ edge_width = self.max_radius * 0.00001
420
421
  radial_profile = 0.5 * (1 - np.tanh((r - self.max_radius) / edge_width))
421
422
  # Apply DoF-based axial intensity profile
422
423
  axial_profile = self._calculate_dof_profile(z_shifted)
@@ -425,32 +426,6 @@ class WidefieldBeam(LaserProfile):
425
426
  return base_intensity * radial_profile * axial_profile
426
427
 
427
428
 
428
- # Example usage
429
- if __name__ == "__main__":
430
- # Create parameters for a typical microscope objective
431
- params = LaserParameters(
432
- wavelength=488, # 488 nm
433
- power=0.001, # 1 mW
434
- beam_width=0.25, # 250 nm
435
- numerical_aperture=1.4,
436
- refractive_index=1.518, # Oil immersion
437
- )
438
-
439
- # Create beam object
440
- beam = GaussianBeam(params)
441
-
442
- # Get intensity map
443
- result = beam.get_intensity_map(
444
- volume_size=(5, 5, 10), # 5x5x10 microns
445
- voxel_size=0.1, # 100 nm voxels
446
- t=0, # t=0 seconds
447
- )
448
-
449
- # print(f"Beam waist: {params.beam_width:.3f} µm")
450
- # print(f"Rayleigh range: {params.rayleigh_range:.3f} µm")
451
- # print(f"Diffraction limit: {params.diffraction_limited_width:.3f} µm")
452
-
453
-
454
429
  class HiLoBeam(LaserProfile):
455
430
  """
456
431
  Highly Inclined Laminated Optical (HiLo) illumination profile.
@@ -552,143 +527,3 @@ class HiLoBeam(LaserProfile):
552
527
  lamination_factor = np.exp(-np.abs(z_shifted) / (2 * self.axial_resolution))
553
528
 
554
529
  return intensity * lamination_factor
555
-
556
-
557
- class ConfocalBeam(LaserProfile):
558
- """
559
- Confocal microscopy beam profile with point scanning and pinhole characteristics.
560
-
561
- Implements key optical principles of confocal microscopy:
562
- - Point scanning illumination
563
- - Pinhole-based rejection of out-of-focus light
564
- - Depth-resolved imaging capabilities
565
- """
566
-
567
- def __init__(
568
- self,
569
- params: LaserParameters,
570
- pinhole_diameter: float, # Pinhole diameter in microns
571
- scanning_mode: str = "point", # 'point' or 'line'
572
- line_orientation: str = "horizontal", # 'horizontal' or 'vertical'
573
- ):
574
- """
575
- Initialize Confocal beam profile.
576
-
577
- Args:
578
- params: LaserParameters for the beam
579
- pinhole_diameter: Diameter of the detection pinhole in microns
580
- scanning_mode: Scanning method ('point' or 'line')
581
- line_orientation: Orientation for line scanning
582
- """
583
- super().__init__(params)
584
-
585
- # Validate numerical aperture
586
- if params.numerical_aperture is None:
587
- raise ValueError(
588
- "Numerical aperture must be specified for confocal microscopy"
589
- )
590
-
591
- # Pinhole and optical characteristics
592
- self.pinhole_diameter = pinhole_diameter
593
- self.scanning_mode = scanning_mode
594
- self.line_orientation = line_orientation
595
-
596
- # Calculate optical parameters
597
- wavelength_microns = params.wavelength / 1000.0
598
- na = params.numerical_aperture
599
-
600
- # Theoretical resolution calculations
601
- self.lateral_resolution = 0.61 * wavelength_microns / na
602
- self.axial_resolution = 0.5 * wavelength_microns / (na**2)
603
-
604
- # Pinhole transmission calculation
605
- # Airy disk radius calculation
606
- self.airy_radius = 1.22 * wavelength_microns / (2 * na)
607
-
608
- # Transmission through pinhole
609
- def pinhole_transmission(z):
610
- """
611
- Calculate pinhole transmission as a function of z-position.
612
- Uses an error function to model smooth transition.
613
- """
614
- # Normalized z-position relative to focal plane
615
- z_norm = z / self.axial_resolution
616
-
617
- # Smooth transition function
618
- return 0.5 * (1 + np.tanh(-z_norm))
619
-
620
- self.pinhole_transmission = pinhole_transmission
621
-
622
- # print("Confocal Microscopy Configuration:")
623
- # print(f" Scanning Mode: {scanning_mode}")
624
- # print(f" Pinhole Diameter: {pinhole_diameter:.2f} µm")
625
- # print(f" Lateral Resolution: {self.lateral_resolution:.3f} µm")
626
- # print(f" Axial Resolution: {self.axial_resolution:.3f} µm")
627
- # print(f" Airy Disk Radius: {self.airy_radius:.3f} µm")
628
-
629
- def calculate_intensity(
630
- self,
631
- x: np.ndarray | float,
632
- y: np.ndarray | float,
633
- z: np.ndarray | float,
634
- t: float,
635
- ) -> np.ndarray:
636
- """
637
- Calculate the confocal illumination intensity distribution.
638
-
639
- Args:
640
- x: X coordinates in microns (3D array)
641
- y: Y coordinates in microns (3D array)
642
- z: Z coordinates in microns (3D array)
643
- t: Time in seconds
644
-
645
- Returns:
646
- 3D array of intensities in W/µm²
647
- """
648
- # Get time-dependent parameters
649
- power = self.params.get_power(t)
650
- pos = self.params.get_position(t)
651
-
652
- # Shift coordinates based on current beam position
653
- x_shifted = x - pos[0]
654
- y_shifted = y - pos[1]
655
- z_shifted = z - pos[2]
656
-
657
- # Base beam parameters
658
- w0 = self.params.beam_width # Beam waist
659
- zR = self.params.rayleigh_range # Rayleigh range
660
-
661
- # Calculate beam width at z
662
- w_z = w0 * np.sqrt(1 + (z_shifted / zR) ** 2)
663
-
664
- # Peak intensity calculation
665
- I0 = 2 * power / (np.pi * w0**2)
666
-
667
- # Scanning mode intensity modification
668
- if self.scanning_mode == "point":
669
- # Point scanning: standard Gaussian beam
670
- radial_intensity = (
671
- I0
672
- * (w0 / w_z) ** 2
673
- * np.exp(-2 * (x_shifted**2 + y_shifted**2) / w_z**2)
674
- )
675
- elif self.scanning_mode == "line":
676
- # Line scanning: different intensity distribution
677
- if self.line_orientation == "horizontal":
678
- line_intensity = (
679
- I0 * (w0 / w_z) ** 2 * np.exp(-2 * y_shifted**2 / w_z**2)
680
- )
681
- radial_intensity = line_intensity
682
- else: # vertical line scanning
683
- line_intensity = (
684
- I0 * (w0 / w_z) ** 2 * np.exp(-2 * x_shifted**2 / w_z**2)
685
- )
686
- radial_intensity = line_intensity
687
- else:
688
- raise ValueError(f"Unknown scanning mode: {self.scanning_mode}")
689
-
690
- # Pinhole transmission effect
691
- pinhole_effect = self.pinhole_transmission(z_shifted)
692
-
693
- # Final intensity calculation
694
- return radial_intensity * pinhole_effect
@@ -85,15 +85,19 @@ class PSFEngine:
85
85
  self._grid_xy = _generate_grid(self._psf_size, self.params.pixel_size)
86
86
 
87
87
  # Pre-calculate normalized sigma values
88
- self._norm_sigma_xy = self._sigma_xy / 2.355
89
- self._norm_sigma_z = self._sigma_z / 2.355
88
+ self._norm_sigma_xy = self._sigma_xy / 2.0
89
+ self._norm_sigma_z = self._sigma_z / 2.0
90
90
 
91
91
  # Generate pinhole mask if specified
92
92
  if self.params.pinhole_radius is not None:
93
93
  if self.params.pinhole_radius < AIRYFACTOR * self._sigma_xy:
94
- raise ValueError(
94
+ RuntimeWarning(
95
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
96
  )
97
+ #
98
+ # raise ValueError(
99
+ # 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."
100
+ # )
97
101
  self._pinhole_mask = self._generate_pinhole_mask()
98
102
  else:
99
103
  self._pinhole_mask = None
@@ -116,7 +120,9 @@ class PSFEngine:
116
120
  return (r <= self.params.pinhole_radius).astype(np.float64)
117
121
 
118
122
  @lru_cache(maxsize=128)
119
- def psf_z(self, z_val: float) -> NDArray[np.float64]:
123
+ def psf_z(
124
+ self, x_val: float, y_val: float, z_val: float, norm_scale: bool = True
125
+ ) -> NDArray[np.float64]:
120
126
  """Calculate the PSF at the detector for a point source at z_val.
121
127
 
122
128
  This represents how light from a point source at position z_val
@@ -124,17 +130,28 @@ class PSFEngine:
124
130
  detector. If a pinhole is present, it spatially filters this pattern.
125
131
 
126
132
  Args:
133
+ x_val: x-position of the point source in micrometers
134
+ y_val: y-position of the point source in micrometers
127
135
  z_val: Z-position of the point source in micrometers
128
136
 
129
137
  Returns:
130
138
  2D array containing the light intensity pattern at the detector
131
139
  """
132
140
  x, y = self._grid_xy
141
+ sigma_xy_z_squared = (self._norm_sigma_xy**2) * (
142
+ 1 + (z_val / self._norm_sigma_z) ** 2
143
+ )
133
144
 
134
145
  # Calculate how light from the point source diffracts through collection optics
135
- r_squared = (x / self._norm_sigma_xy) ** 2 + (y / self._norm_sigma_xy) ** 2
136
- z_term = (z_val / self._norm_sigma_z) ** 2
137
- psf_at_detector = np.exp(-0.5 * (r_squared + z_term))
146
+ r_squared = (x - x_val % self.params.pixel_size) ** 2 + (
147
+ y - y_val % self.params.pixel_size
148
+ ) ** 2
149
+ psf_at_detector = np.exp(-0.5 * (r_squared / sigma_xy_z_squared))
150
+
151
+ if norm_scale:
152
+ psf_at_detector = self.normalize_psf(
153
+ psf_at_detector, mode="sum"
154
+ ) * self.psf_z_xy0(z_val)
138
155
 
139
156
  if self._pinhole_mask is not None:
140
157
  # Apply pinhole's spatial filtering
@@ -252,7 +269,7 @@ def calculate_psf_size(
252
269
  Tuple of dimensions (z,y,x) or (y,x) for the PSF calculation
253
270
  """
254
271
  # Calculate radius to capture important features (2x Airy radius)
255
- r_psf = 2 * sigma_xy
272
+ r_psf = 3 * sigma_xy
256
273
 
257
274
  # Convert to pixels and ensure odd number
258
275
  pixels_xy = int(np.ceil(r_psf / pixel_size))
@@ -168,11 +168,11 @@ class incident_photons:
168
168
  photons_n = self.transmission_photon_rate.values[i] * dt
169
169
  photons += photons_n
170
170
  psf_gen = (
171
- self.generator[i].normalize_psf(
172
- self.generator[i].psf_z(z_val=self.position[2]),
173
- mode="sum",
171
+ self.generator[i].psf_z(
172
+ x_val=self.position[0],
173
+ y_val=self.position[1],
174
+ z_val=self.position[2],
174
175
  )
175
- * self.generator[i].psf_z_xy0(z_val=self.position[2])
176
176
  * photons_n
177
177
  )
178
178
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AMS_BP
3
- Version: 0.0.25
3
+ Version: 0.0.31
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
@@ -172,4 +172,4 @@ from AMS_BP.configio.saving import save_config_frames
172
172
  save_config_frames(metadata, frames, setup_config["base_config"].OutputParameters)
173
173
  ```
174
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)
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). Then head over to the [laser modulation module](examples/VisualizingIndividualModules/laser_modulation.ipynb) which will show how to change the laser power over time in the simulations. Then view an example of a complex experiment setup for [FRAP](examples/QuantitativeExperiments/FRAP_methods.ipynb) which is possible by the use of compositions of modules in this simulation library.
@@ -1,4 +1,4 @@
1
- AMS_BP/__init__.py,sha256=yp6QnMO5sZo0vrYRjuOtHAlUVullfFuge7Vs5jrt0zI,327
1
+ AMS_BP/__init__.py,sha256=iU9u6S7CcnHsXcUjS8BDRGWvPnqK-wceLqo-pkKOSrk,327
2
2
  AMS_BP/run_cell_simulation.py,sha256=7InopFikjo0HfaLO2siXskBIbyCIte9avG4YXjjaWCI,7420
3
3
  AMS_BP/sim_config.toml,sha256=3IqOQIJYmP5g4okk15nqQiNZb3ij7Pt63HbpI-5tySw,11672
4
4
  AMS_BP/sim_microscopy.py,sha256=u60ApTA6MTUmqSAd7EsAxweKya_Typput8NumDq9fp8,18697
@@ -16,10 +16,10 @@ AMS_BP/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  AMS_BP/metadata/metadata.py,sha256=YDumjc5sI3lY_UZx8f0ZhMqbG2qKQkysXwl7CY4ZtnY,2927
17
17
  AMS_BP/motion/__init__.py,sha256=cy3W-wCRjjlN1DrTqYc-JltYwcE8SZCXMVPJ2o6q_BQ,178
18
18
  AMS_BP/motion/condensate_movement.py,sha256=eig4WtD7o1cvIafWMjOk6pqxyhe_IIucgLcBEoDvasU,11648
19
- AMS_BP/motion/track_gen.py,sha256=Z3QJLVMP1gX4SlgOXFxBg8sJhBG0Xq25ixnBoEHEAZI,19462
19
+ AMS_BP/motion/track_gen.py,sha256=2ssg8BXxZUEufycqgziL2BOeKOInTmmjzsthfS80gfI,19540
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
- AMS_BP/motion/movement/fbm_BP.py,sha256=dH-JZiAInnIaZXH1wAAo8dOIX9zafclqnZ4dOhKtnO0,9327
22
+ AMS_BP/motion/movement/fbm_BP.py,sha256=47d2ph4r8Izso_mBxxgQYH9xjEqj_zXUzIGpEXPEhFM,9292
23
23
  AMS_BP/optics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  AMS_BP/optics/camera/__init__.py,sha256=eCoDUFHcoCWgbgYdLn8EH7AULM53A3XWTXNZnV8QxeY,182
25
25
  AMS_BP/optics/camera/detectors.py,sha256=_815Ovo7Aj375OZh5Xim8pFuZEEcSVtSdnLRYFqb3_8,10355
@@ -29,11 +29,11 @@ AMS_BP/optics/filters/filters.py,sha256=-iw7eqmDO77SEqlFTv5jJNVwpA8y93TLsjy5hhsA
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=lJG4LPCYFmGYVKPTfCiyCctppHUAlrSlNCvPLSYBZZk,22865
32
+ AMS_BP/optics/lasers/laser_profiles.py,sha256=7mqf5VMpb0VN_veqYEdeiakr0kaOilfGzNq5mzFQuRw,17136
33
33
  AMS_BP/optics/psf/__init__.py,sha256=ezrKPgpTeR4gTHOvF0mhF6u2zMMTd8Bgp8PGeOf11fA,121
34
- AMS_BP/optics/psf/psf_engine.py,sha256=Do54D1jMbSrj5uljdTrrEttCvxq3qbVT74acRuOk15c,9434
34
+ AMS_BP/optics/psf/psf_engine.py,sha256=FbR4VHQ-VgCWrrDj8AHPPnVgwVUGs-OP19w_TjcbMcU,10215
35
35
  AMS_BP/photophysics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- AMS_BP/photophysics/photon_physics.py,sha256=QRG_QIZ4csJ3g5qGP9Wtk7kzqm8_MUbVHfFef6cMtHQ,6671
36
+ AMS_BP/photophysics/photon_physics.py,sha256=9FWBXaxuSRaSxW8bY0x1d5R5buooibZbRdYTuQcMXhQ,6624
37
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
@@ -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.25.dist-info/METADATA,sha256=DV7dXicn4eT0pVFdX-Mvj66iF1nJ5-iIjq_DOucP5Ig,5483
52
- ams_bp-0.0.25.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
- ams_bp-0.0.25.dist-info/entry_points.txt,sha256=MFUK9bZWW61djfsavqopMqiVPVn4lJtt6v8qzyEFyNM,76
54
- ams_bp-0.0.25.dist-info/licenses/LICENSE,sha256=k_-JV1DQKvO0FR8WjvOisqdTl0kp6VJ7RFM3YZhao0c,1071
55
- ams_bp-0.0.25.dist-info/RECORD,,
51
+ ams_bp-0.0.31.dist-info/METADATA,sha256=_BrdW-rInQ_BfbnMgpegzioE8C7ksXy3Z0guJdZxWxA,5869
52
+ ams_bp-0.0.31.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
53
+ ams_bp-0.0.31.dist-info/entry_points.txt,sha256=MFUK9bZWW61djfsavqopMqiVPVn4lJtt6v8qzyEFyNM,76
54
+ ams_bp-0.0.31.dist-info/licenses/LICENSE,sha256=k_-JV1DQKvO0FR8WjvOisqdTl0kp6VJ7RFM3YZhao0c,1071
55
+ ams_bp-0.0.31.dist-info/RECORD,,