Source code for semi_cr.core.lab.station.snapshot
from __future__ import annotations
from datetime import datetime
from pathlib import Path
from typing import Any
import yaml
from pydantic import BaseModel, Field
[docs]
class ParameterSnapshot(BaseModel):
value: Any = None
unit: str | None = None
label: str | None = None
[docs]
class ComponentSnapshot(BaseModel):
name: str
class_name: str | None = None
label: str | None = None
parameters: dict[str, ParameterSnapshot] = Field(default_factory=dict)
submodules: dict[str, "ComponentSnapshot"] = Field(default_factory=dict)
[docs]
class StationSnapshot(BaseModel):
timestamp: datetime = Field(default_factory=datetime.now)
instruments: dict[str, ComponentSnapshot] = Field(default_factory=dict)
config: dict[str, Any] = Field(default_factory=dict)
metadata: dict[str, Any] = Field(default_factory=dict)
[docs]
def to_yaml(self, path: str | Path) -> None:
path = Path(path)
data = self.model_dump(mode="json",exclude_none=True)
with path.open("w", encoding="utf-8") as file:
yaml.safe_dump(data, file,sort_keys=False)
[docs]
def component_from_qcodes_snapshot(
name: str,
snapshot: dict[str, Any],
) -> ComponentSnapshot:
parameters = {
parameter_name: ParameterSnapshot(
value=parameter.get("value"),
unit=parameter.get("unit"),
label=parameter.get("label"),
)
for parameter_name, parameter
in snapshot.get("parameters", {}).items()
}
submodules = {
submodule_name: component_from_qcodes_snapshot(
submodule_name,
submodule_snapshot,
)
for submodule_name, submodule_snapshot
in snapshot.get("submodules", {}).items()
}
return ComponentSnapshot(
name=snapshot.get("name", name),
label=snapshot.get("label"),
class_name=snapshot.get("__class__"),
parameters=parameters,
submodules=submodules,
)
[docs]
def station_snapshot_from_qcodes(
station,
) -> StationSnapshot:
raw = station.snapshot()
instruments = {
instrument_name: component_from_qcodes_snapshot(
instrument_name,
instrument_snapshot,
)
for instrument_name, instrument_snapshot
in raw.get("instruments", {}).items()
}
return StationSnapshot(
instruments=instruments,
config=raw.get("config", {}),
)