Line data Source code
1 : # SPDX-FileCopyrightText: 2025 Pairinteraction Developers 2 : # SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 1 : import logging 5 1 : from typing import Any 6 : 7 1 : from PySide6.QtWidgets import QHBoxLayout, QMenu, QPushButton, QStyle 8 : 9 1 : from pairinteraction_gui.calculate.calculate_two_atoms import ParametersTwoAtoms, ResultsTwoAtoms, calculate_two_atoms 10 1 : from pairinteraction_gui.config import ( 11 : BasisConfigTwoAtoms, 12 : CalculationConfig, 13 : KetConfigTwoAtoms, 14 : SystemConfigTwoAtoms, 15 : ) 16 1 : from pairinteraction_gui.page.base_page import CalculationPage 17 : 18 1 : logger = logging.getLogger(__name__) 19 : 20 : 21 1 : class TwoAtomsPage(CalculationPage): 22 : """Page for configuring and analyzing pair systems.""" 23 : 24 1 : title = "Two Atoms" 25 1 : tooltip = "Configure and analyze pair systems" 26 : 27 1 : def setupWidget(self) -> None: 28 1 : super().setupWidget() 29 : 30 : # all attributes of instance BaseConfig will be added to the toolbox in postSetupWidget 31 1 : self.ket_config = KetConfigTwoAtoms(self) 32 1 : self.basis_config = BasisConfigTwoAtoms(self) 33 1 : self.system_config = SystemConfigTwoAtoms(self) 34 1 : self.calculation_config = CalculationConfig(self) 35 : 36 : # Set some better defaults for the two atoms page 37 1 : self.calculation_config.number_state_labels.setValue(5) 38 1 : self.calculation_config.number_state_labels.setChecked(False) 39 1 : self.calculation_config.energy_range.setValues(-0.5, 0.5) 40 1 : self.calculation_config.energy_range.setChecked(False) 41 : 42 1 : self.ket_config.signal_species_changed.connect(self.basis_config.on_species_changed) 43 1 : self.ket_config.signal_species_changed.connect(self.plotwidget.clear) 44 : 45 : # Create a fit button with menu 46 1 : fit_button = QPushButton("Fit") 47 1 : fit_button.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_DialogResetButton)) 48 1 : fit_menu = QMenu(self) 49 1 : fit_menu.addAction("Fit c3", lambda: self.plotwidget.fit("c3")) 50 1 : fit_menu.addAction("Fit c6", lambda: self.plotwidget.fit("c6")) 51 1 : fit_menu.addAction("Fit c3+c6", lambda: self.plotwidget.fit("c3+c6")) 52 1 : fit_button.setMenu(fit_menu) 53 1 : fit_button.setFixedHeight(50) 54 1 : self.findChild(QHBoxLayout, name="bottomLayout").insertWidget(1, fit_button, stretch=1) 55 : 56 1 : def before_calculate(self) -> None: 57 0 : self.basis_config.clear_basis_pair_label() 58 0 : return super().before_calculate() 59 : 60 1 : def calculate(self) -> tuple[ParametersTwoAtoms, ResultsTwoAtoms]: 61 0 : parameters = ParametersTwoAtoms.from_page(self) 62 0 : results = calculate_two_atoms(parameters) 63 0 : return parameters, results 64 : 65 1 : def update_plot(self, parameters: ParametersTwoAtoms, results: ResultsTwoAtoms) -> None: # type: ignore[override] 66 0 : super().update_plot(parameters, results) 67 : 68 0 : if results.basis_0_label is not None: 69 0 : self.basis_config.update_basis_pair_label(results.basis_0_label) 70 : 71 1 : def _get_export_replacements(self) -> dict[str, Any]: 72 0 : parameters = ParametersTwoAtoms.from_page(self) 73 0 : return parameters.to_replacement_dict() 74 : 75 1 : def _get_export_notebook_template_name(self) -> str: 76 0 : ranges = self.system_config.get_ranges_dict() 77 0 : if all(v[0] == v[-1] for k, v in ranges.items() if k in ["Ex", "Ey", "Ez", "Bx", "By", "Bz"]): 78 0 : return "two_atoms.ipynb" 79 0 : return "two_atoms_variable_fields.ipynb"