Source code for crystal_toolkit.components.robocrys

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", )