Source code for palm_tracer.Settings.Settings

"""
Ce fichier définit la classe :class:`.Settings`, utilisée pour gérer et enregistrer les paramètres nécessaires à la configuration de PALM Tracer.

**Fonctionnalités principales** :

- Permet le parsing et l'enregistrement des paramètres liés à l'interface utilisateur.
- Fournit une gestion structurée des paramètres par sections et algorithmes.

**Usage** :

La classe :class:`.Settings` est conçue pour interagir directement avec l'interface utilisateur en facilitant le paramétrage de PALM Tracer.
"""
from contextlib import AbstractContextManager, ExitStack
from dataclasses import dataclass, field
from typing import Any, Callable, cast, Optional

from palm_tracer.Settings.Groups.BaseSettingGroup import BaseSettingGroup
from palm_tracer.Settings.Groups.Batch import Batch
from palm_tracer.Settings.Groups.BlinkingReconnection import BlinkingReconnection
from palm_tracer.Settings.Groups.Calibration import Calibration
from palm_tracer.Settings.Groups.BeadsExtraction import BeadsExtraction
from palm_tracer.Settings.Groups.Filtering import Filtering
from palm_tracer.Settings.Groups.Gallery import Gallery
from palm_tracer.Settings.Groups.Localization import Localization
from palm_tracer.Settings.Groups.Tracking import Tracking
from palm_tracer.Settings.Groups.TracksCompute import TracksCompute
from palm_tracer.Settings.Groups.VisualizationGraph import VisualizationGraph
from palm_tracer.Settings.Groups.VisualizationHR import VisualizationHR


##################################################
[docs] @dataclass class Settings: """Classe nécessaire au parsing et enregistrement des différents paramètres de PALM Tracer.""" _settings: dict[str, BaseSettingGroup] = field(init=False, default_factory=dict[str, BaseSettingGroup]) """Dictionnaire de groupes de paramètres.""" # ================================================== # region Initialization # ================================================== ################################################## def __post_init__(self): """Méthode appelée automatiquement après l'initialisation du dataclass.""" self._settings = dict[str, BaseSettingGroup]() list_settings = [Batch, Calibration, Localization, BeadsExtraction, Tracking, BlinkingReconnection, TracksCompute, Gallery, VisualizationHR, VisualizationGraph, Filtering] for setting in list_settings: self._settings[setting.__name__] = setting() self._settings["Batch"].always_active() self._settings["Calibration"].always_active() ##################################################
[docs] def reset(self): """Remet les valeurs par défaut des paramètres.""" for _, setting in self._settings.items(): setting.reset()
##################################################
[docs] def connect(self, f: Any): """ Connecte une fonction ou un slot à l'intégralité des paramètres. :param f: Fonction ou slot à connecter. """ for _, setting in self._settings.items(): setting.connect(f)
##################################################
[docs] def disconnect(self, f: Optional[Callable[[Any], None]] = None): """ Déconnecte une fonction ou un slot à tous les éléments du groupe. :param f: Fonction ou slot à déconnecter. :return: Nombre de slots déconnectés """ for _, setting in self._settings.items(): setting.disconnect(f)
##################################################
[docs] def signal_blocked(self) -> AbstractContextManager[Any]: """ Blocage des signaux pour l'intégralité des paramètres. :return: Retourne un context manager utilisable avec `with ...:`. """ # if not self._settings: return nullcontext() # On n'a pas de settings vide stack = ExitStack() for group in self._settings.values(): stack.enter_context(group.signal_blocked()) return stack
# ================================================== # endregion Initialization # ================================================== # ================================================== # region Getter/Setter # ================================================== ################################################## @property def batch(self) -> Batch: """Groupe de paramètres liés au batch (:class:`Batch <palm_tracer.Settings.Groups.Batch.Batch>`).""" return cast(Batch, self._settings["Batch"]) ################################################## @property def calibration(self) -> Calibration: """Groupe de paramètres liés à la calibration (:class:`Calibration <palm_tracer.Settings.Groups.Calibration.Calibration>`).""" return cast(Calibration, self._settings["Calibration"]) ################################################## @property def localization(self) -> Localization: """Groupe de paramètres liés à la localisation (:class:`Localization <palm_tracer.Settings.Groups.Localization.Localization>`).""" return cast(Localization, self._settings["Localization"]) ################################################## @property def beads(self) -> BeadsExtraction: """Groupe de paramètres liés à l'extraction des billes (:class:`BeadsExtraction <palm_tracer.Settings.Groups.BeadsExtraction.BeadsExtraction>`).""" return cast(BeadsExtraction, self._settings["BeadsExtraction"]) ################################################## @property def tracking(self) -> Tracking: """Groupe de paramètres liés au suivi (:class:`Tracking <palm_tracer.Settings.Groups.Tracking.Tracking>`).""" return cast(Tracking, self._settings["Tracking"]) ################################################## @property def blinking(self) -> BlinkingReconnection: """Groupe de paramètres liés à la correction du scintillement (:class:`BlinkingReconnection <palm_tracer.Settings.Groups.BlinkingReconnection.BlinkingReconnection>`).""" return cast(BlinkingReconnection, self._settings["BlinkingReconnection"]) ################################################## @property def tracks_compute(self) -> TracksCompute: """Groupe de paramètres liés aux calculs sur trajectoires (:class:`TracksCompute <palm_tracer.Settings.Groups.TracksCompute.TracksCompute>`.)""" return cast(TracksCompute, self._settings["TracksCompute"]) ################################################## @property def gallery(self) -> Gallery: """Groupe de paramètres liés à la génération de galerie (:class:`Gallery <palm_tracer.Settings.Groups.Gallery.Gallery>`).""" return cast(Gallery, self._settings["Gallery"]) ################################################## @property def visualization_hr(self) -> VisualizationHR: """Groupe de paramètres liés à la Visualisation haute-résolution (:class:`VisualizationHR <palm_tracer.Settings.Groups.VisualizationHR.VisualizationHR>`).""" return cast(VisualizationHR, self._settings["VisualizationHR"]) ################################################## @property def visualization_graph(self) -> VisualizationGraph: """Groupe de paramètres liés à la Visualisation graphique (:class:`VisualizationGraph <palm_tracer.Settings.Groups.VisualizationGraph.VisualizationGraph>`).""" return cast(VisualizationGraph, self._settings["VisualizationGraph"]) ################################################## @property def filtering(self) -> Filtering: """Groupe de paramètres liés au filtrage (:class:`Filtering <palm_tracer.Settings.Groups.Filtering.Filtering>`).""" return cast(Filtering, self._settings["Filtering"]) # ================================================== # endregion Getter/Setter # ================================================== # ================================================== # region Parsing # ================================================== ##################################################
[docs] def to_dict(self) -> dict[str, Any]: """Renvoie un dictionnaire contenant toutes les informations de la classe.""" return {"PALM Tracer Settings": {name: obj.to_dict() for name, obj in self._settings.items()}}
##################################################
[docs] @classmethod def from_dict(cls, data: dict[str, Any]) -> "Settings": """Créé une instance de la classe à partir d'un dictionnaire.""" res = cls() # Instancie la classe appelée res.update_from_dict(data) return res
##################################################
[docs] def update_from_dict(self, data: dict[str, Any]): """Mets à jour la classe à partir d'un dictionnaire.""" groups = data["PALM Tracer Settings"] for name, obj in self._settings.items(): if name in groups: obj.update_from_dict(groups[name])
##################################################
[docs] def to_compact_dict(self) -> dict[str, Any]: """Renvoie un dictionnaire minimal contenant la valeur du setting.""" return {"PALM Tracer Settings": {name: obj.to_compact_dict() for name, obj in self._settings.items()}}
##################################################
[docs] def update_from_compact_dict(self, data: dict[str, Any]): """Mets à jour la classe à partir d'un dictionnaire minimal.""" groups = data["PALM Tracer Settings"] for name, obj in self._settings.items(): if name in groups: obj.update_from_compact_dict(groups[name])
# ================================================== # endregion Parsing # ================================================== # ================================================== # region IO # ================================================== ##################################################
[docs] def tostring(self) -> str: """ Retourne une chaîne de caractères correspondant à la liste des paramètres. :return: Une description textuelle des paramètres de PALM Tracer. """ msg = f"Settings :\n" for key, setting in self._settings.items(): msg += f" - {key} :\n{setting.tostring(' ')}" return msg
################################################## def __str__(self) -> str: return self.tostring()