spacr 0.1.76__py3-none-any.whl → 0.1.81__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.
spacr/core.py CHANGED
@@ -994,7 +994,7 @@ def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=22
994
994
  model = torch.load(model_path)
995
995
 
996
996
  dataset = TarImageDataset(tar_path, transform=transform)
997
- data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True, n_jobs=n_jobs, pin_memory=True)
997
+ data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=n_jobs, pin_memory=True)
998
998
 
999
999
  model_name = os.path.splitext(os.path.basename(model_path))[0]
1000
1000
  dataset_name = os.path.splitext(os.path.basename(tar_path))[0]
@@ -1055,7 +1055,7 @@ def apply_model(src, model_path, image_size=224, batch_size=64, normalize=True,
1055
1055
 
1056
1056
  print(f'Loading dataset in {src} with {len(src)} images')
1057
1057
  dataset = NoClassDataset(data_dir=src, transform=transform, shuffle=True, load_to_memory=False)
1058
- data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True, n_jobs=n_jobs)
1058
+ data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=n_jobs)
1059
1059
  print(f'Loaded {len(src)} images')
1060
1060
 
1061
1061
  result_loc = os.path.splitext(model_path)[0]+datetime.date.today().strftime('%y%m%d')+'_'+os.path.splitext(model_path)[1]+'_test_result.csv'
@@ -1404,10 +1404,10 @@ def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_
1404
1404
  #val_dataset = augment_dataset(val_dataset, is_grayscale=(len(channels) == 1))
1405
1405
  print(f'Data after augmentation: Train: {len(train_dataset)}')#, Validataion:{len(val_dataset)}')
1406
1406
 
1407
- train_loaders = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle, n_jobs=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1408
- val_loaders = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, n_jobs=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1407
+ train_loaders = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1408
+ val_loaders = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1409
1409
  else:
1410
- train_loaders = DataLoader(data, batch_size=batch_size, shuffle=shuffle, n_jobs=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1410
+ train_loaders = DataLoader(data, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1411
1411
 
1412
1412
  elif train_mode == 'irm':
1413
1413
  data = MyDataset(data_dir, classes, transform=transform, shuffle=shuffle, pin_memory=pin_memory)
@@ -1436,13 +1436,13 @@ def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_
1436
1436
  #val_dataset = augment_dataset(val_dataset, is_grayscale=(len(channels) == 1))
1437
1437
  print(f'Data after augmentation: Train: {len(train_dataset)}')#, Validataion:{len(val_dataset)}')
1438
1438
 
1439
- train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle, n_jobs=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1440
- val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, n_jobs=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1439
+ train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1440
+ val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1441
1441
 
1442
1442
  train_loaders.append(train_loader)
1443
1443
  val_loaders.append(val_loader)
1444
1444
  else:
1445
- train_loader = DataLoader(plate_data, batch_size=batch_size, shuffle=shuffle, n_jobs=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1445
+ train_loader = DataLoader(plate_data, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
1446
1446
  train_loaders.append(train_loader)
1447
1447
  val_loaders.append(None)
1448
1448
 
spacr/gui.py CHANGED
@@ -17,21 +17,33 @@ class MainApp(tk.Tk):
17
17
  style = ttk.Style()
18
18
  set_dark_style(style)
19
19
 
20
- self.gui_apps = {
20
+ self.main_gui_apps = {
21
21
  "Mask": (lambda frame: initiate_root(frame, 'mask'), "Generate cellpose masks for cells, nuclei and pathogen images."),
22
22
  "Measure": (lambda frame: initiate_root(frame, 'measure'), "Measure single object intensity and morphological feature. Crop and save single object image"),
23
23
  "Annotate": (lambda frame: initiate_root(frame, 'annotate'), "Annotation single object images on a grid. Annotations are saved to database."),
24
- "Make Masks": (lambda frame: initiate_root(frame, 'make_masks'),"Adjust pre-existing Cellpose models to your specific dataset for improved performance"),
24
+ "Make Masks": (lambda frame: initiate_root(frame, 'make_masks'), "Adjust pre-existing Cellpose models to your specific dataset for improved performance"),
25
25
  "Classify": (lambda frame: initiate_root(frame, 'classify'), "Train Torch Convolutional Neural Networks (CNNs) or Transformers to classify single object images."),
26
- "Sequencing": (lambda frame: initiate_root(frame, 'sequencing'), "Analyze sequensing data."),
27
- "Umap": (lambda frame: initiate_root(frame, 'umap'), "Generate UMAP embedings with datapoints represented as images.")
26
+ }
27
+
28
+ self.additional_gui_apps = {
29
+ "Sequencing": (lambda frame: initiate_root(frame, 'sequencing'), "Analyze sequencing data."),
30
+ "Umap": (lambda frame: initiate_root(frame, 'umap'), "Generate UMAP embeddings with datapoints represented as images."),
31
+ "Train Cellpose": (lambda frame: initiate_root(frame, 'train_cellpose'), "Train custom Cellpose models."),
32
+ "ML Analyze": (lambda frame: initiate_root(frame, 'ml_analyze'), "Machine learning analysis of data."),
33
+ "Cellpose Masks": (lambda frame: initiate_root(frame, 'cellpose_masks'), "Generate Cellpose masks."),
34
+ "Cellpose All": (lambda frame: initiate_root(frame, 'cellpose_all'), "Run Cellpose on all images."),
35
+ "Map Barcodes": (lambda frame: initiate_root(frame, 'map_barcodes'), "Map barcodes to data."),
36
+ "Regression": (lambda frame: initiate_root(frame, 'regression'), "Perform regression analysis."),
37
+ "Recruitment": (lambda frame: initiate_root(frame, 'recruitment'), "Analyze recruitment data.")
28
38
  }
29
39
 
30
40
  self.selected_app = tk.StringVar()
31
41
  self.create_widgets()
32
42
 
33
- if default_app in self.gui_apps:
34
- self.load_app(default_app, self.gui_apps[default_app][0])
43
+ if default_app in self.main_gui_apps:
44
+ self.load_app(default_app, self.main_gui_apps[default_app][0])
45
+ elif default_app in self.additional_gui_apps:
46
+ self.load_app(default_app, self.additional_gui_apps[default_app][0])
35
47
 
36
48
  def create_widgets(self):
37
49
  # Create the menu bar
@@ -47,7 +59,7 @@ class MainApp(tk.Tk):
47
59
  self.content_frame = tk.Frame(self.canvas, bg="black")
48
60
  self.content_frame.pack(fill=tk.BOTH, expand=True)
49
61
 
50
- # Create startup screen with buttons for each GUI app
62
+ # Create startup screen with buttons for each main GUI app and drop-down for additional apps
51
63
  self.create_startup_screen()
52
64
 
53
65
  def create_startup_screen(self):
@@ -68,7 +80,7 @@ class MainApp(tk.Tk):
68
80
  buttons_frame = tk.Frame(self.content_frame, bg="black")
69
81
  buttons_frame.pack(pady=10, expand=True, padx=10)
70
82
 
71
- for i, (app_name, app_data) in enumerate(self.gui_apps.items()):
83
+ for i, (app_name, app_data) in enumerate(self.main_gui_apps.items()):
72
84
  app_func, app_desc = app_data
73
85
 
74
86
  # Create custom button with text
@@ -78,6 +90,17 @@ class MainApp(tk.Tk):
78
90
  description_label = tk.Label(buttons_frame, text=app_desc, bg="black", fg="white", wraplength=800, justify="left", font=('Helvetica', 12))
79
91
  description_label.grid(row=i, column=1, pady=10, padx=10, sticky="w")
80
92
 
93
+ # Add drop-down menu for additional apps
94
+ dropdown_frame = tk.Frame(buttons_frame, bg="black")
95
+ dropdown_frame.grid(row=len(self.main_gui_apps), column=0, columnspan=2, pady=20)
96
+
97
+ tk.Label(dropdown_frame, text="Additional Apps", bg="black", fg="white", font=('Helvetica', 12)).pack(side=tk.LEFT, padx=5)
98
+ self.additional_apps_var = tk.StringVar(value="Select an app")
99
+ dropdown = ttk.Combobox(dropdown_frame, textvariable=self.additional_apps_var, values=list(self.additional_gui_apps.keys()))
100
+ dropdown.pack(side=tk.LEFT, padx=5)
101
+ load_button = spacrButton(dropdown_frame, text="Load", command=self.load_additional_app, font=('Helvetica', 12))
102
+ load_button.pack(side=tk.LEFT, padx=5)
103
+
81
104
  # Ensure buttons have a fixed width
82
105
  buttons_frame.grid_columnconfigure(0, minsize=150)
83
106
  # Ensure descriptions expand as needed
@@ -135,6 +158,11 @@ class MainApp(tk.Tk):
135
158
  app_frame.pack(fill=tk.BOTH, expand=True)
136
159
  app_func(app_frame)
137
160
 
161
+ def load_additional_app(self):
162
+ selected_app = self.additional_apps_var.get()
163
+ if selected_app in self.additional_gui_apps:
164
+ self.load_app(selected_app, self.additional_gui_apps[selected_app][0])
165
+
138
166
  def clear_frame(self, frame):
139
167
  for widget in frame.winfo_children():
140
168
  widget.destroy()
spacr/gui_core.py CHANGED
@@ -1,27 +1,24 @@
1
- import os, traceback, ctypes, matplotlib, requests, csv
1
+ import os, traceback, ctypes, matplotlib, requests, csv, matplotlib, time, requests
2
+ import matplotlib.pyplot as plt
2
3
  matplotlib.use('Agg')
3
4
  import tkinter as tk
4
5
  from tkinter import ttk
5
6
  from tkinter import filedialog
6
- from multiprocessing import Process, Value, Queue
7
+ from multiprocessing import Process, Value, Queue, set_start_method
7
8
  from multiprocessing.sharedctypes import Synchronized
8
- from multiprocessing import set_start_method
9
9
  from tkinter import ttk, scrolledtext
10
10
  from matplotlib.figure import Figure
11
11
  from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
12
- import time
13
- import requests
14
12
  from huggingface_hub import list_repo_files
15
13
 
16
- from .settings import set_default_train_test_model, get_measure_crop_settings, set_default_settings_preprocess_generate_masks, get_analyze_reads_default_settings, set_default_umap_image_settings
17
- from .gui_elements import create_menu_bar, spacrButton, spacrLabel, spacrFrame, spacrDropdownMenu ,set_dark_style, set_default_font
18
- from . gui_run import run_mask_gui, run_measure_gui, run_classify_gui, run_sequencing_gui, run_umap_gui
19
-
20
14
  try:
21
15
  ctypes.windll.shcore.SetProcessDpiAwareness(True)
22
16
  except AttributeError:
23
17
  pass
24
18
 
19
+ from .settings import set_default_train_test_model, get_measure_crop_settings, set_default_settings_preprocess_generate_masks, get_analyze_reads_default_settings, set_default_umap_image_settings
20
+ from .gui_elements import create_menu_bar, spacrButton, spacrLabel, spacrFrame, spacrDropdownMenu ,set_dark_style, set_default_font
21
+
25
22
  # Define global variables
26
23
  q = None
27
24
  console_output = None
@@ -44,26 +41,116 @@ def initiate_abort():
44
41
  thread_control["run_thread"].join()
45
42
  thread_control["run_thread"] = None
46
43
 
47
- def start_process_v1(q, fig_queue, settings_type='mask'):
48
- global thread_control, vars_dict
49
- from .settings import check_settings, expected_types
44
+ def spacrFigShow(fig_queue=None):
45
+ """
46
+ Replacement for plt.show() that queues figures instead of displaying them.
47
+ """
48
+ fig = plt.gcf()
49
+ if fig_queue:
50
+ fig_queue.put(fig)
51
+ else:
52
+ fig.show()
53
+ plt.close(fig)
50
54
 
51
- settings = check_settings(vars_dict, expected_types, q)
52
- if thread_control.get("run_thread") is not None:
53
- initiate_abort()
54
- stop_requested = Value('i', 0) # multiprocessing shared value for inter-process communication
55
- thread_control["stop_requested"] = stop_requested
55
+ def function_gui_wrapper(function=None, settings={}, q=None, fig_queue=None, imports=1):
56
+
57
+ """
58
+ Wraps the run_multiple_simulations function to integrate with GUI processes.
59
+
60
+ Parameters:
61
+ - settings: dict, The settings for the run_multiple_simulations function.
62
+ - q: multiprocessing.Queue, Queue for logging messages to the GUI.
63
+ - fig_queue: multiprocessing.Queue, Queue for sending figures to the GUI.
64
+ """
65
+
66
+ # Temporarily override plt.show
67
+ original_show = plt.show
68
+ plt.show = lambda: spacrFigShow(fig_queue)
69
+
70
+ try:
71
+ if imports == 1:
72
+ function(settings=settings)
73
+ elif imports == 2:
74
+ function(src=settings['src'], settings=settings)
75
+ except Exception as e:
76
+ # Send the error message to the GUI via the queue
77
+ errorMessage = f"Error during processing: {e}"
78
+ q.put(errorMessage)
79
+ traceback.print_exc()
80
+ finally:
81
+ # Restore the original plt.show function
82
+ plt.show = original_show
83
+
84
+ def run_function_gui(settings_type, settings, q, fig_queue, stop_requested):
85
+ from .gui_utils import process_stdout_stderr
86
+ from .core import preprocess_generate_masks, generate_ml_scores, identify_masks_finetune, check_cellpose_models, analyze_recruitment, train_cellpose, compare_cellpose_masks, analyze_plaques, generate_dataset, apply_model_to_tar
87
+ from .io import generate_cellpose_train_test
88
+ from .measure import measure_crop
89
+ from .sim import run_multiple_simulations
90
+ from .deep_spacr import train_test_model
91
+ from .sequencing import analyze_reads, map_barcodes_folder, perform_regression
92
+ process_stdout_stderr(q)
93
+
56
94
  if settings_type == 'mask':
57
- thread_control["run_thread"] = Process(target=run_mask_gui, args=(settings, q, fig_queue, stop_requested))
95
+ function = preprocess_generate_masks
96
+ imports = 2
58
97
  elif settings_type == 'measure':
59
- thread_control["run_thread"] = Process(target=run_measure_gui, args=(settings, q, fig_queue, stop_requested))
60
- elif settings_type == 'classify':
61
- thread_control["run_thread"] = Process(target=run_classify_gui, args=(settings, q, fig_queue, stop_requested))
98
+ function = measure_crop
99
+ imports = 1
100
+ elif settings_type == 'simulation':
101
+ function = run_multiple_simulations
102
+ imports = 1
62
103
  elif settings_type == 'sequencing':
63
- thread_control["run_thread"] = Process(target=run_sequencing_gui, args=(settings, q, fig_queue, stop_requested))
64
- elif settings_type == 'umap':
65
- thread_control["run_thread"] = Process(target=run_umap_gui, args=(settings, q, fig_queue, stop_requested))
66
- thread_control["run_thread"].start()
104
+ function = analyze_reads
105
+ imports = 1
106
+ elif settings_type == 'classify':
107
+ function = train_test_model
108
+ imports = 2
109
+ elif settings_type == 'train_cellpose':
110
+ function = train_cellpose
111
+ imports = 1
112
+ elif settings_type == 'ml_analyze':
113
+ function = generate_ml_scores
114
+ imports = 2
115
+ elif settings_type == 'cellpose_masks':
116
+ function = identify_masks_finetune
117
+ imports = 1
118
+ elif settings_type == 'cellpose_all':
119
+ function = check_cellpose_models
120
+ imports = 1
121
+ elif settings_type == 'map_barcodes':
122
+ function = map_barcodes_folder
123
+ imports = 2
124
+ elif settings_type == 'regression':
125
+ function = perform_regression
126
+ imports = 2
127
+ elif settings_type == 'recruitment':
128
+ function = analyze_recruitment
129
+ imports = 2
130
+ #elif settings_type == 'cellpose_dataset':
131
+ # function = generate_cellpose_train_test
132
+ # imports = 1
133
+ #elif settings_type == 'plaques':
134
+ # function = analyze_plaques
135
+ # imports = 1
136
+ #elif settings_type == 'cellpose_compare':
137
+ # function = compare_cellpose_masks
138
+ # imports = 1
139
+ #elif settings_type == 'vision_scores':
140
+ # function = apply_model_to_tar
141
+ # imports = 1
142
+ #elif settings_type == 'vision_dataset':
143
+ # function = generate_dataset
144
+ # imports = 1
145
+ else:
146
+ raise ValueError(f"Invalid settings type: {settings_type}")
147
+ try:
148
+ function_gui_wrapper(function, settings, q, fig_queue, imports)
149
+ except Exception as e:
150
+ q.put(f"Error during processing: {e}")
151
+ traceback.print_exc()
152
+ finally:
153
+ stop_requested.value = 1
67
154
 
68
155
  def start_process(q=None, fig_queue=None, settings_type='mask'):
69
156
  global thread_control, vars_dict
@@ -83,25 +170,15 @@ def start_process(q=None, fig_queue=None, settings_type='mask'):
83
170
  if thread_control.get("run_thread") is not None:
84
171
  initiate_abort()
85
172
 
86
- stop_requested = Value('i', 0) # multiprocessing shared value for inter-process communication
173
+ stop_requested = Value('i', 0)
87
174
  thread_control["stop_requested"] = stop_requested
88
175
 
89
- process_args = (settings, q, fig_queue, stop_requested)
90
-
91
- if settings_type == 'mask':
92
- thread_control["run_thread"] = Process(target=run_mask_gui, args=process_args)
93
- elif settings_type == 'measure':
94
- thread_control["run_thread"] = Process(target=run_measure_gui, args=process_args)
95
- elif settings_type == 'classify':
96
- thread_control["run_thread"] = Process(target=run_classify_gui, args=process_args)
97
- elif settings_type == 'sequencing':
98
- thread_control["run_thread"] = Process(target=run_sequencing_gui, args=process_args)
99
- elif settings_type == 'umap':
100
- thread_control["run_thread"] = Process(target=run_umap_gui, args=process_args)
176
+ process_args = (settings_type, settings, q, fig_queue, stop_requested)
177
+ if settings_type in ['mask','measure','simulation','sequencing','classify','cellpose_dataset','train_cellpose','ml_analyze','cellpose_masks','cellpose_all','map_barcodes','regression','recruitment','plaques','cellpose_compare','vision_scores','vision_dataset']:
178
+ thread_control["run_thread"] = Process(target=run_function_gui, args=process_args)
101
179
  else:
102
180
  q.put(f"Error: Unknown settings type '{settings_type}'")
103
181
  return
104
-
105
182
  thread_control["run_thread"].start()
106
183
 
107
184
  def import_settings(settings_type='mask'):
@@ -194,7 +271,7 @@ def convert_settings_dict_for_gui(settings):
194
271
 
195
272
  def setup_settings_panel(vertical_container, settings_type='mask', window_dimensions=[500, 1000]):
196
273
  global vars_dict, scrollable_frame
197
- from .settings import set_default_settings_preprocess_generate_masks, get_measure_crop_settings, set_default_train_test_model, get_analyze_reads_default_settings, set_default_umap_image_settings, generate_fields, descriptions
274
+ from .settings import descriptions, get_identify_masks_finetune_default_settings, set_default_analyze_screen, set_default_settings_preprocess_generate_masks, get_measure_crop_settings, set_default_train_test_model, get_analyze_reads_default_settings, set_default_umap_image_settings, generate_fields, get_perform_regression_default_settings, get_train_cellpose_default_settings, get_map_barcodes_default_settings, get_analyze_recruitment_default_settings, get_check_cellpose_models_default_settings
198
275
 
199
276
  width = (window_dimensions[0])//6
200
277
  height = window_dimensions[1]
@@ -219,9 +296,36 @@ def setup_settings_panel(vertical_container, settings_type='mask', window_dimens
219
296
  settings = get_analyze_reads_default_settings(settings={})
220
297
  elif settings_type == 'umap':
221
298
  settings = set_default_umap_image_settings(settings={})
299
+ elif settings_type == 'train_cellpose':
300
+ settings = get_train_cellpose_default_settings(settings={})
301
+ elif settings_type == 'ml_analyze':
302
+ settings = set_default_analyze_screen(settings={})
303
+ elif settings_type == 'cellpose_masks':
304
+ settings = get_identify_masks_finetune_default_settings(settings={})
305
+ elif settings_type == 'cellpose_all':
306
+ settings = get_check_cellpose_models_default_settings(settings={})
307
+ elif settings_type == 'map_barcodes':
308
+ settings = get_map_barcodes_default_settings(settings={})
309
+ elif settings_type == 'regression':
310
+ settings = get_perform_regression_default_settings(settings={})
311
+ elif settings_type == 'recruitment':
312
+ settings = get_analyze_recruitment_default_settings(settings={})
313
+ #elif settings_type == 'simulation':
314
+ # settings = set_default_
315
+ #elif settings_type == 'cellpose_dataset':
316
+ # settings = set_default_
317
+ #elif settings_type == 'plaques':
318
+ # settings = set_default_
319
+ #elif settings_type == 'cellpose_compare':
320
+ # settings = set_default_
321
+ #elif settings_type == 'vision_scores':
322
+ # settings = set_default_
323
+ #elif settings_type == 'vision_dataset':
324
+ # settings = set_default_
222
325
  else:
223
326
  raise ValueError(f"Invalid settings type: {settings_type}")
224
327
 
328
+
225
329
  variables = convert_settings_dict_for_gui(settings)
226
330
  vars_dict = generate_fields(variables, scrollable_frame)
227
331
  print("Settings panel setup complete")
@@ -402,8 +506,9 @@ def setup_button_section(horizontal_container, settings_type='mask', window_dim
402
506
  # Description frame
403
507
  description_frame = tk.Frame(horizontal_container, bg='black', height=height, width=width)
404
508
  horizontal_container.add(description_frame, stretch="always", sticky="nsew")
405
- description_label = tk.Label(description_frame, text="Module Description", bg='black', fg='white', anchor='nw', justify='left', wraplength=width//2-100)
406
- description_label.pack(pady=10, padx=10)
509
+ description_frame.grid_columnconfigure(0, weight=1) # Make the column stretch
510
+ description_label = tk.Label(description_frame, text="Module Description", bg='black', fg='white', anchor='nw', justify='left', wraplength=width-50)
511
+ description_label.grid(row=0, column=0, pady=50, padx=20, sticky='nsew') # Use sticky='nsew' to stretch the label
407
512
  description_text = descriptions.get(settings_type, "No description available for this module.")
408
513
  description_label.config(text=description_text)
409
514
 
spacr/gui_elements.py CHANGED
@@ -1439,7 +1439,14 @@ def create_menu_bar(root):
1439
1439
  "Make Masks": (lambda frame: initiate_root(frame, 'make_masks'), "Adjust pre-existing Cellpose models to your specific dataset for improved performance"),
1440
1440
  "Classify": (lambda frame: initiate_root(frame, 'classify'), "Train Torch Convolutional Neural Networks (CNNs) or Transformers to classify single object images."),
1441
1441
  "Sequencing": (lambda frame: initiate_root(frame, 'sequencing'), "Analyze sequencing data."),
1442
- "Umap": (lambda frame: initiate_root(frame, 'umap'), "Generate UMAP embeddings with datapoints represented as images.")
1442
+ "Umap": (lambda frame: initiate_root(frame, 'umap'), "Generate UMAP embeddings with datapoints represented as images."),
1443
+ "Train Cellpose": (lambda frame: initiate_root(frame, 'train_cellpose'), "Train custom Cellpose models."),
1444
+ "ML Analyze": (lambda frame: initiate_root(frame, 'ml_analyze'), "Machine learning analysis of data."),
1445
+ "Cellpose Masks": (lambda frame: initiate_root(frame, 'cellpose_masks'), "Generate Cellpose masks."),
1446
+ "Cellpose All": (lambda frame: initiate_root(frame, 'cellpose_all'), "Run Cellpose on all images."),
1447
+ "Map Barcodes": (lambda frame: initiate_root(frame, 'map_barcodes'), "Map barcodes to data."),
1448
+ "Regression": (lambda frame: initiate_root(frame, 'regression'), "Perform regression analysis."),
1449
+ "Recruitment": (lambda frame: initiate_root(frame, 'recruitment'), "Analyze recruitment data.")
1443
1450
  }
1444
1451
 
1445
1452
  def load_app_wrapper(app_name, app_func):
@@ -1460,6 +1467,7 @@ def create_menu_bar(root):
1460
1467
  # Configure the menu for the root window
1461
1468
  root.config(menu=menu_bar)
1462
1469
 
1470
+
1463
1471
  def set_dark_style(style):
1464
1472
  font_style = tkFont.Font(family="Helvetica", size=24)
1465
1473
  style.configure('TEntry', padding='5 5 5 5', borderwidth=1, relief='solid', fieldbackground='black', foreground='#ffffff', font=font_style)
spacr/io.py CHANGED
@@ -1693,7 +1693,7 @@ def _save_settings_to_db(settings):
1693
1693
  settings_df['setting_value'] = settings_df['setting_value'].apply(str)
1694
1694
  display(settings_df)
1695
1695
  # Determine the directory path
1696
- src = os.path.dirname(settings['input_folder'])
1696
+ src = os.path.dirname(settings['src'])
1697
1697
  directory = f'{src}/measurements'
1698
1698
  # Create the directory if it doesn't exist
1699
1699
  os.makedirs(directory, exist_ok=True)
spacr/measure.py CHANGED
@@ -610,7 +610,7 @@ def _measure_crop_core(index, time_ls, file, settings):
610
610
 
611
611
  start = time.time()
612
612
  try:
613
- source_folder = os.path.dirname(settings['input_folder'])
613
+ source_folder = os.path.dirname(settings['src'])
614
614
  #if not os.path.basename(source_folder).endswith('merged'):
615
615
  # source_folder = os.path.join(source_folder, 'merged')
616
616
  # print(f'changed source_folder to {source_folder}')
@@ -619,7 +619,7 @@ def _measure_crop_core(index, time_ls, file, settings):
619
619
  # return
620
620
 
621
621
  file_name = os.path.splitext(file)[0]
622
- data = np.load(os.path.join(settings['input_folder'], file))
622
+ data = np.load(os.path.join(settings['src'], file))
623
623
  data_type = data.dtype
624
624
  if data_type not in ['uint8','uint16']:
625
625
  data_type_before = data_type
@@ -663,7 +663,7 @@ def _measure_crop_core(index, time_ls, file, settings):
663
663
  cell_mask, nucleus_mask = _relabel_parent_with_child_labels(cell_mask, nucleus_mask)
664
664
  data[:, :, settings['cell_mask_dim']] = cell_mask
665
665
  data[:, :, settings['nucleus_mask_dim']] = nucleus_mask
666
- save_folder = settings['input_folder']
666
+ save_folder = settings['src']
667
667
  np.save(os.path.join(save_folder, file), data)
668
668
  else:
669
669
  nucleus_mask = np.zeros_like(data[:, :, 0])
@@ -941,13 +941,13 @@ def measure_crop(settings):
941
941
  settings = get_measure_crop_settings(settings)
942
942
  settings = measure_test_mode(settings)
943
943
 
944
- #src_fldr = settings['input_folder']
944
+ #src_fldr = settings['src']
945
945
  #if not os.path.basename(src_fldr).endswith('merged'):
946
- # settings['input_folder'] = os.path.join(src_fldr, 'merged')
947
- # print(f"changed input_folder to {src_fldr}")
946
+ # settings['src'] = os.path.join(src_fldr, 'merged')
947
+ # print(f"changed src to {src_fldr}")
948
948
 
949
- #if not os.path.exists(settings['input_folder']):
950
- # print(f'input_folder: {settings["input_folder"]} does not exist')
949
+ #if not os.path.exists(settings['src']):
950
+ # print(f'src: {settings["src"]} does not exist')
951
951
  # return
952
952
 
953
953
  if settings['cell_mask_dim'] is None:
@@ -961,7 +961,7 @@ def measure_crop(settings):
961
961
  else:
962
962
  settings['cytoplasm'] = False
963
963
 
964
- dirname = os.path.dirname(settings['input_folder'])
964
+ dirname = os.path.dirname(settings['src'])
965
965
  settings_df = pd.DataFrame(list(settings.items()), columns=['Key', 'Value'])
966
966
  settings_csv = os.path.join(dirname,'settings','measure_crop_settings.csv')
967
967
  os.makedirs(os.path.join(dirname,'settings'), exist_ok=True)
@@ -997,7 +997,7 @@ def measure_crop(settings):
997
997
 
998
998
  _save_settings_to_db(settings)
999
999
 
1000
- files = [f for f in os.listdir(settings['input_folder']) if f.endswith('.npy')]
1000
+ files = [f for f in os.listdir(settings['src']) if f.endswith('.npy')]
1001
1001
  n_jobs = settings['n_jobs'] or mp.cpu_count()-4
1002
1002
  print(f'using {n_jobs} cpu cores')
1003
1003
 
@@ -1018,7 +1018,7 @@ def measure_crop(settings):
1018
1018
 
1019
1019
  if settings['representative_images']:
1020
1020
  if settings['save_png']:
1021
- img_fldr = os.path.join(os.path.dirname(settings['input_folder']), 'data')
1021
+ img_fldr = os.path.join(os.path.dirname(settings['src']), 'data')
1022
1022
  sc_img_fldrs = _list_endpoint_subdirectories(img_fldr)
1023
1023
 
1024
1024
  for i, well_src in enumerate(sc_img_fldrs):
@@ -1037,7 +1037,7 @@ def measure_crop(settings):
1037
1037
  #traceback.print_exc()
1038
1038
 
1039
1039
  if settings['save_measurements']:
1040
- db_path = os.path.join(os.path.dirname(settings['input_folder']), 'measurements', 'measurements.db')
1040
+ db_path = os.path.join(os.path.dirname(settings['src']), 'measurements', 'measurements.db')
1041
1041
  channel_indices = settings['png_dims']
1042
1042
  channel_indices = [min(value, 2) for value in channel_indices]
1043
1043
  _generate_representative_images(db_path,
@@ -1061,13 +1061,13 @@ def measure_crop(settings):
1061
1061
 
1062
1062
  if settings['timelapse']:
1063
1063
  if settings['timelapse_objects'] == 'nucleus':
1064
- folder_path = settings['input_folder']
1064
+ folder_path = settings['src']
1065
1065
  mask_channels = [settings['nucleus_mask_dim'], settings['pathogen_mask_dim'],settings['cell_mask_dim']]
1066
1066
  object_types = ['nucleus','pathogen','cell']
1067
1067
  _timelapse_masks_to_gif(folder_path, mask_channels, object_types)
1068
1068
 
1069
1069
  #if settings['save_png']:
1070
- img_fldr = os.path.join(os.path.dirname(settings['input_folder']), 'data')
1070
+ img_fldr = os.path.join(os.path.dirname(settings['src']), 'data')
1071
1071
  sc_img_fldrs = _list_endpoint_subdirectories(img_fldr)
1072
1072
  _scmovie(sc_img_fldrs)
1073
1073
  print("Successfully completed run")
spacr/settings.py CHANGED
@@ -292,6 +292,7 @@ def get_measure_crop_settings(settings):
292
292
  return settings
293
293
 
294
294
  def set_default_analyze_screen(settings):
295
+ settings.setdefault('src', 'path')
295
296
  settings.setdefault('model_type','xgboost')
296
297
  settings.setdefault('heatmap_feature','predictions')
297
298
  settings.setdefault('grouping','mean')
@@ -392,6 +393,7 @@ def get_analyze_reads_default_settings(settings):
392
393
  return settings
393
394
 
394
395
  def get_map_barcodes_default_settings(settings):
396
+ settings.setdefault('src', 'path')
395
397
  settings.setdefault('grna', '/home/carruthers/Documents/grna_barcodes.csv')
396
398
  settings.setdefault('barcodes', '/home/carruthers/Documents/SCREEN_BARCODES.csv')
397
399
  settings.setdefault('plate_dict', {'EO1': 'plate1', 'EO2': 'plate2', 'EO3': 'plate3', 'EO4': 'plate4', 'EO5': 'plate5', 'EO6': 'plate6', 'EO7': 'plate7', 'EO8': 'plate8'})
@@ -536,7 +538,7 @@ expected_types = {
536
538
  "plot": bool,
537
539
  "n_jobs": int,
538
540
  "verbose": bool,
539
- "input_folder": str,
541
+ "src": str,
540
542
  "cell_mask_dim": int,
541
543
  "cell_min_size": int,
542
544
  "cytoplasm_min_size": int,
@@ -858,88 +860,227 @@ def generate_fields(variables, scrollable_frame):
858
860
  row = 1
859
861
  vars_dict = {}
860
862
  tooltips = {
861
- "src": "Path to the folder containing the images.",
862
- "metadata_type": "Type of metadata to expect in the images. This will determine how the images are processed. If 'custom' is selected, you can provide a custom regex pattern to extract metadata from the image names.",
863
- "custom_regex": "Custom regex pattern to extract metadata from the image names. This will only be used if 'custom' is selected for 'metadata_type'.",
864
- "experiment": "Name of the experiment. This will be used to name the output files.",
865
- "channels": "List of channels to use for the analysis. The first channel is 0, the second is 1, and so on. For example, [0,1,2] will use channels 0, 1, and 2.",
866
- "magnification": "At what magnification the images were taken. This will be used to determine the size of the objects in the images.",
867
- "nucleus_channel": "The channel to use for the nucleus. If None, the nucleus will not be segmented.",
868
- "nucleus_background": "The background intensity for the nucleus channel. This will be used to remove background noise.",
869
- "nucleus_Signal_to_noise": "The signal-to-noise ratio for the nucleus channel. This will be used to determine the range of intensities to normalize images to for nucleus segmentation.",
870
- "nucleus_CP_prob": "The cellpose probability threshold for the nucleus channel. This will be used to segment the nucleus.",
871
- "nucleus_FT": "The flow threshold for nucleus objects. This will be used in nuclues segmentation.",
872
- "cell_channel": "The channel to use for the cell. If None, the cell will not be segmented.",
873
- "cell_background": "The background intensity for the cell channel. This will be used to remove background noise.",
874
- "cell_Signal_to_noise": "The signal-to-noise ratio for the cell channel. This will be used to determine the range of intensities to normalize images to for cell segmentation.",
875
- "cell_CP_prob": "The cellpose probability threshold for the cell channel. This will be used in cell segmentation.",
876
- "cell_FT": "The flow threshold for cell objects. This will be used to segment the cells.",
877
- "pathogen_channel": "The channel to use for the pathogen. If None, the pathogen will not be segmented.",
878
- "pathogen_background": "The background intensity for the pathogen channel. This will be used to remove background noise.",
879
- "pathogen_Signal_to_noise": "The signal-to-noise ratio for the pathogen channel. This will be used to determine the range of intensities to normalize images to for pathogen segmentation.",
880
- "pathogen_CP_prob": "The cellpose probability threshold for the pathogen channel. This will be used to segment the pathogen.",
881
- "pathogen_FT": "The flow threshold for pathogen objects. This will be used in pathogen segmentation.",
882
- "preprocess": "Whether to preprocess the images before segmentation. This includes background removal and normalization. Set to False only if this step has already been done.",
883
- "masks": "Whether to generate masks for the segmented objects. If True, masks will be generated for the nucleus, cell, and pathogen.",
884
- "examples_to_plot": "The number of images to plot for each segmented object. This will be used to visually inspect the segmentation results and normalization.",
885
- "randomize": "Whether to randomize the order of the images before processing. Recommended to avoid bias in the segmentation.",
886
- "batch_size": "The batch size to use for processing the images. This will determine how many images are processed at once. Images are normalized and segmented in batches. Lower if application runs out of RAM or VRAM.",
887
- "timelapse": "Whether to process the images as a timelapse.",
888
- "timelapse_displacement": "The displacement between frames in the timelapse. This will be used to align the frames before processing.",
889
- "timelapse_memory": "The number of frames to in tandem objects must be present in to be considered the same object in the timelapse.",
890
- "timelapse_frame_limits": "The frame limits to use for the timelapse. This will determine which frames are processed. For example, [5,20] will process frames 5 to 20.",
891
- "timelapse_remove_transient": "Whether to remove transient objects in the timelapse. Transient objects are present in fewer than all frames.",
892
- "timelapse_mode": "The mode to use for processing the timelapse. 'trackpy' uses the trackpy library for tracking objects, while 'btrack' uses the btrack library.",
893
- "timelapse_objects": "The objects to track in the timelapse (cell, nucleus or pathogen). This will determine which objects are tracked over time. If None, all objects will be tracked.",
894
- "fps": "Frames per second of the automatically generated timelapse movies.",
895
- "remove_background": "Whether to remove background noise from the images. This will help improve the quality of the segmentation.",
896
- "lower_percentile": "The lower quantile to use for normalizing the images. This will be used to determine the range of intensities to normalize images to.",
897
- "merge_pathogens": "Whether to merge pathogen objects that share more than 75% of their perimeter.",
898
- "normalize_plots": "Whether to normalize the plots.",
899
- "all_to_mip": "Whether to convert all images to maximum intensity projections before processing.",
900
- "pick_slice": "Whether to pick a single slice from the z-stack images. If False, the maximum intensity projection will be used.",
901
- "skip_mode": "The mode to use for skipping images. This will determine how to handle images that cannot be processed.",
902
- "save": "Whether to save the results to disk.",
903
- "merge_edge_pathogen_cells": "Whether to merge cells that share pathogen objects.",
904
- "plot": "Whether to plot the results.",
905
- "n_jobs": "The number of n_jobs to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
906
- "verbose": "Whether to print verbose output during processing.",
907
- "input_folder": "Path to the folder containing the images.",
908
- "cell_mask_dim": "The dimension of the array the cell mask is saved in.",
909
- "cell_min_size": "The minimum size of cell objects in pixels^2.",
910
- "cytoplasm": "Whether to segment the cytoplasm (Cell - Nucleus + Pathogen).",
911
- "cytoplasm_min_size": "The minimum size of cytoplasm objects in pixels^2.",
912
- "nucleus_mask_dim": "The dimension of the array the nucleus mask is saved in.",
913
- "nucleus_min_size": "The minimum size of nucleus objects in pixels^2.",
914
- "pathogen_mask_dim": "The dimension of the array the pathogen mask is saved in.",
915
- "pathogen_min_size": "The minimum size of pathogen objects in pixels^2.",
916
- "save_png": "Whether to save the segmented objects as PNG images.",
917
- "crop_mode": "The mode to use for cropping the images. This will determine which objects are cropped from the images (cell, nucleus, pathogen, cytoplasm).",
918
- "use_bounding_box": "Whether to use the bounding box of the objects for cropping. If False, only the object itself will be cropped.",
919
- "png_size": "The size of the PNG images to save. This will determine the size of the saved images.",
920
- "normalize": "The percentiles to use for normalizing the images. This will be used to determine the range of intensities to normalize images to. If None, no normalization is done.",
921
- "png_dims": "The dimensions of the PNG images to save. This will determine the dimensions of the saved images. Maximum of 3 dimensions e.g. [1,2,3].",
922
- "normalize_by": "Whether to normalize the images by field of view (fov) or by PNG image (png).",
923
- "save_measurements": "Whether to save the measurements to disk.",
924
- "representative_images": "Whether to save representative images of the segmented objects (Not working yet).",
925
- "plot_filtration": "Whether to plot the filtration steps.",
926
- "include_uninfected": "Whether to include uninfected cells in the analysis.",
927
- "dialate_pngs": "Whether to dilate the PNG images before saving.",
928
- "dialate_png_ratios": "The ratios to use for dilating the PNG images. This will determine the amount of dilation applied to the images before cropping.",
929
- "n_jobs": "The number of n_jobs to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
930
- "cells": "The cell types to include in the analysis.",
931
- "cell_loc": "The locations of the cell types in the images.",
932
- "pathogens": "The pathogen types to include in the analysis.",
933
- "pathogen_loc": "The locations of the pathogen types in the images.",
934
- "treatments": "The treatments to include in the analysis.",
935
- "treatment_loc": "The locations of the treatments in the images.",
936
- "channel_of_interest": "The channel of interest to use for the analysis.",
937
- "compartments": "The compartments to measure in the images.",
938
- "measurement": "The measurement to use for the analysis.",
939
- "nr_imgs": "The number of images to plot.",
940
- "um_per_pixel": "The micrometers per pixel for the images."
863
+ "adjust_cells": "(bool) - Adjust cell parameters for better segmentation.",
864
+ "agg_type": "(str) - Type of aggregation to use for the data.",
865
+ "alpha": "(float) - Alpha parameter for the regression model.",
866
+ "all_to_mip": "(bool) - Whether to convert all images to maximum intensity projections before processing.",
867
+ "amsgrad": "(bool) - Whether to use AMSGrad optimizer.",
868
+ "analyze_clusters": "(bool) - Whether to analyze the resulting clusters.",
869
+ "augment": "(dict) - Data augmentation settings.",
870
+ "background": "(float) - Background intensity for the images.",
871
+ "backgrounds": "(str) - Background settings for the analysis.",
872
+ "barcodes": "(str) - Path to the file containing barcodes.",
873
+ "batch_size": "(int) - The batch size to use for processing the images. This will determine how many images are processed at once. Images are normalized and segmented in batches. Lower if application runs out of RAM or VRAM.",
874
+ "black_background": "(bool) - Whether to use a black background for plots.",
875
+ "calculate_correlation": "(bool) - Whether to calculate correlations between features.",
876
+ "cell_CP_prob": "(float) - The cellpose probability threshold for the cell channel. This will be used in cell segmentation.",
877
+ "cell_FT": "(float) - The flow threshold for cell objects. This will be used to segment the cells.",
878
+ "cell_background": "(float) - The background intensity for the cell channel. This will be used to remove background noise.",
879
+ "cell_chann_dim": "(int) - Dimension of the channel to use for cell segmentation.",
880
+ "cell_channel": "(int) - The channel to use for the cell. If None, the cell will not be segmented.",
881
+ "cell_intensity_range": "(list) - Intensity range for cell segmentation.",
882
+ "cell_loc": "(list) - The locations of the cell types in the images.",
883
+ "cell_mask_dim": "(int) - The dimension of the array the cell mask is saved in.",
884
+ "cell_min_size": "(int) - The minimum size of cell objects in pixels^2.",
885
+ "cell_plate_metadata": "(str) - Metadata for the cell plate.",
886
+ "cell_Signal_to_noise": "(float) - The signal-to-noise ratio for the cell channel. This will be used to determine the range of intensities to normalize images to for cell segmentation.",
887
+ "cell_size_range": "(list) - Size range for cell segmentation.",
888
+ "cell_types": "(list) - Types of cells to include in the analysis.",
889
+ "cells": "(list) - The cell types to include in the analysis.",
890
+ "cells_per_well": "(int) - Number of cells per well.",
891
+ "channel_dims": "(list) - The dimensions of the image channels.",
892
+ "channel_of_interest": "(int) - The channel of interest to use for the analysis.",
893
+ "channels": "(list) - List of channels to use for the analysis. The first channel is 0, the second is 1, and so on. For example, [0,1,2] will use channels 0, 1, and 2.",
894
+ "chunk_size": "(int) - Chunk size for processing the sequencing data.",
895
+ "classes": "(list) - Classes to include in the training.",
896
+ "class_1_threshold": "(float) - Threshold for class 1 classification.",
897
+ "clustering": "(str) - Clustering algorithm to use.",
898
+ "col_to_compare": "(str) - Column to compare in the embeddings.",
899
+ "color_by": "(str) - Coloring scheme for the plots.",
900
+ "compartments": "(list) - The compartments to measure in the images.",
901
+ "CP_prob": "(float) - Cellpose probability threshold for segmentation.",
902
+ "crop_mode": "(str) - Mode to use for cropping images (cell, nucleus, pathogen, cytoplasm).",
903
+ "custom_model": "(str) - Path to a custom Cellpose model.",
904
+ "custom_regex": "(str) - Custom regex pattern to extract metadata from the image names. This will only be used if 'custom' is selected for 'metadata_type'.",
905
+ "cytoplasm": "(bool) - Whether to segment the cytoplasm (Cell - Nucleus + Pathogen).",
906
+ "cytoplasm_min_size": "(int) - The minimum size of cytoplasm objects in pixels^2.",
907
+ "dependent_variable": "(str) - The dependent variable for the regression analysis.",
908
+ "diameter": "(float) - Diameter of the objects to segment.",
909
+ "dialate_png_ratios": "(list) - The ratios to use for dilating the PNG images. This will determine the amount of dilation applied to the images before cropping.",
910
+ "dialate_pngs": "(bool) - Whether to dilate the PNG images before saving.",
911
+ "dot_size": "(int) - Size of dots in scatter plots.",
912
+ "downstream": "(str) - Downstream region for sequencing analysis.",
913
+ "dropout_rate": "(float) - Dropout rate for training.",
914
+ "eps": "(float) - Epsilon parameter for clustering.",
915
+ "epochs": "(int) - Number of epochs for training the deep learning model.",
916
+ "examples_to_plot": "(int) - The number of images to plot for each segmented object. This will be used to visually inspect the segmentation results and normalization.",
917
+ "exclude": "(list) - Conditions to exclude from the analysis.",
918
+ "exclude_conditions": "(list) - Specific conditions to exclude from the analysis.",
919
+ "experiment": "(str) - Name of the experiment. This will be used to name the output files.",
920
+ "figuresize": "(tuple) - Size of the figures to plot.",
921
+ "filter": "(dict) - Filter settings for the analysis.",
922
+ "filter_by": "(str) - Feature to filter the data by.",
923
+ "flow_threshold": "(float) - Flow threshold for segmentation.",
924
+ "fps": "(int) - Frames per second of the automatically generated timelapse movies.",
925
+ "fraction_threshold": "(float) - Threshold for the fraction of cells to consider in the analysis.",
926
+ "from_scratch": "(bool) - Whether to train the Cellpose model from scratch.",
927
+ "gene_weights_csv": "(str) - Path to the CSV file containing gene weights.",
928
+ "gradient_accumulation": "(bool) - Whether to use gradient accumulation.",
929
+ "gradient_accumulation_steps": "(int) - Number of steps for gradient accumulation.",
930
+ "grayscale": "(bool) - Whether to process the images in grayscale.",
931
+ "grna": "(str) - Path to the file containing gRNA sequences.",
932
+ "grouping": "(str) - Grouping variable for plotting.",
933
+ "heatmap_feature": "(str) - Feature to use for generating heatmaps.",
934
+ "homogeneity": "(float) - Measure of homogeneity for the objects.",
935
+ "homogeneity_distances": "(list) - Distances to use for measuring homogeneity.",
936
+ "image_nr": "(int) - Number of images to process.",
937
+ "image_size": "(int) - Size of the images for training.",
938
+ "img_zoom": "(float) - Zoom factor for the images in plots.",
939
+ "include_multinucleated": "(bool) - Whether to include multinucleated cells in the analysis.",
940
+ "include_multiinfected": "(bool) - Whether to include multi-infected cells in the analysis.",
941
+ "include_noninfected": "(bool) - Whether to include non-infected cells in the analysis.",
942
+ "include_uninfected": "(bool) - Whether to include uninfected cells in the analysis.",
943
+ "init_weights": "(bool) - Whether to initialize weights for the model.",
944
+ "src": "(str) - Path to the folder containing the images.",
945
+ "intermedeate_save": "(bool) - Whether to save intermediate results.",
946
+ "invert": "(bool) - Whether to invert the image intensities.",
947
+ "learning_rate": "(float) - Learning rate for training.",
948
+ "location_column": "(str) - Column name for the location information.",
949
+ "log_data": "(bool) - Whether to log-transform the data.",
950
+ "lower_percentile": "(float) - The lower quantile to use for normalizing the images. This will be used to determine the range of intensities to normalize images to.",
951
+ "magnification": "(int) - At what magnification the images were taken. This will be used to determine the size of the objects in the images.",
952
+ "manders_thresholds": "(list) - Thresholds for Manders' coefficients.",
953
+ "mask": "(bool) - Whether to generate masks for the segmented objects. If True, masks will be generated for the nucleus, cell, and pathogen.",
954
+ "measurement": "(str) - The measurement to use for the analysis.",
955
+ "metadata_type": "(str) - Type of metadata to expect in the images. This will determine how the images are processed. If 'custom' is selected, you can provide a custom regex pattern to extract metadata from the image names.",
956
+ "metadata_types": "(list) - Types of metadata to include in the analysis.",
957
+ "merge_edge_pathogen_cells": "(bool) - Whether to merge cells that share pathogen objects.",
958
+ "merge_pathogens": "(bool) - Whether to merge pathogen objects that share more than 75% of their perimeter.",
959
+ "metric": "(str) - Metric to use for UMAP.",
960
+ "min_cell_count": "(int) - Minimum number of cells required for analysis.",
961
+ "min_dist": "(float) - Minimum distance for UMAP.",
962
+ "min_max": "(tuple) - Minimum and maximum values for normalizing plots.",
963
+ "min_samples": "(int) - Minimum number of samples for clustering.",
964
+ "mix": "(dict) - Mixing settings for the samples.",
965
+ "model_name": "(str) - Name of the Cellpose model.",
966
+ "model_type": "(str) - Type of model to use for the analysis.",
967
+ "nc": "(str) - Negative control identifier.",
968
+ "nc_loc": "(str) - Location of the negative control in the images.",
969
+ "negative_control": "(str) - Identifier for the negative control.",
970
+ "n_estimators": "(int) - Number of estimators for the model.",
971
+ "n_epochs": "(int) - Number of epochs for training the Cellpose model.",
972
+ "n_jobs": "(int) - The number of n_jobs to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
973
+ "n_neighbors": "(int) - Number of neighbors for UMAP.",
974
+ "n_repeats": "(int) - Number of repeats for cross-validation.",
975
+ "normalize": "(list) - The percentiles to use for normalizing the images. This will be used to determine the range of intensities to normalize images to. If None, no normalization is done.",
976
+ "normalize_by": "(str) - Whether to normalize the images by field of view (fov) or by PNG image (png).",
977
+ "normalize_plots": "(bool) - Whether to normalize the plots.",
978
+ "nr_imgs": "(int) - The number of images to plot.",
979
+ "nucleus_CP_prob": "(float) - The cellpose probability threshold for the nucleus channel. This will be used to segment the nucleus.",
980
+ "nucleus_FT": "(float) - The flow threshold for nucleus objects. This will be used in nucleus segmentation.",
981
+ "nucleus_background": "(float) - The background intensity for the nucleus channel. This will be used to remove background noise.",
982
+ "nucleus_chann_dim": "(int) - Dimension of the channel to use for nucleus segmentation.",
983
+ "nucleus_channel": "(int) - The channel to use for the nucleus. If None, the nucleus will not be segmented.",
984
+ "nucleus_intensity_range": "(list) - Intensity range for nucleus segmentation.",
985
+ "nucleus_loc": "(str) - Location of the nucleus in the images.",
986
+ "nucleus_mask_dim": "(int) - The dimension of the array the nucleus mask is saved in.",
987
+ "nucleus_min_size": "(int) - The minimum size of nucleus objects in pixels^2.",
988
+ "nucleus_Signal_to_noise": "(float) - The signal-to-noise ratio for the nucleus channel. This will be used to determine the range of intensities to normalize images to for nucleus segmentation.",
989
+ "nucleus_size_range": "(list) - Size range for nucleus segmentation.",
990
+ "optimizer_type": "(str) - Type of optimizer to use.",
991
+ "other": "(dict) - Additional parameters for the regression analysis.",
992
+ "pathogen_CP_prob": "(float) - The cellpose probability threshold for the pathogen channel. This will be used to segment the pathogen.",
993
+ "pathogen_FT": "(float) - The flow threshold for pathogen objects. This will be used in pathogen segmentation.",
994
+ "pathogen_background": "(float) - The background intensity for the pathogen channel. This will be used to remove background noise.",
995
+ "pathogen_chann_dim": "(int) - Dimension of the channel to use for pathogen segmentation.",
996
+ "pathogen_channel": "(int) - The channel to use for the pathogen. If None, the pathogen will not be segmented.",
997
+ "pathogen_intensity_range": "(list) - Intensity range for pathogen segmentation.",
998
+ "pathogen_loc": "(list) - The locations of the pathogen types in the images.",
999
+ "pathogen_mask_dim": "(int) - The dimension of the array the pathogen mask is saved in.",
1000
+ "pathogen_min_size": "(int) - The minimum size of pathogen objects in pixels^2.",
1001
+ "pathogen_model": "(str) - Model to use for pathogen segmentation.",
1002
+ "pathogen_plate_metadata": "(str) - Metadata for the pathogen plate.",
1003
+ "pathogen_Signal_to_noise": "(float) - The signal-to-noise ratio for the pathogen channel. This will be used to determine the range of intensities to normalize images to for pathogen segmentation.",
1004
+ "pathogen_size_range": "(list) - Size range for pathogen segmentation.",
1005
+ "pathogen_types": "(list) - Types of pathogens to include in the analysis.",
1006
+ "pc": "(str) - Positive control identifier.",
1007
+ "pc_loc": "(str) - Location of the positive control in the images.",
1008
+ "percentiles": "(list) - Percentiles to use for normalizing the images.",
1009
+ "pick_slice": "(bool) - Whether to pick a single slice from the z-stack images. If False, the maximum intensity projection will be used.",
1010
+ "pin_memory": "(bool) - Whether to pin memory for the data loader.",
1011
+ "plate": "(str) - Plate identifier for the experiment.",
1012
+ "plate_dict": "(dict) - Dictionary of plate metadata.",
1013
+ "plot": "(bool) - Whether to plot the results.",
1014
+ "plot_by_cluster": "(bool) - Whether to plot images by clusters.",
1015
+ "plot_cluster_grids": "(bool) - Whether to plot grids of clustered images.",
1016
+ "plot_control": "(dict) - Control settings for plotting.",
1017
+ "plot_filtration": "(bool) - Whether to plot the filtration steps.",
1018
+ "plot_images": "(bool) - Whether to plot images.",
1019
+ "plot_nr": "(int) - Number of plots to generate.",
1020
+ "plot_outlines": "(bool) - Whether to plot outlines of segmented objects.",
1021
+ "png_dims": "(list) - The dimensions of the PNG images to save. This will determine the dimensions of the saved images. Maximum of 3 dimensions e.g. [1,2,3].",
1022
+ "png_size": "(int) - The size of the PNG images to save. This will determine the size of the saved images.",
1023
+ "positive_control": "(str) - Identifier for the positive control.",
1024
+ "preprocess": "(bool) - Whether to preprocess the images before segmentation. This includes background removal and normalization. Set to False only if this step has already been done.",
1025
+ "radial_dist": "(list) - Radial distances for measuring features.",
1026
+ "random_test": "(bool) - Whether to randomly select images for testing.",
1027
+ "randomize": "(bool) - Whether to randomize the order of the images before processing. Recommended to avoid bias in the segmentation.",
1028
+ "regression_type": "(str) - Type of regression to perform.",
1029
+ "remove_background": "(bool) - Whether to remove background noise from the images. This will help improve the quality of the segmentation.",
1030
+ "remove_background_cell": "(bool) - Whether to remove background noise from the cell channel.",
1031
+ "remove_background_nucleus": "(bool) - Whether to remove background noise from the nucleus channel.",
1032
+ "remove_background_pathogen": "(bool) - Whether to remove background noise from the pathogen channel.",
1033
+ "remove_cluster_noise": "(bool) - Whether to remove noise from the clusters.",
1034
+ "remove_highly_correlated": "(bool) - Whether to remove highly correlated features.",
1035
+ "remove_highly_correlated_features": "(bool) - Whether to remove highly correlated features from the analysis.",
1036
+ "remove_image_canvas": "(bool) - Whether to remove the image canvas after plotting.",
1037
+ "remove_low_variance_features": "(bool) - Whether to remove low variance features from the analysis.",
1038
+ "remove_row_column_effect": "(bool) - Whether to remove row and column effects from the data.",
1039
+ "representative_images": "(bool) - Whether to save representative images of the segmented objects (Not working yet).",
1040
+ "resize": "(bool) - Resize factor for the images.",
1041
+ "resample": "(bool) - Whether to resample the images during processing.",
1042
+ "rescale": "(float) - Rescaling factor for the images.",
1043
+ "reduction_method": "(str) - Dimensionality reduction method to use ().",
1044
+ "resnet_features": "(bool) - Whether to use ResNet features for embedding.",
1045
+ "row_limit": "(int) - Limit on the number of rows to plot.",
1046
+ "save": "(bool) - Whether to save the results to disk.",
1047
+ "save_arrays": "(bool) - Whether to save arrays of segmented objects.",
1048
+ "save_figure": "(bool) - Whether to save the generated figures.",
1049
+ "save_measurements": "(bool) - Whether to save the measurements to disk.",
1050
+ "save_png": "(bool) - Whether to save the segmented objects as PNG images.",
1051
+ "schedule": "(str) - Schedule for processing the data.",
1052
+ "Signal_to_noise": "(float) - Signal-to-noise ratio for the images.",
1053
+ "skip_mode": "(str) - The mode to use for skipping images. This will determine how to handle images that cannot be processed.",
1054
+ "smooth_lines": "(bool) - Whether to smooth lines in the plots.",
1055
+ "src": "(str, path) - Path to source directory.",
1056
+ "target": "(str) - Target variable for the analysis.",
1057
+ "target_height": "(int) - Target height for resizing the images.",
1058
+ "target_intensity_min": "(float) - Minimum intensity for the target objects.",
1059
+ "target_width": "(int) - Target width for resizing the images.",
1060
+ "tables": "(list) - Tables to include in the analysis.",
1061
+ "test": "(bool) - Whether to run the pipeline in test mode.",
1062
+ "test_images": "(list) - List of images to use for testing.",
1063
+ "test_mode": "(bool) - Mode to use for testing the analysis pipeline.",
1064
+ "test_nr": "(int) - Number of test images.",
1065
+ "test_size": "(float) - Size of the test set.",
1066
+ "treatment_loc": "(list) - The locations of the treatments in the images.",
1067
+ "treatments": "(list) - The treatments to include in the analysis.",
1068
+ "top_features": "(int) - Top features to include in the analysis.",
1069
+ "train": "(bool) - Whether to train the model.",
1070
+ "train_mode": "(str) - Mode to use for training the model.",
1071
+ "transform": "(dict) - Transformation to apply to the data.",
1072
+ "upscale": "(bool) - Whether to upscale the images.",
1073
+ "upscale_factor": "(float) - Factor by which to upscale the images.",
1074
+ "upstream": "(str) - Upstream region for sequencing analysis.",
1075
+ "val_split": "(float) - Validation split ratio.",
1076
+ "visualize": "(bool) - Whether to visualize the embeddings.",
1077
+ "verbose": "(bool) - Whether to print verbose output during processing.",
1078
+ "weight_decay": "(float) - Weight decay for regularization.",
1079
+ "width_height": "(tuple) - Width and height of the input images.",
1080
+ "um_per_pixel": "(float) - The micrometers per pixel for the images."
941
1081
  }
942
1082
 
1083
+
943
1084
  for key, (var_type, options, default_value) in variables.items():
944
1085
  label, widget, var = create_input_field(scrollable_frame.scrollable_frame, key, row, var_type, options, default_value)
945
1086
  vars_dict[key] = (label, widget, var) # Store the label, widget, and variable
@@ -951,33 +1092,53 @@ def generate_fields(variables, scrollable_frame):
951
1092
  return vars_dict
952
1093
 
953
1094
  categories = {
954
- "General": ["src", "input_folder", "metadata_type", "custom_regex", "experiment", "channels", "magnification"],
955
- "Nucleus": ["nucleus_channel", "nucleus_background", "nucleus_Signal_to_noise", "nucleus_CP_prob", "nucleus_FT", "remove_background_nucleus", "nucleus_min_size", "nucleus_mask_dim", "nucleus_loc"],
956
- "Cell": ["cell_channel", "cell_background", "cell_Signal_to_noise", "cell_CP_prob", "cell_FT", "remove_background_cell", "cell_min_size", "cell_mask_dim", "cytoplasm", "cytoplasm_min_size", "include_uninfected", "merge_edge_pathogen_cells", "adjust_cells"],
957
- "Pathogen": ["pathogen_channel", "pathogen_background", "pathogen_Signal_to_noise", "pathogen_CP_prob", "pathogen_FT", "pathogen_model", "remove_background_pathogen", "pathogen_min_size", "pathogen_mask_dim"],
1095
+ "General": ["src", "metadata_type", "custom_regex", "experiment", "channels", "magnification", "channel_dims"],
1096
+ "Paths":["grna", "barcodes"],
1097
+ "Regression":["class_1_threshold", "plate", "other", "fraction_threshold", "alpha", "remove_row_column_effect", "regression_type", "min_cell_count", "agg_type", "transform", "dependent_variable", "gene_weights_csv"],
1098
+ "Cellpose":["from_scratch", "n_epochs", "width_height", "model_name", "custom_model", "resample", "rescale", "CP_prob", "flow_threshold", "percentiles", "circular", "invert", "diameter", "grayscale", "background", "Signal_to_noise", "resize", "target_height", "target_width"],
1099
+ "Nucleus": ["nucleus_intensity_range", "nucleus_size_range", "nucleus_chann_dim", "nucleus_channel", "nucleus_background", "nucleus_Signal_to_noise", "nucleus_CP_prob", "nucleus_FT", "remove_background_nucleus", "nucleus_min_size", "nucleus_mask_dim", "nucleus_loc"],
1100
+ "Cell": ["cell_intensity_range", "cell_size_range", "cell_chann_dim", "cell_channel", "cell_background", "cell_Signal_to_noise", "cell_CP_prob", "cell_FT", "remove_background_cell", "cell_min_size", "cell_mask_dim", "cytoplasm", "cytoplasm_min_size", "include_uninfected", "merge_edge_pathogen_cells", "adjust_cells"],
1101
+ "Pathogen": ["pathogen_intensity_range", "pathogen_size_range", "pathogen_chann_dim", "pathogen_channel", "pathogen_background", "pathogen_Signal_to_noise", "pathogen_CP_prob", "pathogen_FT", "pathogen_model", "remove_background_pathogen", "pathogen_min_size", "pathogen_mask_dim"],
958
1102
  "Timelapse": ["fps", "timelapse_displacement", "timelapse_memory", "timelapse_frame_limits", "timelapse_remove_transient", "timelapse_mode", "timelapse_objects", "compartments"],
959
- "Plot": ["plot_filtration", "examples_to_plot", "normalize_plots", "normalize", "cmap", "figuresize", "plot_cluster_grids", "img_zoom", "row_limit", "color_by", "plot_images", "smooth_lines", "plot_points", "plot_outlines", "black_background", "plot_by_cluster", "heatmap_feature","grouping","min_max","cmap","save_figure"],
1103
+ "Plot": ["plot_control", "plot_nr", "plot_filtration", "examples_to_plot", "normalize_plots", "normalize", "cmap", "figuresize", "plot_cluster_grids", "img_zoom", "row_limit", "color_by", "plot_images", "smooth_lines", "plot_points", "plot_outlines", "black_background", "plot_by_cluster", "heatmap_feature","grouping","min_max","cmap","save_figure"],
960
1104
  "Object Image": ["save_png", "dialate_pngs", "dialate_png_ratios", "png_size", "png_dims", "save_arrays", "normalize_by", "dialate_png_ratios", "crop_mode", "dialate_pngs", "normalize", "use_bounding_box"],
961
- "Annotate Data": ["positive_control","negative_control", "location_column", "treatment_loc", "cells", "cell_loc", "pathogens", "pathogen_loc", "channel_of_interest", "measurement", "treatments", "representative_images", "um_per_pixel", "nr_imgs", "exclude", "exclude_conditions", "mix", "pos", "neg"],
1105
+ "Annotate Data": ["nc_loc", "pc_loc", "nc", "pc", "cell_plate_metadata","pathogen_types", "pathogen_plate_metadata", "treatment_plate_metadata", "metadata_types", "cell_types", "target","positive_control","negative_control", "location_column", "treatment_loc", "cells", "cell_loc", "pathogens", "pathogen_loc", "channel_of_interest", "measurement", "treatments", "representative_images", "um_per_pixel", "nr_imgs", "exclude", "exclude_conditions", "mix", "pos", "neg"],
962
1106
  "Measurements": ["remove_image_canvas", "remove_highly_correlated", "homogeneity", "homogeneity_distances", "radial_dist", "calculate_correlation", "manders_thresholds", "save_measurements", "tables", "image_nr", "dot_size", "filter_by", "remove_highly_correlated_features", "remove_low_variance_features", "channel_of_interest"],
963
- "Advanced": ["plot", "timelapse", "schedule", "test_size","exclude","n_repeats","top_features", "model_type","minimum_cell_count","n_estimators","preprocess", "remove_background", "normalize", "lower_percentile", "merge_pathogens", "batch_size", "filter", "save", "masks", "verbose", "randomize", "n_jobs", "train_mode","amsgrad","use_checkpoint","gradient_accumulation","gradient_accumulation_steps","intermedeate_save","pin_memory","n_jobs","channels","augment"],
1107
+ "Advanced": ["plate_dict", "target_intensity_min", "cells_per_well", "include_multinucleated", "include_multiinfected", "include_noninfected", "backgrounds", "plot", "timelapse", "schedule", "test_size","exclude","n_repeats","top_features", "model_type","minimum_cell_count","n_estimators","preprocess", "remove_background", "normalize", "lower_percentile", "merge_pathogens", "batch_size", "filter", "save", "masks", "verbose", "randomize", "n_jobs", "train_mode","amsgrad","use_checkpoint","gradient_accumulation","gradient_accumulation_steps","intermedeate_save","pin_memory","n_jobs","channels","augment"],
964
1108
  "Clustering": ["eps","min_samples","analyze_clusters","clustering","remove_cluster_noise"],
965
1109
  "Embedding": ["visualize","n_neighbors","min_dist","metric","resnet_features","reduction_method","embedding_by_controls","col_to_compare","log_data"],
966
- "Train DL Model": ["epochs", "loss_type", "optimizer_type","image_size","val_split","learning_rate","weight_decay","dropout_rate","init_weights", "train", "classes"],
1110
+ "Train DL Model": ["epochs", "loss_type", "optimizer_type","image_size","val_split","learning_rate","weight_decay","dropout_rate", "init_weights", "train", "classes"],
967
1111
  "Miscellaneous": ["all_to_mip", "pick_slice", "skip_mode", "upscale", "upscale_factor"],
968
- "Test": ["test_mode", "test_images", "random_test", "test_nr"],
969
- "Sequencing": ["upstream", "downstream", "barecode_length_1", "barecode_length_2", "chunk_size", "test"]
1112
+ "Test": ["test_mode", "test_images", "random_test", "test_nr", "test"],
1113
+ "Sequencing": ["upstream", "downstream", "barecode_length_1", "barecode_length_2", "chunk_size"]
970
1114
  }
971
1115
 
972
1116
  descriptions = {
973
- 'mask': "This module allows you to set default settings for preprocessing and generating masks.",
974
- 'measure': "This module allows you to set default settings for measuring and cropping images.",
975
- 'classify': "This module allows you to set default settings for training and testing classification models.",
976
- 'sequencing': "This module allows you to set default settings for analyzing sequencing reads.",
977
- 'umap': "This module allows you to set default settings for UMAP image analysis."
1117
+ 'mask': "Generate Cellpose masks for Cells, Nuclei, and Pathogens. This module uses: preprocess_generate_masks from spacr.core.\n\nKey Features:\n- Automated Mask Generation: Automatically generate accurate masks for various cellular components using Cellpose, a robust deep learning model for cell segmentation.\n- Versatility: Capable of handling different types of biological samples, including cells, nuclei, and pathogens.\n- Integration: Directly integrates with other modules, providing the foundational masks required for subsequent analysis.",
1118
+
1119
+ 'measure': "Capture Measurements from Cells, Nuclei, Pathogens, and Cytoplasm objects. Generate single object PNG images for one or several objects. (Requires masks from the Mask module). This module uses: measure_crop from spacr.measure.\n\nKey Features:\n- Comprehensive Measurement Capture: Obtain detailed measurements for various cellular components, including area, perimeter, intensity, and more.\n- Image Generation: Create high-resolution PNG images of individual objects, facilitating further analysis and visualization.\n- Mask Dependency: Requires accurate masks generated by the Mask module to ensure precise measurements.",
1120
+
1121
+ 'classify': "Train and Test any Torch Computer vision model. (Requires PNG images from the Measure module). This module uses: train_test_model from spacr.deep_spacr.\n\nKey Features:\n- Deep Learning Integration: Train and evaluate state-of-the-art Torch models for various classification tasks.\n- Flexible Training: Supports a wide range of Torch models, allowing customization based on specific research needs.\n- Data Requirement: Requires PNG images generated by the Measure module for training and testing.",
1122
+
1123
+ 'sequencing': "Find Barcodes and gRNA sequences in FASTQ files. (Requires paired-end FASTQ files, R1 and R2). This module uses: analyze_reads from spacr.sequencing.\n\nKey Features:\n- Barcode and gRNA Identification: Efficiently detect and extract barcode and gRNA sequences from raw sequencing data.\n- Paired-End Support: Specifically designed to handle paired-end FASTQ files, ensuring accurate sequence alignment and analysis.\n- High Throughput: Capable of processing large sequencing datasets quickly and accurately.",
1124
+
1125
+ 'umap': "Generate UMAP or tSNE embeddings and represent points as single cell images. (Requires measurements.db and PNG images from the Measure module). This module uses: generate_image_umap from spacr.core.\n\nKey Features:\n- Dimensionality Reduction: Employ UMAP or tSNE algorithms to reduce high-dimensional data into two dimensions for visualization.\n- Single Cell Representation: Visualize embedding points as single cell images, providing an intuitive understanding of data clusters.\n- Data Integration: Requires measurements and images generated by the Measure module, ensuring comprehensive data representation.",
1126
+
1127
+ 'train_cellpose': "Train custom Cellpose models for your specific dataset. This module uses: train_cellpose_model from spacr.core.\n\nKey Features:\n- Custom Model Training: Train Cellpose models on your dataset to improve segmentation accuracy.\n- Data Adaptation: Tailor the model to handle specific types of biological samples more effectively.\n- Advanced Training Options: Supports various training parameters and configurations for optimized performance.",
1128
+
1129
+ 'ml_analyze': "Perform machine learning analysis on your data. This module uses: ml_analysis_tools from spacr.ml.\n\nKey Features:\n- Comprehensive Analysis: Utilize a suite of machine learning tools for data analysis.\n- Customizable Workflows: Configure and run different ML algorithms based on your research requirements.\n- Integration: Works seamlessly with other modules to analyze data produced from various steps.",
1130
+
1131
+ 'cellpose_masks': "Generate masks using Cellpose for all images in your dataset. This module uses: generate_masks from spacr.cellpose.\n\nKey Features:\n- Batch Processing: Generate masks for large sets of images efficiently.\n- Robust Segmentation: Leverage Cellpose's capabilities for accurate segmentation across diverse samples.\n- Automation: Automate the mask generation process for streamlined workflows.",
1132
+
1133
+ 'cellpose_all': "Run Cellpose on all images in your dataset and obtain masks and measurements. This module uses: cellpose_analysis from spacr.cellpose.\n\nKey Features:\n- End-to-End Analysis: Perform both segmentation and measurement extraction in a single step.\n- Efficiency: Process entire datasets with minimal manual intervention.\n- Comprehensive Output: Obtain detailed masks and corresponding measurements for further analysis.",
1134
+
1135
+ 'map_barcodes': "Map barcodes to your data for identification and tracking. This module uses: barcode_mapping_tools from spacr.sequencing.\n\nKey Features:\n- Barcode Integration: Efficiently map and integrate barcode information into your dataset.\n- Tracking: Enable tracking and identification of samples using barcodes.\n- Compatibility: Works with sequencing data to ensure accurate mapping and analysis.",
1136
+
1137
+ 'regression': "Perform regression analysis on your data. This module uses: regression_tools from spacr.analysis.\n\nKey Features:\n- Statistical Analysis: Conduct various types of regression analysis to identify relationships within your data.\n- Flexible Options: Supports multiple regression models and configurations.\n- Data Insight: Gain deeper insights into your dataset through advanced regression techniques.",
1138
+
1139
+ 'recruitment': "Analyze recruitment data to understand sample recruitment dynamics. This module uses: recruitment_analysis_tools from spacr.analysis.\n\nKey Features:\n- Recruitment Analysis: Investigate and analyze the recruitment of samples over time or conditions.\n- Visualization: Generate visualizations to represent recruitment trends and patterns.\n- Integration: Utilize data from various sources for a comprehensive recruitment analysis."
978
1140
  }
979
1141
 
980
-
981
1142
  def set_annotate_default_settings(settings):
982
1143
  settings.setdefault('src', 'path')
983
1144
  settings.setdefault('image_type', 'cell_png')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.1.76
3
+ Version: 0.1.81
4
4
  Summary: Spatial phenotype analysis of crisp screens (SpaCr)
5
5
  Home-page: https://github.com/EinarOlafsson/spacr
6
6
  Author: Einar Birnir Olafsson
@@ -14,17 +14,17 @@ spacr/app_umap.py,sha256=ZWAmf_OsIKbYvolYuWPMYhdlVe-n2CADoJulAizMiEo,153
14
14
  spacr/chris.py,sha256=YlBjSgeZaY8HPy6jkrT_ISAnCMAKVfvCxF0I9eAZLFM,2418
15
15
  spacr/classify_app.py,sha256=Zi15ryc1ocYitRF4kyxlC27XxGyzfSPdvj2d6ZrSh7E,8446
16
16
  spacr/cli.py,sha256=507jfOOEV8BoL4eeUcblvH-iiDHdBrEVJLu1ghAAPSc,1800
17
- spacr/core.py,sha256=vDSqxiFUdQ0sCn5QRlFWYqR7CQCDaMGTD-xDOnikOfE,160176
17
+ spacr/core.py,sha256=bm1cApGVTE218Ds3FqqWD5TsF5FF8kclHwPlvdOolzc,160216
18
18
  spacr/deep_spacr.py,sha256=ASBsN4JpHp_3S-91JUsB34IWTjTGPYI7jKV2qZnUR5M,37005
19
19
  spacr/foldseek.py,sha256=YIP1d4Ci6CeA9jSyiv-HTDbNmAmcSM9Y_DaOs7wYzLY,33546
20
20
  spacr/get_alfafold_structures.py,sha256=ehx_MQgb12k3hFecP6cYVlm5TLO8iWjgevy8ESyS3cw,3544
21
21
  spacr/graph_learning.py,sha256=1tR-ZxvXE3dBz1Saw7BeVFcrsUFu9OlUZeZVifih9eo,13070
22
- spacr/gui.py,sha256=9psWiXMna1ebi-I55H0vQ3lad_923fhq_LB13lMSEg4,6893
22
+ spacr/gui.py,sha256=OPIMDVVYyAKO3zJIrWkP_YIc9-SwQsVR2S7ynXu1wkQ,8901
23
23
  spacr/gui_2.py,sha256=ZAI5quQYbhQJ40vK0NCqU_UMSPLkpfeQpomBWUSM0fc,6946
24
24
  spacr/gui_annotate.py,sha256=ugBksLGOHdtOLlEuRyyc59TrkYKu3rDf8JxEgiBSVao,6536
25
25
  spacr/gui_classify_app.py,sha256=Zi15ryc1ocYitRF4kyxlC27XxGyzfSPdvj2d6ZrSh7E,8446
26
- spacr/gui_core.py,sha256=VkcYV8gE8Bc1fKcuZSJ1plS8agS_386ZxjqudRMLhG0,27912
27
- spacr/gui_elements.py,sha256=fgRaG7THe95jyaIaqJqe05syQ9apo9ZIwkRR2u9vMnY,72544
26
+ spacr/gui_core.py,sha256=PmElJrKHtEGYKpGTGgryxxvUvOHMh-wUmhvuHnyI13w,31833
27
+ spacr/gui_elements.py,sha256=b0GJCHyrgJFeqB_IdjkXqMbXeC1reiLyiQ6-MTf_UuQ,73305
28
28
  spacr/gui_make_masks_app.py,sha256=tl4M4Q2WQgrrwjRBJVevxJxpNowqzPhWkdCOm2UfRbw,45053
29
29
  spacr/gui_make_masks_app_v2.py,sha256=X3izTBXdCZDlkVe-fbG-jmCQtcAbmK0OIivjyWaLhug,30576
30
30
  spacr/gui_mask_app.py,sha256=mhTl_XzXLFl8Tx3WYEMpdYB_qw9u5JJa0EdkvlcIzAE,10706
@@ -33,17 +33,17 @@ spacr/gui_run.py,sha256=0x85MJqFtREuWuNeIRLB8hFeibKGszfN14POQQWzPDQ,1998
33
33
  spacr/gui_sim_app.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  spacr/gui_utils.py,sha256=W0blyZ6JTCBzlkZwXqJpg_uUv41vvqbKvJGCigCeWG8,13890
35
35
  spacr/gui_wrappers.py,sha256=-E1SFOmtp7_nfg9QzajI7GJcAcaMug92Pjw7pS1YzjY,4656
36
- spacr/io.py,sha256=IoERqSwoxJrInYl-E0WfwFOEDZXFdJofk5DmpbyLGWM,112077
36
+ spacr/io.py,sha256=f7cVn48wNUEj6Teky4p3ojoivAdMUmPll2s0MzJkKD0,112068
37
37
  spacr/logger.py,sha256=7Zqr3TuuOQLWT32gYr2q1qvv7x0a2JhLANmZcnBXAW8,670
38
38
  spacr/make_masks_app.py,sha256=iGaTwhowoe2JMOSOf8bJwQZTooRhLQx7KO0ewnAmqDY,45138
39
39
  spacr/make_masks_app_v2.py,sha256=X3izTBXdCZDlkVe-fbG-jmCQtcAbmK0OIivjyWaLhug,30576
40
40
  spacr/mask_app.py,sha256=mhTl_XzXLFl8Tx3WYEMpdYB_qw9u5JJa0EdkvlcIzAE,10706
41
- spacr/measure.py,sha256=e36NR8raCkvKHZXvTJgPDwObsmsegvc1dAiCqD3oljk,55751
41
+ spacr/measure.py,sha256=RzcD8rsUaOZUYB-zcbaUZcJbrwT0IIW5G7qvb__SO-E,55616
42
42
  spacr/measure_app.py,sha256=_C1-XFL5HSquUEEbM_NcxdvHx-socPFCx85MBG4d6xo,10598
43
43
  spacr/old_code.py,sha256=jw67DAGoLBd7mWofVzRJSEmCI1Qrff26zIo65SEkV00,13817
44
44
  spacr/plot.py,sha256=DYJEoK1kz2ih6ZGvKiA3xTqeIeKQNhuQKwgrscopFxA,69101
45
45
  spacr/sequencing.py,sha256=fHZRnoMSxmhMdadkei3lUeBdckqFyptWdQyWsDW3aaU,83304
46
- spacr/settings.py,sha256=PQ-VJSTlBMxfQuz35MiipoGmBjq56jqepViUvOjov0k,48668
46
+ spacr/settings.py,sha256=VkRJHdzDtfGn_F8sJ5rfK80blZhpy21djxLfQcnlhGA,65665
47
47
  spacr/sim.py,sha256=FveaVgBi3eypO2oVB5Dx-v0CC1Ny7UPfXkJiiRRodAk,71212
48
48
  spacr/sim_app.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  spacr/timelapse.py,sha256=KMYCgHzf9LTZe-lWl5mvH2EjbKRE6OhpwdY13wEumGc,39504
@@ -52,9 +52,9 @@ spacr/version.py,sha256=axH5tnGwtgSnJHb5IDhiu4Zjk5GhLyAEDRe-rnaoFOA,409
52
52
  spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model,sha256=z8BbHWZPRnE9D_BHO0fBREE85c1vkltDs-incs2ytXQ,26566572
53
53
  spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model_settings.csv,sha256=fBAGuL_B8ERVdVizO3BHozTDSbZUh1yFzsYK3wkQN68,420
54
54
  spacr/models/cp/toxo_pv_lumen.CP_model,sha256=2y_CindYhmTvVwBH39SNILF3rI3x9SsRn6qrMxHy3l0,26562451
55
- spacr-0.1.76.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
56
- spacr-0.1.76.dist-info/METADATA,sha256=SLaAcTSAOj_pyCLUshGwpwD0rt_XLRTE9p08sVbTalo,5050
57
- spacr-0.1.76.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
58
- spacr-0.1.76.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
59
- spacr-0.1.76.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
60
- spacr-0.1.76.dist-info/RECORD,,
55
+ spacr-0.1.81.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
56
+ spacr-0.1.81.dist-info/METADATA,sha256=E8m8oiUydIogb-0PipHqaIe-wden3HvcAcxSqkpqH9g,5050
57
+ spacr-0.1.81.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
58
+ spacr-0.1.81.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
59
+ spacr-0.1.81.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
60
+ spacr-0.1.81.dist-info/RECORD,,
File without changes