cellects 0.3.1__py3-none-any.whl → 0.3.5__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.
@@ -76,15 +76,15 @@ class VideoAnalysisWindow(MainTabsType):
76
76
  self.video_tab.set_in_use()
77
77
  self.data_tab.clicked.connect(self.data_tab_is_clicked)
78
78
  self.image_tab.clicked.connect(self.image_tab_is_clicked)
79
- self.thread = {}
80
- self.thread['VideoReader'] = VideoReaderThread(self.parent())
81
- self.thread['OneArena'] = OneArenaThread(self.parent())
82
- self.thread['ChangeOneRepResult'] = ChangeOneRepResultThread(self.parent())
83
- self.thread['RunAll'] = RunAllThread(self.parent())
79
+ self.thread_dict = {}
80
+ self.thread_dict['VideoReader'] = VideoReaderThread(self.parent())
81
+ self.thread_dict['OneArena'] = OneArenaThread(self.parent())
82
+ self.thread_dict['ChangeOneRepResult'] = ChangeOneRepResultThread(self.parent())
83
+ self.thread_dict['RunAll'] = RunAllThread(self.parent())
84
84
  self.previous_arena = 0
85
85
  curr_row_main_layout = 0
86
86
  ncol = 1
87
- self.Vlayout.addItem(self.vertical_space)#, curr_row_main_layout, 0, 1, ncol)
87
+ self.Vlayout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.MinimumExpanding))#, curr_row_main_layout, 0, 1, ncol)
88
88
  curr_row_main_layout += 1
89
89
 
90
90
  # Open subtitle
@@ -94,10 +94,11 @@ class VideoAnalysisWindow(MainTabsType):
94
94
  self.general_step_label = FixedText('Step 1: Tune parameters to improve Detection', night_mode=self.parent().po.all['night_mode'])
95
95
  self.general_step_button = PButton('Done', night_mode=self.parent().po.all['night_mode'])
96
96
  self.general_step_button.clicked.connect(self.step_done_is_clicked)
97
- self.general_step_layout.addItem(self.horizontal_space)
97
+ self.general_step_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
98
98
  self.general_step_layout.addWidget(self.general_step_label)
99
99
  self.general_step_layout.addWidget(self.general_step_button)
100
- self.general_step_layout.addItem(self.horizontal_space)
100
+ self.general_step_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
101
+
101
102
  self.general_step_widget.setLayout(self.general_step_layout)
102
103
  self.Vlayout.addWidget(self.general_step_widget)#, curr_row_main_layout, 0, 1, ncol)
103
104
  curr_row_main_layout += 1
@@ -105,7 +106,7 @@ class VideoAnalysisWindow(MainTabsType):
105
106
  # Open central widget
106
107
  self.video_display_widget = QtWidgets.QWidget()
107
108
  self.video_display_layout = QtWidgets.QHBoxLayout()
108
- self.video_display_layout.addItem(self.horizontal_space)
109
+ self.video_display_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
109
110
  # Open left widget
110
111
  self.left_options_widget = QtWidgets.QWidget()
111
112
  self.left_options_layout = QtWidgets.QVBoxLayout()
@@ -240,10 +241,10 @@ class VideoAnalysisWindow(MainTabsType):
240
241
  self.right_options_layout.addWidget(self.read, alignment=QtCore.Qt.AlignCenter)
241
242
 
242
243
 
243
- self.right_options_layout.addItem(self.horizontal_space)
244
+ self.right_options_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
244
245
  self.right_options_widget.setLayout(self.right_options_layout)
245
246
  self.video_display_layout.addWidget(self.right_options_widget)
246
- self.video_display_layout.addItem(self.horizontal_space)
247
+ self.video_display_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
247
248
  # Close central widget
248
249
  self.video_display_widget.setLayout(self.video_display_layout)
249
250
  self.Vlayout.addWidget(self.video_display_widget)#, curr_row_main_layout, 0)
@@ -252,7 +253,7 @@ class VideoAnalysisWindow(MainTabsType):
252
253
  # Open Second step row
253
254
  self.second_step_widget = QtWidgets.QWidget()
254
255
  self.second_step_layout = QtWidgets.QHBoxLayout()
255
- self.second_step_layout.addItem(self.horizontal_space)
256
+ self.second_step_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
256
257
  self.second_step_widget.setVisible(False)
257
258
 
258
259
  self.fading_widget = QtWidgets.QWidget()
@@ -292,9 +293,9 @@ class VideoAnalysisWindow(MainTabsType):
292
293
 
293
294
  # Close Second step row
294
295
  self.second_step_layout.setAlignment(QtCore.Qt.AlignHCenter)
295
- self.second_step_layout.addItem(self.horizontal_space)
296
+ self.second_step_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
296
297
  self.second_step_widget.setLayout(self.second_step_layout)
297
- self.Vlayout.addItem(self.vertical_space)#, curr_row_main_layout, 0, 1, ncol)
298
+ self.Vlayout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.MinimumExpanding))#, curr_row_main_layout, 0, 1, ncol)
298
299
  curr_row_main_layout += 1
299
300
  self.Vlayout.addWidget(self.second_step_widget)#, curr_row_main_layout, 0)
300
301
  curr_row_main_layout += 1
@@ -302,7 +303,7 @@ class VideoAnalysisWindow(MainTabsType):
302
303
  # Open last options row widget
303
304
  self.last_options_widget = QtWidgets.QWidget()
304
305
  self.last_options_layout = QtWidgets.QHBoxLayout()
305
- self.last_options_layout.addItem(self.horizontal_space)
306
+ self.last_options_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
306
307
 
307
308
  self.advanced_parameters = PButton(FW["Advanced_parameters"]["label"], tip=FW["Advanced_parameters"]["tips"],
308
309
  night_mode=self.parent().po.all['night_mode'])
@@ -322,7 +323,7 @@ class VideoAnalysisWindow(MainTabsType):
322
323
  self.last_options_layout.addWidget(self.save_all_vars)
323
324
 
324
325
  # Close last options widget
325
- self.last_options_layout.addItem(self.horizontal_space)
326
+ self.last_options_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
326
327
  self.last_options_widget.setLayout(self.last_options_layout)
327
328
  self.Vlayout.addWidget(self.last_options_widget)#, curr_row_main_layout, 0)
328
329
  curr_row_main_layout += 1
@@ -343,12 +344,12 @@ class VideoAnalysisWindow(MainTabsType):
343
344
  self.last_row_widget = QtWidgets.QWidget()
344
345
  self.last_row_layout = QtWidgets.QHBoxLayout()
345
346
  self.last_row_layout.addWidget(self.previous)
346
- self.last_row_layout.addItem(self.horizontal_space)
347
+ self.last_row_layout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Maximum))
347
348
  self.last_row_layout.addWidget(self.message)
348
349
  self.last_row_layout.addWidget(self.run_all)
349
350
  # Close last row widget
350
351
  self.last_row_widget.setLayout(self.last_row_layout)
351
- self.Vlayout.addItem(self.vertical_space)#, curr_row_main_layout, 0, 1, ncol)
352
+ self.Vlayout.addItem(QtWidgets.QSpacerItem(1, 1, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.MinimumExpanding))#, curr_row_main_layout, 0, 1, ncol)
352
353
  self.Vlayout.addWidget(self.last_row_widget)#, curr_row_main_layout + 1, 0)
353
354
 
354
355
  self.setLayout(self.Vlayout)
@@ -458,7 +459,7 @@ class VideoAnalysisWindow(MainTabsType):
458
459
  This function displays an error message when a thread relative to the current window is running.
459
460
  This function also save the id of the following window for later use.
460
461
  """
461
- if self.thread['VideoReader'].isRunning() or self.thread['OneArena'].isRunning() or self.thread['ChangeOneRepResult'].isRunning() or self.parent().firstwindow.thread["RunAll"].isRunning():
462
+ if self.thread_dict['VideoReader'].isRunning() or self.thread_dict['OneArena'].isRunning() or self.thread_dict['ChangeOneRepResult'].isRunning() or self.parent().firstwindow.thread_dict["RunAll"].isRunning():
462
463
  self.message.setText("Wait for the analysis to end, or restart Cellects")
463
464
  else:
464
465
  self.parent().last_tab = "data_specifications"
@@ -475,8 +476,8 @@ class VideoAnalysisWindow(MainTabsType):
475
476
  This function also save the id of the following window for later use.
476
477
  """
477
478
  if self.image_tab.state != "not_usable":
478
- if self.thread['VideoReader'].isRunning() or self.thread['OneArena'].isRunning() or self.thread[
479
- 'ChangeOneRepResult'].isRunning() or self.parent().firstwindow.thread["RunAll"].isRunning():
479
+ if self.thread_dict['VideoReader'].isRunning() or self.thread_dict['OneArena'].isRunning() or self.thread_dict[
480
+ 'ChangeOneRepResult'].isRunning() or self.parent().firstwindow.thread_dict["RunAll"].isRunning():
480
481
  self.message.setText("Wait for the analysis to end, or restart Cellects")
481
482
  else:
482
483
  self.parent().last_tab = "video_analysis"
@@ -526,8 +527,8 @@ class VideoAnalysisWindow(MainTabsType):
526
527
  This method is used to ensure that variable saving operations are performed
527
528
  in a separate thread to avoid blocking the main application.
528
529
  """
529
- if not self.parent().thread['SaveAllVars'].isRunning():
530
- self.parent().thread['SaveAllVars'].start() # SaveAllVarsThreadInThirdWidget
530
+ if not self.parent().thread_dict['SaveAllVars'].isRunning():
531
+ self.parent().thread_dict['SaveAllVars'].start() # SaveAllVarsThreadInThirdWidget
531
532
 
532
533
  def save_current_settings(self):
533
534
  """
@@ -581,7 +582,7 @@ class VideoAnalysisWindow(MainTabsType):
581
582
  arena processing threads. It should be called when all relevant threads are not
582
583
  running to ensure the arena's state is properly reset.
583
584
  """
584
- if not self.thread['VideoReader'].isRunning() and not self.thread['OneArena'].isRunning() and not self.thread['ChangeOneRepResult'].isRunning():
585
+ if not self.thread_dict['VideoReader'].isRunning() and not self.thread_dict['OneArena'].isRunning() and not self.thread_dict['ChangeOneRepResult'].isRunning():
585
586
  self.parent().po.motion = None
586
587
  self.reset_general_step()
587
588
  self.parent().po.computed_video_options = np.zeros(5, bool)
@@ -647,17 +648,17 @@ class VideoAnalysisWindow(MainTabsType):
647
648
  Ensures that the previous arena settings are cleared and connects signals
648
649
  to display messages and images during thread execution.
649
650
  """
650
- if self.thread['OneArena']._isRunning:
651
- self.thread['OneArena'].stop()
651
+ if self.thread_dict['OneArena']._isRunning:
652
+ self.thread_dict['OneArena'].stop()
652
653
  self.save_current_settings()
653
654
  if self.previous_arena != self.parent().po.all['arena']:
654
655
  self.parent().po.motion = None
655
656
  self.message.setText("Load the video and initialize analysis, wait...")
656
- self.thread['OneArena'].start() # OneArenaThreadInThirdWidget
657
- self.thread['OneArena'].message_from_thread_starting.connect(self.display_message_from_thread)
658
- self.thread['OneArena'].when_loading_finished.connect(self.when_loading_thread_finished)
659
- self.thread['OneArena'].when_detection_finished.connect(self.when_detection_finished)
660
- self.thread['OneArena'].image_from_thread.connect(self.display_image_during_thread)
657
+ self.thread_dict['OneArena'].start() # OneArenaThreadInThirdWidget
658
+ self.thread_dict['OneArena'].message_from_thread_starting.connect(self.display_message_from_thread)
659
+ self.thread_dict['OneArena'].when_loading_finished.connect(self.when_loading_thread_finished)
660
+ self.thread_dict['OneArena'].when_detection_finished.connect(self.when_detection_finished)
661
+ self.thread_dict['OneArena'].image_from_thread.connect(self.display_image_during_thread)
661
662
 
662
663
  def when_loading_thread_finished(self, save_loaded_video: bool):
663
664
  """
@@ -671,8 +672,8 @@ class VideoAnalysisWindow(MainTabsType):
671
672
  """
672
673
  self.previous_arena = self.parent().po.all['arena']
673
674
  if save_loaded_video:
674
- self.thread['WriteVideo'] = WriteVideoThread(self.parent())
675
- self.thread['WriteVideo'].start()
675
+ self.thread_dict['WriteVideo'] = WriteVideoThread(self.parent())
676
+ self.thread_dict['WriteVideo'].start()
676
677
  if self.parent().po.load_quick_full == 0:
677
678
  self.message.setText("Loading done, you can watch the video")
678
679
  self.read.setVisible(True)
@@ -699,8 +700,8 @@ class VideoAnalysisWindow(MainTabsType):
699
700
  `image_to_display`, and methods like `display_image.update_image`.
700
701
  """
701
702
  self.previous_arena = self.parent().po.all['arena']
702
- if self.thread['VideoReader'].isRunning(): # VideoReaderThreadInThirdWidget
703
- self.thread['VideoReader'].wait()
703
+ if self.thread_dict['VideoReader'].isRunning(): # VideoReaderThreadInThirdWidget
704
+ self.thread_dict['VideoReader'].wait()
704
705
  if self.parent().po.load_quick_full > 0:
705
706
  image = self.parent().po.motion.segmented[-1, ...]
706
707
  if self.parent().po.motion.visu is None:
@@ -742,10 +743,10 @@ class VideoAnalysisWindow(MainTabsType):
742
743
  """
743
744
  if self.parent().po.motion is not None:
744
745
  if self.parent().po.load_quick_full == 2:
745
- if not self.thread['OneArena'].isRunning() and not self.thread['ChangeOneRepResult'].isRunning():
746
+ if not self.thread_dict['OneArena'].isRunning() and not self.thread_dict['ChangeOneRepResult'].isRunning():
746
747
  self.message.setText(f"Arena {self.parent().po.all['arena']}: Finalize analysis and save, wait...")
747
- self.thread['ChangeOneRepResult'].start() # ChangeOneRepResultThreadInThirdWidget
748
- self.thread['ChangeOneRepResult'].message_from_thread.connect(self.display_message_from_thread)
748
+ self.thread_dict['ChangeOneRepResult'].start() # ChangeOneRepResultThreadInThirdWidget
749
+ self.thread_dict['ChangeOneRepResult'].message_from_thread.connect(self.display_message_from_thread)
749
750
  self.message.setText("Complete analysis + change that result")
750
751
  else:
751
752
  self.message.setText("Wait for the analysis to end")
@@ -763,9 +764,9 @@ class VideoAnalysisWindow(MainTabsType):
763
764
  """
764
765
  if self.parent().po.motion is not None:
765
766
  if self.parent().po.motion.segmented is not None:
766
- if not self.thread['OneArena'].isRunning() and not self.thread['VideoReader'].isRunning():
767
- self.thread['VideoReader'].start() # VideoReaderThreadInThirdWidget
768
- self.thread['VideoReader'].message_from_thread.connect(self.display_image_during_thread)
767
+ if not self.thread_dict['OneArena'].isRunning() and not self.thread_dict['VideoReader'].isRunning():
768
+ self.thread_dict['VideoReader'].start() # VideoReaderThreadInThirdWidget
769
+ self.thread_dict['VideoReader'].message_from_thread.connect(self.display_image_during_thread)
769
770
  else:
770
771
  self.message.setText("Wait for the analysis to end")
771
772
  else:
@@ -786,24 +787,24 @@ class VideoAnalysisWindow(MainTabsType):
786
787
  This function will only start the analysis if no other threads
787
788
  are running. It updates several attributes of the parent object.
788
789
  """
789
- if self.thread['OneArena'].isRunning() or self.thread['ChangeOneRepResult'].isRunning():
790
+ if self.thread_dict['OneArena'].isRunning() or self.thread_dict['ChangeOneRepResult'].isRunning():
790
791
  self.message.setText("Wait for the current analysis to end")
791
792
  else:
792
- if self.thread['VideoReader'].isRunning():
793
- self.thread['VideoReader'].wait()
794
- if self.parent().firstwindow.thread["RunAll"].isRunning():
793
+ if self.thread_dict['VideoReader'].isRunning():
794
+ self.thread_dict['VideoReader'].wait()
795
+ if self.parent().firstwindow.thread_dict["RunAll"].isRunning():
795
796
  self.message.setText('Analysis has already begun in the first window.')
796
797
  else:
797
- if not self.thread['RunAll'].isRunning():
798
+ if not self.thread_dict['RunAll'].isRunning():
798
799
  self.save_current_settings()
799
800
  self.parent().po.motion = None
800
801
  self.parent().po.converted_video = None
801
802
  self.parent().po.converted_video2 = None
802
803
  self.parent().po.visu = None
803
804
  self.message.setText("Complete analysis has started, wait...")
804
- self.thread['RunAll'].start() # RunAllThread
805
- self.thread['RunAll'].message_from_thread.connect(self.display_message_from_thread)
806
- self.thread['RunAll'].image_from_thread.connect(self.display_image_during_thread)
805
+ self.thread_dict['RunAll'].start() # RunAllThread
806
+ self.thread_dict['RunAll'].message_from_thread.connect(self.display_message_from_thread)
807
+ self.thread_dict['RunAll'].image_from_thread.connect(self.display_image_during_thread)
807
808
 
808
809
  def display_message_from_thread(self, text_from_thread: str):
809
810
  """
@@ -816,19 +817,3 @@ class VideoAnalysisWindow(MainTabsType):
816
817
  """
817
818
  self.message.setText(text_from_thread)
818
819
 
819
- def closeEvent(self, event):
820
- """
821
- Handle the close event for a QWidget.
822
- """
823
- event.accept
824
-
825
-
826
- # if __name__ == "__main__":
827
- # from cellects.gui.cellects import CellectsMainWidget
828
- # import sys
829
- # app = QtWidgets.QApplication([])
830
- # parent = CellectsMainWidget()
831
- # session = VideoAnalysisWindow(parent, False)
832
- # parent.insertWidget(0, session)
833
- # parent.show()
834
- # sys.exit(app.exec())
@@ -169,7 +169,7 @@ def compute_one_descriptor_per_colony(binary_vid: NDArray[np.uint8], arena_label
169
169
  centroids = []
170
170
 
171
171
  # pat_tracker = PercentAndTimeTracker(dims[0], compute_with_elements_number=True)
172
- for t in tqdm(np.arange(2)):#dims[0])):
172
+ for t in tqdm(np.arange(dims[0])):
173
173
  # We rank colonies in increasing order to make sure that the larger colony issued from a colony division
174
174
  # keeps the previous colony name.
175
175
  # shapes, stats, centers = cc(binary_vid[t, :, :])
@@ -635,7 +635,7 @@ def read_and_rotate(image_name, prev_img: NDArray=None, raw_images: bool=False,
635
635
 
636
636
  Examples
637
637
  ------
638
- >>> pathway = Path(__name__).resolve().parents[0] / "data" / "experiment"
638
+ >>> pathway = Path(__name__).resolve().parents[0] / "data" / "single_experiment"
639
639
  >>> image_name = 'image1.tif'
640
640
  >>> image = read_and_rotate(pathway /image_name)
641
641
  >>> print(image.shape)
@@ -1084,7 +1084,7 @@ def extract_time(image_list: list, pathway="", raw_images:bool=False):
1084
1084
 
1085
1085
  Examples
1086
1086
  --------
1087
- >>> pathway = Path(__name__).resolve().parents[0] / "data" / "experiment"
1087
+ >>> pathway = Path(__name__).resolve().parents[0] / "data" / "single_experiment"
1088
1088
  >>> image_list = ['image1.tif', 'image2.tif']
1089
1089
  >>> time = extract_time(image_list, pathway)
1090
1090
  >>> print(time)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cellects
3
- Version: 0.3.1
3
+ Version: 0.3.5
4
4
  Summary: Cell Expansion Computer Tracking Software.
5
5
  Author: Aurèle Boussard
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -730,7 +730,7 @@ Requires-Dist: mkdocs-jupyter; extra == "doc"
730
730
  [![Python versions](https://img.shields.io/pypi/pyversions/cellects.svg?style=flat-square)](https://pypi.org/project/cellects/)
731
731
  [![License](https://img.shields.io/pypi/l/cellects.svg?style=flat-square)](https://github.com/Aurele-B/cellects/blob/main/LICENSE)
732
732
  [![Stars](https://img.shields.io/github/stars/Aurele-B/cellects.svg?style=flat-square)](https://github.com/Aurele-B/cellects/stargazers)
733
- ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/Aurele-B/Cellects/.github%2Fworkflows%2Fci.yml)
733
+ ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/Aurele-B/Cellects/.github%2Fworkflows%2Frelease.yml)
734
734
  ![Coverage](https://raw.githubusercontent.com/Aurele-B/cellects/gh-pages/badges/coverage.svg)
735
735
 
736
736
  Description
@@ -748,7 +748,7 @@ easy installation and user-friendly interface.
748
748
 
749
749
  ---
750
750
 
751
- ## 🚀 Installation (Short version)
751
+ ## Installation (Short version)
752
752
  Install using our Windows installer: [Cellects_installer.exe](https://github.com/Aurele-B/Cellects/releases/)
753
753
 
754
754
  Or, install via pip:
@@ -759,15 +759,15 @@ Any difficulties? follow our [complete installation tutorial](https://aurele-b.g
759
759
 
760
760
  ---
761
761
 
762
- ## 🎯 Quick Start
762
+ ## Quick Start
763
763
  Run in terminal:
764
764
  ```bash
765
- Cellects
765
+ cellects
766
766
  ```
767
767
 
768
768
  ---
769
769
 
770
- ## 📚 Documentation
770
+ ## Documentation
771
771
 
772
772
  Cellects' workflow is described in a [complete documentation](https://aurele-b.github.io/Cellects/). It includes:
773
773
  - [**What is Cellects**](https://aurele-b.github.io/Cellects/what-is-cellects/): Purpose of the software, usable data and introduction of its user manual
@@ -779,7 +779,7 @@ Cellects' workflow is described in a [complete documentation](https://aurele-b.g
779
779
 
780
780
  ---
781
781
 
782
- ## 🧪 Use Cases
782
+ ## Use Cases
783
783
 
784
784
  See [use cases](https://aurele-b.github.io/Cellects/use-cases/) for real-world examples:
785
785
  - Automated Physarum polycephalum tracking using GUI
@@ -788,7 +788,7 @@ See [use cases](https://aurele-b.github.io/Cellects/use-cases/) for real-world e
788
788
 
789
789
  ---
790
790
 
791
- ## 🛠 Contributing
791
+ ## Contributing
792
792
 
793
793
  We welcome contributions!
794
794
  1. Fork the repository and create a new branch.
@@ -798,7 +798,7 @@ For developer workflows, see [**Contributing**](https://aurele-b.github.io/Celle
798
798
 
799
799
  ---
800
800
 
801
- ## 📌 License & Citation
801
+ ## License & Citation
802
802
 
803
803
  GNU GPL3 License (see [LICENSE](https://github.com/Aurele-B/cellects/blob/main/LICENSE)).
804
804
 
@@ -816,7 +816,7 @@ To cite Cellects, use:
816
816
 
817
817
  ---
818
818
 
819
- ## 🧪 Testing
819
+ ## Testing
820
820
 
821
821
  Run unit tests with:
822
822
  ```bash
@@ -3,22 +3,22 @@ cellects/__main__.py,sha256=7JEHy1h2TRZCrGh1TmYp_b1QLWm8ZqekRkKb9wKE-dU,2798
3
3
  cellects/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cellects/config/all_vars_dict.py,sha256=Vdu0JoIqwY6QPa8z_DDiZd5QTEdIhPkSvGDjyzX5GTU,6249
5
5
  cellects/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- cellects/core/cellects_paths.py,sha256=vwFEYXVAD16w0euoTuJ8Ca0tUyelsoiDNmWqryU5k-k,880
6
+ cellects/core/cellects_paths.py,sha256=fZ0p1h4zOeb8HCYkr6qAkCWtAJjgGD4R9FLAcPtjrX8,887
7
7
  cellects/core/cellects_threads.py,sha256=YRitz7JY5TVq9BSrqU3S8K-srW9gsFfkG16G3zVF--Y,96014
8
8
  cellects/core/motion_analysis.py,sha256=F2TpebmmvAgH0cY-P2J4CjqDxb_uB1BbAZlGcrGvVPI,99711
9
9
  cellects/core/one_image_analysis.py,sha256=Z5ztSmiRUeaJHGiTVPFOS_XbMtcjoER72g72Pa4_ziM,43557
10
10
  cellects/core/program_organizer.py,sha256=mJlznRrgMWxnPdAbrrkLtYQVhisvc4_WihpKSFIkDPA,92383
11
- cellects/core/script_based_run.py,sha256=EIGPK_pnyHLwExvCgM9C44LFOle9KKp_sRl0da4fA3o,7017
11
+ cellects/core/script_based_run.py,sha256=phkQ7woGuiDvmXecttLQBHNCEmrbZ9_fYTQwk9ya-wo,7340
12
12
  cellects/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- cellects/gui/advanced_parameters.py,sha256=8lpXsSrLr7JZ0PUsl2rslddwU4KSNqWjmqUd68_u1Ng,77321
14
- cellects/gui/cellects.py,sha256=KpCOL1j3sBVcqp5l2epNc28knekGGLUYiLZ3XmEw5BE,8325
15
- cellects/gui/custom_widgets.py,sha256=tSB8sIPCJ8B10eTNrfj1iKoztSQS0iYX2WjYjGpI88o,34257
16
- cellects/gui/first_window.py,sha256=_uYruDNS2FTBMD-T4wUsUJjN6O3uJ_dI_Mf706Zrroo,28585
17
- cellects/gui/if_several_folders_window.py,sha256=9KcnWxzURtxS6ViyoWZVJ7dFBlH4XcRCCsWuL1v4L-c,13803
18
- cellects/gui/image_analysis_window.py,sha256=DVd0b7IswiFyQIp3KxAWMreJoKQLBJ0r3QYEMFzSsvE,131348
19
- cellects/gui/required_output.py,sha256=ib3jXSzRuRzE_yU_ZNkrimCcq6NjAukz088T2Zgl95c,13654
13
+ cellects/gui/advanced_parameters.py,sha256=wDQO628Trp-MjufVfSoznb3gcpd61RZihlqypRccuoc,77950
14
+ cellects/gui/cellects.py,sha256=EvY5aXjtcydxIiPEQH_xlkGJsLVgCZvjfL7UQfBnowY,8676
15
+ cellects/gui/custom_widgets.py,sha256=9UXbK_eFaLrkcqFukEMFFZaSkHSZJ-2lZF6BT8e9aFo,28514
16
+ cellects/gui/first_window.py,sha256=vBL_ZjkHlYo1lrMGDtRFWf4yfV7XB5E7gBBkscbfVfU,29530
17
+ cellects/gui/if_several_folders_window.py,sha256=bW1GYAHjx4uIW1Dr-jxcVYFxo4LUOei0jKMKxCXUBhY,14091
18
+ cellects/gui/image_analysis_window.py,sha256=F7_o7esCx6hk8_MPDn4XKzime9MNDf5YBQzaIq64Irg,133321
19
+ cellects/gui/required_output.py,sha256=HUI-Odk_Izrar4hNqPzObzrVw2s8JMiu-SC0TYTu3AA,13709
20
20
  cellects/gui/ui_strings.py,sha256=_IdMR7Xalk6-USEQ3zNcUmFE04Tmf8QneLzvKs3rEOM,31181
21
- cellects/gui/video_analysis_window.py,sha256=hxIqEWKisJSV3tnceFQfVXkjmC_AuARCcqMZ5ucmGIQ,43340
21
+ cellects/gui/video_analysis_window.py,sha256=fcdi6V1a9D4aubZT4UWy-fKP78_80rduigPG9fvofio,44136
22
22
  cellects/icons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  cellects/icons/cellects_icon.icns,sha256=3GM5rpVKUoy-gAYEee5gGPh9lQx9KZqh9iRqYCT83Aw,393392
24
24
  cellects/icons/cellects_icon.ico,sha256=Eqlci8zZ0zdsRh2kSQAu4aHAPbR2NEzSbJPgaRQNenI,208076
@@ -30,15 +30,15 @@ cellects/image_analysis/network_functions.py,sha256=QHBU09U8My3IQqzDhxcK9t6ZDhxh
30
30
  cellects/image_analysis/one_image_analysis_threads.py,sha256=Spq_LyGiVE4IhsnU8h0DS03c_Y_xHSeCzK2vPvyeah8,17675
31
31
  cellects/image_analysis/oscillations_functions.py,sha256=87dZAEVf4jzyVfM5_iFVsuUOJPxZ5gXSHsZsH3A7n7A,6853
32
32
  cellects/image_analysis/progressively_add_distant_shapes.py,sha256=WTIW0JZBPiVmnwP_vG18bp6BPRCsr0JPdGd1SEdUPUU,25719
33
- cellects/image_analysis/shape_descriptors.py,sha256=L9r4-Y-n4_k4hL1FpDbE1Plgo9Lq25sGkoZ4Lt9CnMY,41964
33
+ cellects/image_analysis/shape_descriptors.py,sha256=fFzt0-Q8cErfHw7gpHGrx01ytyGKywidyGlb6zGmcVE,41959
34
34
  cellects/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  cellects/utils/decorators.py,sha256=kjZWSK71l5-LrrH7BZHb0kdFaAikC_qZu14_KjIUCms,361
36
36
  cellects/utils/formulas.py,sha256=C-koFJpqt42fUe4pfNO-5tzZqyEV90MyqmULt9CIYs8,25287
37
- cellects/utils/load_display_save.py,sha256=ZlqB7LFGrTphWCZBVDex0_ISZV4q3Xsmc9q_jyxVqSI,48969
37
+ cellects/utils/load_display_save.py,sha256=I9NBlXSRghLzp1Dw8L607vtViCuFWtTYjZHurSI_e0Q,48983
38
38
  cellects/utils/utilitarian.py,sha256=mwGWUgrnaO_2Lne485cp0MxsCxtK68whK9O2fAJ725E,19735
39
- cellects-0.3.1.dist-info/LICENSE,sha256=RkNnEPPAi068Hv0ST1RwdKOi_Mc6Ukik5twIYPLWXjw,35176
40
- cellects-0.3.1.dist-info/METADATA,sha256=P82bC6T7DxaYyRTZi0x_sLuVEfCl5YaSak-DI8ydiAM,46231
41
- cellects-0.3.1.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
42
- cellects-0.3.1.dist-info/entry_points.txt,sha256=JT6rEvKpUuKyDPvfOYma-IMQNvfnKMstFMAoVJhXIGc,60
43
- cellects-0.3.1.dist-info/top_level.txt,sha256=8VlvCH4ka3bqugIpQnOVjc3UV9Vavfx5SXNyUV9_lGw,9
44
- cellects-0.3.1.dist-info/RECORD,,
39
+ cellects-0.3.5.dist-info/LICENSE,sha256=RkNnEPPAi068Hv0ST1RwdKOi_Mc6Ukik5twIYPLWXjw,35176
40
+ cellects-0.3.5.dist-info/METADATA,sha256=yreFFI5U2v4HQHQhq5WJVIlW7Tszo6RxNACTYcjlr18,46201
41
+ cellects-0.3.5.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
42
+ cellects-0.3.5.dist-info/entry_points.txt,sha256=JT6rEvKpUuKyDPvfOYma-IMQNvfnKMstFMAoVJhXIGc,60
43
+ cellects-0.3.5.dist-info/top_level.txt,sha256=8VlvCH4ka3bqugIpQnOVjc3UV9Vavfx5SXNyUV9_lGw,9
44
+ cellects-0.3.5.dist-info/RECORD,,