Source code for viperleed.calc.classes.searchpar

"""Module searchpar of viperleed.calc.classes.

Defines SearchPar, a class containing information about ONE parameter
of the tensor-LEED structural search. This module used to be part of
rparams.py (created on 2019-06-13). Refactored by Michele Riva in Oct
 2023.
"""

__authors__ = (
    'Florian Kraushofer (@fkraushofer)',
    )
__copyright__ = 'Copyright (c) 2019-2024 ViPErLEED developers'
__created__ = '2023-10-23'
__license__ = 'GPLv3+'

import logging

import numpy as np

_LOGGER = logging.getLogger(__name__)


[docs]class SearchPar: """Stores properties of ONE parameter of the search, i.e. what variation of what atom is linked to this parameter."""
[docs] def __init__(self, atom, mode, el, deltaname): self.atom = atom self.mode = mode self.el = el self.deltaname = deltaname self.steps = 1 self.edges = (None, None) # the first and last value in the range self.center = 1 # the index closest to "no change" (Fortran index starting at 1) self.non_zero = False # whether the center is truly "unchanged" self.restrictTo = None # None, Index, or other search par self.linkedTo = None # other search par linked via 'atom number' self.parabolaFit = {"min": None, "err_co": np.nan, "err_unco": np.nan} d = {} if mode == "occ": el = next(iter(atom.disp_occ.keys())) # look at any element self.steps = len(atom.disp_occ[el]) self.center = atom.disp_center_index[mode][el] + 1 # (Fortran index starting at 1) self.non_zero = (abs(atom.disp_occ[el][self.center-1] - atom.site.occ[el]) >= 1e-4) edges = [] for ind in (0, -1): edges.append(" + ".join("{:.2f} {}".format( atom.disp_occ[e][ind], e) for e in atom.disp_occ if atom.disp_occ[e][ind] > 0.005)) if edges[-1] == "": edges[-1] = "vac" self.edges = tuple(edges) else: if mode == "geo": d = atom.disp_geo elif mode == "vib": d = atom.disp_vib if len(d) > 0 and el != "vac": # if vac: use defaults if el in d: k = el else: k = "all" self.steps = len(d[k]) self.edges = (d[k][0], d[k][-1]) if k not in atom.disp_center_index[mode]: self.center = atom.disp_center_index[mode]["all"] + 1 else: self.center = atom.disp_center_index[mode][k] + 1 self.non_zero = (np.linalg.norm(d[k][self.center-1]) >= 1e-4)