Skip to content

spectra_plot

Plot Spectra data

SpectraPlotSlider

Bases: SpectraPlot

SpectraPlot with slider for energy split and sum rules

Source code in mmg_toolbox/tkguis/xmcd_visualiser/spectra_plot.py
class SpectraPlotSlider(SpectraPlot):
    """SpectraPlot with slider for energy split and sum rules"""
    def __init__(self, root: tk.Misc, spectra: SpectraContainerSubtraction | None = None, mode: str | None = None,
                 config: dict | None = None, fig_size: tuple[int, int] | None = None, fig_dpi: int = None):
        root.grid_rowconfigure(0, weight=1)
        root.grid_rowconfigure(1, weight=0)
        root.grid_rowconfigure(2, weight=0)

        frame = ttk.Frame(root)
        frame.grid(row=0, column=0, sticky='nsew')
        super().__init__(frame, spectra, mode, config, fig_size, fig_dpi)
        self.slider_value = tk.DoubleVar(root, 0)
        self.report = tk.StringVar(root, '')

        frame = ttk.Frame(root)
        frame.grid(row=1, column=0, sticky='nsew')
        # Add Slider
        self.slider = self.ini_slider(frame)
        # Add Report
        frm = ttk.LabelFrame(root, text='Sum Rules', relief='ridge')
        frm.grid(row=2, column=0, sticky='nsew')
        ttk.Label(frm, textvariable=self.report).pack(side='left', fill='both')

    def ini_slider(self, root: tk.Misc):
        if self.spectra:
            spectrum = next(iter(self.spectra.spectra.values()))
            en_min, en_max = min(spectrum.energy), max(spectrum.energy)
            edges = self.spectra.get_edges()
            default_split = spectrum.get_split_energy(edges)
            self.slider_value.set(default_split)
        else:
            en_min, en_max = 0, 100
            self.slider_value.set(50)

        frm = ttk.Frame(root)
        frm.pack(side='top', fill='x', expand=True, pady=2, padx=5)

        slider = ttk.Scale(frm, from_=en_min, to=en_max, variable=self.slider_value, orient='horizontal',
                            command=self.update_slider)
        slider.pack(side='left', expand=True)
        ttk.Label(frm, textvariable=self.slider_value, width=12).pack(side='left')
        return slider

    def update_spectra(self, spectra: SpectraContainerSubtraction, mode: str | None = None):
        super().update_spectra(spectra, mode)

        spectrum = next(iter(self.spectra.spectra.values()))
        en_min, en_max = min(spectrum.energy), max(spectrum.energy)
        self.slider.config(from_=en_min, to=en_max)
        edges = self.spectra.get_edges()
        default_split = spectrum.get_split_energy(edges)
        self.slider_value.set(default_split)
        self.update_slider()

    def update_slider(self, event=None):
        split = self.slider_value.get()
        self._update_plot(split_energy=split)
        report = self.spectra.sum_rules_report(split_energy=split)
        self.report.set(report)