spacr 0.1.75__py3-none-any.whl → 0.1.77__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/app_annotate.py CHANGED
@@ -41,8 +41,7 @@ def initiate_annotation_app(parent_frame):
41
41
  settings_window.destroy()
42
42
  annotate_app(parent_frame, settings)
43
43
 
44
- #start_button = spacrButton(settings_window, text="Start Annotation", command=lambda: start_annotation_app, font=('Helvetica', 12))
45
- start_button = tk.Button(settings_window, text="Start Annotation", command=start_annotation_app)
44
+ start_button = tk.Button(settings_window, text="Start Annotation", command=start_annotation_app, bg='black', fg='white')
46
45
  start_button.pack(pady=10)
47
46
 
48
47
  def start_annotate_app():
spacr/core.py CHANGED
@@ -971,7 +971,7 @@ def generate_dataset(src, file_metadata=None, experiment='TSG101_screen', sample
971
971
  shutil.rmtree(temp_dir)
972
972
  print(f"\nSaved {total_images} images to {tar_name}")
973
973
 
974
- def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=224, batch_size=64, normalize=True, preload='images', n_job=10, threshold=0.5, verbose=False):
974
+ def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=224, batch_size=64, normalize=True, preload='images', n_jobs=10, threshold=0.5, verbose=False):
975
975
 
976
976
  from .io import TarImageDataset
977
977
  from .utils import process_vision_results
@@ -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_job=n_job, 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]
@@ -1034,7 +1034,7 @@ def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=22
1034
1034
  torch.cuda.memory.empty_cache()
1035
1035
  return df
1036
1036
 
1037
- def apply_model(src, model_path, image_size=224, batch_size=64, normalize=True, n_job=10):
1037
+ def apply_model(src, model_path, image_size=224, batch_size=64, normalize=True, n_jobs=10):
1038
1038
 
1039
1039
  from .io import NoClassDataset
1040
1040
 
@@ -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_job=n_job)
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'
@@ -1302,7 +1302,7 @@ def generate_training_dataset(src, mode='annotation', annotation_column='test',
1302
1302
 
1303
1303
  return
1304
1304
 
1305
- def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_size=32, classes=['nc','pc'], n_job=None, validation_split=0.0, max_show=2, pin_memory=False, normalize=False, channels=[1, 2, 3], augment=False, verbose=False):
1305
+ def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_size=32, classes=['nc','pc'], n_jobs=None, validation_split=0.0, max_show=2, pin_memory=False, normalize=False, channels=[1, 2, 3], augment=False, verbose=False):
1306
1306
 
1307
1307
  """
1308
1308
  Generate data loaders for training and validation/test datasets.
@@ -1314,7 +1314,7 @@ def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_
1314
1314
  - image_size (int): The size of the input images.
1315
1315
  - batch_size (int): The batch size for the data loaders.
1316
1316
  - classes (list): The list of classes to consider.
1317
- - n_job (int): The number of worker threads for data loading.
1317
+ - n_jobs (int): The number of worker threads for data loading.
1318
1318
  - validation_split (float): The fraction of data to use for validation when train_mode is 'erm'.
1319
1319
  - max_show (int): The maximum number of images to show when verbose is True.
1320
1320
  - pin_memory (bool): Whether to pin memory for faster data transfer.
@@ -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_job=n_job if n_job is not None else 0, pin_memory=pin_memory)
1408
- val_loaders = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, n_job=n_job if n_job 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_job=n_job if n_job 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_job=n_job if n_job is not None else 0, pin_memory=pin_memory)
1440
- val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, n_job=n_job if n_job 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_job=n_job if n_job 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
 
@@ -2078,11 +2078,11 @@ def identify_masks(src, object_type, model_name, batch_size, channels, diameter,
2078
2078
  else:
2079
2079
  radius = 100
2080
2080
 
2081
- n_job = os.cpu_count()-2
2082
- if n_job < 1:
2083
- n_job = 1
2081
+ n_jobs = os.cpu_count()-2
2082
+ if n_jobs < 1:
2083
+ n_jobs = 1
2084
2084
 
2085
- mask_stack = _btrack_track_cells(src, name, batch_filenames, object_type, plot, save, masks_3D=masks, mode=timelapse_mode, timelapse_remove_transient=timelapse_remove_transient, radius=radius, n_job=n_job)
2085
+ mask_stack = _btrack_track_cells(src, name, batch_filenames, object_type, plot, save, masks_3D=masks, mode=timelapse_mode, timelapse_remove_transient=timelapse_remove_transient, radius=radius, n_jobs=n_jobs)
2086
2086
  if timelapse_mode == 'trackpy':
2087
2087
  mask_stack = _trackpy_track_cells(src, name, batch_filenames, object_type, masks, timelapse_displacement, timelapse_memory, timelapse_remove_transient, plot, save, timelapse_mode)
2088
2088
 
@@ -2303,9 +2303,9 @@ def generate_cellpose_masks(src, settings, object_type):
2303
2303
  else:
2304
2304
  radius = 100
2305
2305
 
2306
- n_job = os.cpu_count()-2
2307
- if n_job < 1:
2308
- n_job = 1
2306
+ n_jobs = os.cpu_count()-2
2307
+ if n_jobs < 1:
2308
+ n_jobs = 1
2309
2309
 
2310
2310
  mask_stack = _btrack_track_cells(src=src,
2311
2311
  name=name,
@@ -2317,7 +2317,7 @@ def generate_cellpose_masks(src, settings, object_type):
2317
2317
  mode=timelapse_mode,
2318
2318
  timelapse_remove_transient=timelapse_remove_transient,
2319
2319
  radius=radius,
2320
- n_job=n_job)
2320
+ n_jobs=n_jobs)
2321
2321
  if timelapse_mode == 'trackpy':
2322
2322
  mask_stack = _trackpy_track_cells(src=src,
2323
2323
  name=name,
@@ -2551,7 +2551,7 @@ def compare_cellpose_masks(src, verbose=False, processes=None, save=True):
2551
2551
  common_files.intersection_update(os.listdir(d))
2552
2552
  common_files = list(common_files)
2553
2553
 
2554
- # Create a pool of n_job
2554
+ # Create a pool of n_jobs
2555
2555
  with Pool(processes=processes) as pool:
2556
2556
  args = [(src, filename, dirs, conditions) for filename in common_files]
2557
2557
  results = pool.map(compare_mask, args)
spacr/deep_spacr.py CHANGED
@@ -230,7 +230,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
230
230
  image_size=settings['image_size'],
231
231
  batch_size=settings['batch_size'],
232
232
  classes=settings['classes'],
233
- n_job=settings['n_job'],
233
+ n_jobs=settings['n_jobs'],
234
234
  validation_split=settings['val_split'],
235
235
  pin_memory=settings['pin_memory'],
236
236
  normalize=settings['normalize'],
@@ -255,7 +255,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
255
255
  optimizer_type = settings['optimizer_type'],
256
256
  use_checkpoint = settings['use_checkpoint'],
257
257
  dropout_rate = settings['dropout_rate'],
258
- n_job = settings['n_job'],
258
+ n_jobs = settings['n_jobs'],
259
259
  val_loaders = val,
260
260
  test_loaders = None,
261
261
  intermedeate_save = settings['intermedeate_save'],
@@ -276,7 +276,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
276
276
  image_size=settings['image_size'],
277
277
  batch_size=settings['batch_size'],
278
278
  classes=settings['classes'],
279
- n_job=settings['n_job'],
279
+ n_jobs=settings['n_jobs'],
280
280
  validation_split=0.0,
281
281
  pin_memory=settings['pin_memory'],
282
282
  normalize=settings['normalize'],
@@ -315,7 +315,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
315
315
  torch.cuda.memory.empty_cache()
316
316
  gc.collect()
317
317
 
318
- def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='erm', epochs=100, learning_rate=0.0001, weight_decay=0.05, amsgrad=False, optimizer_type='adamw', use_checkpoint=False, dropout_rate=0, n_job=20, val_loaders=None, test_loaders=None, init_weights='imagenet', intermedeate_save=None, chan_dict=None, schedule = None, loss_type='binary_cross_entropy_with_logits', gradient_accumulation=False, gradient_accumulation_steps=4, channels=['r','g','b']):
318
+ def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='erm', epochs=100, learning_rate=0.0001, weight_decay=0.05, amsgrad=False, optimizer_type='adamw', use_checkpoint=False, dropout_rate=0, n_jobs=20, val_loaders=None, test_loaders=None, init_weights='imagenet', intermedeate_save=None, chan_dict=None, schedule = None, loss_type='binary_cross_entropy_with_logits', gradient_accumulation=False, gradient_accumulation_steps=4, channels=['r','g','b']):
319
319
  """
320
320
  Trains a model using the specified parameters.
321
321
 
@@ -332,7 +332,7 @@ def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='
332
332
  optimizer_type (str, optional): The type of optimizer to use. Defaults to 'adamw'.
333
333
  use_checkpoint (bool, optional): Whether to use checkpointing during training. Defaults to False.
334
334
  dropout_rate (float, optional): The dropout rate for the model. Defaults to 0.
335
- n_job (int, optional): The number of n_job for data loading. Defaults to 20.
335
+ n_jobs (int, optional): The number of n_jobs for data loading. Defaults to 20.
336
336
  val_loaders (list, optional): A list of validation data loaders. Defaults to None.
337
337
  test_loaders (list, optional): A list of test data loaders. Defaults to None.
338
338
  init_weights (str, optional): The initialization weights for the model. Defaults to 'imagenet'.
@@ -357,7 +357,7 @@ def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='
357
357
 
358
358
  use_cuda = torch.cuda.is_available()
359
359
  device = torch.device("cuda" if use_cuda else "cpu")
360
- kwargs = {'n_job': n_job, 'pin_memory': True} if use_cuda else {}
360
+ kwargs = {'n_jobs': n_jobs, 'pin_memory': True} if use_cuda else {}
361
361
 
362
362
  for idx, (images, labels, filenames) in enumerate(train_loaders):
363
363
  batch, chans, height, width = images.shape
spacr/gui_core.py CHANGED
@@ -192,15 +192,19 @@ def convert_settings_dict_for_gui(settings):
192
192
  variables[key] = ('entry', None, str(value))
193
193
  return variables
194
194
 
195
- def setup_settings_panel(vertical_container, settings_type='mask', frame_height=500, frame_width=1000):
195
+ def setup_settings_panel(vertical_container, settings_type='mask', window_dimensions=[500, 1000]):
196
196
  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
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
198
198
 
199
- settings_frame = tk.Frame(vertical_container, bg='black', height=frame_height, width=frame_width)
199
+ width = (window_dimensions[0])//6
200
+ height = window_dimensions[1]
201
+
202
+ # Settings Frame
203
+ settings_frame = tk.Frame(vertical_container, bg='black', height=height, width=width)
200
204
  vertical_container.add(settings_frame, stretch="always")
201
205
  settings_label = spacrLabel(settings_frame, text="Settings", background="black", foreground="white", anchor='center', justify='center', align="center")
202
206
  settings_label.grid(row=0, column=0, pady=10, padx=10)
203
- scrollable_frame = spacrFrame(settings_frame, bg='black', width=frame_width)
207
+ scrollable_frame = spacrFrame(settings_frame, bg='black', width=width)
204
208
  scrollable_frame.grid(row=1, column=0, sticky="nsew")
205
209
  settings_frame.grid_rowconfigure(1, weight=1)
206
210
  settings_frame.grid_columnconfigure(0, weight=1)
@@ -351,18 +355,21 @@ def download_dataset(repo_id, subfolder, local_dir=None, retries=5, delay=5):
351
355
 
352
356
  raise Exception("Failed to download files after multiple attempts.")
353
357
 
354
- def setup_button_section(horizontal_container, settings_type='mask', settings_row=5, run=True, abort=True, download=True, import_btn=True):
358
+ def setup_button_section(horizontal_container, settings_type='mask', window_dimensions=[500, 1000], run=True, abort=True, download=True, import_btn=True):
355
359
  global button_frame, button_scrollable_frame, run_button, abort_button, download_dataset_button, import_button, q, fig_queue, vars_dict
360
+ from .settings import descriptions
361
+
362
+ width = (window_dimensions[0])//8
363
+ height = window_dimensions[1]
356
364
 
357
- button_frame = tk.Frame(horizontal_container, bg='black')
365
+ button_frame = tk.Frame(horizontal_container, bg='black', height=height, width=width)
358
366
  horizontal_container.add(button_frame, stretch="always", sticky="nsew")
359
367
  button_frame.grid_rowconfigure(0, weight=0)
360
368
  button_frame.grid_rowconfigure(1, weight=1)
361
369
  button_frame.grid_columnconfigure(0, weight=1)
362
370
 
363
- categories_label = spacrLabel(button_frame, text="Categories", background="black", foreground="white", font=('Helvetica', 12), anchor='center', justify='center', align="center") # Increase font size
371
+ categories_label = spacrLabel(button_frame, text="Categories", background="black", foreground="white", font=('Helvetica', 12), anchor='center', justify='center', align="center")
364
372
  categories_label.grid(row=0, column=0, pady=10, padx=10)
365
-
366
373
  button_scrollable_frame = spacrFrame(button_frame, bg='black')
367
374
  button_scrollable_frame.grid(row=1, column=0, sticky="nsew")
368
375
 
@@ -391,6 +398,15 @@ def setup_button_section(horizontal_container, settings_type='mask', settings_ro
391
398
  # Call toggle_settings after vars_dict is initialized
392
399
  if vars_dict is not None:
393
400
  toggle_settings(button_scrollable_frame)
401
+
402
+ # Description frame
403
+ description_frame = tk.Frame(horizontal_container, bg='black', height=height, width=width)
404
+ 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)
407
+ description_text = descriptions.get(settings_type, "No description available for this module.")
408
+ description_label.config(text=description_text)
409
+
394
410
  return button_scrollable_frame
395
411
 
396
412
  def hide_all_settings(vars_dict, categories):
@@ -527,13 +543,18 @@ def setup_frame(parent_frame):
527
543
  return parent_frame, vertical_container, horizontal_container
528
544
 
529
545
  def initiate_root(parent, settings_type='mask'):
530
- global q, fig_queue, parent_frame, scrollable_frame, button_frame, vars_dict, canvas, canvas_widget, progress_label, button_scrollable_frame
546
+ global q, fig_queue, parent_frame, scrollable_frame, button_frame, vars_dict, canvas, canvas_widget, progress_label, progress_output, button_scrollable_frame
531
547
  from .gui_utils import main_thread_update_function
532
548
  from .gui import gui_app
533
549
  set_start_method('spawn', force=True)
534
-
535
550
  print("Initializing root with settings_type:", settings_type)
551
+
536
552
  parent_frame = parent
553
+ parent_frame.update_idletasks()
554
+ frame_width = int(parent_frame.winfo_width())
555
+ frame_height = int(parent_frame.winfo_height())
556
+ print(frame_width, frame_height)
557
+ dims = [frame_width, frame_height]
537
558
 
538
559
  if not hasattr(parent_frame, 'after_tasks'):
539
560
  parent_frame.after_tasks = []
@@ -555,13 +576,9 @@ def initiate_root(parent, settings_type='mask'):
555
576
  elif settings_type == 'make_masks':
556
577
  from .app_make_masks import initiate_make_mask_app
557
578
  initiate_make_mask_app(horizontal_container)
558
- elif settings_type is None:
559
- #parent.quit()
560
- parent_frame.destroy()
561
- gui_app()
562
579
  else:
563
- scrollable_frame, vars_dict = setup_settings_panel(horizontal_container, settings_type)
564
- button_scrollable_frame = setup_button_section(horizontal_container, settings_type)
580
+ scrollable_frame, vars_dict = setup_settings_panel(horizontal_container, settings_type, window_dimensions=dims)
581
+ button_scrollable_frame = setup_button_section(horizontal_container, settings_type, window_dimensions=dims)
565
582
  canvas, canvas_widget = setup_plot_section(vertical_container)
566
583
  console_output = setup_console(vertical_container)
567
584
 
@@ -578,16 +595,3 @@ def initiate_root(parent, settings_type='mask'):
578
595
 
579
596
  print("Root initialization complete")
580
597
  return parent_frame, vars_dict
581
-
582
- def start_gui_app(settings_type='mask'):
583
- global q, fig_queue, parent_frame, scrollable_frame, vars_dict, canvas, canvas_widget, progress_label
584
- root = tk.Tk()
585
- width = root.winfo_screenwidth()
586
- height = root.winfo_screenheight()
587
- root.geometry(f"{width}x{height}")
588
- root.title(f"SpaCr: {settings_type.capitalize()}")
589
- root.content_frame = tk.Frame(root)
590
- print("Starting GUI app with settings_type:", settings_type)
591
- initiate_root(root.content_frame, settings_type)
592
- create_menu_bar(root)
593
- root.mainloop()
spacr/gui_elements.py CHANGED
@@ -1433,7 +1433,6 @@ def create_menu_bar(root):
1433
1433
  from .gui_core import initiate_root
1434
1434
 
1435
1435
  gui_apps = {
1436
- "Main": (lambda frame: initiate_root(frame, None), "Main GUI window."),
1437
1436
  "Mask": (lambda frame: initiate_root(frame, 'mask'), "Generate cellpose masks for cells, nuclei and pathogen images."),
1438
1437
  "Measure": (lambda frame: initiate_root(frame, 'measure'), "Measure single object intensity and morphological feature. Crop and save single object image"),
1439
1438
  "Annotate": (lambda frame: initiate_root(frame, 'annotate'), "Annotation single object images on a grid. Annotations are saved to database."),
spacr/measure.py CHANGED
@@ -998,12 +998,12 @@ def measure_crop(settings):
998
998
  _save_settings_to_db(settings)
999
999
 
1000
1000
  files = [f for f in os.listdir(settings['input_folder']) if f.endswith('.npy')]
1001
- n_job = settings['n_job'] or mp.cpu_count()-4
1002
- print(f'using {n_job} cpu cores')
1001
+ n_jobs = settings['n_jobs'] or mp.cpu_count()-4
1002
+ print(f'using {n_jobs} cpu cores')
1003
1003
 
1004
1004
  with mp.Manager() as manager:
1005
1005
  time_ls = manager.list()
1006
- with mp.Pool(n_job) as pool:
1006
+ with mp.Pool(n_jobs) as pool:
1007
1007
  result = pool.starmap_async(_measure_crop_core, [(index, time_ls, file, settings) for index, file in enumerate(files)])
1008
1008
 
1009
1009
  # Track progress in the main process
@@ -1012,7 +1012,7 @@ def measure_crop(settings):
1012
1012
  files_processed = len(time_ls)
1013
1013
  files_to_process = len(files)
1014
1014
  average_time = np.mean(time_ls) if len(time_ls) > 0 else 0
1015
- time_left = (((files_to_process-files_processed)*average_time)/n_job)/60
1015
+ time_left = (((files_to_process-files_processed)*average_time)/n_jobs)/60
1016
1016
  print(f'Progress: {files_processed}/{files_to_process} Time/img {average_time:.3f}sec, Time Remaining {time_left:.3f} min.', end='\r', flush=True)
1017
1017
  result.get()
1018
1018
 
spacr/settings.py CHANGED
@@ -43,7 +43,7 @@ def set_default_settings_preprocess_generate_masks(src, settings={}):
43
43
  settings.setdefault('magnification', 20)
44
44
  settings.setdefault('custom_regex', None)
45
45
  settings.setdefault('metadata_type', 'cellvoyager')
46
- settings.setdefault('n_job', os.cpu_count()-4)
46
+ settings.setdefault('n_jobs', os.cpu_count()-4)
47
47
  settings.setdefault('randomize', True)
48
48
  settings.setdefault('verbose', True)
49
49
  settings.setdefault('remove_background_cell', False)
@@ -254,7 +254,7 @@ def get_measure_crop_settings(settings):
254
254
  settings.setdefault('plot',False)
255
255
  settings.setdefault('plot_filtration',False)
256
256
  settings.setdefault('representative_images', False)
257
- settings.setdefault('n_job', os.cpu_count()-2)
257
+ settings.setdefault('n_jobs', os.cpu_count()-2)
258
258
 
259
259
  # Object settings
260
260
  settings.setdefault('cell_mask_dim',None)
@@ -340,7 +340,7 @@ def set_default_train_test_model(settings):
340
340
  settings.setdefault('gradient_accumulation_steps',4)
341
341
  settings.setdefault('intermedeate_save',True)
342
342
  settings.setdefault('pin_memory',True)
343
- settings.setdefault('n_job',cores)
343
+ settings.setdefault('n_jobs',cores)
344
344
  settings.setdefault('channels',['r','g','b'])
345
345
  settings.setdefault('augment',False)
346
346
  settings.setdefault('verbose',False)
@@ -534,7 +534,7 @@ expected_types = {
534
534
  "skip_mode": str,
535
535
  "save": bool,
536
536
  "plot": bool,
537
- "n_job": int,
537
+ "n_jobs": int,
538
538
  "verbose": bool,
539
539
  "input_folder": str,
540
540
  "cell_mask_dim": int,
@@ -557,7 +557,7 @@ expected_types = {
557
557
  "include_uninfected": bool,
558
558
  "dialate_pngs": bool,
559
559
  "dialate_png_ratios": list,
560
- "n_job": int,
560
+ "n_jobs": int,
561
561
  "cells": list,
562
562
  "cell_loc": list,
563
563
  "pathogens": list,
@@ -677,7 +677,7 @@ expected_types = {
677
677
  "gradient_accumulation_steps": int,
678
678
  "intermedeate_save": bool,
679
679
  "pin_memory": bool,
680
- "n_job": int,
680
+ "n_jobs": int,
681
681
  "augment": bool,
682
682
  "target": str,
683
683
  "cell_types": list,
@@ -902,7 +902,7 @@ def generate_fields(variables, scrollable_frame):
902
902
  "save": "Whether to save the results to disk.",
903
903
  "merge_edge_pathogen_cells": "Whether to merge cells that share pathogen objects.",
904
904
  "plot": "Whether to plot the results.",
905
- "n_job": "The number of n_job to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
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
906
  "verbose": "Whether to print verbose output during processing.",
907
907
  "input_folder": "Path to the folder containing the images.",
908
908
  "cell_mask_dim": "The dimension of the array the cell mask is saved in.",
@@ -926,7 +926,7 @@ def generate_fields(variables, scrollable_frame):
926
926
  "include_uninfected": "Whether to include uninfected cells in the analysis.",
927
927
  "dialate_pngs": "Whether to dilate the PNG images before saving.",
928
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_job": "The number of n_job to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
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
930
  "cells": "The cell types to include in the analysis.",
931
931
  "cell_loc": "The locations of the cell types in the images.",
932
932
  "pathogens": "The pathogen types to include in the analysis.",
@@ -960,7 +960,7 @@ categories = {
960
960
  "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
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"],
962
962
  "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_job", "train_mode","amsgrad","use_checkpoint","gradient_accumulation","gradient_accumulation_steps","intermedeate_save","pin_memory","n_job","channels","augment"],
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"],
964
964
  "Clustering": ["eps","min_samples","analyze_clusters","clustering","remove_cluster_noise"],
965
965
  "Embedding": ["visualize","n_neighbors","min_dist","metric","resnet_features","reduction_method","embedding_by_controls","col_to_compare","log_data"],
966
966
  "Train DL Model": ["epochs", "loss_type", "optimizer_type","image_size","val_split","learning_rate","weight_decay","dropout_rate","init_weights", "train", "classes"],
@@ -969,6 +969,15 @@ categories = {
969
969
  "Sequencing": ["upstream", "downstream", "barecode_length_1", "barecode_length_2", "chunk_size", "test"]
970
970
  }
971
971
 
972
+ 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."
978
+ }
979
+
980
+
972
981
  def set_annotate_default_settings(settings):
973
982
  settings.setdefault('src', 'path')
974
983
  settings.setdefault('image_type', 'cell_png')
@@ -982,4 +991,5 @@ def set_annotate_default_settings(settings):
982
991
  settings.setdefault('percentiles', [2, 98])
983
992
  settings.setdefault('measurement', 'cytoplasm_channel_3_mean_intensity,pathogen_channel_3_mean_intensity')
984
993
  settings.setdefault('threshold', '2')
985
- return settings
994
+ return settings
995
+
spacr/utils.py CHANGED
@@ -74,9 +74,18 @@ from scipy import stats
74
74
  from .logger import log_function_call
75
75
  from multiprocessing import set_start_method, get_start_method
76
76
 
77
- import tkinter as tk
78
- from tkinter import ttk
79
- import tkinter.font as tkFont
77
+ import torch
78
+ import torchvision.transforms as transforms
79
+ from torchvision.models import resnet50
80
+ from PIL import Image
81
+ import numpy as np
82
+ import umap
83
+ import pandas as pd
84
+ from sklearn.ensemble import RandomForestClassifier
85
+ from sklearn.preprocessing import StandardScaler
86
+ from scipy.stats import f_oneway, kruskal
87
+ from sklearn.cluster import KMeans
88
+ from scipy import stats
80
89
 
81
90
  def reset_mp():
82
91
  current_method = get_start_method()
@@ -3853,18 +3862,6 @@ def search_reduction_and_clustering(numeric_data, n_neighbors, min_dist, metric,
3853
3862
  if verbose:
3854
3863
  print(f'Embedding shape: {embedding.shape}')
3855
3864
  return embedding, labels
3856
- import torch
3857
- import torchvision.transforms as transforms
3858
- from torchvision.models import resnet50
3859
- from PIL import Image
3860
- import numpy as np
3861
- import umap
3862
- import pandas as pd
3863
- from sklearn.ensemble import RandomForestClassifier
3864
- from sklearn.preprocessing import StandardScaler
3865
- from scipy.stats import f_oneway, kruskal
3866
- from sklearn.cluster import KMeans
3867
- from scipy import stats
3868
3865
 
3869
3866
  def load_image(image_path):
3870
3867
  """Load and preprocess an image."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.1.75
3
+ Version: 0.1.77
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
@@ -3,7 +3,7 @@ spacr/__main__.py,sha256=bkAJJD2kjIqOP-u1kLvct9jQQCeUXzlEjdgitwi1Lm8,75
3
3
  spacr/alpha.py,sha256=Y95sLEfpK2OSYKRn3M8eUOU33JJeXfV8zhrC4KnwSTY,35244
4
4
  spacr/annotate_app.py,sha256=imQ7ZEXDyM6ce1dxZ1xUS1-KequuF_NCI4xCaPLjvco,29275
5
5
  spacr/annotate_app_v2.py,sha256=imQ7ZEXDyM6ce1dxZ1xUS1-KequuF_NCI4xCaPLjvco,29275
6
- spacr/app_annotate.py,sha256=CW7gW5qXIElCJdr1dhXyCBlV8sB-GlPNjOEY471udcs,2386
6
+ spacr/app_annotate.py,sha256=FhyDBsLdo6etOSvz6et2AhhJn67SwdeYUVDzBJzdw1E,2274
7
7
  spacr/app_classify.py,sha256=urTP_wlZ58hSyM5a19slYlBxN0PdC-9-ga0hvq8CGWc,165
8
8
  spacr/app_make_masks.py,sha256=qV3L_2TilGZBAUyBrzaWAayei_tf3XvJdUUDyzEI6hA,1834
9
9
  spacr/app_make_masks_v2.py,sha256=OkNeskNbgep8wQa4ES3jpJjZLfn4yIkGwQOd9r0spfA,30497
@@ -14,8 +14,8 @@ 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=jNlDk-0vb0fpteNT3bsNpfLRLAuwsx7SPlcajT1eCuw,160139
18
- spacr/deep_spacr.py,sha256=bIa_txVJBy9zrKyqX0tpNQw0nNCUo77pSSUJiYy1egE,36994
17
+ spacr/core.py,sha256=bm1cApGVTE218Ds3FqqWD5TsF5FF8kclHwPlvdOolzc,160216
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
@@ -23,8 +23,8 @@ spacr/gui.py,sha256=9psWiXMna1ebi-I55H0vQ3lad_923fhq_LB13lMSEg4,6893
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=EGcSvroOLsktdaXs_7RVC8vAfqP3YjUnoxWfr4LCiWY,27508
27
- spacr/gui_elements.py,sha256=L1usJ9kCWLvO9UWIGxV3KKVtT-5BTboyqRdH1xeDLPg,72624
26
+ spacr/gui_core.py,sha256=VkcYV8gE8Bc1fKcuZSJ1plS8agS_386ZxjqudRMLhG0,27912
27
+ spacr/gui_elements.py,sha256=fgRaG7THe95jyaIaqJqe05syQ9apo9ZIwkRR2u9vMnY,72544
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
@@ -38,23 +38,23 @@ 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=CL8bI3ujtQxsRuQJUVSXmThQFPzQvTEDK38DSELpSQo,55746
41
+ spacr/measure.py,sha256=e36NR8raCkvKHZXvTJgPDwObsmsegvc1dAiCqD3oljk,55751
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=VNEt7WWf_cpLCpkcfE6o0m3te2b4IuUlDS_j1mhP_s4,48131
46
+ spacr/settings.py,sha256=PQ-VJSTlBMxfQuz35MiipoGmBjq56jqepViUvOjov0k,48668
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
50
- spacr/utils.py,sha256=149Bbha9OXAKyDwABgHz5h4O7Gqy6aeFLA1pMSq311s,186966
50
+ spacr/utils.py,sha256=OQ8sSBH6VWx2xP_vh4ILJT71B46DFFhsq-Y6WxYdGhI,186891
51
51
  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.75.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
56
- spacr-0.1.75.dist-info/METADATA,sha256=xaKRgGtsxGpRudRxKq8F02eI0T0dJRVcpLzY1GRTaBY,5050
57
- spacr-0.1.75.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
58
- spacr-0.1.75.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
59
- spacr-0.1.75.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
60
- spacr-0.1.75.dist-info/RECORD,,
55
+ spacr-0.1.77.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
56
+ spacr-0.1.77.dist-info/METADATA,sha256=FEEy3ZRedFlkX0jIEsC7MZ1qlDRCahOWGrtmzE7Mj3g,5050
57
+ spacr-0.1.77.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
58
+ spacr-0.1.77.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
59
+ spacr-0.1.77.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
60
+ spacr-0.1.77.dist-info/RECORD,,
File without changes