from dash import html
from dash.dependencies import Input, Output
from robocrys import StructureCondenser, StructureDescriber
from robocrys import __version__ as robocrys_version
from crystal_toolkit.core.panelcomponent import PanelComponent
from crystal_toolkit.helpers.layouts import Loading, MessageBody, MessageContainer
[docs]class RobocrysComponent(PanelComponent):
@property
def title(self):
return "Description"
@property
def description(self):
return (
"Your friendly robocrystallographer tries to describe a structure much "
"like a human crystallographer would."
)
[docs] def contents_layout(self) -> html.Div:
return Loading(id=self.id("robocrys"))
[docs] def generate_callbacks(self, app, cache):
super().generate_callbacks(app, cache)
@app.callback(
Output(self.id("robocrys"), "children"), [Input(self.id(), "data")]
)
@cache.memoize()
def run_robocrys_analysis(new_store_contents):
struct = self.from_data(new_store_contents)
try:
condenser = StructureCondenser()
describer = StructureDescriber(fmt="unicode")
condensed_structure = condenser.condense_structure(struct)
description = describer.describe(condensed_structure)
except Exception as exc:
description = str(exc)
return MessageContainer(
MessageBody(
[
f"{description} – ",
html.A(
f"🤖 robocrys v{robocrys_version}",
href="https://github.com/hackingmaterials/robocrystallographer",
style={"white-space": "nowrap"},
),
]
),
kind="dark",
)