Source code for crystal_toolkit.components.transformations.supercell
from dash import html
from dash_mp_components import CrystalToolkitScene
from pymatgen.transformations.standard_transformations import SupercellTransformation
from crystal_toolkit.components.transformations.core import TransformationComponent
from crystal_toolkit.core.scene import Scene
[docs]class SupercellTransformationComponent(TransformationComponent):
@property
def title(self):
return "Make a supercell"
@property
def description(self):
return """Create a supercell by providing a scaling matrix that transforms
input lattice vectors a, b and c into transformed lattice vectors a', b' and c'.
For example, to create a supercell with lattice vectors a'=2a, b'=2b, c'=2c enter a
scaling matrix [[2, 0, 0], [0, 2, 0], [0, 0, 2]] or to create a supercell with
lattice vectors a' = 2a+b, b' = 3b and c' = c enter a scaling matrix
[[2, 1, 0], [0, 3, 0], [0, 0, 1]]. All elements of the scaling matrix must be
integers."""
@property
def transformation(self):
return SupercellTransformation
[docs] def options_layouts(self, state=None, structure=None):
state = state or {"scaling_matrix": ((1, 0, 0), (0, 1, 0), (0, 0, 1))}
options = self.get_numerical_input(
label="Scaling matrix",
kwarg_label="scaling_matrix",
state=state,
help_str="""Scaling matrix that transforms
input lattice vectors a, b and c into transformed lattice vectors a', b' and c'.""",
shape=(3, 3),
)
return [options]
[docs] def get_preview_layout(self, struct_in, struct_out):
if struct_in.lattice == struct_out.lattice:
return html.Div()
lattice_in = struct_in.lattice.get_scene()
lattice_out = struct_out.lattice.get_scene(color="red")
scene = Scene("lattices", contents=[lattice_in, lattice_out])
return html.Div(
[CrystalToolkitScene(data=scene.to_json())],
style={"width": "100px", "height": "100px"},
)