Source code for ewoksbm08.io.types
import numpy
from pydantic import BaseModel
[docs]
class XdiBaseModel(BaseModel):
[docs]
def header_lines(self, prefix: str = None) -> list[str]:
lines = []
for field_name in type(self).model_fields:
value = getattr(self, field_name)
if value is None:
continue
if isinstance(value, XdiBaseModel):
lines.extend(
value.header_lines(
prefix=f"{prefix}.{field_name}" if prefix else field_name
)
)
else:
if prefix:
lines.append(f"{prefix}.{field_name}: {value}")
else:
lines.append(str(value))
return lines
[docs]
class XdiFacility(XdiBaseModel):
name: str = "ESRF"
xray_source: str = "bending magnet"
current: float | None = None
fillingMode: str | None = None
[docs]
class XdiMono(XdiBaseModel):
name: str | None = None
d_spacing: float | None = None
notes: str | None = "LNT cooled"
[docs]
class XdiMetadata(XdiBaseModel):
"""XDI SPECS:
https://github.com/XraySpectroscopy/XAS-Data-Interchange/blob/master/specification/spec.md
"""
Scheme: str = "XDI/1.0 GSE/1.0"
Title: str = (
"Data collected at BM08-LISA of ESRF preproccessed with the beamline Calibration Tool"
)
Facility: XdiFacility
Beamline: XdiBeamline
Scan: XdiScan | None = None
Mono: XdiMono | None = None
Sample: XdiSample | None = None
[docs]
class XdiData(BaseModel, arbitrary_types_allowed=True):
column_names: list[str]
column_data: list[numpy.ndarray]
xdi_metadata: XdiMetadata
[docs]
def header_lines(self) -> list[str]:
lines = self.xdi_metadata.header_lines()
if self.column_names:
for i, name in enumerate(self.column_names):
lines.append(f"Column.{i}: {name}")
lines.append("-------------")
lines.append(" ".join(self.column_names))
return lines