spacr 0.1.16__tar.gz → 0.1.50__tar.gz

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 (61) hide show
  1. {spacr-0.1.16/spacr.egg-info → spacr-0.1.50}/PKG-INFO +2 -1
  2. {spacr-0.1.16 → spacr-0.1.50}/setup.py +7 -6
  3. {spacr-0.1.16 → spacr-0.1.50}/spacr/app_annotate.py +1 -1
  4. spacr-0.1.50/spacr/app_classify.py +8 -0
  5. {spacr-0.1.16 → spacr-0.1.50}/spacr/app_make_masks.py +1 -1
  6. {spacr-0.1.16 → spacr-0.1.50}/spacr/app_make_masks_v2.py +2 -2
  7. spacr-0.1.50/spacr/app_mask.py +8 -0
  8. spacr-0.1.50/spacr/app_measure.py +8 -0
  9. {spacr-0.1.16 → spacr-0.1.50}/spacr/deep_spacr.py +3 -1
  10. {spacr-0.1.16 → spacr-0.1.50}/spacr/gui.py +22 -13
  11. spacr-0.1.50/spacr/gui_utils.py +1525 -0
  12. {spacr-0.1.16 → spacr-0.1.50}/spacr/measure.py +24 -3
  13. {spacr-0.1.16 → spacr-0.1.50}/spacr/settings.py +13 -2
  14. {spacr-0.1.16 → spacr-0.1.50}/spacr/utils.py +59 -5
  15. {spacr-0.1.16 → spacr-0.1.50/spacr.egg-info}/PKG-INFO +2 -1
  16. spacr-0.1.50/spacr.egg-info/entry_points.txt +8 -0
  17. {spacr-0.1.16 → spacr-0.1.50}/spacr.egg-info/requires.txt +1 -0
  18. spacr-0.1.16/spacr/app_classify.py +0 -206
  19. spacr-0.1.16/spacr/app_mask.py +0 -253
  20. spacr-0.1.16/spacr/app_measure.py +0 -253
  21. spacr-0.1.16/spacr/gui_utils.py +0 -1205
  22. spacr-0.1.16/spacr.egg-info/entry_points.txt +0 -8
  23. {spacr-0.1.16 → spacr-0.1.50}/LICENSE +0 -0
  24. {spacr-0.1.16 → spacr-0.1.50}/MANIFEST.in +0 -0
  25. {spacr-0.1.16 → spacr-0.1.50}/README.rst +0 -0
  26. {spacr-0.1.16 → spacr-0.1.50}/setup.cfg +0 -0
  27. {spacr-0.1.16 → spacr-0.1.50}/spacr/__init__.py +0 -0
  28. {spacr-0.1.16 → spacr-0.1.50}/spacr/__main__.py +0 -0
  29. {spacr-0.1.16 → spacr-0.1.50}/spacr/chris.py +0 -0
  30. {spacr-0.1.16 → spacr-0.1.50}/spacr/core.py +0 -0
  31. {spacr-0.1.16 → spacr-0.1.50}/spacr/graph_learning.py +0 -0
  32. {spacr-0.1.16 → spacr-0.1.50}/spacr/io.py +0 -0
  33. {spacr-0.1.16 → spacr-0.1.50}/spacr/logger.py +0 -0
  34. {spacr-0.1.16 → spacr-0.1.50}/spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model +0 -0
  35. {spacr-0.1.16 → spacr-0.1.50}/spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model_settings.csv +0 -0
  36. {spacr-0.1.16 → spacr-0.1.50}/spacr/models/cp/toxo_pv_lumen.CP_model +0 -0
  37. {spacr-0.1.16 → spacr-0.1.50}/spacr/plot.py +0 -0
  38. {spacr-0.1.16 → spacr-0.1.50}/spacr/sequencing.py +0 -0
  39. {spacr-0.1.16 → spacr-0.1.50}/spacr/sim.py +0 -0
  40. {spacr-0.1.16 → spacr-0.1.50}/spacr/sim_app.py +0 -0
  41. {spacr-0.1.16 → spacr-0.1.50}/spacr/timelapse.py +0 -0
  42. {spacr-0.1.16 → spacr-0.1.50}/spacr/version.py +0 -0
  43. {spacr-0.1.16 → spacr-0.1.50}/spacr.egg-info/SOURCES.txt +0 -0
  44. {spacr-0.1.16 → spacr-0.1.50}/spacr.egg-info/dependency_links.txt +0 -0
  45. {spacr-0.1.16 → spacr-0.1.50}/spacr.egg-info/top_level.txt +0 -0
  46. {spacr-0.1.16 → spacr-0.1.50}/tests/test_annotate_app.py +0 -0
  47. {spacr-0.1.16 → spacr-0.1.50}/tests/test_core.py +0 -0
  48. {spacr-0.1.16 → spacr-0.1.50}/tests/test_gui_classify_app.py +0 -0
  49. {spacr-0.1.16 → spacr-0.1.50}/tests/test_gui_mask_app.py +0 -0
  50. {spacr-0.1.16 → spacr-0.1.50}/tests/test_gui_measure_app.py +0 -0
  51. {spacr-0.1.16 → spacr-0.1.50}/tests/test_gui_sim_app.py +0 -0
  52. {spacr-0.1.16 → spacr-0.1.50}/tests/test_gui_utils.py +0 -0
  53. {spacr-0.1.16 → spacr-0.1.50}/tests/test_io.py +0 -0
  54. {spacr-0.1.16 → spacr-0.1.50}/tests/test_mask_app.py +0 -0
  55. {spacr-0.1.16 → spacr-0.1.50}/tests/test_measure.py +0 -0
  56. {spacr-0.1.16 → spacr-0.1.50}/tests/test_plot.py +0 -0
  57. {spacr-0.1.16 → spacr-0.1.50}/tests/test_sim.py +0 -0
  58. {spacr-0.1.16 → spacr-0.1.50}/tests/test_timelapse.py +0 -0
  59. {spacr-0.1.16 → spacr-0.1.50}/tests/test_train.py +0 -0
  60. {spacr-0.1.16 → spacr-0.1.50}/tests/test_umap.py +0 -0
  61. {spacr-0.1.16 → spacr-0.1.50}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.1.16
3
+ Version: 0.1.50
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
@@ -39,6 +39,7 @@ Requires-Dist: ttf_opensans>=2020.10.30
39
39
  Requires-Dist: customtkinter<6.0,>=5.2.2
40
40
  Requires-Dist: biopython<2.0,>=1.80
41
41
  Requires-Dist: lxml<6.0,>=5.1.0
42
+ Requires-Dist: huggingface-hub<0.25,>=0.24.0
42
43
  Provides-Extra: dev
43
44
  Requires-Dist: pytest<3.11,>=3.9; extra == "dev"
44
45
  Provides-Extra: headless
@@ -44,12 +44,13 @@ dependencies = [
44
44
  'ttf_opensans>=2020.10.30',
45
45
  'customtkinter>=5.2.2,<6.0',
46
46
  'biopython>=1.80,<2.0',
47
- 'lxml>=5.1.0,<6.0'
47
+ 'lxml>=5.1.0,<6.0',
48
+ 'huggingface-hub>=0.24.0,<0.25'
48
49
  ]
49
50
 
50
51
  setup(
51
52
  name="spacr",
52
- version="0.1.16",
53
+ version="0.1.50",
53
54
  author="Einar Birnir Olafsson",
54
55
  author_email="olafsson@med.umich.com",
55
56
  description="Spatial phenotype analysis of crisp screens (SpaCr)",
@@ -61,11 +62,11 @@ setup(
61
62
  install_requires=dependencies,
62
63
  entry_points={
63
64
  'console_scripts': [
64
- 'mask=spacr.app_mask:gui_mask',
65
- 'measure=spacr.app_measure:gui_measure',
66
- 'make_masks=spacr.app_make_mask:gui_make_masks',
65
+ 'mask=spacr.app_mask:start_mask_app',
66
+ 'measure=spacr.app_measure:start_measure_app',
67
+ 'make_masks=spacr.app_make_masks:gui_make_masks',
67
68
  'annotate=spacr.app_annotate:gui_annotate',
68
- 'classify=spacr.app_classify:gui_classify',
69
+ 'classify=spacr.app_classify:start_classify_app',
69
70
  'sim=spacr.app_sim:gui_sim',
70
71
  'spacr=spacr.gui:gui_app',
71
72
  ],
@@ -13,7 +13,7 @@ from IPython.display import display, HTML
13
13
  from tkinter import font as tkFont
14
14
  from tkinter import TclError
15
15
 
16
- from .gui_utils import ScrollableFrame, CustomButton, set_dark_style, set_default_font, set_dark_style, create_menu_bar
16
+ from .gui_utils import ScrollableFrame, CustomButton, set_dark_style, create_menu_bar, set_default_font
17
17
 
18
18
  class ImageApp:
19
19
  def __init__(self, root, db_path, src, image_type=None, channels=None, grid_rows=None, grid_cols=None, image_size=(200, 200), annotation_column='annotate', normalize=False, percentiles=(1,99), measurement=None, threshold=None):
@@ -0,0 +1,8 @@
1
+ from .gui import MainApp
2
+
3
+ def start_classify_app():
4
+ app = MainApp(default_app="Classify")
5
+ app.mainloop()
6
+
7
+ if __name__ == "__main__":
8
+ start_classify_app()
@@ -13,7 +13,7 @@ from ttkthemes import ThemedTk
13
13
 
14
14
  from .logger import log_function_call
15
15
 
16
- from .gui_utils import ScrollableFrame, CustomButton, set_dark_style, set_default_font, set_dark_style, create_menu_bar
16
+ from .gui_utils import ScrollableFrame, CustomButton, set_dark_style, create_menu_bar, set_default_font
17
17
 
18
18
  class modify_masks:
19
19
 
@@ -13,7 +13,7 @@ from ttkthemes import ThemedTk
13
13
  from pyqtgraph import GraphicsLayoutWidget, ViewBox, ImageItem, mkQApp
14
14
 
15
15
  from .logger import log_function_call
16
- from .gui_utils import ScrollableFrame, CustomButton, set_dark_style, set_default_font, create_dark_mode, set_dark_style, create_menu_bar
16
+ from .gui_utils import ScrollableFrame, CustomButton, set_dark_style, create_dark_mode, create_menu_bar, set_default_font
17
17
 
18
18
  class ModifyMasks:
19
19
  def __init__(self, root, folder_path, scale_factor):
@@ -635,7 +635,7 @@ def initiate_mask_app_root(width, height):
635
635
  root = ThemedTk(theme=theme)
636
636
  style = ttk.Style(root)
637
637
  set_dark_style(style)
638
- set_default_font(root, font_name="Arial", size=8)
638
+ #set_default_font(root, font_name="Arial", size=8)
639
639
  root.geometry(f"{width}x{height}")
640
640
  root.title("Mask App")
641
641
  create_menu_bar(root)
@@ -0,0 +1,8 @@
1
+ from .gui import MainApp
2
+
3
+ def start_mask_app():
4
+ app = MainApp(default_app="Mask")
5
+ app.mainloop()
6
+
7
+ if __name__ == "__main__":
8
+ start_mask_app()
@@ -0,0 +1,8 @@
1
+ from .gui import MainApp
2
+
3
+ def start_measure_app():
4
+ app = MainApp(default_app="Measure")
5
+ app.mainloop()
6
+
7
+ if __name__ == "__main__":
8
+ start_measure_app()
@@ -10,6 +10,9 @@ import matplotlib.pyplot as plt
10
10
  from PIL import Image
11
11
 
12
12
  from .logger import log_function_call
13
+ from .utils import close_multiprocessing_processes, reset_mp
14
+ #reset_mp()
15
+ #close_multiprocessing_processes()
13
16
 
14
17
  def evaluate_model_core(model, loader, loader_name, epoch, loss_type):
15
18
  """
@@ -42,7 +45,6 @@ def evaluate_model_core(model, loader, loader_name, epoch, loss_type):
42
45
  for batch_idx, (data, target, _) in enumerate(loader, start=1):
43
46
  start_time = time.time()
44
47
  data, target = data.to(device), target.to(device).float()
45
- #data, target = data.to(torch.float).to(device), target.to(device).float()
46
48
  output = model(data)
47
49
  loss += F.binary_cross_entropy_with_logits(output, target, reduction='sum').item()
48
50
  loss = calculate_loss(output, target, loss_type=loss_type)
@@ -1,20 +1,15 @@
1
1
  import tkinter as tk
2
2
  from tkinter import ttk
3
- from tkinter import font as tkFont
4
3
  from PIL import Image, ImageTk
5
4
  import os
6
5
  import requests
7
-
8
- # Import your GUI apps
9
- from .app_mask import initiate_mask_root
10
- from .app_measure import initiate_measure_root
6
+ from multiprocessing import set_start_method
7
+ from .gui_utils import set_dark_style, create_menu_bar, initiate_root
11
8
  from .app_annotate import initiate_annotation_app_root
12
9
  from .app_make_masks import initiate_mask_app_root
13
- from .app_classify import initiate_classify_root
14
- from .gui_utils import CustomButton, set_dark_style, create_menu_bar
15
10
 
16
11
  class MainApp(tk.Tk):
17
- def __init__(self):
12
+ def __init__(self, default_app=None):
18
13
  super().__init__()
19
14
  width = self.winfo_screenwidth()
20
15
  height = self.winfo_screenheight()
@@ -25,16 +20,28 @@ class MainApp(tk.Tk):
25
20
  set_dark_style(style)
26
21
 
27
22
  self.gui_apps = {
28
- "Mask": (initiate_mask_root, "Generate cellpose masks for cells, nuclei and pathogen images."),
29
- "Measure": (initiate_measure_root, "Measure single object intensity and morphological feature. Crop and save single object image"),
23
+ "Mask": (lambda frame: initiate_root(frame, 'mask'), "Generate cellpose masks for cells, nuclei and pathogen images."),
24
+ "Measure": (lambda frame: initiate_root(frame, 'measure'), "Measure single object intensity and morphological feature. Crop and save single object image"),
30
25
  "Annotate": (initiate_annotation_app_root, "Annotation single object images on a grid. Annotations are saved to database."),
31
26
  "Make Masks": (initiate_mask_app_root, "Adjust pre-existing Cellpose models to your specific dataset for improved performance"),
32
- "Classify": (initiate_classify_root, "Train Torch Convolutional Neural Networks (CNNs) or Transformers to classify single object images.")
27
+ "Classify": (lambda frame: initiate_root(frame, 'classify'), "Train Torch Convolutional Neural Networks (CNNs) or Transformers to classify single object images.")
33
28
  }
34
29
 
35
30
  self.selected_app = tk.StringVar()
36
31
  self.create_widgets()
37
32
 
33
+
34
+ if default_app == "Mask":
35
+ self.load_app(default_app, self.gui_apps[default_app][0])
36
+ elif default_app == "Measure":
37
+ self.load_app(default_app, self.gui_apps[default_app][1])
38
+ elif default_app == "Annotate":
39
+ self.load_app(default_app, self.gui_apps[default_app][2])
40
+ elif default_app == "Make Masks":
41
+ self.load_app(default_app, self.gui_apps[default_app][3])
42
+ elif default_app == "Classify":
43
+ self.load_app(default_app, self.gui_apps[default_app][4])
44
+
38
45
  def create_widgets(self):
39
46
  # Create the menu bar
40
47
  create_menu_bar(self)
@@ -74,7 +81,8 @@ class MainApp(tk.Tk):
74
81
  app_func, app_desc = app_data
75
82
 
76
83
  # Create custom button with text
77
- button = CustomButton(buttons_frame, text=app_name, command=lambda app_name=app_name, app_func=app_func: self.load_app(app_name, app_func), font=('Helvetica', 12))
84
+ #button = CustomButton(buttons_frame, text=app_name, command=lambda app_name=app_name, app_func=app_func: self.load_app(app_name, app_func), font=('Helvetica', 12))
85
+ button = ttk.Button(buttons_frame, text=app_name, command=lambda app_name=app_name, app_func=app_func: self.load_app(app_name, app_func), style='Custom.TButton')
78
86
  button.grid(row=i, column=0, pady=10, padx=10, sticky="w")
79
87
 
80
88
  description_label = tk.Label(buttons_frame, text=app_desc, bg="black", fg="white", wraplength=800, justify="left", font=('Helvetica', 12))
@@ -146,4 +154,5 @@ def gui_app():
146
154
  app.mainloop()
147
155
 
148
156
  if __name__ == "__main__":
149
- gui_app()
157
+ set_start_method('spawn', force=True)
158
+ gui_app()