spacr 0.3.30__py3-none-any.whl → 0.3.31__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- spacr/app_annotate.py +1 -2
- spacr/gui_elements.py +72 -49
- spacr/gui_utils.py +4 -43
- spacr/plot.py +0 -2
- spacr/settings.py +1 -0
- {spacr-0.3.30.dist-info → spacr-0.3.31.dist-info}/METADATA +1 -1
- {spacr-0.3.30.dist-info → spacr-0.3.31.dist-info}/RECORD +11 -11
- {spacr-0.3.30.dist-info → spacr-0.3.31.dist-info}/LICENSE +0 -0
- {spacr-0.3.30.dist-info → spacr-0.3.31.dist-info}/WHEEL +0 -0
- {spacr-0.3.30.dist-info → spacr-0.3.31.dist-info}/entry_points.txt +0 -0
- {spacr-0.3.30.dist-info → spacr-0.3.31.dist-info}/top_level.txt +0 -0
spacr/app_annotate.py
CHANGED
@@ -20,7 +20,7 @@ def initiate_annotation_app(parent_frame):
|
|
20
20
|
settings['img_size'] = list(map(int, settings['img_size'].split(','))) # Convert string to list of integers
|
21
21
|
settings['percentiles'] = list(map(int, settings['percentiles'].split(','))) # Convert string to list of integers
|
22
22
|
settings['normalize'] = settings['normalize'].lower() == 'true'
|
23
|
-
|
23
|
+
settings['normalize_channels'] = settings['normalize_channels'].split(',')
|
24
24
|
try:
|
25
25
|
settings['measurement'] = settings['measurement'].split(',') if settings['measurement'] else None
|
26
26
|
settings['threshold'] = None if settings['threshold'].lower() == 'none' else int(settings['threshold'])
|
@@ -38,7 +38,6 @@ def initiate_annotation_app(parent_frame):
|
|
38
38
|
settings[key] = None
|
39
39
|
|
40
40
|
settings_window.destroy()
|
41
|
-
|
42
41
|
annotate_app(parent_frame, settings)
|
43
42
|
|
44
43
|
start_button = spacrButton(settings_window, text="annotate", command=start_annotation_app, show_text=False)
|
spacr/gui_elements.py
CHANGED
@@ -20,6 +20,47 @@ from tkinter import ttk, scrolledtext
|
|
20
20
|
|
21
21
|
fig = None
|
22
22
|
|
23
|
+
def create_menu_bar(root):
|
24
|
+
from .gui import initiate_root
|
25
|
+
gui_apps = {
|
26
|
+
"Mask": lambda: initiate_root(root, settings_type='mask'),
|
27
|
+
"Measure": lambda: initiate_root(root, settings_type='measure'),
|
28
|
+
"Annotate": lambda: initiate_root(root, settings_type='annotate'),
|
29
|
+
"Make Masks": lambda: initiate_root(root, settings_type='make_masks'),
|
30
|
+
"Classify": lambda: initiate_root(root, settings_type='classify'),
|
31
|
+
"Umap": lambda: initiate_root(root, settings_type='umap'),
|
32
|
+
"Train Cellpose": lambda: initiate_root(root, settings_type='train_cellpose'),
|
33
|
+
"ML Analyze": lambda: initiate_root(root, settings_type='ml_analyze'),
|
34
|
+
"Cellpose Masks": lambda: initiate_root(root, settings_type='cellpose_masks'),
|
35
|
+
"Cellpose All": lambda: initiate_root(root, settings_type='cellpose_all'),
|
36
|
+
"Map Barcodes": lambda: initiate_root(root, settings_type='map_barcodes'),
|
37
|
+
"Regression": lambda: initiate_root(root, settings_type='regression'),
|
38
|
+
"Activation": lambda: initiate_root(root, settings_type='activation'),
|
39
|
+
"Recruitment": lambda: initiate_root(root, settings_type='recruitment')
|
40
|
+
}
|
41
|
+
|
42
|
+
# Create the menu bar
|
43
|
+
menu_bar = tk.Menu(root, bg="#008080", fg="white")
|
44
|
+
|
45
|
+
# Create a "SpaCr Applications" menu
|
46
|
+
app_menu = tk.Menu(menu_bar, tearoff=0, bg="#008080", fg="white")
|
47
|
+
menu_bar.add_cascade(label="SpaCr Applications", menu=app_menu)
|
48
|
+
|
49
|
+
# Add options to the "SpaCr Applications" menu
|
50
|
+
for app_name, app_func in gui_apps.items():
|
51
|
+
app_menu.add_command(
|
52
|
+
label=app_name,
|
53
|
+
command=app_func
|
54
|
+
)
|
55
|
+
|
56
|
+
# Add a separator and an exit option
|
57
|
+
app_menu.add_separator()
|
58
|
+
app_menu.add_command(label="Help", command=lambda: webbrowser.open("https://spacr.readthedocs.io/en/latest/?badge=latest"))
|
59
|
+
app_menu.add_command(label="Exit", command=root.quit)
|
60
|
+
|
61
|
+
# Configure the menu for the root window
|
62
|
+
root.config(menu=menu_bar)
|
63
|
+
|
23
64
|
def set_element_size():
|
24
65
|
|
25
66
|
screen_width, screen_height = pyautogui.size()
|
@@ -2122,7 +2163,7 @@ class ModifyMaskApp:
|
|
2122
2163
|
self.update_display()
|
2123
2164
|
|
2124
2165
|
class AnnotateApp:
|
2125
|
-
def __init__(self, root, db_path, src, image_type=None, channels=None, image_size=200, annotation_column='annotate', normalize=False, percentiles=(1, 99), measurement=None, threshold=None):
|
2166
|
+
def __init__(self, root, db_path, src, image_type=None, channels=None, image_size=200, annotation_column='annotate', normalize=False, percentiles=(1, 99), measurement=None, threshold=None, normalize_channels=None):
|
2126
2167
|
self.root = root
|
2127
2168
|
self.db_path = db_path
|
2128
2169
|
self.src = src
|
@@ -2148,7 +2189,8 @@ class AnnotateApp:
|
|
2148
2189
|
self.update_queue = Queue()
|
2149
2190
|
self.measurement = measurement
|
2150
2191
|
self.threshold = threshold
|
2151
|
-
|
2192
|
+
self.normalize_channels = normalize_channels
|
2193
|
+
print('self.normalize_channels',self.normalize_channels)
|
2152
2194
|
style_out = set_dark_style(ttk.Style())
|
2153
2195
|
self.font_loader = style_out['font_loader']
|
2154
2196
|
self.font_size = style_out['font_size']
|
@@ -2157,7 +2199,6 @@ class AnnotateApp:
|
|
2157
2199
|
self.active_color = style_out['active_color']
|
2158
2200
|
self.inactive_color = style_out['inactive_color']
|
2159
2201
|
|
2160
|
-
|
2161
2202
|
if self.font_loader:
|
2162
2203
|
self.font_style = self.font_loader.get_font(size=self.font_size)
|
2163
2204
|
else:
|
@@ -2356,14 +2397,26 @@ class AnnotateApp:
|
|
2356
2397
|
def load_single_image(self, path_annotation_tuple):
|
2357
2398
|
path, annotation = path_annotation_tuple
|
2358
2399
|
img = Image.open(path)
|
2359
|
-
img = self.normalize_image(img, self.normalize, self.percentiles)
|
2400
|
+
img = self.normalize_image(img, self.normalize, self.percentiles, self.normalize_channels)
|
2360
2401
|
img = img.convert('RGB')
|
2361
2402
|
img = self.filter_channels(img)
|
2362
2403
|
img = img.resize(self.image_size)
|
2363
2404
|
return img, annotation
|
2364
|
-
|
2405
|
+
|
2365
2406
|
@staticmethod
|
2366
|
-
def normalize_image(img, normalize=False, percentiles=(1, 99)):
|
2407
|
+
def normalize_image(img, normalize=False, percentiles=(1, 99), normalize_channels=None):
|
2408
|
+
"""
|
2409
|
+
Normalize an image based on specific channels (R, G, B).
|
2410
|
+
|
2411
|
+
Args:
|
2412
|
+
img (PIL.Image or np.array): Input image.
|
2413
|
+
normalize (bool): Whether to normalize the image or not.
|
2414
|
+
percentiles (tuple): Percentiles to use for intensity rescaling.
|
2415
|
+
normalize_channels (list): List of channels to normalize. E.g., ['r', 'g', 'b'], ['r'], ['g'], etc.
|
2416
|
+
|
2417
|
+
Returns:
|
2418
|
+
PIL.Image: Normalized image.
|
2419
|
+
"""
|
2367
2420
|
img_array = np.array(img)
|
2368
2421
|
|
2369
2422
|
if normalize:
|
@@ -2371,13 +2424,23 @@ class AnnotateApp:
|
|
2371
2424
|
p2, p98 = np.percentile(img_array, percentiles)
|
2372
2425
|
img_array = rescale_intensity(img_array, in_range=(p2, p98), out_range=(0, 255))
|
2373
2426
|
else: # Color image or multi-channel image
|
2374
|
-
for
|
2375
|
-
|
2376
|
-
|
2427
|
+
# Create a map for the color channels
|
2428
|
+
channel_map = {'r': 0, 'g': 1, 'b': 2}
|
2429
|
+
|
2430
|
+
# If normalize_channels is not specified, normalize all channels
|
2431
|
+
if normalize_channels is None:
|
2432
|
+
normalize_channels = ['r', 'g', 'b']
|
2433
|
+
|
2434
|
+
for channel_name in normalize_channels:
|
2435
|
+
if channel_name in channel_map:
|
2436
|
+
channel_idx = channel_map[channel_name]
|
2437
|
+
p2, p98 = np.percentile(img_array[:, :, channel_idx], percentiles)
|
2438
|
+
img_array[:, :, channel_idx] = rescale_intensity(img_array[:, :, channel_idx], in_range=(p2, p98), out_range=(0, 255))
|
2377
2439
|
|
2378
2440
|
img_array = np.clip(img_array, 0, 255).astype('uint8')
|
2379
2441
|
|
2380
2442
|
return Image.fromarray(img_array)
|
2443
|
+
|
2381
2444
|
|
2382
2445
|
def add_colored_border(self, img, border_width, border_color):
|
2383
2446
|
top_border = Image.new('RGB', (img.width, border_width), color=border_color)
|
@@ -2505,46 +2568,6 @@ class AnnotateApp:
|
|
2505
2568
|
else:
|
2506
2569
|
print('Waiting for pending updates to finish before quitting')
|
2507
2570
|
|
2508
|
-
def create_menu_bar(root):
|
2509
|
-
from .gui import initiate_root
|
2510
|
-
gui_apps = {
|
2511
|
-
"Mask": lambda: initiate_root(root, settings_type='mask'),
|
2512
|
-
"Measure": lambda: initiate_root(root, settings_type='measure'),
|
2513
|
-
"Annotate": lambda: initiate_root(root, settings_type='annotate'),
|
2514
|
-
"Make Masks": lambda: initiate_root(root, settings_type='make_masks'),
|
2515
|
-
"Classify": lambda: initiate_root(root, settings_type='classify'),
|
2516
|
-
"Umap": lambda: initiate_root(root, settings_type='umap'),
|
2517
|
-
"Train Cellpose": lambda: initiate_root(root, settings_type='train_cellpose'),
|
2518
|
-
"ML Analyze": lambda: initiate_root(root, settings_type='ml_analyze'),
|
2519
|
-
"Cellpose Masks": lambda: initiate_root(root, settings_type='cellpose_masks'),
|
2520
|
-
"Cellpose All": lambda: initiate_root(root, settings_type='cellpose_all'),
|
2521
|
-
"Map Barcodes": lambda: initiate_root(root, settings_type='map_barcodes'),
|
2522
|
-
"Regression": lambda: initiate_root(root, settings_type='regression'),
|
2523
|
-
"Recruitment": lambda: initiate_root(root, settings_type='recruitment')
|
2524
|
-
}
|
2525
|
-
|
2526
|
-
# Create the menu bar
|
2527
|
-
menu_bar = tk.Menu(root, bg="#008080", fg="white")
|
2528
|
-
|
2529
|
-
# Create a "SpaCr Applications" menu
|
2530
|
-
app_menu = tk.Menu(menu_bar, tearoff=0, bg="#008080", fg="white")
|
2531
|
-
menu_bar.add_cascade(label="SpaCr Applications", menu=app_menu)
|
2532
|
-
|
2533
|
-
# Add options to the "SpaCr Applications" menu
|
2534
|
-
for app_name, app_func in gui_apps.items():
|
2535
|
-
app_menu.add_command(
|
2536
|
-
label=app_name,
|
2537
|
-
command=app_func
|
2538
|
-
)
|
2539
|
-
|
2540
|
-
# Add a separator and an exit option
|
2541
|
-
app_menu.add_separator()
|
2542
|
-
app_menu.add_command(label="Help", command=lambda: webbrowser.open("https://spacr.readthedocs.io/en/latest/?badge=latest"))
|
2543
|
-
app_menu.add_command(label="Exit", command=root.quit)
|
2544
|
-
|
2545
|
-
# Configure the menu for the root window
|
2546
|
-
root.config(menu=menu_bar)
|
2547
|
-
|
2548
2571
|
def standardize_figure(fig):
|
2549
2572
|
from .gui_elements import set_dark_style
|
2550
2573
|
from matplotlib.font_manager import FontProperties
|
spacr/gui_utils.py
CHANGED
@@ -253,7 +253,7 @@ def annotate(settings):
|
|
253
253
|
|
254
254
|
root = tk.Tk()
|
255
255
|
root.geometry(settings['geom'])
|
256
|
-
app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], grid_rows=settings['rows'], grid_cols=settings['columns'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'])
|
256
|
+
app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], grid_rows=settings['rows'], grid_cols=settings['columns'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'], normalize_channels=settings['normalize_channels'])
|
257
257
|
next_button = tk.Button(root, text="Next", command=app.next_page)
|
258
258
|
next_button.grid(row=app.grid_rows, column=app.grid_cols - 1)
|
259
259
|
back_button = tk.Button(root, text="Back", command=app.previous_page)
|
@@ -284,7 +284,6 @@ def generate_annotate_fields(frame):
|
|
284
284
|
# Arrange input fields and labels
|
285
285
|
for row, (name, data) in enumerate(vars_dict.items()):
|
286
286
|
tk.Label(frame, text=f"{name.replace('_', ' ').capitalize()}:", bg=style_out['bg_color'], fg=style_out['fg_color'], font=font_loader.get_font(size=font_size)).grid(row=row, column=0)
|
287
|
-
#ttk.Label(frame, text=f"{name.replace('_', ' ').capitalize()}:", background="black", foreground="white").grid(row=row, column=0)
|
288
287
|
if isinstance(data['value'], list):
|
289
288
|
# Convert lists to comma-separated strings
|
290
289
|
data['entry'].insert(0, ','.join(map(str, data['value'])))
|
@@ -300,6 +299,7 @@ def run_annotate_app(vars_dict, parent_frame):
|
|
300
299
|
settings['img_size'] = list(map(int, settings['img_size'].split(','))) # Convert string to list of integers
|
301
300
|
settings['percentiles'] = list(map(int, settings['percentiles'].split(','))) # Convert string to list of integers
|
302
301
|
settings['normalize'] = settings['normalize'].lower() == 'true'
|
302
|
+
settings['normalize_channels'] = settings['channels'].split(',')
|
303
303
|
settings['rows'] = int(settings['rows'])
|
304
304
|
settings['columns'] = int(settings['columns'])
|
305
305
|
settings['measurement'] = settings['measurement'].split(',')
|
@@ -320,6 +320,7 @@ def annotate_app(parent_frame, settings):
|
|
320
320
|
global global_image_refs
|
321
321
|
global_image_refs.clear()
|
322
322
|
root = parent_frame.winfo_toplevel()
|
323
|
+
print('annotate_app',settings)
|
323
324
|
annotate_with_image_refs(settings, root, lambda: load_next_app(root))
|
324
325
|
|
325
326
|
def load_next_app(root):
|
@@ -341,46 +342,6 @@ def load_next_app(root):
|
|
341
342
|
new_root.title("SpaCr Application")
|
342
343
|
next_app_func(new_root, *next_app_args)
|
343
344
|
|
344
|
-
def annotate_with_image_refs(settings, root, shutdown_callback):
|
345
|
-
#from .gui_utils import proceed_with_app
|
346
|
-
from .gui import gui_app
|
347
|
-
from .settings import set_annotate_default_settings
|
348
|
-
|
349
|
-
settings = set_annotate_default_settings(settings)
|
350
|
-
src = settings['src']
|
351
|
-
|
352
|
-
db = os.path.join(src, 'measurements/measurements.db')
|
353
|
-
conn = sqlite3.connect(db)
|
354
|
-
c = conn.cursor()
|
355
|
-
c.execute('PRAGMA table_info(png_list)')
|
356
|
-
cols = c.fetchall()
|
357
|
-
if settings['annotation_column'] not in [col[1] for col in cols]:
|
358
|
-
c.execute(f"ALTER TABLE png_list ADD COLUMN {settings['annotation_column']} integer")
|
359
|
-
conn.commit()
|
360
|
-
conn.close()
|
361
|
-
|
362
|
-
app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], grid_rows=settings['rows'], grid_cols=settings['columns'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'])
|
363
|
-
|
364
|
-
# Set the canvas background to black
|
365
|
-
root.configure(bg='black')
|
366
|
-
|
367
|
-
next_button = tk.Button(root, text="Next", command=app.next_page, background='black', foreground='white')
|
368
|
-
next_button.grid(row=app.grid_rows, column=app.grid_cols - 1)
|
369
|
-
back_button = tk.Button(root, text="Back", command=app.previous_page, background='black', foreground='white')
|
370
|
-
back_button.grid(row=app.grid_rows, column=app.grid_cols - 2)
|
371
|
-
exit_button = tk.Button(root, text="Exit", command=lambda: [app.shutdown(), shutdown_callback()], background='black', foreground='white')
|
372
|
-
exit_button.grid(row=app.grid_rows, column=app.grid_cols - 3)
|
373
|
-
|
374
|
-
#app.load_images()
|
375
|
-
|
376
|
-
# Store the shutdown function and next app details in the root
|
377
|
-
root.current_app_exit_func = lambda: [app.shutdown(), shutdown_callback()]
|
378
|
-
root.next_app_func = proceed_with_app
|
379
|
-
root.next_app_args = ("Main App", gui_app)
|
380
|
-
|
381
|
-
# Call load_images after setting up the root window
|
382
|
-
app.load_images()
|
383
|
-
|
384
345
|
def annotate_with_image_refs(settings, root, shutdown_callback):
|
385
346
|
from .settings import set_annotate_default_settings
|
386
347
|
|
@@ -401,7 +362,7 @@ def annotate_with_image_refs(settings, root, shutdown_callback):
|
|
401
362
|
screen_height = root.winfo_screenheight()
|
402
363
|
root.geometry(f"{screen_width}x{screen_height}")
|
403
364
|
|
404
|
-
app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'])
|
365
|
+
app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'], normalize_channels=settings['normalize_channels'])
|
405
366
|
|
406
367
|
# Set the canvas background to black
|
407
368
|
root.configure(bg='black')
|
spacr/plot.py
CHANGED
@@ -1020,8 +1020,6 @@ def _plot_recruitment_v2(df, df_type, channel_of_interest, columns=[], figuresiz
|
|
1020
1020
|
None
|
1021
1021
|
"""
|
1022
1022
|
|
1023
|
-
from .plot import spacrGraph
|
1024
|
-
|
1025
1023
|
color_list = [(55/255, 155/255, 155/255),
|
1026
1024
|
(155/255, 55/255, 155/255),
|
1027
1025
|
(55/255, 155/255, 255/255),
|
spacr/settings.py
CHANGED
@@ -1315,6 +1315,7 @@ def set_annotate_default_settings(settings):
|
|
1315
1315
|
settings.setdefault('img_size', 200)
|
1316
1316
|
settings.setdefault('annotation_column', 'test')
|
1317
1317
|
settings.setdefault('normalize', 'False')
|
1318
|
+
settings.setdefault('normalize_channels', "r,g,b")
|
1318
1319
|
settings.setdefault('percentiles', [2, 98])
|
1319
1320
|
settings.setdefault('measurement', '')#'cytoplasm_channel_3_mean_intensity,pathogen_channel_3_mean_intensity')
|
1320
1321
|
settings.setdefault('threshold', '')#'2')
|
@@ -1,6 +1,6 @@
|
|
1
1
|
spacr/__init__.py,sha256=3TNo4PgxHZTHOhyPc8AORvG3tzdPFEc30KAtsOou174,1618
|
2
2
|
spacr/__main__.py,sha256=bkAJJD2kjIqOP-u1kLvct9jQQCeUXzlEjdgitwi1Lm8,75
|
3
|
-
spacr/app_annotate.py,sha256=
|
3
|
+
spacr/app_annotate.py,sha256=XxGpapg71099aVjb5ZEqgpKTBc_1OIb6_y8yzWfqrsM,2252
|
4
4
|
spacr/app_classify.py,sha256=urTP_wlZ58hSyM5a19slYlBxN0PdC-9-ga0hvq8CGWc,165
|
5
5
|
spacr/app_make_masks.py,sha256=pqDhRpluiHZz-kPX2Zh_KbYe4TsU43qYBa_7f-rsjpw,1694
|
6
6
|
spacr/app_mask.py,sha256=l-dBY8ftzCMdDe6-pXc2Nh_u-idNL9G7UOARiLJBtds,153
|
@@ -12,17 +12,17 @@ spacr/core.py,sha256=G_x-w7FRIHNfSOoPaIZPSf_A7mVj7PA7o9HQZ4nIu5o,48231
|
|
12
12
|
spacr/deep_spacr.py,sha256=HdOcNU8cHcE_19nP7_5uTz-ih3E169ffr2Hm--NvMvA,43255
|
13
13
|
spacr/gui.py,sha256=ARyn9Q_g8HoP-cXh1nzMLVFCKqthY4v2u9yORyaQqQE,8230
|
14
14
|
spacr/gui_core.py,sha256=LV_HX5zreu3Bye6sQFDbOuk8Dfj4StMoohy6hsrDEXA,41363
|
15
|
-
spacr/gui_elements.py,sha256=
|
16
|
-
spacr/gui_utils.py,sha256=
|
15
|
+
spacr/gui_elements.py,sha256=puDqf7PJJ_UMA01fjqODk-zsfSmvzVXpvaZ1BYV988w,136554
|
16
|
+
spacr/gui_utils.py,sha256=TFY3zNyTk-FkJ0mjSrWsE2DpHWBbGuQoi1rh2AkXQyQ,45007
|
17
17
|
spacr/io.py,sha256=AARmqn1fMmTgVDwWy8bEYK6SjH-6DZIulgCSPdBTyf0,143370
|
18
18
|
spacr/logger.py,sha256=lJhTqt-_wfAunCPl93xE65Wr9Y1oIHJWaZMjunHUeIw,1538
|
19
19
|
spacr/measure.py,sha256=BThn_sALgKrwGKnLOGpT4FyoJeRVoTZoP9SXbCtCMRw,54857
|
20
20
|
spacr/mediar.py,sha256=FwLvbLQW5LQzPgvJZG8Lw7GniA2vbZx6Jv6vIKu7I5c,14743
|
21
21
|
spacr/ml.py,sha256=3XiQUfhhseCz9cZXhaVkCCv_qfqoZCdXGnO_p3ulwo4,47131
|
22
22
|
spacr/openai.py,sha256=5vBZ3Jl2llYcW3oaTEXgdyCB2aJujMUIO5K038z7w_A,1246
|
23
|
-
spacr/plot.py,sha256=
|
23
|
+
spacr/plot.py,sha256=Lv-QFD_NwP9pdsUIiJ--XHJN-jQBkFz_AI9y4i36jEA,105506
|
24
24
|
spacr/sequencing.py,sha256=t18mgpK6rhWuB1LtFOsPxqgpFXxuUmrD06ecsaVQ0Gw,19655
|
25
|
-
spacr/settings.py,sha256=
|
25
|
+
spacr/settings.py,sha256=uTTR6pmwBHbZ_uLLWE4cXplGK7q6K_OmZnsXH-HAFW0,75828
|
26
26
|
spacr/sim.py,sha256=1xKhXimNU3ukzIw-3l9cF3Znc_brW8h20yv8fSTzvss,71173
|
27
27
|
spacr/submodules.py,sha256=AB7s6-cULsaqz-haAaCtXfGEIi8uPZGT4xoCslUJC3Y,18391
|
28
28
|
spacr/timelapse.py,sha256=FSYpUtAVy6xc3lwprRYgyDTT9ysUhfRQ4zrP9_h2mvg,39465
|
@@ -150,9 +150,9 @@ spacr/resources/icons/umap.png,sha256=dOLF3DeLYy9k0nkUybiZMe1wzHQwLJFRmgccppw-8b
|
|
150
150
|
spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif,sha256=Tl0ZUfZ_AYAbu0up_nO0tPRtF1BxXhWQ3T3pURBCCRo,7958528
|
151
151
|
spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif,sha256=m8N-V71rA1TT4dFlENNg8s0Q0YEXXs8slIn7yObmZJQ,7958528
|
152
152
|
spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif,sha256=Pbhk7xn-KUP6RSIhJsxQcrHFImBm3GEpLkzx7WOc-5M,7958528
|
153
|
-
spacr-0.3.
|
154
|
-
spacr-0.3.
|
155
|
-
spacr-0.3.
|
156
|
-
spacr-0.3.
|
157
|
-
spacr-0.3.
|
158
|
-
spacr-0.3.
|
153
|
+
spacr-0.3.31.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
|
154
|
+
spacr-0.3.31.dist-info/METADATA,sha256=-U4SqumPkRAW6fWg7hsKsgq7tTVPvwtH8um0ZEXca1c,5949
|
155
|
+
spacr-0.3.31.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
|
156
|
+
spacr-0.3.31.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
|
157
|
+
spacr-0.3.31.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
|
158
|
+
spacr-0.3.31.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|