Source code for crystal_toolkit.components.transformations.slab

from dash import html
from pymatgen.transformations.advanced_transformations import SlabTransformation

from crystal_toolkit.components.transformations.core import TransformationComponent


[docs]class SlabTransformationComponent(TransformationComponent): @property def title(self): return "Make a slab" @property def description(self): return """Create a slab from a structure, where a "slab" is a crystal surface that is still periodic in all three dimensions but has a large artificial vacuum inserted so that the properties of the crystal surface can be studied. """ @property def transformation(self): return SlabTransformation
[docs] def options_layouts(self, state=None, structure=None): state = state or { "miller_index": (0, 0, 1), "min_slab_size": 4, "min_vacuum_size": 10, "lll_reduce": True, "center_slab": True, "in_unit_planes": False, "primitive": True, "max_normal_search": None, "shift": 0, "tol": 0.1, } miller_index = self.get_numerical_input( label="Miller index", kwarg_label="miller_index", state=state, help_str="The surface plane defined by its Miller index (h, k, l)", is_int=True, shape=(3,), ) min_slab_size = self.get_numerical_input( label="Minimum slab size /Å", kwarg_label="min_slab_size", state=state, help_str="Minimum slab size in Ångstroms (or number of planes of atoms if " '"Use plane units" enabled)', shape=(), ) min_vacuum_size = self.get_numerical_input( label="Minimum vacuum size /Å", kwarg_label="min_vacuum_size", state=state, help_str="Minimum vacuum size in Ångstroms (or number of planes of atoms if " '"Use plane units" enabled)', shape=(), ) lll_reduce = self.get_bool_input( label="Enable LLL reduction", kwarg_label="lll_reduce", state=state, help_str="Whether or not to apply an LLL lattice reduction", ) in_unit_planes = self.get_bool_input( label="Use Plane Units", kwarg_label="in_unit_planes", state=state, help_str="Change units of vacuum size and slab size to be in terms of " "number of planes of atoms instead of Ångstroms.", ) primitive = self.get_bool_input( label="Make primitive", kwarg_label="primitive", state=state, help_str="Reduce the slab to most primitive cell.", ) max_normal_search = self.get_numerical_input( "max_normal_search", state=state, label="Maximum normal search index", help_str="Maximum index to include in linear combinations of indices " "to find **c** lattice vector orthogonal to slab surface.", is_int=True, ) shift = self.get_numerical_input( label="Shift /Å", kwarg_label="shift", state=state, help_str="Shift to change termination.", shape=(), ) tol = self.get_numerical_input( label="Tolerance", kwarg_label="tol", state=state, help_str="Tolerance to find primitive cell.", shape=(), ) options = html.Div( [ miller_index, min_slab_size, min_vacuum_size, lll_reduce, in_unit_planes, primitive, max_normal_search, shift, tol, ] ) return options