spacr 0.5.0__py3-none-any.whl → 0.9.1__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 +0 -2
- spacr/__main__.py +3 -3
- spacr/core.py +13 -106
- spacr/gui_core.py +2 -77
- spacr/gui_utils.py +1 -13
- spacr/io.py +24 -25
- spacr/mediar.py +12 -8
- spacr/plot.py +50 -135
- spacr/settings.py +42 -30
- spacr/submodules.py +11 -1
- spacr/timelapse.py +7 -79
- spacr/utils.py +152 -61
- {spacr-0.5.0.dist-info → spacr-0.9.1.dist-info}/METADATA +62 -62
- spacr-0.9.1.dist-info/RECORD +109 -0
- {spacr-0.5.0.dist-info → spacr-0.9.1.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/__pycache__/SetupDict.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/__pycache__/evaluate.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/__pycache__/generate_mapping.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/__pycache__/main.cpython-39.pyc +0 -0
- 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/__pycache__/Predictor.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/Baseline/__pycache__/Trainer.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/Baseline/__pycache__/__init__.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/Baseline/__pycache__/utils.cpython-39.pyc +0 -0
- 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/__pycache__/EnsemblePredictor.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/MEDIAR/__pycache__/Predictor.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/MEDIAR/__pycache__/Trainer.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/MEDIAR/__pycache__/__init__.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/MEDIAR/__pycache__/utils.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -429
- spacr/resources/MEDIAR/core/__init__.py +0 -2
- spacr/resources/MEDIAR/core/__pycache__/BasePredictor.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/__pycache__/BaseTrainer.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/__pycache__/__init__.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/core/__pycache__/utils.cpython-39.pyc +0 -0
- 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/__pycache__/__init__.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/__pycache__/measures.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/__pycache__/utils.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -1
- spacr/resources/MEDIAR/train_tools/data_utils/__pycache__/__init__.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/__pycache__/datasetter.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/__pycache__/transforms.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/__pycache__/utils.cpython-39.pyc +0 -0
- 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/__pycache__/CellAware.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/custom/__pycache__/LoadImage.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/custom/__pycache__/NormalizeImage.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/data_utils/custom/__pycache__/__init__.cpython-39.pyc +0 -0
- 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/models/__pycache__/MEDIARFormer.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/models/__pycache__/__init__.cpython-39.pyc +0 -0
- spacr/resources/MEDIAR/train_tools/utils.py +0 -70
- spacr-0.5.0.dist-info/RECORD +0 -190
- {spacr-0.5.0.dist-info → spacr-0.9.1.dist-info}/LICENSE +0 -0
- {spacr-0.5.0.dist-info → spacr-0.9.1.dist-info}/entry_points.txt +0 -0
- {spacr-0.5.0.dist-info → spacr-0.9.1.dist-info}/top_level.txt +0 -0
spacr/utils.py
CHANGED
@@ -10,7 +10,7 @@ import skimage.measure as measure
|
|
10
10
|
from skimage.transform import resize as resizescikit
|
11
11
|
from skimage.morphology import dilation, square
|
12
12
|
from skimage.measure import find_contours
|
13
|
-
from skimage.segmentation import clear_border
|
13
|
+
from skimage.segmentation import clear_border, find_boundaries
|
14
14
|
from scipy.stats import pearsonr
|
15
15
|
|
16
16
|
from collections import defaultdict, OrderedDict
|
@@ -431,7 +431,7 @@ def close_multiprocessing_processes():
|
|
431
431
|
|
432
432
|
def check_mask_folder(src,mask_fldr):
|
433
433
|
|
434
|
-
mask_folder = os.path.join(src,'
|
434
|
+
mask_folder = os.path.join(src,'masks',mask_fldr)
|
435
435
|
stack_folder = os.path.join(src,'stack')
|
436
436
|
|
437
437
|
if not os.path.exists(mask_folder):
|
@@ -1266,9 +1266,9 @@ def _pivot_counts_table(db_path):
|
|
1266
1266
|
|
1267
1267
|
def _get_cellpose_channels(src, nucleus_channel, pathogen_channel, cell_channel):
|
1268
1268
|
|
1269
|
-
cell_mask_path = os.path.join(src, '
|
1270
|
-
nucleus_mask_path = os.path.join(src, '
|
1271
|
-
pathogen_mask_path = os.path.join(src, '
|
1269
|
+
cell_mask_path = os.path.join(src, 'masks', 'cell_mask_stack')
|
1270
|
+
nucleus_mask_path = os.path.join(src, 'masks', 'nucleus_mask_stack')
|
1271
|
+
pathogen_mask_path = os.path.join(src, 'masks', 'pathogen_mask_stack')
|
1272
1272
|
|
1273
1273
|
|
1274
1274
|
if os.path.exists(cell_mask_path) or os.path.exists(nucleus_mask_path) or os.path.exists(pathogen_mask_path):
|
@@ -3088,17 +3088,19 @@ def _object_filter(df, object_type, size_range, intensity_range, mask_chans, mas
|
|
3088
3088
|
return df
|
3089
3089
|
|
3090
3090
|
def _get_regex(metadata_type, img_format, custom_regex=None):
|
3091
|
+
|
3092
|
+
print(f"Image_format: {img_format}")
|
3091
3093
|
|
3092
3094
|
if img_format == None:
|
3093
|
-
img_format == '
|
3095
|
+
img_format == 'tif'
|
3094
3096
|
if metadata_type == 'cellvoyager':
|
3095
|
-
regex = f
|
3097
|
+
regex = f"(?P<plateID>.*)_(?P<wellID>.*)_T(?P<timeID>.*)F(?P<fieldID>.*)L(?P<laserID>..)A(?P<AID>..)Z(?P<sliceID>.*)C(?P<chanID>.*).{img_format}"
|
3096
3098
|
elif metadata_type == 'cq1':
|
3097
|
-
regex = f
|
3099
|
+
regex = f"W(?P<wellID>.*)F(?P<fieldID>.*)T(?P<timeID>.*)Z(?P<sliceID>.*)C(?P<chanID>.*).{img_format}"
|
3098
3100
|
elif metadata_type == 'auto':
|
3099
|
-
regex = f
|
3101
|
+
regex = f"(?P<plateID>.*)_(?P<wellID>.*)_T(?P<timeID>.*)F(?P<fieldID>.*)L(?P<laserID>.*)C(?P<chanID>.*).tif"
|
3100
3102
|
elif metadata_type == 'custom':
|
3101
|
-
regex = f
|
3103
|
+
regex = f"({custom_regex}){img_format}"
|
3102
3104
|
|
3103
3105
|
print(f'regex mode:{metadata_type} regex:{regex}')
|
3104
3106
|
return regex
|
@@ -4507,6 +4509,76 @@ def _merge_cells_based_on_parasite_overlap(parasite_mask, cell_mask, nuclei_mask
|
|
4507
4509
|
relabeled_cell_mask, _ = label(cell_mask, return_num=True)
|
4508
4510
|
return relabeled_cell_mask.astype(np.uint16)
|
4509
4511
|
|
4512
|
+
def _merge_cells_without_nucleus(adj_cell_mask: np.ndarray, nuclei_mask: np.ndarray):
|
4513
|
+
"""
|
4514
|
+
Relabel any cell that lacks a nucleus to the ID of an adjacent
|
4515
|
+
cell that *does* contain a nucleus.
|
4516
|
+
|
4517
|
+
Parameters
|
4518
|
+
----------
|
4519
|
+
adj_cell_mask : np.ndarray
|
4520
|
+
Labelled (0 = background) cell mask after all other merging steps.
|
4521
|
+
nuclei_mask : np.ndarray
|
4522
|
+
Labelled (0 = background) nuclei mask.
|
4523
|
+
|
4524
|
+
Returns
|
4525
|
+
-------
|
4526
|
+
np.ndarray
|
4527
|
+
Updated cell mask with nucleus-free cells merged into
|
4528
|
+
neighbouring nucleus-bearing cells.
|
4529
|
+
"""
|
4530
|
+
out = adj_cell_mask.copy()
|
4531
|
+
|
4532
|
+
# ----------------------------------------------------------------- #
|
4533
|
+
# 1 — Identify which cell IDs contain a nucleus
|
4534
|
+
nuc_labels = np.unique(nuclei_mask[nuclei_mask > 0])
|
4535
|
+
|
4536
|
+
cells_with_nuc = set()
|
4537
|
+
for nuc_id in nuc_labels:
|
4538
|
+
labels, counts = np.unique(adj_cell_mask[nuclei_mask == nuc_id],
|
4539
|
+
return_counts=True)
|
4540
|
+
|
4541
|
+
# drop background (label 0) from *both* arrays
|
4542
|
+
keep = labels > 0
|
4543
|
+
labels = labels[keep]
|
4544
|
+
counts = counts[keep]
|
4545
|
+
|
4546
|
+
if labels.size: # at least one non-zero overlap
|
4547
|
+
cells_with_nuc.add(labels[np.argmax(counts)])
|
4548
|
+
|
4549
|
+
# ----------------------------------------------------------------- #
|
4550
|
+
# 2 — Build an adjacency map between neighbouring cell IDs
|
4551
|
+
# ----------------------------------------------------------------- #
|
4552
|
+
boundaries = find_boundaries(adj_cell_mask, mode="thick")
|
4553
|
+
adj_map = defaultdict(set)
|
4554
|
+
|
4555
|
+
ys, xs = np.where(boundaries)
|
4556
|
+
h, w = adj_cell_mask.shape
|
4557
|
+
for y, x in zip(ys, xs):
|
4558
|
+
src = adj_cell_mask[y, x]
|
4559
|
+
if src == 0:
|
4560
|
+
continue
|
4561
|
+
for dy in (-1, 0, 1):
|
4562
|
+
for dx in (-1, 0, 1):
|
4563
|
+
ny, nx = y + dy, x + dx
|
4564
|
+
if 0 <= ny < h and 0 <= nx < w:
|
4565
|
+
dst = adj_cell_mask[ny, nx]
|
4566
|
+
if dst != 0 and dst != src:
|
4567
|
+
adj_map[src].add(dst)
|
4568
|
+
|
4569
|
+
# ----------------------------------------------------------------- #
|
4570
|
+
# 3 — Relabel nucleus-free cells that touch nucleus-bearing neighbours
|
4571
|
+
# ----------------------------------------------------------------- #
|
4572
|
+
cells_no_nuc = set(np.unique(adj_cell_mask)) - {0} - cells_with_nuc
|
4573
|
+
for cell_id in cells_no_nuc:
|
4574
|
+
neighbours = adj_map.get(cell_id, set()) & cells_with_nuc
|
4575
|
+
if neighbours:
|
4576
|
+
# Choose the first nucleus-bearing neighbour deterministically
|
4577
|
+
target = sorted(neighbours)[0]
|
4578
|
+
out[out == cell_id] = target
|
4579
|
+
|
4580
|
+
return out.astype(np.uint16)
|
4581
|
+
|
4510
4582
|
def adjust_cell_masks(parasite_folder, cell_folder, nuclei_folder, overlap_threshold=5, perimeter_threshold=30):
|
4511
4583
|
|
4512
4584
|
"""
|
@@ -4541,12 +4613,12 @@ def adjust_cell_masks(parasite_folder, cell_folder, nuclei_folder, overlap_thres
|
|
4541
4613
|
parasite_mask = np.load(parasite_path, allow_pickle=True)
|
4542
4614
|
cell_mask = np.load(cell_path, allow_pickle=True)
|
4543
4615
|
nuclei_mask = np.load(nuclei_path, allow_pickle=True)
|
4616
|
+
|
4544
4617
|
# Merge and relabel cells
|
4545
4618
|
merged_cell_mask = _merge_cells_based_on_parasite_overlap(parasite_mask, cell_mask, nuclei_mask, overlap_threshold, perimeter_threshold)
|
4546
4619
|
|
4547
|
-
#
|
4548
|
-
|
4549
|
-
|
4620
|
+
#merged_cell_mask = _merge_cells_without_nucleus(merged_cell_mask, nuclei_mask)
|
4621
|
+
|
4550
4622
|
# Overwrite the original cell mask file with the merged result
|
4551
4623
|
np.save(cell_path, merged_cell_mask)
|
4552
4624
|
|
@@ -4836,7 +4908,7 @@ def correct_masks(src):
|
|
4836
4908
|
|
4837
4909
|
from .io import _load_and_concatenate_arrays
|
4838
4910
|
|
4839
|
-
cell_path = os.path.join(src,'
|
4911
|
+
cell_path = os.path.join(src,'masks', 'cell_mask_stack')
|
4840
4912
|
convert_and_relabel_masks(cell_path)
|
4841
4913
|
_load_and_concatenate_arrays(src, [0,1,2,3], 1, 0, 2)
|
4842
4914
|
|
@@ -5107,52 +5179,37 @@ def control_filelist(folder, mode='columnID', values=['01','02']):
|
|
5107
5179
|
return filtered_files
|
5108
5180
|
|
5109
5181
|
def rename_columns_in_db(db_path):
|
5110
|
-
|
5111
|
-
|
5112
|
-
|
5113
|
-
|
5114
|
-
|
5115
|
-
|
5116
|
-
|
5117
|
-
|
5118
|
-
|
5119
|
-
|
5120
|
-
|
5121
|
-
|
5122
|
-
|
5123
|
-
|
5124
|
-
|
5125
|
-
|
5126
|
-
|
5127
|
-
|
5128
|
-
|
5129
|
-
|
5130
|
-
|
5131
|
-
|
5132
|
-
|
5133
|
-
|
5134
|
-
|
5135
|
-
|
5136
|
-
|
5137
|
-
|
5138
|
-
|
5139
|
-
|
5140
|
-
|
5141
|
-
|
5142
|
-
# Copy data to the new table
|
5143
|
-
old_columns = ", ".join([f"`{col}`" for col in column_names])
|
5144
|
-
new_columns = ", ".join(
|
5145
|
-
[f"`{columns_to_rename.get(col, col)}`" for col in column_names]
|
5146
|
-
)
|
5147
|
-
cursor.execute(f"INSERT INTO `{table}` ({new_columns}) SELECT {old_columns} FROM `{temp_table}`")
|
5148
|
-
try:
|
5149
|
-
cursor.execute(f"DROP TABLE `{temp_table}`")
|
5150
|
-
except sqlite3.Error as e:
|
5151
|
-
print(f"Error while dropping temporary table '{temp_table}': {e}")
|
5152
|
-
|
5153
|
-
# After closing the 'with' block, run VACUUM outside of any transaction
|
5154
|
-
with sqlite3.connect(db_path) as conn:
|
5155
|
-
conn.execute("VACUUM;")
|
5182
|
+
# map old column names → new names
|
5183
|
+
rename_map = {
|
5184
|
+
'row': 'rowID',
|
5185
|
+
'column': 'columnID',
|
5186
|
+
'col': 'columnID',
|
5187
|
+
'plate': 'plateID',
|
5188
|
+
'field': 'fieldID',
|
5189
|
+
'channel': 'chanID',
|
5190
|
+
}
|
5191
|
+
|
5192
|
+
con = sqlite3.connect(db_path)
|
5193
|
+
cur = con.cursor()
|
5194
|
+
|
5195
|
+
# 1) get all user tables
|
5196
|
+
cur.execute("SELECT name FROM sqlite_master WHERE type='table';")
|
5197
|
+
tables = [row[0] for row in cur.fetchall()]
|
5198
|
+
|
5199
|
+
for table in tables:
|
5200
|
+
# 2) get column names only
|
5201
|
+
cur.execute(f"PRAGMA table_info(`{table}`);")
|
5202
|
+
cols = [row[1] for row in cur.fetchall()]
|
5203
|
+
|
5204
|
+
# 3) for each old→new, if the old exists and new does not, rename it
|
5205
|
+
for old, new in rename_map.items():
|
5206
|
+
if old in cols and new not in cols:
|
5207
|
+
sql = f"ALTER TABLE `{table}` RENAME COLUMN `{old}` TO `{new}`;"
|
5208
|
+
cur.execute(sql)
|
5209
|
+
print(f"Renamed `{table}`.`{old}` → `{new}`")
|
5210
|
+
|
5211
|
+
con.commit()
|
5212
|
+
con.close()
|
5156
5213
|
|
5157
5214
|
def group_feature_class(df, feature_groups=['cell', 'cytoplasm', 'nucleus', 'pathogen'], name='compartment'):
|
5158
5215
|
|
@@ -5189,7 +5246,7 @@ def delete_intermedeate_files(settings):
|
|
5189
5246
|
path_orig = os.path.join(settings['src'], 'orig')
|
5190
5247
|
path_stack = os.path.join(settings['src'], 'stack')
|
5191
5248
|
merged_stack = os.path.join(settings['src'], 'merged')
|
5192
|
-
path_norm_chan_stack = os.path.join(settings['src'], '
|
5249
|
+
path_norm_chan_stack = os.path.join(settings['src'], 'masks')
|
5193
5250
|
path_1 = os.path.join(settings['src'], '1')
|
5194
5251
|
path_2 = os.path.join(settings['src'], '2')
|
5195
5252
|
path_3 = os.path.join(settings['src'], '3')
|
@@ -5476,3 +5533,37 @@ def correct_metadata(df):
|
|
5476
5533
|
df = df.rename(columns={'field_name': 'fieldID'})
|
5477
5534
|
|
5478
5535
|
return df
|
5536
|
+
|
5537
|
+
def remove_outliers_by_group(df, group_col, value_col, method='iqr', threshold=1.5):
|
5538
|
+
"""
|
5539
|
+
Removes outliers from `value_col` within each group defined by `group_col`.
|
5540
|
+
|
5541
|
+
Parameters:
|
5542
|
+
df (pd.DataFrame): The input DataFrame.
|
5543
|
+
group_col (str): Column name to group by.
|
5544
|
+
value_col (str): Column containing values to check for outliers.
|
5545
|
+
method (str): 'iqr' or 'zscore'.
|
5546
|
+
threshold (float): Threshold multiplier for IQR (default 1.5) or z-score.
|
5547
|
+
|
5548
|
+
Returns:
|
5549
|
+
pd.DataFrame: A DataFrame with outliers removed.
|
5550
|
+
"""
|
5551
|
+
def iqr_filter(subdf):
|
5552
|
+
q1 = subdf[value_col].quantile(0.25)
|
5553
|
+
q3 = subdf[value_col].quantile(0.75)
|
5554
|
+
iqr = q3 - q1
|
5555
|
+
lower = q1 - threshold * iqr
|
5556
|
+
upper = q3 + threshold * iqr
|
5557
|
+
return subdf[(subdf[value_col] >= lower) & (subdf[value_col] <= upper)]
|
5558
|
+
|
5559
|
+
def zscore_filter(subdf):
|
5560
|
+
mean = subdf[value_col].mean()
|
5561
|
+
std = subdf[value_col].std()
|
5562
|
+
return subdf[(subdf[value_col] - mean).abs() <= threshold * std]
|
5563
|
+
|
5564
|
+
if method == 'iqr':
|
5565
|
+
return df.groupby(group_col, group_keys=False).apply(iqr_filter)
|
5566
|
+
elif method == 'zscore':
|
5567
|
+
return df.groupby(group_col, group_keys=False).apply(zscore_filter)
|
5568
|
+
else:
|
5569
|
+
raise ValueError("method must be 'iqr' or 'zscore'")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: spacr
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.9.1
|
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
|
@@ -10,75 +10,75 @@ Classifier: License :: OSI Approved :: MIT License
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
11
11
|
Description-Content-Type: text/x-rst
|
12
12
|
License-File: LICENSE
|
13
|
-
Requires-Dist: numpy<2.0,>=1.26.4
|
14
|
-
Requires-Dist: pandas<3.0,>=2.2.1
|
15
|
-
Requires-Dist: scipy<2.0,>=1.12.0
|
16
|
-
Requires-Dist: cellpose<4.0,>=3.0.6
|
17
|
-
Requires-Dist: scikit-image<1.0,>=0.22.0
|
18
|
-
Requires-Dist: scikit-learn<2.0,>=1.4.1
|
19
|
-
Requires-Dist: scikit-posthocs<0.20,>=0.10.0
|
20
|
-
Requires-Dist: mahotas<2.0,>=1.4.13
|
21
|
-
Requires-Dist: btrack<1.0,>=0.6.5
|
22
|
-
Requires-Dist: trackpy<1.0,>=0.6.2
|
23
|
-
Requires-Dist: statsmodels<1.0,>=0.14.1
|
24
|
-
Requires-Dist: shap<1.0,>=0.45.0
|
25
|
-
Requires-Dist: torch<3.0,>=2.0
|
26
|
-
Requires-Dist: torchvision<1.0,>=0.1
|
27
|
-
Requires-Dist: torch-geometric<3.0,>=2.5
|
28
|
-
Requires-Dist: torchcam<1.0,>=0.4.0
|
29
|
-
Requires-Dist: transformers<5.0,>=4.45.2
|
30
|
-
Requires-Dist: segmentation-models-pytorch>=0.3.3
|
31
|
-
Requires-Dist: monai>=1.3.0
|
32
|
-
Requires-Dist: captum<1.0,>=0.7.0
|
33
|
-
Requires-Dist: seaborn<1.0,>=0.13.2
|
34
|
-
Requires-Dist: matplotlib<4.0,>=3.8.3
|
35
|
-
Requires-Dist: matplotlib-venn<2.0,>=1.1
|
36
|
-
Requires-Dist: adjustText<2.0,>=1.2.0
|
37
|
-
Requires-Dist: bottleneck<2.0,>=1.3.6
|
38
|
-
Requires-Dist: numexpr<3.0,>=2.8.4
|
39
|
-
Requires-Dist: opencv-python-headless<5.0,>=4.9.0.80
|
40
|
-
Requires-Dist: pillow<11.0,>=10.2.0
|
41
|
-
Requires-Dist: tifffile>=2023.4.12
|
42
|
-
Requires-Dist: nd2reader<4.0,>=3.3.0
|
13
|
+
Requires-Dist: numpy <2.0,>=1.26.4
|
14
|
+
Requires-Dist: pandas <3.0,>=2.2.1
|
15
|
+
Requires-Dist: scipy <2.0,>=1.12.0
|
16
|
+
Requires-Dist: cellpose <4.0,>=3.0.6
|
17
|
+
Requires-Dist: scikit-image <1.0,>=0.22.0
|
18
|
+
Requires-Dist: scikit-learn <2.0,>=1.4.1
|
19
|
+
Requires-Dist: scikit-posthocs <0.20,>=0.10.0
|
20
|
+
Requires-Dist: mahotas <2.0,>=1.4.13
|
21
|
+
Requires-Dist: btrack <1.0,>=0.6.5
|
22
|
+
Requires-Dist: trackpy <1.0,>=0.6.2
|
23
|
+
Requires-Dist: statsmodels <1.0,>=0.14.1
|
24
|
+
Requires-Dist: shap <1.0,>=0.45.0
|
25
|
+
Requires-Dist: torch <3.0,>=2.0
|
26
|
+
Requires-Dist: torchvision <1.0,>=0.1
|
27
|
+
Requires-Dist: torch-geometric <3.0,>=2.5
|
28
|
+
Requires-Dist: torchcam <1.0,>=0.4.0
|
29
|
+
Requires-Dist: transformers <5.0,>=4.45.2
|
30
|
+
Requires-Dist: segmentation-models-pytorch >=0.3.3
|
31
|
+
Requires-Dist: monai >=1.3.0
|
32
|
+
Requires-Dist: captum <1.0,>=0.7.0
|
33
|
+
Requires-Dist: seaborn <1.0,>=0.13.2
|
34
|
+
Requires-Dist: matplotlib <4.0,>=3.8.3
|
35
|
+
Requires-Dist: matplotlib-venn <2.0,>=1.1
|
36
|
+
Requires-Dist: adjustText <2.0,>=1.2.0
|
37
|
+
Requires-Dist: bottleneck <2.0,>=1.3.6
|
38
|
+
Requires-Dist: numexpr <3.0,>=2.8.4
|
39
|
+
Requires-Dist: opencv-python-headless <5.0,>=4.9.0.80
|
40
|
+
Requires-Dist: pillow <11.0,>=10.2.0
|
41
|
+
Requires-Dist: tifffile >=2023.4.12
|
42
|
+
Requires-Dist: nd2reader <4.0,>=3.3.0
|
43
43
|
Requires-Dist: czifile
|
44
|
-
Requires-Dist: pylibCZIrw<6.0,>=5.0.0
|
44
|
+
Requires-Dist: pylibCZIrw <6.0,>=5.0.0
|
45
45
|
Requires-Dist: aicspylibczi
|
46
46
|
Requires-Dist: readlif
|
47
|
-
Requires-Dist: imageio<3.0,>=2.34.0
|
48
|
-
Requires-Dist: pingouin<1.0,>=0.5.5
|
49
|
-
Requires-Dist: umap-learn<1.0,>=0.5.6
|
50
|
-
Requires-Dist: ttkthemes<4.0,>=3.2.2
|
51
|
-
Requires-Dist: xgboost<3.0,>=2.0.3
|
52
|
-
Requires-Dist: PyWavelets<2.0,>=1.6.0
|
53
|
-
Requires-Dist: ttf-opensans>=2020.10.30
|
54
|
-
Requires-Dist: customtkinter<6.0,>=5.2.2
|
55
|
-
Requires-Dist: biopython<2.0,>=1.80
|
56
|
-
Requires-Dist: lxml<6.0,>=5.1.0
|
57
|
-
Requires-Dist: psutil<6.0,>=5.9.8
|
58
|
-
Requires-Dist: gputil<2.0,>=1.4.0
|
59
|
-
Requires-Dist: gpustat<2.0,>=1.1.1
|
60
|
-
Requires-Dist: pyautogui<1.0,>=0.9.54
|
61
|
-
Requires-Dist: tables<4.0,>=3.8.0
|
62
|
-
Requires-Dist: rapidfuzz<4.0,>=3.9
|
63
|
-
Requires-Dist: keyring<16.0,>=15.1
|
64
|
-
Requires-Dist: screeninfo<1.0,>=0.8.1
|
65
|
-
Requires-Dist: fastremap>=1.14.1
|
66
|
-
Requires-Dist: pytz>=2023.3.post1
|
67
|
-
Requires-Dist: tqdm>=4.65.0
|
68
|
-
Requires-Dist: wandb>=0.16.2
|
69
|
-
Requires-Dist: openai<2.0,>=1.50.2
|
47
|
+
Requires-Dist: imageio <3.0,>=2.34.0
|
48
|
+
Requires-Dist: pingouin <1.0,>=0.5.5
|
49
|
+
Requires-Dist: umap-learn <1.0,>=0.5.6
|
50
|
+
Requires-Dist: ttkthemes <4.0,>=3.2.2
|
51
|
+
Requires-Dist: xgboost <3.0,>=2.0.3
|
52
|
+
Requires-Dist: PyWavelets <2.0,>=1.6.0
|
53
|
+
Requires-Dist: ttf-opensans >=2020.10.30
|
54
|
+
Requires-Dist: customtkinter <6.0,>=5.2.2
|
55
|
+
Requires-Dist: biopython <2.0,>=1.80
|
56
|
+
Requires-Dist: lxml <6.0,>=5.1.0
|
57
|
+
Requires-Dist: psutil <6.0,>=5.9.8
|
58
|
+
Requires-Dist: gputil <2.0,>=1.4.0
|
59
|
+
Requires-Dist: gpustat <2.0,>=1.1.1
|
60
|
+
Requires-Dist: pyautogui <1.0,>=0.9.54
|
61
|
+
Requires-Dist: tables <4.0,>=3.8.0
|
62
|
+
Requires-Dist: rapidfuzz <4.0,>=3.9
|
63
|
+
Requires-Dist: keyring <16.0,>=15.1
|
64
|
+
Requires-Dist: screeninfo <1.0,>=0.8.1
|
65
|
+
Requires-Dist: fastremap >=1.14.1
|
66
|
+
Requires-Dist: pytz >=2023.3.post1
|
67
|
+
Requires-Dist: tqdm >=4.65.0
|
68
|
+
Requires-Dist: wandb >=0.16.2
|
69
|
+
Requires-Dist: openai <2.0,>=1.50.2
|
70
70
|
Requires-Dist: gdown
|
71
|
-
Requires-Dist: IPython<9.0,>=8.18.1
|
71
|
+
Requires-Dist: IPython <9.0,>=8.18.1
|
72
72
|
Requires-Dist: ipykernel
|
73
|
-
Requires-Dist: ipywidgets<9.0,>=8.1.2
|
74
|
-
Requires-Dist: brokenaxes<1.0,>=0.6.2
|
75
|
-
Requires-Dist: huggingface-hub<0.25,>=0.24.0
|
73
|
+
Requires-Dist: ipywidgets <9.0,>=8.1.2
|
74
|
+
Requires-Dist: brokenaxes <1.0,>=0.6.2
|
75
|
+
Requires-Dist: huggingface-hub <0.25,>=0.24.0
|
76
76
|
Provides-Extra: dev
|
77
|
-
Requires-Dist: pytest<3.11,>=3.9; extra ==
|
77
|
+
Requires-Dist: pytest <3.11,>=3.9 ; extra == 'dev'
|
78
78
|
Provides-Extra: full
|
79
|
-
Requires-Dist: opencv-python; extra ==
|
79
|
+
Requires-Dist: opencv-python ; extra == 'full'
|
80
80
|
Provides-Extra: headless
|
81
|
-
Requires-Dist: opencv-python-headless; extra ==
|
81
|
+
Requires-Dist: opencv-python-headless ; extra == 'headless'
|
82
82
|
|
83
83
|
.. |Documentation Status| image:: https://readthedocs.org/projects/spacr/badge/?version=latest
|
84
84
|
:target: https://einarolafsson.github.io/spacr
|
@@ -0,0 +1,109 @@
|
|
1
|
+
spacr/__init__.py,sha256=EoGInYks0M4foZElYNhksrQK6aEO1au7cncWexWNhRw,1376
|
2
|
+
spacr/__main__.py,sha256=H4MjaMF9ohZL6xfl1kTxVn1Nt_vEhhZArENMMBv8f4E,77
|
3
|
+
spacr/app_annotate.py,sha256=W9eLPa_LZIvXsXx_-0iDFEU938LBDvRy6prXo0qF4KQ,2533
|
4
|
+
spacr/app_classify.py,sha256=urTP_wlZ58hSyM5a19slYlBxN0PdC-9-ga0hvq8CGWc,165
|
5
|
+
spacr/app_make_masks.py,sha256=pqDhRpluiHZz-kPX2Zh_KbYe4TsU43qYBa_7f-rsjpw,1694
|
6
|
+
spacr/app_mask.py,sha256=l-dBY8ftzCMdDe6-pXc2Nh_u-idNL9G7UOARiLJBtds,153
|
7
|
+
spacr/app_measure.py,sha256=_K7APYIeOKpV6e_LcqabBjvEi7mfq9Fch8175x1x0k8,162
|
8
|
+
spacr/app_sequencing.py,sha256=DjG26jy4cpddnV8WOOAIiExtOe9MleVMY4MFa5uTo5w,157
|
9
|
+
spacr/app_umap.py,sha256=ZWAmf_OsIKbYvolYuWPMYhdlVe-n2CADoJulAizMiEo,153
|
10
|
+
spacr/chat_bot.py,sha256=n3Fhqg3qofVXHmh3H9sUcmfYy9MmgRnr48663MVdY9E,1244
|
11
|
+
spacr/core.py,sha256=w4E3Pg-ZnA8BOK0iUMTjiNO0GeR5YCEs8fUTbESzqjY,47392
|
12
|
+
spacr/deep_spacr.py,sha256=055tIo3WP3elGFiIuSZaLURgu2XyUDxAdbw5ezASEqM,54526
|
13
|
+
spacr/gui.py,sha256=NhMh96KoArrSAaJBV6PhDQpIC1cQpxgb6SclhRbYG8s,8122
|
14
|
+
spacr/gui_core.py,sha256=m-AYUmaSXqsGFj9EzPf4fp1irZGN-X-21S4FBO8PoXc,52727
|
15
|
+
spacr/gui_elements.py,sha256=5a3BOpctBPklsT1NungqS72h1Bg1FArUndE0OfvWD8Y,152646
|
16
|
+
spacr/gui_utils.py,sha256=vv_uBOA0n-04KCCicYHhNt3sRbm0IPLM5r8QX5EkJ1Q,40867
|
17
|
+
spacr/io.py,sha256=SYLhupKnOJJscNSGE4N67E32-ywhwrjRccIfZrL38Uk,157966
|
18
|
+
spacr/logger.py,sha256=lJhTqt-_wfAunCPl93xE65Wr9Y1oIHJWaZMjunHUeIw,1538
|
19
|
+
spacr/measure.py,sha256=Z3u4BU5RzcY82IZuboQ0OsxuXaPVwOlH65Rw6FrL5z4,55045
|
20
|
+
spacr/mediar.py,sha256=p0F515eFbm6_rePSnChsgqrgH-H5Sr_3zWrghtOnAUg,14863
|
21
|
+
spacr/ml.py,sha256=XCRZeX7UkbMctQICIoskeWVx8CCmmCoHNauUOAkfFq0,91692
|
22
|
+
spacr/openai.py,sha256=5vBZ3Jl2llYcW3oaTEXgdyCB2aJujMUIO5K038z7w_A,1246
|
23
|
+
spacr/plot.py,sha256=M2w9ytR8iMFtsVPhmQ5tzIWTQDmbtCzs1-7hALUIQtg,167339
|
24
|
+
spacr/sequencing.py,sha256=EY12RdW5QRKpHDRQCw1QoAlxCq8FK2v6WoVa5uuDBXQ,26745
|
25
|
+
spacr/settings.py,sha256=Fd5RbNxjBmWG6bCCDprVvy8dTjBzSK7L71k_-mJXBsk,87380
|
26
|
+
spacr/sim.py,sha256=1xKhXimNU3ukzIw-3l9cF3Znc_brW8h20yv8fSTzvss,71173
|
27
|
+
spacr/sp_stats.py,sha256=mbhwsyIqt5upsSD346qGjdCw7CFBa0tIS7zHU9e0jNI,9536
|
28
|
+
spacr/spacr_cellpose.py,sha256=RBHMs2vwXcfkj0xqAULpALyzJYXddSRycgZSzmwI7v0,14755
|
29
|
+
spacr/submodules.py,sha256=Z2i4kv_rWdxqoXsOKCF7BaSXtvaCZB69Ow8_FQBnZsY,83093
|
30
|
+
spacr/timelapse.py,sha256=-5ZupTsCCpbenIQ2zsUmnwXh45B82fO-gPrSXOxu2s8,42980
|
31
|
+
spacr/toxo.py,sha256=GoNfgyH-NJx3WOzNQPgzODir7Jp65fs7UM46XpzcrUo,26056
|
32
|
+
spacr/utils.py,sha256=RA4V1EDXsU_Gs6QgplvOA4lVIRFQJVJ1JAzQsaunHiU,234010
|
33
|
+
spacr/version.py,sha256=axH5tnGwtgSnJHb5IDhiu4Zjk5GhLyAEDRe-rnaoFOA,409
|
34
|
+
spacr/resources/data/lopit.csv,sha256=ERI5f9W8RdJGiSx_khoaylD374f8kmvLia1xjhD_mII,4421709
|
35
|
+
spacr/resources/data/toxoplasma_metadata.csv,sha256=9TXx0VlClDHAxQmaLhoklE8NuETduXaGHZjhR_6lZfs,2969409
|
36
|
+
spacr/resources/font/open_sans/OFL.txt,sha256=bGMoWBRrE2RcdzDiuYiB8A9OVFlJ0sA2imWwce2DAdo,4484
|
37
|
+
"spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf",sha256=QSoWv9h46CRX_fdlqFM3O2d3-PF3R1srnb4zUezcLm0,580280
|
38
|
+
"spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf",sha256=E3RLvAefD0kuT7OxShXSQrjZYA-qzUI9WM35N_6nzms,529700
|
39
|
+
spacr/resources/font/open_sans/README.txt,sha256=-ZB4ocy30PWpgUpWm_djuTyBe_NiE1yEFG7H-zODBbA,3518
|
40
|
+
spacr/resources/font/open_sans/static/OpenSans-Bold.ttf,sha256=vHPEXlgQoJcevq7062w13shGB9vgLaZ1f59D2Vi22l8,130860
|
41
|
+
spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf,sha256=tiGd9Fy-5vh25rKPZoNI4YB7H7mtEY6n1ocEHw0zI4Q,136360
|
42
|
+
spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf,sha256=DAeBB3dmNBMRYr5Go4JFOZBAwr7MSV6T1p2bbt1lqY0,131244
|
43
|
+
spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf,sha256=oDRGYhCusJ9__bySUKzNH1w-L7isv9O-iqFUmT7EPZs,136928
|
44
|
+
spacr/resources/font/open_sans/static/OpenSans-Italic.ttf,sha256=XqvWf-PYtbXu5kUE6p5KXvdmW2Q1d-8Rfzwy_aZ80p8,136604
|
45
|
+
spacr/resources/font/open_sans/static/OpenSans-Light.ttf,sha256=RurTiXjijzKtfcENRn7-jYtXhv-YAgw3GKKW-I738cw,130804
|
46
|
+
spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf,sha256=TqxQLBDa9mCOU-fbhteXaYkDc-u9VHKle7y3V4m8URA,136896
|
47
|
+
spacr/resources/font/open_sans/static/OpenSans-Medium.ttf,sha256=KrFWKUJKzobUKdvA5ae-sw0q89uZiisDpxYB7mllwzQ,130976
|
48
|
+
spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf,sha256=v0NvTDTSySHQ8tSZfnhUBQpg_qqJu6zGBK6JatJUyos,136796
|
49
|
+
spacr/resources/font/open_sans/static/OpenSans-Regular.ttf,sha256=ZTBIAnfaYu_eBH6ybnin5TLRz67skWA-aNY4drlmnw0,130832
|
50
|
+
spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf,sha256=5gMTXMOxIAxyYLNPN_nLHyF4pCs2MDfiah4YJ2q3i_A,130760
|
51
|
+
spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf,sha256=sb8sWCggtXA9vNM5tdyXI1wUUYXQ-ruwnCJO-HIVJms,136724
|
52
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf,sha256=CIWGlNIDGR-928YD8NguGNEEwnlBYir6S4_wzKyhK2A,130372
|
53
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf,sha256=dd_-wIDY3AM6l5T_JTYUo4D1H34Tmq5I2vEuvpqkrsQ,136240
|
54
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf,sha256=98s7bdAITVn2b6nlI4tLuBkq1pSfmaFnPJELgyripT4,130812
|
55
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf,sha256=Yh7na-RGr-rH4T_uNLv6cGefmQfyALsb1Qrf4c5xp30,136652
|
56
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf,sha256=K8gjp2YPH9NLDCpX3ZrNRv7fCser4yoUbS6JXojzkQI,136588
|
57
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf,sha256=wcbhJiAM7-BGpJ82qwIMDcyEQJVnGXcTJzlFmAR4etY,130472
|
58
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf,sha256=4eYPQJMjKmJ_QuIVuP6hQag4mVYxg5wVJFV8h28zd_c,136760
|
59
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf,sha256=acH5RzYjKjt9ePPfhjwvdWHau9FxkgVNCCVzxUBUM6Y,130520
|
60
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf,sha256=vL_D1ucljgIr9sz4FSoWkg38QLVbxMglTBX0_01o3Vo,136700
|
61
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf,sha256=9ZSB0mD3qvxsRpbdhgjMvhJxTJjmT41hQi7nWvuUl7U,130492
|
62
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf,sha256=F5ld4DVfj5bpv37MfcrisKrdWosy6C85CVibgmFpMhw,130524
|
63
|
+
spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf,sha256=bDVD8CkRaVOD96JJBURtnawSs8vspPKCNsBHW9SCBk0,136792
|
64
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf,sha256=saQFKWcgcpqcyyIV744l-gMfKKdKI6eC7gA7Eg2SqIc,131168
|
65
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf,sha256=wTHNHKW51uSs5WjuDM881pe51U25ezzIg4pKiQkkksE,137104
|
66
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf,sha256=NWASkgz4LTrSPDAipCY41ul2Z5XDMeUleDE8C7Nt6RI,131744
|
67
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf,sha256=PZSxtpkBYq79eWqnTh4KcwtaoAd_QFA6AYfdtvZI-bc,137584
|
68
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf,sha256=bHPr5WeX4zrP-VaVVHquxysTBlnRog8lfrh2z2ydf1g,137000
|
69
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf,sha256=ks1IgCjNng7ksZNOSKaqBefxvwTGXrgQTySGy0nfIJY,131128
|
70
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf,sha256=-Xa1RlfcMxM1QYpjMNbNRv-a5ka8m5o5h-3P7gsMoRs,137220
|
71
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf,sha256=a-MrWOsGFqIGqpQXeaZyxruXqU3hMC2eHpWNa4wq8RE,130976
|
72
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf,sha256=vJfOBlOVmx_MXbkgSdxHdzSSeALkd253C4Srr84Qvq8,137068
|
73
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf,sha256=skg4DCl15zL9ZD4MAL9fOt4WjonKYBUOMj46ItSAe5Q,130848
|
74
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf,sha256=uCiR97jg6sUHtGKVPNtJEg1zZG5Y9ArQ-raqBGjaeGg,130856
|
75
|
+
spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf,sha256=a5-0oOIrtJltQRa64uFKCdtcjzPvEJ71f_cYavG2i3E,137132
|
76
|
+
spacr/resources/icons/abort.png,sha256=avtIRT7aCJsdZ1WnY_rZStm6cCji5bYPLnlptdcTNcM,6583
|
77
|
+
spacr/resources/icons/annotate.png,sha256=GFgh7DiUMwPG_-xE6W1qU8V_qzSwBi1xKenfoaQxeFA,15495
|
78
|
+
spacr/resources/icons/cellpose_all.png,sha256=HVWOIOBF8p3-On-2UahwMyQXp7awsoC5yWExU1ahDag,20271
|
79
|
+
spacr/resources/icons/cellpose_masks.png,sha256=HVWOIOBF8p3-On-2UahwMyQXp7awsoC5yWExU1ahDag,20271
|
80
|
+
spacr/resources/icons/classify.png,sha256=-iv4sqAwUVJO3CG6fHKHf3_BB0s-I2i4prg-iR7dSBM,35897
|
81
|
+
spacr/resources/icons/convert.png,sha256=vLyTkQeUZ9q-pirhtZeXDq3-DzfjoPMjLlgKl5Wv6R0,7069
|
82
|
+
spacr/resources/icons/default.png,sha256=KoNhaSHukO4wDyivyYEgSbb5mGj-sAxmhKikLLtNpWs,20341
|
83
|
+
spacr/resources/icons/dna_matrix.mp4,sha256=NegOQkn4q4kHhFgqcIX2dd58wVytBtnkmbgg0ZegL8U,23462876
|
84
|
+
spacr/resources/icons/download.png,sha256=1nUoWRaTc4vIsK6gompdeqk0cIv2GdH-gCNHaEBX6Mc,20467
|
85
|
+
spacr/resources/icons/logo.pdf,sha256=VB4cS41V3VV_QxD7l6CwdQKQiYLErugLBxWoCoxjQU0,377925
|
86
|
+
spacr/resources/icons/logo_spacr.png,sha256=qG3e3bdrAefhl1281rfo0R2XP0qA-c-oaBCXjxMGXkw,42587
|
87
|
+
spacr/resources/icons/logo_spacr_1.png,sha256=g9y2ZmnV3hab8r1idDfytm8AaHbBiQdu_93Jd7YKzwA,610892
|
88
|
+
spacr/resources/icons/make_masks.png,sha256=iB4kaTgbgyygSJSNstVKhRIXKSgWYkeh7Gt3ox-kWDI,42493
|
89
|
+
spacr/resources/icons/map_barcodes.png,sha256=ED6yCopk3hP7tICSvT8U_qA1bOOb0WHqmxVkmRxnbtE,7896
|
90
|
+
spacr/resources/icons/mask.png,sha256=DcBes-3UJ7XjRfj_P4RttRp680ZKZeH9a-DSk7bIF5U,37658
|
91
|
+
spacr/resources/icons/measure.png,sha256=Gd-dlN-3Z8D_XngJnChNme8D63KEJMFs_cBv7wT2vOY,40938
|
92
|
+
spacr/resources/icons/ml_analyze.png,sha256=Wc9a_LpG2XffiMfXxn0yUmGP40IXzlAV7bHXQf7m_2o,15754
|
93
|
+
spacr/resources/icons/plaque.png,sha256=NWt7C8thV0iQ1YuRvW_NfUJSFG6XK_iGpoW0R9Xfsyc,45033
|
94
|
+
spacr/resources/icons/recruitment.png,sha256=dlVh2ebV_f3rhRFBiL0hDtlUeBSIeg0d4vny8A8IAdo,25067
|
95
|
+
spacr/resources/icons/regression.png,sha256=WIrKY4fSojBOCDkHno4Qb-KH7jcHh6G67dOKzczaU1I,42267
|
96
|
+
spacr/resources/icons/run.png,sha256=ICzyAvsRBCXNAbdn5N3PxCxxVyqxkfC4zOI5Zc8vbxQ,8974
|
97
|
+
spacr/resources/icons/sequencing.png,sha256=P9E_Y76ZysWMKst3_hAw-_4F510XPW1l1TsDElVzt4o,17775
|
98
|
+
spacr/resources/icons/settings.png,sha256=y5Ow5BxJDDsrqom0VNbOMDGGUs6odxbSMDy6y4r_F0w,22269
|
99
|
+
spacr/resources/icons/train_cellpose.png,sha256=_PZ_R_B6azuUACmscScAkugmgLZvCPKQFGIAsszqNLk,3858
|
100
|
+
spacr/resources/icons/umap.png,sha256=dOLF3DeLYy9k0nkUybiZMe1wzHQwLJFRmgccppw-8bI,27457
|
101
|
+
spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif,sha256=Tl0ZUfZ_AYAbu0up_nO0tPRtF1BxXhWQ3T3pURBCCRo,7958528
|
102
|
+
spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif,sha256=m8N-V71rA1TT4dFlENNg8s0Q0YEXXs8slIn7yObmZJQ,7958528
|
103
|
+
spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif,sha256=Pbhk7xn-KUP6RSIhJsxQcrHFImBm3GEpLkzx7WOc-5M,7958528
|
104
|
+
spacr-0.9.1.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
|
105
|
+
spacr-0.9.1.dist-info/METADATA,sha256=Lh02YCW7LiHlegDZDIIascNP_XrFD421ewydkNNjjSY,6208
|
106
|
+
spacr-0.9.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
107
|
+
spacr-0.9.1.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
|
108
|
+
spacr-0.9.1.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
|
109
|
+
spacr-0.9.1.dist-info/RECORD,,
|
spacr/resources/MEDIAR/LICENSE
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
MIT License
|
2
|
-
|
3
|
-
Copyright (c) 2022 opcrisis
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
13
|
-
copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
-
SOFTWARE.
|