spacr 0.4.60__py3-none-any.whl → 0.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. spacr/__init__.py +2 -4
  2. spacr/__main__.py +3 -3
  3. spacr/core.py +13 -107
  4. spacr/gui.py +0 -1
  5. spacr/gui_core.py +2 -2
  6. spacr/gui_utils.py +5 -14
  7. spacr/io.py +189 -200
  8. spacr/mediar.py +12 -8
  9. spacr/plot.py +50 -13
  10. spacr/settings.py +71 -14
  11. spacr/submodules.py +21 -14
  12. spacr/timelapse.py +192 -6
  13. spacr/utils.py +180 -56
  14. {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/METADATA +64 -62
  15. {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/RECORD +20 -72
  16. {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/WHEEL +1 -1
  17. spacr/resources/MEDIAR/.gitignore +0 -18
  18. spacr/resources/MEDIAR/LICENSE +0 -21
  19. spacr/resources/MEDIAR/README.md +0 -189
  20. spacr/resources/MEDIAR/SetupDict.py +0 -39
  21. spacr/resources/MEDIAR/config/baseline.json +0 -60
  22. spacr/resources/MEDIAR/config/mediar_example.json +0 -72
  23. spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -17
  24. spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -55
  25. spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -58
  26. spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -66
  27. spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -66
  28. spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -16
  29. spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -23
  30. spacr/resources/MEDIAR/core/BasePredictor.py +0 -120
  31. spacr/resources/MEDIAR/core/BaseTrainer.py +0 -240
  32. spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -59
  33. spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -113
  34. spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -2
  35. spacr/resources/MEDIAR/core/Baseline/utils.py +0 -80
  36. spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -105
  37. spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -234
  38. spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -172
  39. spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -3
  40. spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -429
  41. spacr/resources/MEDIAR/core/__init__.py +0 -2
  42. spacr/resources/MEDIAR/core/utils.py +0 -40
  43. spacr/resources/MEDIAR/evaluate.py +0 -71
  44. spacr/resources/MEDIAR/generate_mapping.py +0 -121
  45. spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
  46. spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
  47. spacr/resources/MEDIAR/image/failure_cases.png +0 -0
  48. spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
  49. spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
  50. spacr/resources/MEDIAR/image/mediar_results.png +0 -0
  51. spacr/resources/MEDIAR/main.py +0 -125
  52. spacr/resources/MEDIAR/predict.py +0 -70
  53. spacr/resources/MEDIAR/requirements.txt +0 -14
  54. spacr/resources/MEDIAR/train_tools/__init__.py +0 -3
  55. spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -1
  56. spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -88
  57. spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -161
  58. spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -77
  59. spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -3
  60. spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
  61. spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -208
  62. spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -148
  63. spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -84
  64. spacr/resources/MEDIAR/train_tools/measures.py +0 -200
  65. spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -102
  66. spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -1
  67. spacr/resources/MEDIAR/train_tools/utils.py +0 -70
  68. spacr/stats.py +0 -221
  69. /spacr/{cellpose.py → spacr_cellpose.py} +0 -0
  70. {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/LICENSE +0 -0
  71. {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/entry_points.txt +0 -0
  72. {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/top_level.txt +0 -0
spacr/plot.py CHANGED
@@ -1414,7 +1414,8 @@ def _plot_recruitment(df, df_type, channel_of_interest, columns=[], figuresize=1
1414
1414
  sns.barplot(ax=ax, data=df, x='condition', y=f'{col}', hue='pathogen', capsize=.1, ci='sd', dodge=False)
1415
1415
  ax.set_xlabel(f'pathogen {df_type}', fontsize=font)
1416
1416
  ax.set_ylabel(f'{col}', fontsize=int(font*2))
1417
- ax.legend_.remove()
1417
+ if ax.get_legend() is not None:
1418
+ ax.legend_.remove()
1418
1419
  ax.tick_params(axis='both', which='major', labelsize=font)
1419
1420
  ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
1420
1421
  if i <= 5:
@@ -2031,7 +2032,7 @@ def plot_comparison_results(comparison_results):
2031
2032
  def plot_object_outlines(src, objects=['nucleus','cell','pathogen'], channels=[0,1,2], max_nr=10):
2032
2033
 
2033
2034
  for object_, channel in zip(objects, channels):
2034
- folders = [os.path.join(src, 'norm_channel_stack', f'{object_}_mask_stack'),
2035
+ folders = [os.path.join(src, 'masks', f'{object_}_mask_stack'),
2035
2036
  os.path.join(src,f'{channel+1}')]
2036
2037
  print(folders)
2037
2038
  plot_images_and_arrays(folders,
@@ -2597,7 +2598,7 @@ class spacrGraph:
2597
2598
  # Group by ['prc', grouping_column]
2598
2599
  group_cols = ['prc', self.grouping_column]
2599
2600
 
2600
- elif self.representation == 'plateID':
2601
+ elif self.representation == 'plate':
2601
2602
  # Make sure 'plateID' exists (split from 'prc' if needed)
2602
2603
  if 'plateID' not in df.columns:
2603
2604
  if 'prc' in df.columns:
@@ -2930,6 +2931,7 @@ class spacrGraph:
2930
2931
  self.df_melted = pd.melt(self.df, id_vars=[self.grouping_column], value_vars=self.data_column,var_name='Data Column', value_name='Value')
2931
2932
  unique_groups = self.df[self.grouping_column].unique()
2932
2933
  is_normal, normality_results = self.perform_normality_tests()
2934
+ is_normal = True
2933
2935
  levene_stat, levene_p = self.perform_levene_test(unique_groups)
2934
2936
  test_results = self.perform_statistical_tests(unique_groups, is_normal)
2935
2937
  posthoc_results = self.perform_posthoc_tests(is_normal, unique_groups)
@@ -3371,8 +3373,11 @@ class spacrGraph:
3371
3373
  return self.fig
3372
3374
 
3373
3375
  def plot_data_from_db(settings):
3376
+
3374
3377
  from .io import _read_db, _read_and_merge_data
3375
3378
  from .utils import annotate_conditions, save_settings
3379
+ from .settings import set_default_plot_data_from_db
3380
+
3376
3381
  """
3377
3382
  Extracts the specified table from the SQLite database and plots a specified column.
3378
3383
 
@@ -3385,8 +3390,8 @@ def plot_data_from_db(settings):
3385
3390
  df (pd.DataFrame): The extracted table as a DataFrame.
3386
3391
  """
3387
3392
 
3388
-
3389
-
3393
+ settings = set_default_plot_data_from_db(settings)
3394
+
3390
3395
  if isinstance(settings['src'], str):
3391
3396
  srcs = [settings['src']]
3392
3397
  elif isinstance(settings['src'], list):
@@ -3403,7 +3408,6 @@ def plot_data_from_db(settings):
3403
3408
 
3404
3409
  dfs = []
3405
3410
  for i, src in enumerate(srcs):
3406
-
3407
3411
  db_loc = os.path.join(src, 'measurements', settings['database'][i])
3408
3412
  print(f"Database: {db_loc}")
3409
3413
  if settings['table_names'] in ['saliency_image_correlations']:
@@ -3415,7 +3419,7 @@ def plot_data_from_db(settings):
3415
3419
  verbose=settings['verbose'],
3416
3420
  nuclei_limit=settings['nuclei_limit'],
3417
3421
  pathogen_limit=settings['pathogen_limit'])
3418
-
3422
+
3419
3423
  dft = annotate_conditions(df1,
3420
3424
  cells=settings['cell_types'],
3421
3425
  cell_loc=settings['cell_plate_metadata'],
@@ -3436,12 +3440,27 @@ def plot_data_from_db(settings):
3436
3440
 
3437
3441
  if settings['treatment_plate_metadata'] != None:
3438
3442
  df = df.dropna(subset='treatment')
3439
-
3443
+
3444
+ if settings['data_column'] == 'recruitment':
3445
+ pahtogen_measurement = df[f"pathogen_channel_{settings['channel_of_interest']}_mean_intensity"]
3446
+ cytoplasm_measurement = df[f"cytoplasm_channel_{settings['channel_of_interest']}_mean_intensity"]
3447
+ df['recruitment'] = pahtogen_measurement / cytoplasm_measurement
3448
+
3449
+ if settings['data_column'] not in df.columns:
3450
+ print(f"Data column {settings['data_column']} not found in DataFrame.")
3451
+ print(f'Please use one of the following columns:')
3452
+ for col in df.columns:
3453
+ print(col)
3454
+ display(df)
3455
+ return None
3456
+
3440
3457
  df = df.dropna(subset=settings['data_column'])
3441
3458
 
3442
3459
  if settings['grouping_column'] not in df.columns:
3443
3460
  print(f"Grouping column {settings['grouping_column']} not found in DataFrame.")
3444
- print(f'Please use one of the following columns: {df.columns}')
3461
+ print(f'Please use one of the following columns:')
3462
+ for col in df.columns:
3463
+ print(col)
3445
3464
  display(df)
3446
3465
  return None
3447
3466
 
@@ -3480,7 +3499,8 @@ def plot_data_from_db(settings):
3480
3499
 
3481
3500
  def plot_data_from_csv(settings):
3482
3501
  from .io import _read_db, _read_and_merge_data
3483
- from .utils import annotate_conditions, save_settings
3502
+ from .utils import annotate_conditions, save_settings, remove_outliers_by_group
3503
+ from .settings import get_plot_data_from_csv_default_settings
3484
3504
  """
3485
3505
  Extracts the specified table from the SQLite database and plots a specified column.
3486
3506
 
@@ -3492,7 +3512,12 @@ def plot_data_from_csv(settings):
3492
3512
  Returns:
3493
3513
  df (pd.DataFrame): The extracted table as a DataFrame.
3494
3514
  """
3515
+
3495
3516
 
3517
+ def filter_rows_by_column_values(df: pd.DataFrame, column: str, values: list) -> pd.DataFrame:
3518
+ """Return a filtered DataFrame where only rows with the column value in the list are kept."""
3519
+ return df[df[column].isin(values)].copy()
3520
+
3496
3521
  if isinstance(settings['src'], str):
3497
3522
  srcs = [settings['src']]
3498
3523
  elif isinstance(settings['src'], list):
@@ -3519,15 +3544,27 @@ def plot_data_from_csv(settings):
3519
3544
  except Exception as e:
3520
3545
  print(f"Could not split the prc column: {e}")
3521
3546
 
3522
-
3523
- display(df)
3524
-
3547
+ if 'keep_groups' in settings.keys():
3548
+ if isinstance(settings['keep_groups'], str):
3549
+ settings['keep_groups'] = [settings['keep_groups']]
3550
+ elif isinstance(settings['keep_groups'], list):
3551
+ df = filter_rows_by_column_values(df, settings['grouping_column'], settings['keep_groups'])
3552
+
3553
+ if settings['remove_outliers']:
3554
+ df = remove_outliers_by_group(df, settings['grouping_column'], settings['data_column'], method='iqr', threshold=1.5)
3555
+
3556
+ if settings['verbose']:
3557
+ display(df)
3558
+
3525
3559
  df = df.dropna(subset=settings['data_column'])
3526
3560
  df = df.dropna(subset=settings['grouping_column'])
3527
3561
  src = srcs[0]
3528
3562
  dst = os.path.join(os.path.dirname(src), 'results', settings['graph_name'])
3529
3563
  os.makedirs(dst, exist_ok=True)
3530
3564
 
3565
+ #data_csv = os.path.join(dst, f"{settings['graph_name']}_data.csv")
3566
+ #df.to_csv(data_csv, index=False)
3567
+
3531
3568
  spacr_graph = spacrGraph(
3532
3569
  df=df, # Your DataFrame
3533
3570
  grouping_column=settings['grouping_column'], # Column for grouping the data (x-axis)
spacr/settings.py CHANGED
@@ -29,7 +29,6 @@ def set_default_settings_preprocess_generate_masks(settings={}):
29
29
  settings.setdefault('denoise', False)
30
30
  settings.setdefault('src', 'path')
31
31
  settings.setdefault('delete_intermediate', False)
32
- settings.setdefault('segmentation_mode', 'cellpose')
33
32
  settings.setdefault('preprocess', True)
34
33
  settings.setdefault('masks', True)
35
34
  settings.setdefault('save', True)
@@ -95,14 +94,39 @@ def set_default_settings_preprocess_generate_masks(settings={}):
95
94
 
96
95
  # Misc settings
97
96
  settings.setdefault('all_to_mip', False)
98
- settings.setdefault('pick_slice', False)
99
- settings.setdefault('skip_mode', '01')
100
97
  settings.setdefault('upscale', False)
101
98
  settings.setdefault('upscale_factor', 2.0)
102
99
  settings.setdefault('adjust_cells', False)
103
100
  return settings
104
101
 
105
- def set_default_settings_preprocess_img_data(settings):
102
+ def set_default_plot_data_from_db(settings):
103
+ settings.setdefault('src', 'path')
104
+ settings.setdefault('database', 'measurements.db')
105
+ settings.setdefault('graph_name', 'Figure_1')
106
+ settings.setdefault('table_names', ['cell', 'cytoplasm', 'nucleus', 'pathogen'])
107
+ settings.setdefault('data_column', 'recruitment')
108
+ settings.setdefault('grouping_column', 'condition')
109
+ settings.setdefault('cell_types', ['Hela'])
110
+ settings.setdefault('cell_plate_metadata', None)
111
+ settings.setdefault('pathogen_types', None)
112
+ settings.setdefault('pathogen_plate_metadata', None)
113
+ settings.setdefault('treatments', None)
114
+ settings.setdefault('treatment_plate_metadata', None)
115
+ settings.setdefault('graph_type', 'jitter')
116
+ settings.setdefault('theme', 'deep')
117
+ settings.setdefault('save', True)
118
+ settings.setdefault('y_lim', [1,1.5])
119
+ settings.setdefault('verbose', False)
120
+ settings.setdefault('channel_of_interest', 1)
121
+ settings.setdefault('nuclei_limit', 2)
122
+ settings.setdefault('pathogen_limit', 3)
123
+ settings.setdefault('representation', 'well')
124
+ settings.setdefault('uninfected', False)
125
+ return settings
126
+
127
+
128
+
129
+ def set_default_settings_preprocess_img_data_v1(settings):
106
130
 
107
131
  metadata_type = settings.setdefault('metadata_type', 'cellvoyager')
108
132
  custom_regex = settings.setdefault('custom_regex', None)
@@ -127,6 +151,27 @@ def set_default_settings_preprocess_img_data(settings):
127
151
 
128
152
  return settings, metadata_type, custom_regex, nr, plot, batch_size, timelapse, lower_percentile, randomize, all_to_mip, pick_slice, skip_mode, cmap, figuresize, normalize, save_dtype, test_mode, test_images, random_test
129
153
 
154
+ def set_default_settings_preprocess_img_data(settings):
155
+
156
+ settings.setdefault('metadata_type', 'cellvoyager')
157
+ settings.setdefault('custom_regex', None)
158
+ settings.setdefault('nr', 1)
159
+ settings.setdefault('plot', True)
160
+ settings.setdefault('batch_size', 50)
161
+ settings.setdefault('timelapse', False)
162
+ settings.setdefault('lower_percentile', 2)
163
+ settings.setdefault('randomize', True)
164
+ settings.setdefault('all_to_mip', False)
165
+ settings.setdefault('cmap', 'inferno')
166
+ settings.setdefault('figuresize', 10)
167
+ settings.setdefault('normalize', True)
168
+ settings.setdefault('save_dtype', 'uint16')
169
+ settings.setdefault('test_mode', False)
170
+ settings.setdefault('test_images', 10)
171
+ settings.setdefault('random_test', True)
172
+ settings.setdefault('fps', 2)
173
+ return settings
174
+
130
175
  def _get_object_settings(object_type, settings):
131
176
 
132
177
  from .utils import _get_diam
@@ -278,7 +323,7 @@ def get_measure_crop_settings(settings={}):
278
323
 
279
324
  # Timelapsed settings
280
325
  settings.setdefault('timelapse', False)
281
- settings.setdefault('timelapse_objects', 'cell')
326
+ settings.setdefault('timelapse_objects', ['cell'])
282
327
 
283
328
  # Operational settings
284
329
  settings.setdefault('plot',False)
@@ -715,7 +760,7 @@ expected_types = {
715
760
  #"timelapse_frame_limits": (list, type(None)), # This can be a list of lists
716
761
  "timelapse_remove_transient": bool,
717
762
  "timelapse_mode": str,
718
- "timelapse_objects": list,
763
+ "timelapse_objects": (list, type(None)),
719
764
  "fps": int,
720
765
  "remove_background": bool,
721
766
  "lower_percentile": (int, float),
@@ -936,7 +981,6 @@ expected_types = {
936
981
  "png_type":str,
937
982
  "custom_model_path":str,
938
983
  "generate_training_dataset":bool,
939
- "segmentation_mode":str,
940
984
  "train_DL_model":bool,
941
985
  "normalize":bool,
942
986
  "overlay":bool,
@@ -987,7 +1031,7 @@ expected_types = {
987
1031
  }
988
1032
 
989
1033
  categories = {"Paths":[ "src", "grna", "barcodes", "custom_model_path", "dataset","model_path","grna_csv","row_csv","column_csv", "metadata_files", "score_data","count_data"],
990
- "General": ["cell_mask_dim", "cytoplasm", "cell_chann_dim", "cell_channel", "nucleus_chann_dim", "nucleus_channel", "nucleus_mask_dim", "pathogen_mask_dim", "pathogen_chann_dim", "pathogen_channel", "test_mode", "plot", "metadata_type", "custom_regex", "experiment", "channels", "magnification", "channel_dims", "apply_model_to_dataset", "generate_training_dataset", "train_DL_model", "segmentation_mode", "delete_intermediate", "uninfected", ],
1034
+ "General": ["cell_mask_dim", "cytoplasm", "cell_chann_dim", "cell_channel", "nucleus_chann_dim", "nucleus_channel", "nucleus_mask_dim", "pathogen_mask_dim", "pathogen_chann_dim", "pathogen_channel", "test_mode", "plot", "metadata_type", "custom_regex", "experiment", "channels", "magnification", "channel_dims", "apply_model_to_dataset", "generate_training_dataset", "train_DL_model", "delete_intermediate", "uninfected", ],
991
1035
  "Cellpose":["denoise","fill_in","from_scratch", "n_epochs", "width_height", "model_name", "custom_model", "resample", "rescale", "CP_prob", "flow_threshold", "percentiles", "invert", "diameter", "grayscale", "Signal_to_noise", "resize", "target_height", "target_width"],
992
1036
  "Cell": ["cell_diamiter","cell_intensity_range", "cell_size_range", "cell_background", "cell_Signal_to_noise", "cell_CP_prob", "cell_FT", "remove_background_cell", "cell_min_size", "cytoplasm_min_size", "adjust_cells", "cells", "cell_loc"],
993
1037
  "Nucleus": ["nucleus_diamiter","nucleus_intensity_range", "nucleus_size_range", "nucleus_background", "nucleus_Signal_to_noise", "nucleus_CP_prob", "nucleus_FT", "remove_background_nucleus", "nucleus_min_size", "nucleus_loc"],
@@ -1005,7 +1049,7 @@ categories = {"Paths":[ "src", "grna", "barcodes", "custom_model_path", "dataset
1005
1049
  "Plot": ["split_axis_lims", "x_lim","log_x","log_y", "plot_control", "plot_nr", "examples_to_plot", "normalize_plots", "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"],
1006
1050
  "Timelapse": ["timelapse", "fps", "timelapse_displacement", "timelapse_memory", "timelapse_frame_limits", "timelapse_remove_transient", "timelapse_mode", "timelapse_objects", "compartments"],
1007
1051
  "Advanced": ["merge_edge_pathogen_cells", "test_images", "random_test", "test_nr", "test", "test_split", "normalize", "target_unique_count","threshold_multiplier", "threshold_method", "min_n","shuffle", "target_intensity_min", "cells_per_well", "nuclei_limit", "pathogen_limit", "background", "backgrounds", "schedule", "test_size","exclude","n_repeats","top_features", "model_type_ml", "model_type","minimum_cell_count","n_estimators","preprocess", "remove_background", "normalize", "lower_percentile", "merge_pathogens", "batch_size", "filter", "save", "masks", "verbose", "randomize", "n_jobs"],
1008
- "Beta": ["all_to_mip", "pick_slice", "skip_mode", "upscale", "upscale_factor", "consolidate"]
1052
+ "Beta": ["all_to_mip", "upscale", "upscale_factor", "consolidate"]
1009
1053
  }
1010
1054
 
1011
1055
 
@@ -1033,7 +1077,7 @@ def check_settings(vars_dict, expected_types, q=None):
1033
1077
  expected_type = expected_types.get(key, str)
1034
1078
 
1035
1079
  try:
1036
- if key in ["cell_plate_metadata", "timelapse_frame_limits", "png_size", "png_dims", "pathogen_plate_metadata", "treatment_plate_metadata", "class_metadata", "crop_mode"]:
1080
+ if key in ["cell_plate_metadata", "timelapse_frame_limits", "png_size", "png_dims", "pathogen_plate_metadata", "treatment_plate_metadata", "timelapse_objects", "class_metadata", "crop_mode"]:
1037
1081
  if value is None:
1038
1082
  parsed_value = None
1039
1083
  else:
@@ -1198,7 +1242,7 @@ def generate_fields(variables, scrollable_frame):
1198
1242
  "nucleus_min_size": "(int) - The minimum size of nucleus objects in pixels^2.",
1199
1243
  "normalize_by": "(str) - Normalize cropped png images by png or by field of view.",
1200
1244
  "dependent_variable": "(str) - The dependent variable for the regression analysis.",
1201
- "delete_intermediate": "(bool) - Delete intermediate folders (stack, channel, norm_channel_stack).",
1245
+ "delete_intermediate": "(bool) - Delete intermediate folders (stack, channel, masks).",
1202
1246
  "diameter": "(float) - Diameter of the objects to segment.",
1203
1247
  "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.",
1204
1248
  "dialate_pngs": "(bool) - Whether to dilate the PNG images before saving.",
@@ -1274,7 +1318,6 @@ def generate_fields(variables, scrollable_frame):
1274
1318
  "pc": "(str) - Positive control identifier.",
1275
1319
  "pc_loc": "(str) - Location of the positive control in the images.",
1276
1320
  "percentiles": "(list) - Percentiles to use for normalizing the images.",
1277
- "pick_slice": "(bool) - Whether to pick a single slice from the z-stack images. If False, the maximum intensity projection will be used.",
1278
1321
  "pin_memory": "(bool) - Whether to pin memory for the data loader.",
1279
1322
  "plate": "(str) - Plate identifier for the experiment.",
1280
1323
  "plate_dict": "(dict) - Dictionary of plate metadata.",
@@ -1319,7 +1362,6 @@ def generate_fields(variables, scrollable_frame):
1319
1362
  "skip_mode": "(str) - The mode to use for skipping images. This will determine how to handle images that cannot be processed.",
1320
1363
  "smooth_lines": "(bool) - Whether to smooth lines in the plots.",
1321
1364
  "src": "(str, path) - Path to source directory.",
1322
- "segmentation_mode": "(str) - Algorithm to use for segmentation (cellpose or mediar).",
1323
1365
  "target": "(str) - Target variable for the analysis.",
1324
1366
  "target_height": "(int) - Target height for resizing the images.",
1325
1367
  "target_intensity_min": "(float) - Minimum intensity for the target objects.",
@@ -1358,7 +1400,6 @@ def generate_fields(variables, scrollable_frame):
1358
1400
  "dataset_mode": "str - How to generate train/test dataset.",
1359
1401
  "annotated_classes": "list - list of numbers in annotation column.",
1360
1402
  "um_per_pixel": "(float) - The micrometers per pixel for the images.",
1361
- "segmentation_model": "(str) - The segmentation model to use, either cellpose or mediar.",
1362
1403
  "pathogen_model": "(str) - use a custom cellpose model to detect pathogen objects.",
1363
1404
  "timelapse_displacement": "(int) - Displacement for timelapse tracking.",
1364
1405
  "timelapse_memory": "(int) - Memory for timelapse tracking.",
@@ -1578,4 +1619,20 @@ def set_analyze_class_proportion_defaults(settings):
1578
1619
  settings.setdefault('level','well')
1579
1620
  settings.setdefault('save',False)
1580
1621
  settings.setdefault('verbose', False)
1622
+ return settings
1623
+
1624
+ def get_plot_data_from_csv_default_settings(settings):
1625
+ settings.setdefault('src','path')
1626
+ settings.setdefault('data_column','choose column')
1627
+ settings.setdefault('grouping_column','choose column')
1628
+ settings.setdefault('graph_type','violin')
1629
+ settings.setdefault('save',False)
1630
+ settings.setdefault('y_lim',None)
1631
+ settings.setdefault('log_y',False)
1632
+ settings.setdefault('log_x',False)
1633
+ settings.setdefault('keep_groups',None)
1634
+ settings.setdefault('representation','well')
1635
+ settings.setdefault('theme','dark')
1636
+ settings.setdefault('remove_outliers',False)
1637
+ settings.setdefault('verbose',False)
1581
1638
  return settings
spacr/submodules.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import seaborn as sns
2
- import os, random, sqlite3, re, shap, string, time
2
+ import os, random, sqlite3, re, shap, string, time, shutil
3
3
  import pandas as pd
4
4
  import numpy as np
5
5
 
@@ -28,10 +28,7 @@ from skimage.measure import regionprops, label as sklabel
28
28
  import matplotlib.pyplot as plt
29
29
  from natsort import natsorted
30
30
 
31
- import torch
32
31
  from torch.utils.data import Dataset
33
- from spacr.settings import get_train_cellpose_default_settings
34
- from spacr.utils import save_settings, invert_image
35
32
 
36
33
  class CellposeLazyDataset(Dataset):
37
34
  def __init__(self, image_files, label_files, settings, randomize=True, augment=False):
@@ -91,8 +88,8 @@ class CellposeLazyDataset(Dataset):
91
88
 
92
89
  def train_cellpose(settings):
93
90
 
94
- from spacr.settings import get_train_cellpose_default_settings
95
- from spacr.utils import save_settings
91
+ from .settings import get_train_cellpose_default_settings
92
+ from .utils import save_settings
96
93
 
97
94
  settings = get_train_cellpose_default_settings(settings)
98
95
  img_src = os.path.join(settings['src'], 'train', 'images')
@@ -161,11 +158,11 @@ def train_cellpose(settings):
161
158
 
162
159
  def test_cellpose_model(settings):
163
160
 
164
- from spacr.utils import save_settings, print_progress
161
+ from .utils import save_settings, print_progress
165
162
  from .settings import get_default_test_cellpose_model_settings
166
163
 
167
164
  def plot_cellpose_resilts(i, j, results_dir, img, lbl, pred, flow):
168
- from spacr. plot import generate_mask_random_cmap
165
+ from . plot import generate_mask_random_cmap
169
166
  fig, axs = plt.subplots(1, 5, figsize=(16, 4), gridspec_kw={'wspace': 0.1, 'hspace': 0.1})
170
167
  cmap_lbl = generate_mask_random_cmap(lbl)
171
168
  cmap_pred = generate_mask_random_cmap(pred)
@@ -348,7 +345,7 @@ def test_cellpose_model(settings):
348
345
  def apply_cellpose_model(settings):
349
346
 
350
347
  from .settings import get_default_apply_cellpose_model_settings
351
- from spacr.utils import save_settings, print_progress
348
+ from .utils import save_settings, print_progress
352
349
 
353
350
  def plot_cellpose_result(i, j, results_dir, img, pred, flow):
354
351
 
@@ -466,7 +463,7 @@ def apply_cellpose_model(settings):
466
463
  print("Saved object count and average area to summary.csv")
467
464
 
468
465
  def plot_cellpose_batch(images, labels):
469
- from spacr.plot import generate_mask_random_cmap
466
+ from .plot import generate_mask_random_cmap
470
467
 
471
468
  cmap_lbl = generate_mask_random_cmap(labels)
472
469
  batch_size = len(images)
@@ -481,8 +478,8 @@ def plot_cellpose_batch(images, labels):
481
478
  plt.show()
482
479
 
483
480
  def analyze_percent_positive(settings):
484
- from spacr.io import _read_and_merge_data
485
- from spacr.utils import save_settings
481
+ from .io import _read_and_merge_data
482
+ from .utils import save_settings
486
483
  from .settings import default_settings_analyze_percent_positive
487
484
 
488
485
  settings = default_settings_analyze_percent_positive(settings)
@@ -583,6 +580,16 @@ def analyze_recruitment(settings):
583
580
  from .settings import get_analyze_recruitment_default_settings
584
581
 
585
582
  settings = get_analyze_recruitment_default_settings(settings=settings)
583
+
584
+ if settings['src'].endswith('/measurements.db'):
585
+ src_orig = settings['src']
586
+ settings['src'] = os.path.dirname(settings['src'])
587
+ if not settings['src'].endswith('/measurements'):
588
+ src_mes = os.path.join(settings['src'], 'measurements')
589
+ if not os.path.exists(src_mes):
590
+ os.makedirs(src_mes)
591
+ shutil.move(src_orig, os.path.join(src_mes, 'measurements.db'))
592
+
586
593
  save_settings(settings, name='recruitment')
587
594
 
588
595
  print(f"Cell(s): {settings['cell_types']}, in {settings['cell_plate_metadata']}")
@@ -681,7 +688,7 @@ def analyze_recruitment(settings):
681
688
 
682
689
  def analyze_plaques(settings):
683
690
 
684
- from .cellpose import identify_masks_finetune
691
+ from .spacr_cellpose import identify_masks_finetune
685
692
  from .settings import get_analyze_plaque_settings
686
693
  from .utils import save_settings, download_models
687
694
  from spacr import __file__ as spacr_path
@@ -1020,7 +1027,7 @@ def interperate_vision_model(settings={}):
1020
1027
  else:
1021
1028
  return None
1022
1029
 
1023
- from spacr.plot import spacrGraph
1030
+ from .plot import spacrGraph
1024
1031
 
1025
1032
  df[name] = df['feature'].apply(lambda x: find_feature_class(x, feature_groups))
1026
1033