cellects 0.3.0__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.
- cellects/core/cellects_paths.py +1 -1
- cellects/core/script_based_run.py +5 -1
- cellects/gui/advanced_parameters.py +21 -32
- cellects/gui/cellects.py +10 -4
- cellects/gui/custom_widgets.py +4 -103
- cellects/gui/first_window.py +37 -43
- cellects/gui/if_several_folders_window.py +11 -18
- cellects/gui/image_analysis_window.py +103 -119
- cellects/gui/required_output.py +7 -16
- cellects/gui/video_analysis_window.py +50 -65
- cellects/image_analysis/shape_descriptors.py +1 -1
- cellects/utils/load_display_save.py +2 -2
- {cellects-0.3.0.dist-info → cellects-0.3.5.dist-info}/METADATA +10 -10
- {cellects-0.3.0.dist-info → cellects-0.3.5.dist-info}/RECORD +18 -18
- {cellects-0.3.0.dist-info → cellects-0.3.5.dist-info}/LICENSE +0 -0
- {cellects-0.3.0.dist-info → cellects-0.3.5.dist-info}/WHEEL +0 -0
- {cellects-0.3.0.dist-info → cellects-0.3.5.dist-info}/entry_points.txt +0 -0
- {cellects-0.3.0.dist-info → cellects-0.3.5.dist-info}/top_level.txt +0 -0
|
@@ -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.
|
|
80
|
-
self.
|
|
81
|
-
self.
|
|
82
|
-
self.
|
|
83
|
-
self.
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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.
|
|
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.
|
|
479
|
-
'ChangeOneRepResult'].isRunning() or self.parent().firstwindow.
|
|
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().
|
|
530
|
-
self.parent().
|
|
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.
|
|
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.
|
|
651
|
-
self.
|
|
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.
|
|
657
|
-
self.
|
|
658
|
-
self.
|
|
659
|
-
self.
|
|
660
|
-
self.
|
|
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.
|
|
675
|
-
self.
|
|
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.
|
|
703
|
-
self.
|
|
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.
|
|
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.
|
|
748
|
-
self.
|
|
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.
|
|
767
|
-
self.
|
|
768
|
-
self.
|
|
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.
|
|
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.
|
|
793
|
-
self.
|
|
794
|
-
if self.parent().firstwindow.
|
|
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.
|
|
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.
|
|
805
|
-
self.
|
|
806
|
-
self.
|
|
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(
|
|
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" / "
|
|
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" / "
|
|
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.
|
|
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
|
[](https://pypi.org/project/cellects/)
|
|
731
731
|
[](https://github.com/Aurele-B/cellects/blob/main/LICENSE)
|
|
732
732
|
[](https://github.com/Aurele-B/cellects/stargazers)
|
|
733
|
-

|
|
734
734
|

|
|
735
735
|
|
|
736
736
|
Description
|
|
@@ -748,7 +748,7 @@ easy installation and user-friendly interface.
|
|
|
748
748
|
|
|
749
749
|
---
|
|
750
750
|
|
|
751
|
-
##
|
|
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
|
-
##
|
|
762
|
+
## Quick Start
|
|
763
763
|
Run in terminal:
|
|
764
764
|
```bash
|
|
765
|
-
|
|
765
|
+
cellects
|
|
766
766
|
```
|
|
767
767
|
|
|
768
768
|
---
|
|
769
769
|
|
|
770
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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=
|
|
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=
|
|
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=
|
|
14
|
-
cellects/gui/cellects.py,sha256=
|
|
15
|
-
cellects/gui/custom_widgets.py,sha256=
|
|
16
|
-
cellects/gui/first_window.py,sha256=
|
|
17
|
-
cellects/gui/if_several_folders_window.py,sha256=
|
|
18
|
-
cellects/gui/image_analysis_window.py,sha256=
|
|
19
|
-
cellects/gui/required_output.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
40
|
-
cellects-0.3.
|
|
41
|
-
cellects-0.3.
|
|
42
|
-
cellects-0.3.
|
|
43
|
-
cellects-0.3.
|
|
44
|
-
cellects-0.3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|