Source code for smartem_backend.model.http_request
from datetime import datetime
from typing import Literal
from pydantic import BaseModel, ConfigDict
from smartem_common.entity_status import (
AcquisitionStatus,
FoilHoleStatus,
GridSquareStatus,
GridStatus,
MicrographStatus,
)
# Acquisition models
class AcquisitionBaseFields(BaseModel):
uuid: str | None = None
name: str | None = None
status: AcquisitionStatus | None = None
start_time: datetime | None = None
end_time: datetime | None = None
paused_time: datetime | None = None
storage_path: str | None = None
atlas_path: str | None = None
clustering_mode: str | None = None
clustering_radius: str | None = None
instrument_model: str | None = None
instrument_id: str | None = None
computer_name: str | None = None
model_config = {
"use_enum_values": True,
"json_encoders": {
datetime: lambda v: v.isoformat(),
},
}
class AcquisitionBaseRequest(AcquisitionBaseFields):
uuid: str
class AcquisitionCreateRequest(AcquisitionBaseRequest):
pass
class AcquisitionUpdateRequest(AcquisitionBaseFields):
pass
# Atlas models
class AtlasBaseFields(BaseModel):
uuid: str | None = None
atlas_id: str | None = None
grid_uuid: str | None = None
acquisition_date: datetime | None = None
storage_folder: str | None = None
description: str | None = None
name: str | None = None
model_config = {
"json_encoders": {
datetime: lambda v: v.isoformat(),
}
}
class AtlasTileBaseFields(BaseModel):
uuid: str | None = None
tile_id: str | None = None
position_x: int | None = None
position_y: int | None = None
size_x: int | None = None
size_y: int | None = None
file_format: str | None = None
base_filename: str | None = None
atlas_uuid: str | None = None
class AtlasTileBaseRequest(AtlasTileBaseFields):
uuid: str
class AtlasTileCreateRequest(AtlasTileBaseRequest):
atlas_uuid: str
class AtlasTileUpdateRequest(AtlasTileBaseFields):
pass
class AtlasBaseRequest(AtlasBaseFields):
uuid: str
grid_uuid: str
name: str
class AtlasCreateRequest(AtlasBaseRequest):
tiles: list[AtlasTileCreateRequest] | None = None
class AtlasUpdateRequest(AtlasBaseFields):
pass
# Grid models
class GridBaseFields(BaseModel):
uuid: str | None = None
name: str | None = None
acquisition_uuid: str | None = None
status: GridStatus | None = None
data_dir: str | None = None
atlas_dir: str | None = None
scan_start_time: datetime | None = None
scan_end_time: datetime | None = None
model_config = {
"use_enum_values": True,
"json_encoders": {
datetime: lambda v: v.isoformat(),
},
}
class GridBaseRequest(GridBaseFields):
uuid: str
name: str
acquisition_uuid: str
class GridCreateRequest(GridBaseRequest):
pass
class GridUpdateRequest(GridBaseFields):
pass
class GridSquarePositionRequest(BaseModel):
center_x: int
center_y: int
size_width: int
size_height: int
gridsquare_uuid: str | None = None
# GridSquare models
class GridSquareBaseFields(BaseModel):
uuid: str | None = None
gridsquare_id: str | None = None
grid_uuid: str | None = None
data_dir: str | None = None
atlas_node_id: int | None = None
state: str | None = None
rotation: float | None = None
image_path: str | None = None
selected: bool | None = None
unusable: bool | None = None
stage_position_x: float | None = None
stage_position_y: float | None = None
stage_position_z: float | None = None
center_x: int | None = None
center_y: int | None = None
physical_x: float | None = None
physical_y: float | None = None
size_width: int | None = None
size_height: int | None = None
acquisition_datetime: datetime | None = None
defocus: float | None = None
magnification: float | None = None
pixel_size: float | None = None
detector_name: str | None = None
applied_defocus: float | None = None
status: GridSquareStatus | None = None
model_config = ConfigDict(
use_enum_values=True, json_encoders={datetime: lambda v: v.isoformat() if v else None}, from_attributes=True
)
class GridSquareBaseRequest(GridSquareBaseFields):
uuid: str
gridsquare_id: str
grid_uuid: str
center_x: int | None = None
center_y: int | None = None
size_width: int | None = None
size_height: int | None = None
class GridSquareCreateRequest(GridSquareBaseRequest):
lowmag: bool = False
class GridSquareUpdateRequest(GridSquareBaseFields):
lowmag: bool = False
# FoilHole models
class FoilHoleBaseFields(BaseModel):
uuid: str | None = None
foilhole_id: str | None = None
gridsquare_id: str | None = None
gridsquare_uuid: str | None = None
center_x: float | None = None
center_y: float | None = None
quality: float | None = None
rotation: float | None = None
size_width: float | None = None
size_height: float | None = None
x_location: int | None = None
y_location: int | None = None
x_stage_position: float | None = None
y_stage_position: float | None = None
diameter: int | None = None
is_near_grid_bar: bool = False
status: FoilHoleStatus | None = None
model_config = {"use_enum_values": True}
class FoilHoleBaseRequest(FoilHoleBaseFields):
uuid: str
foilhole_id: str
gridsquare_id: str
gridsquare_uuid: str
class FoilHoleCreateRequest(FoilHoleBaseRequest):
pass
class FoilHoleUpdateRequest(FoilHoleBaseFields):
pass
# Micrograph models
class MicrographBaseFields(BaseModel):
uuid: str | None = None
foilhole_uuid: str | None = None
foilhole_id: str | None = None
location_id: str | None = None
high_res_path: str | None = None
manifest_file: str | None = None
acquisition_datetime: datetime | None = None
defocus: float | None = None
detector_name: str | None = None
energy_filter: bool | None = None
phase_plate: bool | None = None
image_size_x: int | None = None
image_size_y: int | None = None
binning_x: int | None = None
binning_y: int | None = None
total_motion: float | None = None
average_motion: float | None = None
ctf_max_resolution_estimate: float | None = None
number_of_particles_selected: int | None = None
number_of_particles_rejected: int | None = None
selection_distribution: str | None = None
number_of_particles_picked: int | None = None
pick_distribution: str | None = None
status: MicrographStatus = MicrographStatus.NONE # Default to NONE
model_config = {
"use_enum_values": True,
"json_encoders": {
datetime: lambda v: v.isoformat() if v else None,
},
}
class MicrographBaseRequest(MicrographBaseFields):
uuid: str
foilhole_id: str
# foilhole_uuid is not required here since it comes from the path parameter
class MicrographCreateRequest(MicrographBaseRequest):
pass
class MicrographUpdateRequest(MicrographBaseFields):
pass
# ============ Quality Prediction Request Models ============
class QualityPredictionModelBaseFields(BaseModel):
name: str | None = None
description: str | None = None
class QualityPredictionModelCreateRequest(BaseModel):
name: str
description: str = ""
class QualityPredictionModelUpdateRequest(BaseModel):
description: str | None = None
class QualityPredictionCreateRequest(BaseModel):
value: float
prediction_model_name: str
foilhole_uuid: str | None = None
gridsquare_uuid: str | None = None
class QualityPredictionModelParameterCreateRequest(BaseModel):
grid_uuid: str
prediction_model_name: str
key: str
value: float
group: str = ""
class QualityPredictionModelWeightCreateRequest(BaseModel):
grid_uuid: str
micrograph_uuid: str | None = None
micrograph_quality: bool | None = None
origin: str | None = None
prediction_model_name: str
weight: float
# ============ Agent Communication Models ============
[docs]
class AgentInstructionAcknowledgement(BaseModel):
"""Request model for instruction acknowledgements from agents"""
status: Literal["received", "processed", "failed", "declined"]
result: str | None = None
error_message: str | None = None
processing_time_ms: int | None = None
processed_at: datetime | None = None
model_config = ConfigDict(
str_strip_whitespace=True,
validate_assignment=True,
extra="forbid",
)