CoolFace
Apppublic

mlukac/xrf-explorer-dev

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
pca_proj_controller.py70 linesDownload Raw Back to controllers
1from typing import Callable2 3import panel as pn4import param5 6from xrf_explorer.common.defaults import K_MEANS, K_MEANS_BOUNDS7from xrf_explorer.core.events import (8    NClustersUpdated,9    ShowWeightsUpdated,10    XRFFileLoadHandled,11)12from xrf_explorer.core.types import EventTriggerProtocol13from xrf_explorer.helpers.print import time_me14 15 16class PCAProjController(param.Parameterized):17 18    show_weights = param.Boolean(default=False, allow_refs=True)19    n_clusters = param.Integer(default=K_MEANS, bounds=K_MEANS_BOUNDS)20 21    def __init__(22        self,23        app: EventTriggerProtocol,24        max_k_getter: Callable[[], int | None],25        **kwargs,26    ) -> None:27        super().__init__(**kwargs)28        self._app = app29        self._max_k_getter = max_k_getter30        self._initialized: bool = False31 32        self._show_weights_widget = pn.widgets.Switch.from_param(33            parameter=self.param.show_weights,34            name="Show Weights",35            align="center",36            margin=(0, 0, 0, 0),37        )38        self._n_clusters_widget = pn.widgets.IntSlider.from_param(39            parameter=self.param.n_clusters,40            name="Number of Clusters",41            min_width=100,42        )43 44    def handle_xrf_load(self, event: XRFFileLoadHandled) -> None:45        upper_bound = self._max_k_getter()46        self.param.n_clusters.bounds = (1, upper_bound)47        if self.n_clusters > upper_bound:48            self.n_clusters = upper_bound49        self._initialized = True50 51    @property52    def show_weights_widget(self) -> pn.widgets.Switch:53        return self._show_weights_widget54 55    @property56    def n_clusters_widget(self) -> pn.widgets.IntSlider:57        return self._n_clusters_widget58 59    @time_me()60    @param.depends("n_clusters", watch=True)61    def update_n_clusters(self) -> None:62        if not self._initialized:63            return64        self._app.trigger(NClustersUpdated(n_clusters=self.n_clusters))65 66    @time_me()67    @param.depends("show_weights", watch=True)68    def update_show_weights(self) -> None:69        self._app.trigger(ShowWeightsUpdated(show_weights=self.show_weights))70