Source code for aiida_atomistic.data.structure.structure

from aiida.orm.nodes.data import Data

from aiida_atomistic.data.structure.models import MutableStructureModel, ImmutableStructureModel
from aiida_atomistic.data.structure.setter_mixin import SetterMixin
from aiida_atomistic.data.structure.getter_mixin import GetterMixin

from aiida_atomistic.data.structure.utils import (
    compress_properties_by_kind,
    rebuild_site_lists_from_kind_lists,
    build_sites_from_expanded_properties,
    sites_from_kinds,
)

[docs] class StructureData(Data, GetterMixin):
[docs] _mutable = False
def __init__(self, validate_kinds=True, sites:list[dict]=None, kinds:list[dict]=None, **kwargs): if sites is not None and kinds is not None: raise ValueError("You cannot provide both `sites` and `kinds`. Please provide only one of them.") if kinds is not None: sites = sites_from_kinds(kinds)
[docs] self._properties = ImmutableStructureModel(sites=sites, **kwargs)
super().__init__() if validate_kinds and self.kinds is not None: self.validate_kinds() attributes = self.properties.model_dump(exclude_unset=True, exclude_none=True, warnings=False) if self.properties.kind_names is not None: compressed = compress_properties_by_kind(attributes) attributes.update(compressed) attributes.pop("sites", None) attributes.pop("kinds", None) for prop, value in attributes.items(): self.base.attributes.set(prop, value) @property
[docs] def properties(self): if self.is_stored: if "kind_names" in self.base.attributes.all: attribute_lists = rebuild_site_lists_from_kind_lists(self.base.attributes.all) attributes = build_sites_from_expanded_properties(attribute_lists) else: attributes = build_sites_from_expanded_properties(self.base.attributes.all) properties = ImmutableStructureModel(**attributes) return properties else: return self._properties
@classmethod
[docs] def from_mutable(cls, mutable_structure, validate_kinds=True): if not isinstance(mutable_structure, StructureDataMutable): raise ValueError(f"Input structure should be of type StructureDataMutable, not {type(mutable_structure)}") return cls(validate_kinds=validate_kinds, **mutable_structure.to_dict(exclude_kinds=True))
[docs] def to_mutable(self,): return StructureDataMutable(**self.to_dict())
[docs] def get_value(self): return StructureDataMutable(**self.to_dict())
[docs] class StructureDataMutable(GetterMixin, SetterMixin):
[docs] _mutable = True
def __init__(self, validate_kinds=True, sites:list[dict]=None, kinds:list[dict]=None, **kwargs): if sites is not None and kinds is not None: raise ValueError("You cannot provide both `sites` and `kinds`. Please provide only one of them.") if kinds is not None: sites = sites_from_kinds(kinds)
[docs] self._properties = MutableStructureModel(sites=sites, **kwargs)
super().__init__() @property
[docs] def properties(self): return self._properties