63 lines
1.8 KiB
Python
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)
|
|
|
|
|
|
|