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.
- spacr/__init__.py +2 -4
- spacr/__main__.py +3 -3
- spacr/core.py +13 -107
- spacr/gui.py +0 -1
- spacr/gui_core.py +2 -2
- spacr/gui_utils.py +5 -14
- spacr/io.py +189 -200
- spacr/mediar.py +12 -8
- spacr/plot.py +50 -13
- spacr/settings.py +71 -14
- spacr/submodules.py +21 -14
- spacr/timelapse.py +192 -6
- spacr/utils.py +180 -56
- {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/METADATA +64 -62
- {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/RECORD +20 -72
- {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/WHEEL +1 -1
- spacr/resources/MEDIAR/.gitignore +0 -18
- spacr/resources/MEDIAR/LICENSE +0 -21
- spacr/resources/MEDIAR/README.md +0 -189
- spacr/resources/MEDIAR/SetupDict.py +0 -39
- spacr/resources/MEDIAR/config/baseline.json +0 -60
- spacr/resources/MEDIAR/config/mediar_example.json +0 -72
- spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -17
- spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -55
- spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -58
- spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -66
- spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -66
- spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -16
- spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -23
- spacr/resources/MEDIAR/core/BasePredictor.py +0 -120
- spacr/resources/MEDIAR/core/BaseTrainer.py +0 -240
- spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -59
- spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -113
- spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -2
- spacr/resources/MEDIAR/core/Baseline/utils.py +0 -80
- spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -105
- spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -234
- spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -172
- spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -3
- spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -429
- spacr/resources/MEDIAR/core/__init__.py +0 -2
- spacr/resources/MEDIAR/core/utils.py +0 -40
- spacr/resources/MEDIAR/evaluate.py +0 -71
- spacr/resources/MEDIAR/generate_mapping.py +0 -121
- spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
- spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
- spacr/resources/MEDIAR/image/failure_cases.png +0 -0
- spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
- spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
- spacr/resources/MEDIAR/image/mediar_results.png +0 -0
- spacr/resources/MEDIAR/main.py +0 -125
- spacr/resources/MEDIAR/predict.py +0 -70
- spacr/resources/MEDIAR/requirements.txt +0 -14
- spacr/resources/MEDIAR/train_tools/__init__.py +0 -3
- spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -1
- spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -88
- spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -161
- spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -77
- spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -3
- spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -208
- spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -148
- spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -84
- spacr/resources/MEDIAR/train_tools/measures.py +0 -200
- spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -102
- spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -1
- spacr/resources/MEDIAR/train_tools/utils.py +0 -70
- spacr/stats.py +0 -221
- /spacr/{cellpose.py → spacr_cellpose.py} +0 -0
- {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/LICENSE +0 -0
- {spacr-0.4.60.dist-info → spacr-0.9.0.dist-info}/entry_points.txt +0 -0
- {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.
|
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, '
|
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 == '
|
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:
|
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
|
-
|
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
|
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", "
|
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", "
|
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,
|
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
|
95
|
-
from
|
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
|
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
|
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
|
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
|
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
|
485
|
-
from
|
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 .
|
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
|
1030
|
+
from .plot import spacrGraph
|
1024
1031
|
|
1025
1032
|
df[name] = df['feature'].apply(lambda x: find_feature_class(x, feature_groups))
|
1026
1033
|
|