1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
from typing import Optional, Union
from pydantic import BaseModel, Field
from pymatgen.core.structure import Structure
from emmet.core.material_property import PropertyDoc
from emmet.core.mpid import MPID
from emmet.core.utils import generate_robocrys_condensed_struct_and_description
class MineralData(BaseModel):
"""
Model for mineral data in the condensed structure robocrystallographer field
"""
type: Union[str, None] = Field(
description="Mineral type.",
)
name: Optional[str] = Field(None, description="The mineral name if found.")
class CondensedStructureData(BaseModel):
"""
Model for data in the condensed structure robocrystallographer field
More details: https://hackingmaterials.lbl.gov/robocrystallographer/format.html
"""
mineral: MineralData = Field(
description="Matched mineral data for the material.",
)
dimensionality: int = Field(
description="Dimensionality of the material.",
)
formula: Optional[str] = Field(
None,
description="Formula for the material.",
)
spg_symbol: Optional[str] = Field(
None,
description="Space group symbol of the material.",
)
crystal_system: Optional[str] = Field(
None,
description="Crystal system of the material.",
)
class RobocrystallogapherDoc(PropertyDoc):
"""
This document contains the descriptive data from robocrystallographer
for a material:
Structural features, mineral prototypes, dimensionality, ...
"""
property_name: str = "robocrys"
description: str = Field(
description="Description text from robocrytallographer.",
)
condensed_structure: CondensedStructureData = Field(
description="Condensed structure data from robocrytallographer.",
)
robocrys_version: str = Field(
...,
description="The version of Robocrystallographer used to generate this document.",
)
@classmethod
def from_structure(
cls,
structure: Structure,
material_id: MPID,
robocrys_version: str,
mineral_matcher=None,
**kwargs
):
(
condensed_structure,
description,
) = generate_robocrys_condensed_struct_and_description(
structure=structure, mineral_matcher=mineral_matcher
)
return super().from_structure(
meta_structure=structure,
material_id=material_id,
condensed_structure=condensed_structure,
description=description,
robocrys_version=robocrys_version,
**kwargs
)
|