Files
stand/stand/api.py
T
2026-06-03 22:57:47 +02:00

63 lines
1.8 KiB
Python

from datetime import datetime
from http import HTTPStatus
from typing import Any
import pandas as pd
from fastapi import APIRouter, HTTPException, Response
from state import grids, adb
from utils.annotations import Beamline, PGroup
router = APIRouter()
@router.get("/pgroups/{pgroup}")
def get_pgroup(beamline: Beamline, pgroup: PGroup, orient: str = None):
content = adb.get(beamline).get_data(pgroup).to_json(orient=orient)
return Response(content=content, media_type="application/json")
@router.delete("/pgroups/{pgroup}/runs")
def clear_pgroup(beamline: Beamline, pgroup: PGroup):
adb.get(beamline).clear_data(pgroup)
for grid in grids[pgroup]:
grid.clear()
@router.post("/pgroups/{pgroup}/runs/{run}")
def append_run(beamline: Beamline, pgroup: PGroup, run: int, row: dict[str, Any]):
lib = adb.get(beamline)
run_exists = lib.has_index(pgroup, run)
if run_exists:
raise HTTPException(HTTPStatus.CONFLICT, f"run {run} exists already in {beamline}/{pgroup}")
timestamp = row.pop("timestamp", None)
timestamp = datetime.fromisoformat(timestamp) if timestamp else datetime.now()
row = {"timestamp": timestamp, **row} # setdefault would not force timestamp to be the first column
df = pd.DataFrame(row, index=[run])
lib.append_data(pgroup, df)
row = {"run": run, **row} # setdefault would not force run to be the first column
res = []
for grid in grids[pgroup]:
grid.append(row)
res.append(grid.options)
return res
@router.put("/pgroups/{pgroup}/runs/{run}/entries/{entry}")
def set_entry(beamline: Beamline, pgroup: PGroup, run: int, entry: str, value: Any):
adb.get(beamline).update_cell(pgroup, run, entry, value)
for grid in grids[pgroup]:
grid.set_cell(run, entry, value)