2525from kymflow .core .analysis .utils import _medianFilter , _removeOutliers
2626from kymflow .core .utils .logging import get_logger
2727
28- from kymflow .core .analysis .stall_analysis import StallAnalysis , StallAnalysisParams
28+ # DEPRECATED: Stall analysis is deprecated
29+ # from kymflow.core.analysis.stall_analysis import StallAnalysis, StallAnalysisParams
2930from kymflow .core .analysis .velocity_events .velocity_events import (
3031 UserType ,
3132 VelocityEvent ,
@@ -145,7 +146,8 @@ def __init__(
145146 self ._analysis_metadata : Dict [int , RoiAnalysisMetadata ] = {}
146147 self ._df : Optional [pd .DataFrame ] = None
147148 self ._dirty : bool = False
148- self ._stall_analysis : Dict [int , StallAnalysis ] = {}
149+ # DEPRECATED: Stall analysis is deprecated
150+ # self._stall_analysis: Dict[int, StallAnalysis] = {}
149151 # Stall analysis is computed on-demand from stored analysis values (e.g., velocity).
150152 self ._velocity_events : Dict [int , List [VelocityEvent ]] = {}
151153 # Velocity events are computed on-demand from stored analysis values (e.g., velocity).
@@ -449,9 +451,10 @@ def save_analysis(self) -> bool:
449451 }
450452 for rid , meta in self ._analysis_metadata .items ()
451453 },
452- "stall_analysis" : {
453- str (rid ): sa .to_dict () for rid , sa in self ._stall_analysis .items ()
454- },
454+ # DEPRECATED: Stall analysis is deprecated
455+ # "stall_analysis": {
456+ # str(rid): sa.to_dict() for rid, sa in self._stall_analysis.items()
457+ # },
455458 "velocity_events" : {
456459 str (rid ): [ev .to_dict () for ev in evs ]
457460 for rid , evs in self ._velocity_events .items ()
@@ -534,15 +537,15 @@ def load_analysis(self) -> bool:
534537 except Exception as e :
535538 logger .warning (f"Skipping invalid analysis metadata entry { key } : { e } " )
536539
537-
538- # Load stall analysis (optional; may be absent in older analysis JSON).
539- self ._stall_analysis .clear ()
540- for roi_id_str , payload in json_data .get ("stall_analysis" , {}).items ():
541- try :
542- roi_id = int (roi_id_str )
543- self ._stall_analysis [roi_id ] = StallAnalysis .from_dict (payload )
544- except Exception as e :
545- logger .warning (f"Skipping invalid stall_analysis entry { roi_id_str } : { e } " )
540+ # DEPRECATED: Stall analysis is deprecated
541+ # # Load stall analysis (optional; may be absent in older analysis JSON).
542+ # self._stall_analysis.clear()
543+ # for roi_id_str, payload in json_data.get("stall_analysis", {}).items():
544+ # try:
545+ # roi_id = int(roi_id_str)
546+ # self._stall_analysis[roi_id] = StallAnalysis.from_dict(payload)
547+ # except Exception as e:
548+ # logger.warning(f"Skipping invalid stall_analysis entry {roi_id_str}: {e}")
546549
547550 # Load velocity events (optional; may be absent in older analysis JSON).
548551 self ._velocity_events .clear ()
@@ -568,9 +571,10 @@ def load_analysis(self) -> bool:
568571 self ._analysis_metadata = {
569572 rid : meta for rid , meta in self ._analysis_metadata .items () if rid in current_roi_ids
570573 }
571- self ._stall_analysis = {
572- rid : sa for rid , sa in self ._stall_analysis .items () if rid in current_roi_ids
573- }
574+ # DEPRECATED: Stall analysis is deprecated
575+ # self._stall_analysis = {
576+ # rid: sa for rid, sa in self._stall_analysis.items() if rid in current_roi_ids
577+ # }
574578 # Remove events for deleted ROIs and clean up UUID mappings
575579 removed_roi_ids = set (self ._velocity_events .keys ()) - current_roi_ids
576580 for removed_roi_id in removed_roi_ids :
@@ -655,53 +659,54 @@ def get_analysis_value(
655659 return values
656660
657661
658- def run_stall_analysis (self , roi_id : int , params : StallAnalysisParams ) -> StallAnalysis :
659- """Run stall analysis for a single ROI and store results.
660-
661- This method is intentionally **on-demand**: it does not run automatically
662- when flow analysis is computed. A caller (GUI/script) supplies parameters and
663- explicitly requests stall detection once the underlying analysis values exist.
664-
665- The source signal is selected via `params.velocity_key` (e.g. 'velocity',
666- 'cleanVelocity', 'signedVelocity').
667-
668- Args:
669- roi_id: Identifier of the ROI to analyze.
670- params: Stall analysis parameters.
671-
672- Returns:
673- The computed `StallAnalysis` instance.
674-
675- Raises:
676- ValueError: If the requested analysis values are missing for this ROI.
677- """
678- values = self .get_analysis_value (
679- roi_id = roi_id ,
680- key = params .velocity_key ,
681- remove_outliers = False ,
682- )
683- if values is None :
684- raise ValueError (
685- f"Cannot run stall analysis: ROI { roi_id } has no analysis values for key '{ params .velocity_key } '."
686- )
687-
688- analysis = StallAnalysis .run (velocity = values , params = params )
689- self ._stall_analysis [roi_id ] = analysis
690- # Mark dirty so callers know there are unsaved results.
691- self ._dirty = True
692- return analysis
693-
694- def get_stall_analysis (self , roi_id : int ) -> Optional [StallAnalysis ]:
695- """Return stall analysis results for roi_id, or None if not present.
696-
697- Args:
698- roi_id: Identifier of the ROI.
699-
700- Returns:
701- Stored `StallAnalysis` results, or None if stall analysis has not been run
702- for this ROI (or results were not loaded).
703- """
704- return self ._stall_analysis .get (roi_id )
662+ # DEPRECATED: Stall analysis is deprecated
663+ # def run_stall_analysis(self, roi_id: int, params: StallAnalysisParams) -> StallAnalysis:
664+ # """Run stall analysis for a single ROI and store results.
665+ #
666+ # This method is intentionally **on-demand**: it does not run automatically
667+ # when flow analysis is computed. A caller (GUI/script) supplies parameters and
668+ # explicitly requests stall detection once the underlying analysis values exist.
669+ #
670+ # The source signal is selected via `params.velocity_key` (e.g. 'velocity',
671+ # 'cleanVelocity', 'signedVelocity').
672+ #
673+ # Args:
674+ # roi_id: Identifier of the ROI to analyze.
675+ # params: Stall analysis parameters.
676+ #
677+ # Returns:
678+ # The computed `StallAnalysis` instance.
679+ #
680+ # Raises:
681+ # ValueError: If the requested analysis values are missing for this ROI.
682+ # """
683+ # values = self.get_analysis_value(
684+ # roi_id=roi_id,
685+ # key=params.velocity_key,
686+ # remove_outliers=False,
687+ # )
688+ # if values is None:
689+ # raise ValueError(
690+ # f"Cannot run stall analysis: ROI {roi_id} has no analysis values for key '{params.velocity_key}'."
691+ # )
692+ #
693+ # analysis = StallAnalysis.run(velocity=values, params=params)
694+ # self._stall_analysis[roi_id] = analysis
695+ # # Mark dirty so callers know there are unsaved results.
696+ # self._dirty = True
697+ # return analysis
698+ #
699+ # def get_stall_analysis(self, roi_id: int) -> Optional[StallAnalysis]:
700+ # """Return stall analysis results for roi_id, or None if not present.
701+ #
702+ # Args:
703+ # roi_id: Identifier of the ROI.
704+ #
705+ # Returns:
706+ # Stored `StallAnalysis` results, or None if stall analysis has not been run
707+ # for this ROI (or results were not loaded).
708+ # """
709+ # return self._stall_analysis.get(roi_id)
705710
706711 def run_velocity_event_analysis (
707712 self ,
0 commit comments