AMS-BP 0.4.40__py3-none-any.whl → 0.4.42__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 +1 -1
- AMS_BP/core/configio/convertconfig.py +13 -0
- AMS_BP/core/optics/collection_efficiency.py +24 -0
- AMS_BP/core/photophysics/photon_physics.py +6 -2
- AMS_BP/core/sim_microscopy.py +5 -1
- AMS_BP/gui/main.py +0 -7
- AMS_BP/gui/widgets/camera_config_widget.py +1 -5
- AMS_BP/gui/widgets/channel_config_widget.py +0 -1
- AMS_BP/gui/widgets/condensate_config_widget.py +0 -4
- AMS_BP/gui/widgets/laser_config_widget.py +56 -11
- AMS_BP/gui/widgets/utility_widgets/toggleswitch_widget.py +0 -2
- AMS_BP/gui/windows/configuration_window.py +0 -4
- {ams_bp-0.4.40.dist-info → ams_bp-0.4.42.dist-info}/METADATA +2 -1
- {ams_bp-0.4.40.dist-info → ams_bp-0.4.42.dist-info}/RECORD +17 -16
- {ams_bp-0.4.40.dist-info → ams_bp-0.4.42.dist-info}/WHEEL +0 -0
- {ams_bp-0.4.40.dist-info → ams_bp-0.4.42.dist-info}/entry_points.txt +0 -0
- {ams_bp-0.4.40.dist-info → ams_bp-0.4.42.dist-info}/licenses/LICENSE +0 -0
AMS_BP/__init__.py
CHANGED
@@ -6,6 +6,9 @@ import numpy as np
|
|
6
6
|
import tomli
|
7
7
|
from pydantic import BaseModel
|
8
8
|
|
9
|
+
from ...core.optics.collection_efficiency import (
|
10
|
+
collection_efficiency_isotropic_emission,
|
11
|
+
)
|
9
12
|
from ..cells import BaseCell, create_cell
|
10
13
|
from ..motion import Track_generator, create_condensate_dict
|
11
14
|
from ..motion.track_gen import (
|
@@ -274,11 +277,19 @@ def create_psf_from_config(config: Dict[str, Any]) -> Tuple[Callable, Dict[str,
|
|
274
277
|
additional_config = {
|
275
278
|
"type": psf_config.get("type", "gaussian"),
|
276
279
|
"custom_path": psf_config.get("custom_path", ""),
|
280
|
+
"psf_config": psf_config,
|
277
281
|
}
|
278
282
|
|
279
283
|
return Partial_PSFengine, additional_config
|
280
284
|
|
281
285
|
|
286
|
+
def create_collection_efficiency(config: Dict[str, Any]) -> float:
|
287
|
+
na = config.get("psf").get("parameters").get("numerical_aperture")
|
288
|
+
n = config.get("psf").get("parameters").get("refractive_index")
|
289
|
+
col_eff = collection_efficiency_isotropic_emission(na=na, n=n)
|
290
|
+
return col_eff
|
291
|
+
|
292
|
+
|
282
293
|
# Helper function to find pixel size
|
283
294
|
def find_pixel_size(magnification: float, pixel_detector_size: float) -> float:
|
284
295
|
return pixel_detector_size / magnification
|
@@ -728,6 +739,7 @@ def setup_microscope(config: Dict[str, Any]) -> dict:
|
|
728
739
|
fluorophores = create_fluorophores_from_config(config)
|
729
740
|
# psf config
|
730
741
|
psf, psf_config = create_psf_from_config(config)
|
742
|
+
collection_efficiency = create_collection_efficiency(config)
|
731
743
|
# lasers config
|
732
744
|
lasers = create_lasers_from_config(config)
|
733
745
|
# channels config
|
@@ -776,6 +788,7 @@ def setup_microscope(config: Dict[str, Any]) -> dict:
|
|
776
788
|
channels=channels,
|
777
789
|
psf=psf,
|
778
790
|
config=base_config,
|
791
|
+
collection_efficiency=collection_efficiency,
|
779
792
|
)
|
780
793
|
|
781
794
|
return {
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import warnings
|
2
|
+
from functools import lru_cache
|
3
|
+
|
4
|
+
import numpy as np
|
5
|
+
|
6
|
+
|
7
|
+
@lru_cache(maxsize=None)
|
8
|
+
def collection_efficiency_isotropic_emission(na: float, n: float) -> float:
|
9
|
+
ratio = na / n
|
10
|
+
|
11
|
+
if ratio > 1.0:
|
12
|
+
warnings.warn(
|
13
|
+
f"NA ({na}) exceeds refractive index n ({n}), which is unphysical. "
|
14
|
+
f"Clipping NA/n to 1.0 for collection efficiency calculation."
|
15
|
+
)
|
16
|
+
ratio = 1.0
|
17
|
+
elif ratio < 0.0:
|
18
|
+
warnings.warn(
|
19
|
+
f"NA ({na}) is negative, which is unphysical. " f"Clipping NA/n to 0.0."
|
20
|
+
)
|
21
|
+
ratio = 0.0
|
22
|
+
|
23
|
+
# Use identity: cos(arcsin(x)) = sqrt(1 - x^2)
|
24
|
+
return 0.5 * (1 - np.sqrt(1 - ratio**2))
|
@@ -157,7 +157,9 @@ class incident_photons:
|
|
157
157
|
else:
|
158
158
|
self.generator.append(0)
|
159
159
|
|
160
|
-
def incident_photons_calc(
|
160
|
+
def incident_photons_calc(
|
161
|
+
self, dt: float, collection_efficiency: float = 1
|
162
|
+
) -> Tuple[float, List]:
|
161
163
|
photons = 0
|
162
164
|
psf_hold = []
|
163
165
|
for i in range(len(self.transmission_photon_rate.wavelengths)):
|
@@ -165,7 +167,9 @@ class incident_photons:
|
|
165
167
|
qe_lam = self.quantumEff.get_qe(
|
166
168
|
self.transmission_photon_rate.wavelengths[i]
|
167
169
|
)
|
168
|
-
photons_n =
|
170
|
+
photons_n = (
|
171
|
+
self.transmission_photon_rate.values[i] * dt * collection_efficiency
|
172
|
+
)
|
169
173
|
photons += photons_n
|
170
174
|
psf_gen = (
|
171
175
|
self.generator[i].psf_z(
|
AMS_BP/core/sim_microscopy.py
CHANGED
@@ -30,6 +30,7 @@ class VirtualMicroscope:
|
|
30
30
|
channels: Channels,
|
31
31
|
psf: Callable[[float | int, Optional[float | int]], PSFEngine],
|
32
32
|
config: ConfigList,
|
33
|
+
collection_efficiency: float = 1,
|
33
34
|
start_time: int = 0,
|
34
35
|
):
|
35
36
|
# Core components
|
@@ -41,6 +42,7 @@ class VirtualMicroscope:
|
|
41
42
|
self.psf = psf
|
42
43
|
self._time = start_time # ms
|
43
44
|
self.config = config
|
45
|
+
self.collection_efficiency = collection_efficiency
|
44
46
|
|
45
47
|
# Cached initial configuration
|
46
48
|
self._cached_initial_config()
|
@@ -271,7 +273,9 @@ class VirtualMicroscope:
|
|
271
273
|
self.psf,
|
272
274
|
florPos,
|
273
275
|
)
|
274
|
-
_, psfs = inc.incident_photons_calc(
|
276
|
+
_, psfs = inc.incident_photons_calc(
|
277
|
+
deltaTime, self.collection_efficiency
|
278
|
+
)
|
275
279
|
for ipsf in psfs:
|
276
280
|
mapSC[self.channels.names[channel_num]].add_psf_frame(
|
277
281
|
ipsf, florPos[:2], frame_list[time_index]
|
AMS_BP/gui/main.py
CHANGED
@@ -36,12 +36,10 @@ class MainWindow(QMainWindow):
|
|
36
36
|
# Set up the main layout
|
37
37
|
layout = QVBoxLayout()
|
38
38
|
|
39
|
-
# Add logo as a placeholder (SVG format)
|
40
39
|
self.logo_label = QLabel() # Label to hold the logo
|
41
40
|
self.set_svg_logo(LOGO_PATH) # Set the SVG logo
|
42
41
|
layout.addWidget(self.logo_label, alignment=Qt.AlignmentFlag.AlignCenter)
|
43
42
|
|
44
|
-
# Add the maintainer's name under the image
|
45
43
|
self.maintainer_label = QLabel(
|
46
44
|
"Maintainer: Baljyot Parmar \n baljyotparmar@hotmail.com"
|
47
45
|
)
|
@@ -96,7 +94,6 @@ class MainWindow(QMainWindow):
|
|
96
94
|
def package_logs(self):
|
97
95
|
log_dir = Path.home() / "AMS_runs"
|
98
96
|
|
99
|
-
# Step 1: Open dialog to select folders
|
100
97
|
folder_paths = QFileDialog.getExistingDirectory(
|
101
98
|
self,
|
102
99
|
"Select Folder Containing Run Logs",
|
@@ -107,7 +104,6 @@ class MainWindow(QMainWindow):
|
|
107
104
|
if not folder_paths:
|
108
105
|
return
|
109
106
|
|
110
|
-
# QFileDialog.getExistingDirectory() returns a single path.
|
111
107
|
# For now, let's treat this as a single run_* folder being selected.
|
112
108
|
|
113
109
|
run_dir = Path(folder_paths)
|
@@ -117,7 +113,6 @@ class MainWindow(QMainWindow):
|
|
117
113
|
)
|
118
114
|
return
|
119
115
|
|
120
|
-
# Step 2: Ask for destination .zip archive
|
121
116
|
zip_path_str, _ = QFileDialog.getSaveFileName(
|
122
117
|
self,
|
123
118
|
"Save Zipped Folder As",
|
@@ -220,7 +215,6 @@ class MainWindow(QMainWindow):
|
|
220
215
|
|
221
216
|
if file_path:
|
222
217
|
try:
|
223
|
-
# Load the image (expand here if you want ND2 or Zarr support)
|
224
218
|
image = tifffile.imread(file_path)
|
225
219
|
|
226
220
|
# Open Napari viewer and display the image
|
@@ -233,7 +227,6 @@ class MainWindow(QMainWindow):
|
|
233
227
|
|
234
228
|
def set_svg_logo(self, svg_path):
|
235
229
|
"""Set an SVG logo to the QLabel, maintaining the aspect ratio."""
|
236
|
-
# Create a QSvgRenderer to render the SVG
|
237
230
|
renderer = QSvgRenderer(svg_path)
|
238
231
|
if renderer.isValid():
|
239
232
|
# Get the size of the SVG image
|
@@ -123,7 +123,6 @@ class CameraConfigWidget(QWidget):
|
|
123
123
|
"wavelengths": dialog.wavelengths,
|
124
124
|
"quantum_efficiency": dialog.intensities,
|
125
125
|
}
|
126
|
-
# You can now use this data wherever needed, e.g., saving or validation
|
127
126
|
|
128
127
|
def validate(self) -> bool:
|
129
128
|
try:
|
@@ -132,7 +131,6 @@ class CameraConfigWidget(QWidget):
|
|
132
131
|
# Convert QE before passing
|
133
132
|
qe = create_quantum_efficiency_from_config(data["quantum_efficiency"])
|
134
133
|
|
135
|
-
# Prepare CMOS-specific parameters only (drop "type" and "quantum_efficiency")
|
136
134
|
camera_data = {
|
137
135
|
k: v for k, v in data.items() if k not in {"type", "quantum_efficiency"}
|
138
136
|
}
|
@@ -168,9 +166,7 @@ class CameraConfigWidget(QWidget):
|
|
168
166
|
"sensitivity": self.sensitivity.value(),
|
169
167
|
"base_adu": self.base_adu.value(),
|
170
168
|
"binning_size": self.binning_size.value(),
|
171
|
-
"quantum_efficiency": convert_dict_to_2_list(
|
172
|
-
self.quantum_efficiency_data
|
173
|
-
), # Use edited data here
|
169
|
+
"quantum_efficiency": convert_dict_to_2_list(self.quantum_efficiency_data),
|
174
170
|
}
|
175
171
|
return camera_data
|
176
172
|
|
@@ -55,7 +55,6 @@ class ChannelConfigWidget(QWidget):
|
|
55
55
|
# Full simulation-level validation
|
56
56
|
channels = create_channels({"channels": data})
|
57
57
|
|
58
|
-
# Optional: Validate shape consistency
|
59
58
|
if len(channels.names) != channels.num_channels:
|
60
59
|
raise ValueError("Channel count does not match number of names.")
|
61
60
|
|
@@ -122,7 +122,6 @@ class CondensateConfigWidget(QWidget):
|
|
122
122
|
condensate_controls.addWidget(condensate_count)
|
123
123
|
layout.addLayout(condensate_controls)
|
124
124
|
|
125
|
-
# === Density Difference field RIGHT AFTER the condensate count ===
|
126
125
|
density_layout = QHBoxLayout()
|
127
126
|
density_layout.addWidget(QLabel("Density Difference:"))
|
128
127
|
|
@@ -133,7 +132,6 @@ class CondensateConfigWidget(QWidget):
|
|
133
132
|
density_layout.addWidget(density_spin)
|
134
133
|
layout.addLayout(density_layout)
|
135
134
|
|
136
|
-
# === Condensate containers BELOW this point ===
|
137
135
|
condensate_container = QVBoxLayout()
|
138
136
|
layout.addLayout(condensate_container)
|
139
137
|
|
@@ -307,10 +305,8 @@ class CondensateConfigWidget(QWidget):
|
|
307
305
|
try:
|
308
306
|
data = self.get_data()
|
309
307
|
|
310
|
-
# Step 1: Validate with Pydantic
|
311
308
|
validated = CondensateParameters(**data)
|
312
309
|
|
313
|
-
# Step 2: Validate simulation compatibility for each condensate
|
314
310
|
# Create a dummy cell just for validation context
|
315
311
|
dummy_cell = create_cell(
|
316
312
|
"SphericalCell", {"center": [0, 0, 0], "radius": 5.0}
|
@@ -1,10 +1,12 @@
|
|
1
1
|
from pathlib import Path
|
2
2
|
|
3
|
-
from PyQt6.QtCore import pyqtSignal
|
3
|
+
from PyQt6.QtCore import Qt, QTimer, pyqtSignal
|
4
4
|
from PyQt6.QtWidgets import (
|
5
5
|
QComboBox,
|
6
6
|
QDoubleSpinBox,
|
7
7
|
QFormLayout,
|
8
|
+
QGraphicsOpacityEffect,
|
9
|
+
QLabel,
|
8
10
|
QLineEdit,
|
9
11
|
QMessageBox,
|
10
12
|
QPushButton,
|
@@ -23,6 +25,7 @@ class LaserConfigWidget(QWidget):
|
|
23
25
|
|
24
26
|
def __init__(self):
|
25
27
|
super().__init__()
|
28
|
+
self._confocal_mode = False
|
26
29
|
self.laser_name_widgets = []
|
27
30
|
layout = QVBoxLayout()
|
28
31
|
layout.setContentsMargins(10, 10, 10, 10)
|
@@ -30,6 +33,25 @@ class LaserConfigWidget(QWidget):
|
|
30
33
|
self.setLayout(layout)
|
31
34
|
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
|
32
35
|
|
36
|
+
self.scanning_label = QLabel(
|
37
|
+
"Scanning Confocal Selected \n Only Gaussian Laser Allowed"
|
38
|
+
)
|
39
|
+
self.scanning_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
40
|
+
self.scanning_label.setStyleSheet(
|
41
|
+
"color: green; font-weight: bold; font-size: 14px;"
|
42
|
+
)
|
43
|
+
self.scanning_label.setVisible(
|
44
|
+
True
|
45
|
+
) # Always visible — will control opacity instead
|
46
|
+
# blinking effect
|
47
|
+
self.opacity_effect = QGraphicsOpacityEffect(self.scanning_label)
|
48
|
+
self.scanning_label.setGraphicsEffect(self.opacity_effect)
|
49
|
+
self.opacity_effect.setOpacity(0.0)
|
50
|
+
self.blink_timer = QTimer(self)
|
51
|
+
self.blink_timer.setInterval(500)
|
52
|
+
self.blink_timer.timeout.connect(self._toggle_scanning_label_opacity)
|
53
|
+
layout.addWidget(self.scanning_label)
|
54
|
+
|
33
55
|
form = QFormLayout()
|
34
56
|
|
35
57
|
self.num_lasers = QSpinBox()
|
@@ -52,35 +74,49 @@ class LaserConfigWidget(QWidget):
|
|
52
74
|
self.validate_button.clicked.connect(self.validate)
|
53
75
|
layout.addWidget(self.validate_button)
|
54
76
|
|
77
|
+
def _toggle_scanning_label_opacity(self):
|
78
|
+
if self._confocal_mode:
|
79
|
+
current_opacity = self.opacity_effect.opacity()
|
80
|
+
new_opacity = 0.0 if current_opacity > 0.5 else 1.0
|
81
|
+
self.opacity_effect.setOpacity(new_opacity)
|
82
|
+
else:
|
83
|
+
self.opacity_effect.setOpacity(0.0)
|
84
|
+
|
55
85
|
def set_confocal_mode(self, enabled: bool):
|
86
|
+
self._confocal_mode = enabled
|
87
|
+
|
56
88
|
for i in range(self.laser_tabs.count()):
|
57
89
|
tab = self.laser_tabs.widget(i)
|
58
90
|
|
59
91
|
laser_type: QComboBox = tab.findChild(QComboBox)
|
60
92
|
beam_width: QDoubleSpinBox = tab.findChildren(QDoubleSpinBox)[
|
61
93
|
1
|
62
|
-
] #
|
94
|
+
] # second spinbox is beam_width
|
63
95
|
|
64
96
|
if enabled:
|
65
|
-
# Force laser type to "gaussian" and disable editing
|
66
97
|
laser_type.setCurrentText("gaussian")
|
67
98
|
laser_type.setEnabled(False)
|
68
99
|
|
69
|
-
# Hide beam width
|
70
100
|
beam_width.hide()
|
71
101
|
label = tab.layout().labelForField(beam_width)
|
72
102
|
if label:
|
73
103
|
label.hide()
|
74
104
|
else:
|
75
|
-
# Enable laser type editing
|
76
105
|
laser_type.setEnabled(True)
|
77
106
|
|
78
|
-
# Show beam width
|
79
107
|
beam_width.show()
|
80
108
|
label = tab.layout().labelForField(beam_width)
|
81
109
|
if label:
|
82
110
|
label.show()
|
83
111
|
|
112
|
+
# Handle blinking label
|
113
|
+
if enabled:
|
114
|
+
self.scanning_label.setVisible(True)
|
115
|
+
self.blink_timer.start()
|
116
|
+
else:
|
117
|
+
self.scanning_label.setVisible(False)
|
118
|
+
self.blink_timer.stop()
|
119
|
+
|
84
120
|
def validate(self) -> bool:
|
85
121
|
try:
|
86
122
|
data = self.get_data()
|
@@ -148,13 +184,22 @@ class LaserConfigWidget(QWidget):
|
|
148
184
|
layout.addRow(f"Laser {index + 1} Beam Width (µm):", beam_width)
|
149
185
|
layout.addRow(f"Laser {index + 1} Numerical Aperture:", numerical_aperture)
|
150
186
|
layout.addRow(f"Laser {index + 1} Refractive Index:", refractive_index)
|
151
|
-
|
187
|
+
inclination_label = QLabel(f"Laser {index + 1} Inclination Angle (°):")
|
188
|
+
layout.addRow(inclination_label, inclination_angle)
|
152
189
|
|
153
190
|
# Logic for hilo
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
191
|
+
def handle_inclination_visibility(selected_type):
|
192
|
+
if selected_type == "hilo":
|
193
|
+
inclination_angle.show()
|
194
|
+
inclination_label.show()
|
195
|
+
else:
|
196
|
+
inclination_angle.hide()
|
197
|
+
inclination_label.hide()
|
198
|
+
|
199
|
+
laser_type.currentTextChanged.connect(handle_inclination_visibility)
|
200
|
+
|
201
|
+
# Initial state
|
202
|
+
handle_inclination_visibility(laser_type.currentText())
|
158
203
|
|
159
204
|
tab.setLayout(layout)
|
160
205
|
self.laser_tabs.addTab(tab, f"Laser {index + 1}")
|
@@ -41,13 +41,11 @@ class ToggleSwitch(QWidget):
|
|
41
41
|
painter = QPainter(self)
|
42
42
|
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
|
43
43
|
|
44
|
-
# NEW: Background indicates *next* theme
|
45
44
|
bg_color = QColor("#dddddd") if self._checked else QColor("#333333")
|
46
45
|
painter.setBrush(QBrush(bg_color))
|
47
46
|
painter.setPen(Qt.PenStyle.NoPen)
|
48
47
|
painter.drawRoundedRect(0, 0, self.width(), self.height(), 14, 14)
|
49
48
|
|
50
|
-
# Handle (always green)
|
51
49
|
painter.setBrush(QBrush(QColor("#008000")))
|
52
50
|
painter.drawEllipse(int(self._circle_position), 2, 24, 24)
|
53
51
|
|
@@ -198,23 +198,19 @@ class ConfigEditor(QWidget):
|
|
198
198
|
def preview_config(self):
|
199
199
|
"""Preview the full TOML config in a dialog before saving."""
|
200
200
|
try:
|
201
|
-
# Step 1: Validate tabs
|
202
201
|
if not self.validate_all_tabs():
|
203
202
|
QMessageBox.warning(
|
204
203
|
self, "Validation Error", "Fix errors before preview."
|
205
204
|
)
|
206
205
|
return
|
207
206
|
|
208
|
-
# Step 2: Collect config data
|
209
207
|
config = self.collect_all_config()
|
210
208
|
|
211
|
-
# Step 3: Convert to TOML string
|
212
209
|
toml_doc = tomlkit.document()
|
213
210
|
for key, value in config.items():
|
214
211
|
toml_doc[key] = value
|
215
212
|
toml_str = tomlkit.dumps(toml_doc)
|
216
213
|
|
217
|
-
# Step 4: Show preview dialog
|
218
214
|
preview_dialog = QDialog(self)
|
219
215
|
preview_dialog.setWindowTitle("Preview TOML Configuration")
|
220
216
|
layout = QVBoxLayout(preview_dialog)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: AMS_BP
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.42
|
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
|
@@ -125,6 +125,7 @@ To start the GUI, run:
|
|
125
125
|
|
126
126
|
run_AMS_BP gui
|
127
127
|
```
|
128
|
+
Please note, the first time the package is used it will take a minute to start.
|
128
129
|
For detailed walkthrough see the [GUI Documentation](./src/AMS_BP/gui/README.md).
|
129
130
|
## Configuration File
|
130
131
|
|
@@ -1,14 +1,14 @@
|
|
1
|
-
AMS_BP/__init__.py,sha256=
|
1
|
+
AMS_BP/__init__.py,sha256=a35SZK734gHwpLAEZQ1CXjk7s_pxy_vDEy9UHuqDCCE,327
|
2
2
|
AMS_BP/main_cli.py,sha256=Z2vRNCSY2GZq0yG5unCZI2BAdtKtVnh1DuNuB2rIo2g,5797
|
3
3
|
AMS_BP/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
AMS_BP/core/run_sim_util.py,sha256=UQr0l9rbtTmzuuWXjkIaTQV-ETO5AqyXRwflF6U2WYs,2415
|
5
|
-
AMS_BP/core/sim_microscopy.py,sha256=
|
5
|
+
AMS_BP/core/sim_microscopy.py,sha256=M8-bqxngUQ0cgzifQ2kuOM8Ej5e4sJIglRdTkwHOWRM,20181
|
6
6
|
AMS_BP/core/cells/__init__.py,sha256=Rd2gpWWUZJxW2u_piI2ZcIqLtYkzVOr_MjU3upiUv8Q,866
|
7
7
|
AMS_BP/core/cells/budding_yeast_cell.py,sha256=_n0jhiRvrMcPddfoR8Vi4RdOJQTo_nR4JF7ydsrCF98,9448
|
8
8
|
AMS_BP/core/cells/cell_factory.py,sha256=a-M5xHDkYDHoMv3vbQyn4x0KQ-lshO2CEdfrStLGSOU,4422
|
9
9
|
AMS_BP/core/configio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
AMS_BP/core/configio/configmodels.py,sha256=2KxvXy1jRWjmu5PWcDGyHAoM6EfpW2TaigCiZLrP3P0,3764
|
11
|
-
AMS_BP/core/configio/convertconfig.py,sha256=
|
11
|
+
AMS_BP/core/configio/convertconfig.py,sha256=ek54bZeqhQnWl_T09GVlZiUWF3HrgREjG5vN16qCWF0,28866
|
12
12
|
AMS_BP/core/configio/experiments.py,sha256=dls7oALLqLr7ejyEGXm4A9TZzkYa0G3lZjpLeCtmdzI,4122
|
13
13
|
AMS_BP/core/configio/saving.py,sha256=596QgAadV32rzsN4B2FngGFcBWCzCDnLFN-qtQsv3bM,857
|
14
14
|
AMS_BP/core/groundtruth_generators/__init__.py,sha256=UPVmhiB81OfyqAes5LoN-n6XgQuBCYCqRPAGd2jpMfc,99
|
@@ -21,6 +21,7 @@ AMS_BP/core/motion/track_gen.py,sha256=V3bFDxDajObRhPWiOzjWiW_VA9aJEWFwDjxMqqlVR
|
|
21
21
|
AMS_BP/core/motion/movement/__init__.py,sha256=tBNb9UVDPAAnjENRtvI35YF2BdKKBqBkgWJMZSENL8U,59
|
22
22
|
AMS_BP/core/motion/movement/boundary_conditions.py,sha256=FB9T1eO7_P9z9k37OVtB9VC8mB5PhkVJt06UfGXU85c,2547
|
23
23
|
AMS_BP/core/optics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
24
|
+
AMS_BP/core/optics/collection_efficiency.py,sha256=jG2gZwZ2szfEmLBwTwBpX_CQPKJfSpxQ0rm5VWnjgBE,677
|
24
25
|
AMS_BP/core/optics/camera/__init__.py,sha256=eCoDUFHcoCWgbgYdLn8EH7AULM53A3XWTXNZnV8QxeY,182
|
25
26
|
AMS_BP/core/optics/camera/detectors.py,sha256=_815Ovo7Aj375OZh5Xim8pFuZEEcSVtSdnLRYFqb3_8,10355
|
26
27
|
AMS_BP/core/optics/camera/quantum_eff.py,sha256=ZCvJ8dJESOUbjwblsJIBcCg_b-_DNdhDlkzd7HeGMDg,2378
|
@@ -34,7 +35,7 @@ AMS_BP/core/optics/lasers/scanning_patterns.py,sha256=Xen96e5BlYI892HzZDXdwm80id
|
|
34
35
|
AMS_BP/core/optics/psf/__init__.py,sha256=ezrKPgpTeR4gTHOvF0mhF6u2zMMTd8Bgp8PGeOf11fA,121
|
35
36
|
AMS_BP/core/optics/psf/psf_engine.py,sha256=FbR4VHQ-VgCWrrDj8AHPPnVgwVUGs-OP19w_TjcbMcU,10215
|
36
37
|
AMS_BP/core/photophysics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
|
-
AMS_BP/core/photophysics/photon_physics.py,sha256=
|
38
|
+
AMS_BP/core/photophysics/photon_physics.py,sha256=clN_dPL1_u4GAEdL59QvE6PPMV70uGcuPq32HdViMY4,6737
|
38
39
|
AMS_BP/core/photophysics/state_kinetics.py,sha256=hDb1VqoeEkbYcse-N-S7BzyE4hIt4KLMju7ZKOIJDYc,6980
|
39
40
|
AMS_BP/core/probabilityfuncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
40
41
|
AMS_BP/core/probabilityfuncs/markov_chain.py,sha256=LV6KGr8Lv4NIvBPJqsR0CEynssa_mPH30qLaK85GObA,4339
|
@@ -45,7 +46,7 @@ AMS_BP/core/sample/flurophores/__init__.py,sha256=arLVUx1-yh5T41fH9Mr6RNY8Ao3Zio
|
|
45
46
|
AMS_BP/core/sample/flurophores/flurophore_schema.py,sha256=QyWnaNqsyHcci_V8Va0KnU1F7jCQz-J9n1um4vG0zMo,10887
|
46
47
|
AMS_BP/gui/README.md,sha256=z2XreAPQeeFmKSXbhsa2kznHbk-YbLD55-VPWikNQp4,2778
|
47
48
|
AMS_BP/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
|
-
AMS_BP/gui/main.py,sha256=
|
49
|
+
AMS_BP/gui/main.py,sha256=sHWD35NWLubhcbU78-hiUEbgf0AlnMWQHtyELZCXVt8,10284
|
49
50
|
AMS_BP/gui/sim_worker.py,sha256=bwnCzPU0dnBbPwi2eXzM_VBg_gwIwWjyBnjGIOvhkEo,1980
|
50
51
|
AMS_BP/gui/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
52
|
AMS_BP/gui/assets/drawing.svg,sha256=8L2O509kczSQ_AUSzew4fHjMQGSikGn3dVt9Ons6kvo,26563
|
@@ -65,24 +66,24 @@ AMS_BP/gui/help_docs/psf_help.md,sha256=onH-suSxocfj9mD6WCE6lG7yxov1yCoGeau82oG-
|
|
65
66
|
AMS_BP/gui/themes/dark_theme.qss,sha256=6MUyaaZnmZCnXTNNJuqi7NN8Om8P8P9pSfAffv4ampA,1462
|
66
67
|
AMS_BP/gui/themes/light_theme.qss,sha256=wVEIcnFzGVZN7ohLHrus6zX5ybGnyfTwihAPSvhrDL8,1424
|
67
68
|
AMS_BP/gui/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
68
|
-
AMS_BP/gui/widgets/camera_config_widget.py,sha256=
|
69
|
+
AMS_BP/gui/widgets/camera_config_widget.py,sha256=yDIolqOXrOuEf3oEmgKyGGHGP5saW-T_EbRVXJUcj-I,7535
|
69
70
|
AMS_BP/gui/widgets/cell_config_widget.py,sha256=eHS7h3hBHG9Qp6SClFRDE4-TwBljdwVx7lDIXNwwdxo,8056
|
70
|
-
AMS_BP/gui/widgets/channel_config_widget.py,sha256=
|
71
|
-
AMS_BP/gui/widgets/condensate_config_widget.py,sha256=
|
71
|
+
AMS_BP/gui/widgets/channel_config_widget.py,sha256=Ot6WoS2-oe8lZWLDqDt0O7mSzsGAmybnY-Hw6JqKZt8,10949
|
72
|
+
AMS_BP/gui/widgets/condensate_config_widget.py,sha256=4-K8gDVODmbS2De1ozYC90d6R6uK8L1Z84_uGyYyzJI,12310
|
72
73
|
AMS_BP/gui/widgets/experiment_config_widget.py,sha256=uyxLXwHQRpaOC_GvqYkKUpqK2x4oa8VC1eyDM9rTF84,11971
|
73
74
|
AMS_BP/gui/widgets/flurophore_config_widget.py,sha256=g1dag-S_BsbhwdJm9g42K02ZibZCqQPtAR56iV7Cuko,19889
|
74
75
|
AMS_BP/gui/widgets/general_config_widget.py,sha256=YbnE11TnWZBgb-xqKWM00p8RdSp-9eTbwTZ9mikPvZc,1321
|
75
76
|
AMS_BP/gui/widgets/global_config_widget.py,sha256=XS9y031BRQZZdNE7EAretYuaIoi4VebCG-u5mb2sEak,5091
|
76
|
-
AMS_BP/gui/widgets/laser_config_widget.py,sha256=
|
77
|
+
AMS_BP/gui/widgets/laser_config_widget.py,sha256=X4ifkTpAdKjNORm2SmRg4vYpvDPemUNQlfCChx2uWn4,10605
|
77
78
|
AMS_BP/gui/widgets/molecule_config_widget.py,sha256=vnrrBUM0fU2rBt-9jzjorZftcEbdAMmuff6uyFtg5Ko,27871
|
78
79
|
AMS_BP/gui/widgets/output_config_widget.py,sha256=pExiAHIHs0-J-dY2lZtfB0ei9oNjZIJKDQtWDSjFZOY,2105
|
79
80
|
AMS_BP/gui/widgets/psf_config_widget.py,sha256=75ggeolYI_Sbn5LD_hUGY3S4Z9uRkJGtzZhb79NgsY4,4534
|
80
81
|
AMS_BP/gui/widgets/utility_widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
81
82
|
AMS_BP/gui/widgets/utility_widgets/scinotation_widget.py,sha256=sLrQqueRJ0wEy4aF1I8UJO0Bolnm7yTsAyfNqrHiAKI,553
|
82
83
|
AMS_BP/gui/widgets/utility_widgets/spectrum_widget.py,sha256=QQjYV-aErjyI1HdOZMIPaddHpi0sag6r4V8nBSdgEn8,3659
|
83
|
-
AMS_BP/gui/widgets/utility_widgets/toggleswitch_widget.py,sha256=
|
84
|
+
AMS_BP/gui/widgets/utility_widgets/toggleswitch_widget.py,sha256=ZBT8_wgjvRnftxFj_28MY8FI-TDQ3AXdE8DAxyzhtZM,1864
|
84
85
|
AMS_BP/gui/windows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
85
|
-
AMS_BP/gui/windows/configuration_window.py,sha256=
|
86
|
+
AMS_BP/gui/windows/configuration_window.py,sha256=9Cj8pEtyeVCuOcYaFllhZl6NZIama-R1Qu3rlKSOKdA,12060
|
86
87
|
AMS_BP/gui/windows/help_window.py,sha256=Jn844Vez7ULC1VGKb4iGgRvuw3wPTd0pcyRv7VWbeV4,790
|
87
88
|
AMS_BP/gui/windows/logging_window.py,sha256=a7HbmfYP3YavLuyT317YRE1xWXJtB4i8EoK9QAstOv8,2938
|
88
89
|
AMS_BP/gui/windows/template_window_selection.py,sha256=AkrqY3KnTHO109axaDAyot4BoPcjkf9VRzUZWW7q9Pk,4182
|
@@ -103,8 +104,8 @@ AMS_BP/utils/decorators.py,sha256=4qFdvzPJne0dhkhD1znPxRln1Rfr5NX8rdcCDcbATRU,62
|
|
103
104
|
AMS_BP/utils/errors.py,sha256=7BOd-L4_YeKmWn3Q4EOdTnNF3Bj_exDa3eg5X0yCZrc,759
|
104
105
|
AMS_BP/utils/maskMaker.py,sha256=2ca3n2nc8rFtUh1LurKXOJJsUmhrOpWbRnVX7fjRVvs,335
|
105
106
|
AMS_BP/utils/util_functions.py,sha256=9Qlr4kjY04fObktR8TrzB0IgoG1yXtcmxPRX9AN34mM,9671
|
106
|
-
ams_bp-0.4.
|
107
|
-
ams_bp-0.4.
|
108
|
-
ams_bp-0.4.
|
109
|
-
ams_bp-0.4.
|
110
|
-
ams_bp-0.4.
|
107
|
+
ams_bp-0.4.42.dist-info/METADATA,sha256=XJS5nw93yvPTH50D8w1K2-XDJU5i5gjzCmsEHEs1TV0,9909
|
108
|
+
ams_bp-0.4.42.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
109
|
+
ams_bp-0.4.42.dist-info/entry_points.txt,sha256=06NS85P4dz6vosMOKXHfx8l7gK9WXBZxuwjl55XfT2c,65
|
110
|
+
ams_bp-0.4.42.dist-info/licenses/LICENSE,sha256=k_-JV1DQKvO0FR8WjvOisqdTl0kp6VJ7RFM3YZhao0c,1071
|
111
|
+
ams_bp-0.4.42.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|