AMS-BP 0.3.1__py3-none-any.whl → 0.4.0__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.
Files changed (60) hide show
  1. AMS_BP/__init__.py +1 -1
  2. AMS_BP/configio/configmodels.py +26 -12
  3. AMS_BP/configio/convertconfig.py +508 -632
  4. AMS_BP/gui/README.md +77 -0
  5. AMS_BP/gui/__init__.py +0 -0
  6. AMS_BP/gui/assets/__init__.py +0 -0
  7. AMS_BP/gui/assets/drawing.svg +107 -0
  8. AMS_BP/gui/configuration_window.py +333 -0
  9. AMS_BP/gui/help_docs/__init__.py +0 -0
  10. AMS_BP/gui/help_docs/cell_help.md +45 -0
  11. AMS_BP/gui/help_docs/channels_help.md +78 -0
  12. AMS_BP/gui/help_docs/condensate_help.md +59 -0
  13. AMS_BP/gui/help_docs/detector_help.md +57 -0
  14. AMS_BP/gui/help_docs/experiment_help.md +92 -0
  15. AMS_BP/gui/help_docs/fluorophore_help.md +128 -0
  16. AMS_BP/gui/help_docs/general_help.md +43 -0
  17. AMS_BP/gui/help_docs/global_help.md +47 -0
  18. AMS_BP/gui/help_docs/laser_help.md +76 -0
  19. AMS_BP/gui/help_docs/molecule_help.md +78 -0
  20. AMS_BP/gui/help_docs/output_help.md +5 -0
  21. AMS_BP/gui/help_docs/psf_help.md +51 -0
  22. AMS_BP/gui/help_window.py +26 -0
  23. AMS_BP/gui/logging_window.py +93 -0
  24. AMS_BP/gui/main.py +255 -0
  25. AMS_BP/gui/sim_worker.py +58 -0
  26. AMS_BP/gui/template_window_selection.py +100 -0
  27. AMS_BP/gui/widgets/__init__.py +0 -0
  28. AMS_BP/gui/widgets/camera_config_widget.py +213 -0
  29. AMS_BP/gui/widgets/cell_config_widget.py +225 -0
  30. AMS_BP/gui/widgets/channel_config_widget.py +307 -0
  31. AMS_BP/gui/widgets/condensate_config_widget.py +341 -0
  32. AMS_BP/gui/widgets/experiment_config_widget.py +259 -0
  33. AMS_BP/gui/widgets/flurophore_config_widget.py +513 -0
  34. AMS_BP/gui/widgets/general_config_widget.py +47 -0
  35. AMS_BP/gui/widgets/global_config_widget.py +142 -0
  36. AMS_BP/gui/widgets/laser_config_widget.py +255 -0
  37. AMS_BP/gui/widgets/molecule_config_widget.py +714 -0
  38. AMS_BP/gui/widgets/output_config_widget.py +61 -0
  39. AMS_BP/gui/widgets/psf_config_widget.py +128 -0
  40. AMS_BP/gui/widgets/utility_widgets/__init__.py +0 -0
  41. AMS_BP/gui/widgets/utility_widgets/scinotation_widget.py +21 -0
  42. AMS_BP/gui/widgets/utility_widgets/spectrum_widget.py +115 -0
  43. AMS_BP/logging/__init__.py +0 -0
  44. AMS_BP/logging/logutil.py +83 -0
  45. AMS_BP/logging/setup_run_directory.py +35 -0
  46. AMS_BP/{run_cell_simulation.py → main_cli.py} +27 -72
  47. AMS_BP/optics/filters/filters.py +2 -0
  48. AMS_BP/resources/template_configs/metadata_configs.json +20 -0
  49. AMS_BP/resources/template_configs/sim_config.toml +408 -0
  50. AMS_BP/resources/template_configs/twocolor_widefield_timeseries_live.toml +399 -0
  51. AMS_BP/resources/template_configs/twocolor_widefield_zstack_fixed.toml +406 -0
  52. AMS_BP/resources/template_configs/twocolor_widefield_zstack_live.toml +408 -0
  53. AMS_BP/run_sim_util.py +76 -0
  54. {ams_bp-0.3.1.dist-info → ams_bp-0.4.0.dist-info}/METADATA +46 -27
  55. ams_bp-0.4.0.dist-info/RECORD +103 -0
  56. ams_bp-0.4.0.dist-info/entry_points.txt +2 -0
  57. ams_bp-0.3.1.dist-info/RECORD +0 -55
  58. ams_bp-0.3.1.dist-info/entry_points.txt +0 -2
  59. {ams_bp-0.3.1.dist-info → ams_bp-0.4.0.dist-info}/WHEEL +0 -0
  60. {ams_bp-0.3.1.dist-info → ams_bp-0.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,408 @@
1
+ version = "0.2"
2
+ length_unit = "um" # always um.
3
+ time_unit = "ms" # always ms
4
+ diffusion_unit = "um^2/s" # always um^2/s
5
+
6
+ [Cell_Parameters]
7
+ cell_type = "RodCell" # any of RectangularCell, SphericalCell, OvoidCell, RodCell, BuddingCell
8
+ [Cell_Parameters.params] # see docs for parameters for each cell type
9
+ center = [5, 5, 0]
10
+ direction = [1, 0, 0]
11
+ radius = 1.0
12
+ height = 4.0
13
+ # bounds = [[3, 7], [3, 9], [-1, 1]]
14
+
15
+ [Molecule_Parameters]
16
+ num_molecules = [
17
+ 5000,
18
+ 5000,
19
+ ] # size of array tells the types of molecules (must be same as num_of_fluorophores below). All of the Molecule_Parameters are of the same first dimension as this.
20
+ track_type = ["fbm", "fbm"] # "constant", "fbm"
21
+ diffusion_coefficient = [
22
+ [
23
+ 0.2,
24
+ 0.4,
25
+ ],
26
+ [
27
+ 0.2,
28
+ 0.4,
29
+ ],
30
+ ] # um^2/s, size of each index (eg. len(...[0]) is the # of diffusion coefficients the system can explore.
31
+
32
+ hurst_exponent = [[0.5], [0.5]]
33
+ allow_transition_probability = [true, true] # bool
34
+ transition_matrix_time_step = [
35
+ 20,
36
+ 20,
37
+ ] # ms, the time at which the probabilities in the below are presented.
38
+ diffusion_transition_matrix = [
39
+ [
40
+ [
41
+ 0.992,
42
+ 0.008,
43
+ ],
44
+ [
45
+ 0.0273,
46
+ 0.9727,
47
+ ],
48
+ ],
49
+ [
50
+ [
51
+ 0.992,
52
+ 0.008,
53
+ ],
54
+ [
55
+ 0.0273,
56
+ 0.9727,
57
+ ],
58
+ ],
59
+ ]
60
+ hurst_transition_matrix = [[[0.1]], [[0.1]]]
61
+ state_probability_diffusion = [[0.5, 0.5], [0.5, 0.5]]
62
+ state_probability_hurst = [[1], [1]]
63
+
64
+
65
+ [Global_Parameters]
66
+ sample_plane_dim = [10, 10] # um
67
+ cycle_count = 50 # cycles of exposure_time + interval_time
68
+ exposure_time = 20 # ms
69
+ interval_time = 0 # ms
70
+ oversample_motion_time = 20 # ms
71
+
72
+ [Condensate_Parameters]
73
+ initial_centers = [
74
+ [
75
+ [
76
+ 5.5,
77
+ 5,
78
+ 0.05,
79
+ ],
80
+ [
81
+ 5,
82
+ 5,
83
+ -0.15,
84
+ ],
85
+ [
86
+ 4,
87
+ 5,
88
+ -0.15,
89
+ ],
90
+ [
91
+ 6,
92
+ 5.5,
93
+ -0.15,
94
+ ],
95
+ [
96
+ 6,
97
+ 5.5,
98
+ -0.15,
99
+ ],
100
+ ],
101
+ [
102
+ [
103
+ 4,
104
+ 5,
105
+ 0.05,
106
+ ],
107
+ [
108
+ 3,
109
+ 5,
110
+ -0.15,
111
+ ],
112
+ ],
113
+ ] # um. First dimension is the types of molecules as in Molecule Parameters.num_molecules. second dimension is the # of condentates. center = [x,y,z]
114
+ initial_scale = [[0.26, 0.26, 0.13, 0.13, 0.26], [0.26, 0.26]] # um
115
+ diffusion_coefficient = [[0, 0, 0, 0, 0], [0, 0]] # um^2/s
116
+ hurst_exponent = [[0.2, 0.2, 0.2, 0.2, 0.2], [0.2, 0.2]]
117
+ density_dif = [10, 10] # density of the condensate vs the background.
118
+
119
+ [Output_Parameters]
120
+ output_path = "Output"
121
+ output_name = "Cell_Movie_001"
122
+ subsegment_type = "mean" # not implemented yet, use any string
123
+ subsegment_number = 5 # not implemented yet, use any integer
124
+
125
+
126
+ [fluorophores]
127
+ num_of_fluorophores = 2
128
+ fluorophore_names = ["PAmCherry", "EGFP"]
129
+
130
+ # PAmCherry name
131
+ [fluorophores.PAmCherry]
132
+ name = "PAmCherry"
133
+ initial_state = "dark" # flurophore will start with this state in the simulation (all of them), must be valid name from ones provided below.
134
+
135
+ # States definition
136
+ [fluorophores.PAmCherry.states.bright]
137
+ name = "bright"
138
+ state_type = "fluorescent" # any of fluorescent, dark, bleached
139
+ quantum_yield = 0.46 # from 0-1
140
+ extinction_coefficient = 18000 # M^-1 cm^-1
141
+ fluorescent_lifetime = 0.000000001 # seconds
142
+ # Spectral data for bright state
143
+ [fluorophores.PAmCherry.states.bright.excitation_spectrum]
144
+ wavelengths = [310.0, 311.0, 411.0, 511.0, 611.0, 612.0]
145
+ intensities = [0.00, 0.047, 0.0043, 0.6, 0.06, 0.00]
146
+ [fluorophores.PAmCherry.states.bright.emission_spectrum]
147
+ wavelengths = [530.0, 529.0, 600.0, 650.0, 700.0, 797.0, 799.0]
148
+ intensities = [0.00, 0.02, 0.98, 0.28, 0.05, 0.003, 0.00]
149
+
150
+ [fluorophores.PAmCherry.states.dark]
151
+ name = "dark"
152
+ state_type = "dark"
153
+
154
+ [fluorophores.PAmCherry.states.triplet]
155
+ name = "triplet"
156
+ state_type = "dark"
157
+
158
+ [fluorophores.PAmCherry.states.bleached]
159
+ name = "bleached"
160
+ state_type = "bleached"
161
+
162
+ # State transitions
163
+
164
+ [fluorophores.PAmCherry.transitions.dark_to_bright]
165
+ from_state = "dark"
166
+ to_state = "bright"
167
+ photon_dependent = true
168
+ [fluorophores.PAmCherry.transitions.dark_to_bright.spectrum]
169
+ wavelengths = [308.0, 309.0, 359.0, 403.0, 440.0, 484.0, 485.0]
170
+ intensities = [0.00, 0.04, 0.11, 1.0, 0.07, 0.0004, 0.00]
171
+ extinction_coefficient = 6500 # M^-1 cm^-1
172
+ quantum_yield = 0.000005 # switching events per photons absorbed
173
+
174
+
175
+ [fluorophores.PAmCherry.transitions.bright_to_bleached]
176
+ from_state = "bright"
177
+ to_state = "bleached"
178
+ photon_dependent = true
179
+ [fluorophores.PAmCherry.transitions.bright_to_bleached.spectrum]
180
+ wavelengths = [310.0, 311.0, 411.0, 511.0, 611.0, 612.0]
181
+ intensities = [0.00, 0.047, 0.0043, 0.6, 0.06, 0.00]
182
+ extinction_coefficient = 18000 # M^-1 cm^-1
183
+ quantum_yield = 0.000005 # switching events per photons absorbed
184
+
185
+ [fluorophores.PAmCherry.transitions.bright_to_triplet]
186
+ from_state = "bright"
187
+ to_state = "triplet"
188
+ photon_dependent = false
189
+ base_rate = 1 # 1/s
190
+
191
+ [fluorophores.PAmCherry.transitions.triplet_to_dark]
192
+ from_state = "triplet"
193
+ to_state = "dark"
194
+ photon_dependent = false
195
+ base_rate = 1 # 1/s
196
+
197
+
198
+ # EGFP name
199
+ [fluorophores.EGFP]
200
+ name = "EGFP"
201
+ initial_state = "bright" # flurophore will start with this state in the simulation (all of them), must be valid name from ones provided below.
202
+
203
+ # States definition
204
+ [fluorophores.EGFP.states.bright]
205
+ name = "bright"
206
+ state_type = "fluorescent" # any of fluorescent, dark, bleached
207
+ quantum_yield = 0.6 # from 0-1
208
+ extinction_coefficient = 55900 # M^-1 cm^-1
209
+ fluorescent_lifetime = 0.0000000026 # seconds
210
+ # Spectral data for bright state
211
+ [fluorophores.EGFP.states.bright.excitation_spectrum]
212
+ wavelengths = [300.0, 337.0, 488.0, 501.0, 522.0, 540.0]
213
+ intensities = [0.1, 0.03, 1.00, 0.69, 0.03, 0.00]
214
+ [fluorophores.EGFP.states.bright.emission_spectrum]
215
+ wavelengths = [463.0, 494.0, 503.0, 510.0, 528.0, 549.0, 700.0]
216
+ intensities = [0.00, 0.33, 0.82, 1.00, 0.51, 0.30, 0.00]
217
+
218
+
219
+ [fluorophores.EGFP.states.triplet]
220
+ name = "triplet"
221
+ state_type = "dark"
222
+
223
+ [fluorophores.EGFP.states.bleached]
224
+ name = "bleached"
225
+ state_type = "bleached"
226
+
227
+ # State transitions
228
+ [fluorophores.EGFP.transitions.bright_to_bleached]
229
+ from_state = "bright"
230
+ to_state = "bleached"
231
+ photon_dependent = true
232
+ [fluorophores.EGFP.transitions.bright_to_bleached.spectrum]
233
+ wavelengths = [300.0, 337.0, 488.0, 501.0, 522.0, 540.0]
234
+ intensities = [0.1, 0.03, 1.00, 0.69, 0.03, 0.00]
235
+ extinction_coefficient = 55900 # M^-1 cm^-1
236
+ quantum_yield = 0.0000025 # switching events per photons absorbed
237
+
238
+ [fluorophores.EGFP.transitions.bright_to_triplet]
239
+ from_state = "bright"
240
+ to_state = "triplet"
241
+ photon_dependent = true
242
+ [fluorophores.EGFP.transitions.bright_to_triplet.spectrum]
243
+ wavelengths = [300.0, 337.0, 488.0, 501.0, 522.0, 540.0]
244
+ intensities = [0.1, 0.03, 1.00, 0.69, 0.03, 0.00]
245
+ extinction_coefficient = 55900 # M^-1 cm^-1
246
+ quantum_yield = 0.0000025 # switching events per photons absorbed
247
+
248
+ [fluorophores.EGFP.transitions.triplet_to_bleached]
249
+ from_state = "triplet"
250
+ to_state = "bleached"
251
+ photon_dependent = false
252
+ base_rate = 1 # 1/s
253
+
254
+
255
+ # PSF Configuration
256
+
257
+ [psf]
258
+ # PSF type: "gaussian"
259
+ type = "gaussian"
260
+
261
+ # If type is "custom", specify the path to the PSF file # not supported currently
262
+ custom_path = ""
263
+
264
+ [psf.parameters]
265
+ numerical_aperture = 1.4 # typical range: 0.1 - 1.5
266
+ refractive_index = 1.0 # default is air (1.0)
267
+ #pinhole_diameter = 1.0 # Do not include for no pinhole else float in um units
268
+
269
+ # Multiple Laser Configuration File
270
+
271
+ [lasers]
272
+ active = ["red", "blue"] # List of active lasers provided in setup
273
+
274
+ [lasers.red]
275
+ type = "widefield" # "gaussian" or "hilo" or "widefield"
276
+ preset = "red_633" # description
277
+
278
+ [lasers.red.parameters]
279
+ power = 50000 # Power in watts
280
+ wavelength = 600 # Wavelength in nanometers
281
+ beam_width = 5.0 # 1/e² beam width at waist in microns
282
+ numerical_aperture = 1.4 # NA of focusing lens
283
+ refractive_index = 1.518
284
+ inclination_angle = 67.0 # degrees, only for HiLo
285
+
286
+ [lasers.blue]
287
+ type = "widefield"
288
+ preset = "blue_405"
289
+
290
+ [lasers.blue.parameters]
291
+ power = 5
292
+ wavelength = 405
293
+ beam_width = 5.0
294
+ numerical_aperture = 1.4
295
+ refractive_index = 1.518
296
+
297
+
298
+ [channels]
299
+ num_of_channels = 2
300
+ channel_names = ["red", "green"]
301
+ split_efficiency = [
302
+ 1.0,
303
+ 1.0,
304
+ ] # 1.0 is 100% efficiency. Physically represents the efficiency of the channel splitter for each channel. max: 1.0 = equal to the original emission light.
305
+ # Filter Set Configuration
306
+ [channels.filters]
307
+ [channels.filters.red] # .red , .green etc, must be of channel_name.
308
+ filter_set_name = "Red Filter Set"
309
+ filter_set_description = "Sample Red filter set configuration"
310
+
311
+ [channels.filters.red.excitation]
312
+ name = "Red-Ex"
313
+ type = "allow_all"
314
+ points = 100
315
+
316
+ [channels.filters.red.emission]
317
+ name = "Red-Em"
318
+ type = "bandpass"
319
+ center_wavelength = 600 # nm
320
+ bandwidth = 35 # nm
321
+ transmission_peak = 0.95
322
+ points = 1000
323
+
324
+ [channels.filters.green]
325
+ filter_set_name = "Green Filter Set"
326
+ filter_set_description = "Sample Green filter set configuration"
327
+ [channels.filters.green.excitation]
328
+ name = "Green-Ex"
329
+ type = "allow_all"
330
+ points = 1000
331
+ [channels.filters.green.emission]
332
+ name = "Green-Em"
333
+ type = "bandpass"
334
+ center_wavelength = 500 # nm
335
+ bandwidth = 35 # nm
336
+ transmission_peak = 0.95
337
+ points = 1000
338
+
339
+
340
+ # Camera configurations
341
+ [camera]
342
+ type = "CMOS"
343
+ pixel_count = [190, 190] # [width, height], 1200x1200 (x pixel_size)
344
+ pixel_detector_size = 6.5 # um
345
+ magnification = 100
346
+ dark_current = 0.0005 # electrons/pixel/second
347
+ readout_noise = 1.6 # electrons RMS
348
+ bit_depth = 16
349
+ sensitivity = 1.0 # electrons/ADU
350
+ base_adu = 100 #ADU
351
+ binning_size = 1 # 1x1 , if 2 then 2x2
352
+
353
+ # Quantum efficiency curve (wavelength in nm : efficiency 0-1)
354
+ # extrapotation for wavelengths not included uses edge values
355
+ quantum_efficiency = [
356
+ [
357
+ 399,
358
+ 0.00,
359
+ ],
360
+ [
361
+ 400,
362
+ 0.80,
363
+ ],
364
+ [
365
+ 500,
366
+ 0.90,
367
+ ],
368
+ [
369
+ 600,
370
+ 0.95,
371
+ ],
372
+ [
373
+ 700,
374
+ 0.90,
375
+ ],
376
+ [
377
+ 800,
378
+ 0.70,
379
+ ],
380
+ [
381
+ 900,
382
+ 0.40,
383
+ ],
384
+ [
385
+ 901,
386
+ 0.00,
387
+ ],
388
+ ]
389
+
390
+
391
+ [experiment]
392
+ name = "PAmCherry_EGFP_Live_Widefield"
393
+ description = "Sample experiment configuration"
394
+ # experiment_type = "time-series" # "time-series" or "z-stack"
395
+ # z_position = 0.0
396
+ # laser_names_active = ["red", "blue"]
397
+ # laser_powers_active = [0.5, 0.05] #W
398
+ # laser_positions_active = [[5, 5, 0], [5, 5, 0]] # um
399
+ # xyoffset = [0, 0] # um
400
+
401
+ experiment_type = "z-stack" # "time-series" or "z-stack"
402
+ z_position = [-0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5]
403
+ laser_names_active = ["red", "blue"]
404
+ laser_powers_active = [0.5, 0.05] #W
405
+ laser_positions_active = [[5, 5, 0], [5, 5, 0]] # um
406
+ xyoffset = [0, 0] # um
407
+ exposure_time = 100 # ms, needs to be >= than oversample motion time in GlobalParameters
408
+ interval_time = 0 # ms, must be == 0 or if >0 then must be >= oversample motion time in GlobalParameters
AMS_BP/run_sim_util.py ADDED
@@ -0,0 +1,76 @@
1
+ import os
2
+ import time
3
+ from contextlib import contextmanager
4
+ from pathlib import Path
5
+
6
+ import rich
7
+ from rich.progress import Progress, SpinnerColumn, TextColumn
8
+
9
+ from .configio.convertconfig import load_config, setup_microscope
10
+ from .configio.saving import save_config_frames
11
+
12
+
13
+ def run_simulation_from_file(config_file: Path, show_progress: bool = True) -> None:
14
+ """
15
+ Core simulation logic used by both CLI and GUI.
16
+ """
17
+
18
+ @contextmanager
19
+ def progress_context():
20
+ if show_progress:
21
+ progress = Progress(
22
+ SpinnerColumn(),
23
+ TextColumn("[progress.description]{task.description}"),
24
+ transient=True,
25
+ )
26
+ with progress:
27
+ yield progress
28
+ else:
29
+ # Dummy context for GUI
30
+ class DummyProgress:
31
+ def add_task(self, description, total=None):
32
+ return None
33
+
34
+ def update(self, task, completed):
35
+ pass
36
+
37
+ yield DummyProgress()
38
+
39
+ with progress_context() as progress:
40
+ start_task_1 = time.time()
41
+ task_1 = progress.add_task(
42
+ description="Processing request to run the simulation ...", total=10
43
+ )
44
+
45
+ if not os.path.isfile(config_file):
46
+ raise FileNotFoundError("Configuration file not found.")
47
+
48
+ loadedconfig = load_config(config_file)
49
+
50
+ if "version" in loadedconfig:
51
+ version = loadedconfig["version"]
52
+ rich.print(f"Using config version: [bold]{version}[/bold]")
53
+
54
+ setup_config = setup_microscope(loadedconfig)
55
+ microscope = setup_config["microscope"]
56
+ configEXP = setup_config["experiment_config"]
57
+ functionEXP = setup_config["experiment_func"]
58
+
59
+ progress.update(task_1, completed=10)
60
+ rich.print(
61
+ "Prep work done in {:.2f} seconds.".format(time.time() - start_task_1)
62
+ )
63
+
64
+ time_task_2 = time.time()
65
+ task_2 = progress.add_task(description="Running the simulation ...", total=None)
66
+
67
+ frames, metadata = functionEXP(microscope=microscope, config=configEXP)
68
+
69
+ save_config_frames(
70
+ metadata, frames, setup_config["base_config"].OutputParameter
71
+ )
72
+
73
+ progress.update(task_2, completed=None)
74
+ rich.print(
75
+ "Simulation completed in {:.2f} seconds.".format(time.time() - time_task_2)
76
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AMS_BP
3
- Version: 0.3.1
3
+ Version: 0.4.0
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
@@ -11,12 +11,16 @@ Keywords: SMS
11
11
  Requires-Python: >=3.12
12
12
  Requires-Dist: boundedfbm>=0.4.0
13
13
  Requires-Dist: jsonschema>=4.23.0
14
+ Requires-Dist: napari[all]>=0.5.6
14
15
  Requires-Dist: numpy>=1.21.2
15
16
  Requires-Dist: pydantic>=2.9.2
17
+ Requires-Dist: pyqt6>=6.9.0
16
18
  Requires-Dist: pyvista>=0.44.2
17
19
  Requires-Dist: scikit-image>=0.18.3
18
20
  Requires-Dist: scipy>=1.7.1
21
+ Requires-Dist: tifffile>=2024.12.12
19
22
  Requires-Dist: tomli>=2.0.2
23
+ Requires-Dist: tomlkit>=0.13.2
20
24
  Requires-Dist: typer>=0.12.5
21
25
  Description-Content-Type: text/markdown
22
26
 
@@ -50,6 +54,7 @@ Find detailed API references for the library at: [joemans3/github.io/AMS_BP](htt
50
54
  ## Table of Contents
51
55
  - [Installation](#installation)
52
56
  - [Command Line Interface](#command-line-interface)
57
+ - [GUI](#gui)
53
58
  - [Configuration File](#configuration-file)
54
59
  - [Running Experiments](#running-experiments)
55
60
  - [Advanced Usage](#advanced-usage)
@@ -90,6 +95,9 @@ run_AMS_BP config [OPTIONS]
90
95
 
91
96
  # Run a simulation using a configuration file
92
97
  run_AMS_BP runsim CONFIG_FILE
98
+
99
+ #start the GUI
100
+ run_AMS_BP gui
93
101
  ```
94
102
 
95
103
  ### Config Command Options
@@ -97,6 +105,40 @@ run_AMS_BP runsim CONFIG_FILE
97
105
  - `-o, --output_path PATH`: Specify the output directory for the configuration file
98
106
  - `-r, --recursive_o`: Create output directory if it doesn't exist
99
107
 
108
+ ## GUI
109
+ In addition to the CLI and programmatic API, AMS-BP comes with a graphical interface to guide users through the configuration, simulation, and analysis pipeline.
110
+
111
+ ### Main GUI Features
112
+ The GUI provides the following tools from a single interface:
113
+
114
+ **Create Configuration File** — Launches the visual configuration builder
115
+ **Run Simulation from Config** — Select a .toml file and run the simulation with logging and progress tracking
116
+ **Visualize Microscopy Data (Napari)** — Open TIFF, PNG, ND2, or Zarr image files and view with the Napari viewer
117
+ **Package Logs for Sharing** — Package run directories (e.g., run_2024_04_20_001) into a .zip file for archival or collaboration
118
+
119
+ ### Launch the GUI
120
+ To start the GUI, run:
121
+
122
+ ```bash
123
+
124
+ run_AMS_BP gui
125
+ ```
126
+ #### Configuration Builder
127
+ Clicking "Create Configuration File" opens a template selector where you can choose a preconfigured simulation (with preview images), and then visually edit all configuration options through dedicated tabs.
128
+
129
+ Each section of the configuration is editable via structured UI forms, with contextual help and validation. Tabs include:
130
+
131
+ - Global/Cell/Molecule/Condensate/Fluorophore parameters
132
+ - Laser and optical configuration
133
+ - Camera and channel settings
134
+ - Experiment setup (e.g., z-stack vs time-series)
135
+ Once ready, click "Preview Configuration TOML" to inspect the final file, and "Save" to export.
136
+
137
+ #### Running Simulations from GUI
138
+ Clicking "Run Simulation from Config" lets you select any .toml configuration file. A real-time log viewer shows progress, and outputs are saved in a structured AMS_runs/run_*/ directory.
139
+
140
+ #### Sharing Logs
141
+ Run into an issue? Use the packge logs button to select the logs corresponding to the simulation you just ran, save them and send them over to us! It will help you diagnose the issue!
100
142
 
101
143
  ## Configuration File
102
144
 
@@ -175,32 +217,6 @@ run_AMS_BP config
175
217
  run_AMS_BP runsim sim_config.toml
176
218
  ```
177
219
  4. View the results in the newly created folder, whose name is defined in the config file.
178
- ## Advanced Usage
179
-
180
- ### Using AMS-BP as a Library
181
-
182
- For programmatic control, you can import and use AMS-BP as a Python library:
183
-
184
- ```python
185
- from AMS_BP.configio.convertconfig import ConfigLoader
186
-
187
- # Configuration loader intialization
188
- config_loader = ConfigLoader(config_path="path/to/config.toml")
189
-
190
- # Setup microscope
191
- setup_config = config_loader.setup_microscope()
192
- microscope = setup_config["microscope"]
193
- config_exp = setup_config["experiment_config"]
194
- function_exp = setup_config["experiment_func"]
195
-
196
- # Run simulation
197
- frames, metadata = function_exp(microscope=microscope, config=config_exp)
198
-
199
- # Save results
200
- from AMS_BP.configio.saving import save_config_frames
201
- save_config_frames(metadata, frames, setup_config["base_config"].OutputParameters)
202
- ```
203
- > **_NOTE:_** Please note that this application DOES NOT currently model the process of stimulated emission, and as such is not suitable for simulating stimulated emission microscopy ([STED](https://en.wikipedia.org/wiki/STED_microscopy))-type experiments. Work in this area is ongoing.
204
220
 
205
221
  ## High Priority Features
206
222
  ~~1. Irregular cell shapes with motion models~~ (supported with release of v0.2.0)
@@ -208,3 +224,6 @@ save_config_frames(metadata, frames, setup_config["base_config"].OutputParameter
208
224
  3. STORM workflow examples
209
225
  4. CTRW motion models
210
226
  5. Simpler configurations
227
+ > **_NOTE:_** Please note that this application DOES NOT currently model the process of stimulated emission, and as such is not suitable for simulating stimulated emission microscopy ([STED](https://en.wikipedia.org/wiki/STED_microscopy))-type experiments. Work in this area is ongoing.
228
+
229
+