LCOV - code coverage report
Current view: top level - src/pairinteraction_gui/page - one_atom_page.py (source / functions) Hit Total Coverage
Test: coverage.info Lines: 47 48 97.9 %
Date: 2026-04-17 09:29:39 Functions: 6 6 100.0 %

          Line data    Source code
       1             : # SPDX-FileCopyrightText: 2025 PairInteraction Developers
       2             : # SPDX-License-Identifier: LGPL-3.0-or-later
       3           1 : from __future__ import annotations
       4             : 
       5           1 : import logging
       6           1 : from typing import TYPE_CHECKING, Any
       7             : 
       8           1 : from pairinteraction_gui.calculate.calculate_one_atom import ParametersOneAtom, calculate_one_atom
       9           1 : from pairinteraction_gui.config import (
      10             :     BasisConfigOneAtom,
      11             :     CalculationConfig,
      12             :     KetConfigOneAtom,
      13             :     SystemConfigOneAtom,
      14             : )
      15           1 : from pairinteraction_gui.page.base_page import CalculationPage
      16             : 
      17             : if TYPE_CHECKING:
      18             :     from pairinteraction.state import StateBase
      19             :     from pairinteraction_gui.calculate.calculate_one_atom import ResultsOneAtom
      20             : 
      21           1 : logger = logging.getLogger(__name__)
      22             : 
      23             : 
      24           1 : class OneAtomPage(CalculationPage):
      25             :     """Page for configuring and analyzing single-atom systems."""
      26             : 
      27           1 :     title = "One\nAtom"
      28           1 :     tooltip = "Configure and analyze single-atom systems"
      29             : 
      30           1 :     def setupWidget(self) -> None:
      31           1 :         super().setupWidget()
      32             : 
      33             :         # all attributes of instance BaseConfig will be added to the toolbox in postSetupWidget
      34           1 :         self.ket_config = KetConfigOneAtom(self)
      35           1 :         self.basis_config = BasisConfigOneAtom(self)
      36           1 :         self.system_config = SystemConfigOneAtom(self)
      37           1 :         self.calculation_config = CalculationConfig(self)
      38             : 
      39           1 :         self.ket_config.signal_species_changed.connect(self.basis_config.on_species_changed)
      40           1 :         self.ket_config.signal_species_changed.connect(self.plotwidget.clear)
      41             : 
      42           1 :     def calculate(self) -> tuple[ParametersOneAtom, ResultsOneAtom]:
      43           1 :         parameters = ParametersOneAtom.from_page(self)
      44           1 :         results = calculate_one_atom(parameters)
      45           1 :         return parameters, results
      46             : 
      47           1 :     def _plot_function(self, parameters: ParametersOneAtom, results: ResultsOneAtom) -> None:  # type: ignore[override]
      48           1 :         self.add_short_labels(results)
      49             : 
      50           1 :     def add_short_labels(
      51             :         self,
      52             :         results: ResultsOneAtom,
      53             :     ) -> None:
      54           1 :         if not results.systems:
      55           0 :             return
      56             : 
      57           1 :         ax = self.plotwidget.canvas.ax
      58           1 :         x_lim = ax.get_xlim()
      59           1 :         ax.set_xlim(x_lim[0] - (x_lim[1] - x_lim[0]) * 0.1, x_lim[1])
      60             : 
      61           1 :         used = set()
      62           1 :         states0: list[StateBase[Any]] = results.systems[0].get_eigenbasis().states
      63           1 :         for state, energy in zip(states0, results.energies[0], strict=True):
      64           1 :             ket_label = state.get_label()
      65           1 :             short_label = ket_label[1:-1]
      66           1 :             short_label = short_label.split(":", 1)[-1]
      67           1 :             components = short_label.split(",")
      68           1 :             short_label = ",".join(components[:-1])
      69           1 :             short_label = short_label.split("_", 1)[0]
      70           1 :             if short_label in used:
      71           1 :                 continue
      72           1 :             used.add(short_label)
      73           1 :             self.plotwidget.canvas.ax.text(x_lim[0], energy, short_label, va="center", ha="right")
      74             : 
      75           1 :     def _get_export_notebook_template_name(self) -> str:
      76           1 :         return "one_atom.ipynb"
      77             : 
      78           1 :     def _get_export_replacements(self) -> dict[str, str]:
      79           1 :         parameters = ParametersOneAtom.from_page(self)
      80           1 :         return parameters.to_replacement_dict()

Generated by: LCOV version 1.16