From f975c3b1062f4372910117c6b2feaa94e2cc7e9f Mon Sep 17 00:00:00 2001 From: Rafael Mannarelli Date: Tue, 24 Jun 2025 12:29:24 +0200 Subject: [PATCH] Add clear blink intervals feature --- README.md | 2 +- src/main/python/ui/MenuBar.ui | 9 +++++++++ src/main/python/ui/_MenuBar.py | 11 +++++++++++ src/main/python/widgets/base_window.py | 8 ++++++++ src/main/python/widgets/trace_window.py | 24 ++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d34cc3..16ec489 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ FRET (smFRET) fast and efficiently. The key feature is reverse-loading of ASCII - Memory-free movie batch loading - Distribution plotting and fitting - Backwards-compatibility with iSMS-exported data -- Manual blinking interval selection and export +- Manual blinking interval selection, clearing and export If you'd like to play around with just the Keras/TensorFlow model, please go to https://github.com/komodovaran/DeepFRET-Model diff --git a/src/main/python/ui/MenuBar.ui b/src/main/python/ui/MenuBar.ui index 7f67ca4..7d2fa68 100644 --- a/src/main/python/ui/MenuBar.ui +++ b/src/main/python/ui/MenuBar.ui @@ -135,6 +135,7 @@ Manually Select Blinking + @@ -598,6 +599,14 @@ Blink Interval + + + false + + + Clear Blink Intervals + + false diff --git a/src/main/python/ui/_MenuBar.py b/src/main/python/ui/_MenuBar.py index bdd28b9..d07ce81 100644 --- a/src/main/python/ui/_MenuBar.py +++ b/src/main/python/ui/_MenuBar.py @@ -224,6 +224,11 @@ def setupUi(self, MenuBar): self.actionSelect_Blink_Interval.setObjectName( "actionSelect_Blink_Interval" ) + self.actionClear_Blink_Intervals = QtWidgets.QAction(MenuBar) + self.actionClear_Blink_Intervals.setEnabled(False) + self.actionClear_Blink_Intervals.setObjectName( + "actionClear_Blink_Intervals" + ) self.actionAdvanced_Sort = QtWidgets.QAction(MenuBar) self.actionAdvanced_Sort.setEnabled(False) self.actionAdvanced_Sort.setObjectName("actionAdvanced_Sort") @@ -285,6 +290,9 @@ def setupUi(self, MenuBar): self.menuManually_Select_Blinking.addAction( self.actionSelect_Blink_Interval ) + self.menuManually_Select_Blinking.addAction( + self.actionClear_Blink_Intervals + ) self.menuPredict_Trace_Type.addAction( self.actionPredict_Selected_Traces ) @@ -518,6 +526,9 @@ def retranslateUi(self, MenuBar): self.actionSelect_Blink_Interval.setText( _translate("MenuBar", "Blink Interval") ) + self.actionClear_Blink_Intervals.setText( + _translate("MenuBar", "Clear Blink Intervals") + ) self.actionAdvanced_Sort.setText(_translate("MenuBar", "Advanced Sort")) self.actionCheck_All.setText(_translate("MenuBar", "Check All")) self.actionCheck_All.setShortcut( diff --git a/src/main/python/widgets/base_window.py b/src/main/python/widgets/base_window.py index 4fdf547..2c0dadd 100644 --- a/src/main/python/widgets/base_window.py +++ b/src/main/python/widgets/base_window.py @@ -178,6 +178,10 @@ def setupMenuBarActions(self): for f in (self.triggerBlink, self.refreshPlot): self.ui.actionSelect_Blink_Interval.triggered.connect(f) + self.ui.actionClear_Blink_Intervals.triggered.connect( + self.clearBlinkIntervals + ) + # self.ui.actionFit_Hmm_Current.triggered.connect( # partial(self.fitSingleTraceHiddenMarkovModel, True) # ) @@ -922,6 +926,10 @@ def triggerBlink(self): """Override in subclass.""" pass + def clearBlinkIntervals(self): + """Override in subclass.""" + pass + def triggerBleach(self, color): """Override in subclass.""" pass diff --git a/src/main/python/widgets/trace_window.py b/src/main/python/widgets/trace_window.py index f210bb9..031b1c9 100644 --- a/src/main/python/widgets/trace_window.py +++ b/src/main/python/widgets/trace_window.py @@ -118,6 +118,7 @@ def enablePerWindow(self): self.ui.actionSelect_Bleach_Red_Channel, self.ui.actionSelect_Bleach_Green_Channel, self.ui.actionSelect_Blink_Interval, + self.ui.actionClear_Blink_Intervals, self.ui.actionFit_Hmm_Selected, self.ui.actionPredict_Selected_Traces, self.ui.actionPredict_All_traces, @@ -767,6 +768,29 @@ def clearCorrectionFactors(self): self.clearMarkerLines() self.refreshPlot() + def clearBlinkIntervals(self): + """Clear manually selected blink intervals for the current trace.""" + if self.currName is not None: + trace = self.currentTrace() + trace.blink_intervals = [] + trace.hmm = None + + self.refreshPlot() + + histogram_window = self.windows[gvars.HistogramWindow] + transition_density_window = self.windows[gvars.TransitionDensityWindow] + + histogram_window.getHistogramData() + histogram_window.gauss_params = None + if histogram_window.isVisible(): + histogram_window.refreshPlot() + + histogram_window.setPooledLifetimes() + transition_density_window.setClusteredTransitions() + + if transition_density_window.isVisible(): + transition_density_window.refreshPlot() + def getCurrentLines(self, ax): """Get labels of currently plotted lines""" if self.currName is not None: