From 5a0047b6d5eaee3d18091be81d788b6b64608d23 Mon Sep 17 00:00:00 2001
From: GotthardG <51994228+GotthardG@users.noreply.github.com>
Date: Mon, 17 Mar 2025 11:51:07 +0100
Subject: [PATCH] Refactor AareDB backend and update schemas and paths.

Revised backend schema definitions, removing unnecessary attributes and adding new configurations. Updated file path references to align with the aaredb structure. Cleaned up redundant notebook content and commented out unused database regeneration logic in the backend.

Added posting a result to the database
---
 backend/app/models.py                  |   10 +-
 backend/app/routers/sample.py          |  116 ++-
 backend/app/schemas.py                 |   46 +-
 backend/main.py                        |    4 +-
 backend/tests/test_results.py          |    0
 frontend/fetch-openapi.js              |    6 +-
 frontend/src/components/ResultGrid.tsx |   50 +-
 testfunctions.ipynb                    | 1046 +++++-------------------
 8 files changed, 355 insertions(+), 923 deletions(-)
 create mode 100644 backend/tests/test_results.py

diff --git a/backend/app/models.py b/backend/app/models.py
index 2a848fb..c4d9793 100644
--- a/backend/app/models.py
+++ b/backend/app/models.py
@@ -278,10 +278,14 @@ class Results(Base):
     __tablename__ = "results"
 
     id = Column(Integer, primary_key=True, index=True, autoincrement=True)
-    #    pgroup = Column(String(255), nullable=False)
-    result = Column(JSON, nullable=True)
-    result_id = Column(Integer, ForeignKey("experiment_parameters.id"), nullable=False)
+    result = Column(JSON, nullable=False)  # store the full result object as JSON
     sample_id = Column(Integer, ForeignKey("samples.id"), nullable=False)
+    run_id = Column(Integer, ForeignKey("experiment_parameters.id"), nullable=False)
+
+    # optional relationships if you wish to query easily
+    # sample = relationship("SampleModel", backref="results")
+    # experiment_parameters = relationship("ExperimentParametersModel",
+    # backref="results")
 
 
 #    method = Column(String(255), nullable=False)
diff --git a/backend/app/routers/sample.py b/backend/app/routers/sample.py
index 465719b..4f89135 100644
--- a/backend/app/routers/sample.py
+++ b/backend/app/routers/sample.py
@@ -14,8 +14,9 @@ from app.schemas import (
     SampleResult,
     ExperimentParametersCreate,
     ExperimentParametersRead,
-    # ResultResponse,
-    # ResultCreate,
+    ImageInfo,
+    ResultResponse,
+    ResultCreate,
 )
 from app.models import (
     Puck as PuckModel,
@@ -25,7 +26,7 @@ from app.models import (
     Dewar as DewarModel,
     ExperimentParameters as ExperimentParametersModel,
     # ExperimentParameters,
-    # Results,
+    Results as ResultsModel,
 )
 from app.dependencies import get_db
 import logging
@@ -246,8 +247,13 @@ async def get_sample_results(active_pgroup: str, db: Session = Depends(get_db)):
 
     results = []
     for sample in samples:
-        # Query images associated with the sample.
-        images = db.query(ImageModel).filter(ImageModel.sample_id == sample.id).all()
+        # Query images associated with the sample, including the related event_type
+        images = (
+            db.query(ImageModel)
+            .options(joinedload(ImageModel.sample_event))
+            .filter(ImageModel.sample_id == sample.id)
+            .all()
+        )
 
         # Query experiment parameters (which include beamline parameters) for the
         # sample.
@@ -259,27 +265,34 @@ async def get_sample_results(active_pgroup: str, db: Session = Depends(get_db)):
         print("Experiment Parameters for sample", sample.id, experiment_parameters)
 
         results.append(
-            {
-                "sample_id": sample.id,
-                "sample_name": sample.sample_name,
-                "puck_name": sample.puck.puck_name if sample.puck else None,
-                "dewar_name": sample.puck.dewar.dewar_name
+            SampleResult(
+                sample_id=sample.id,
+                sample_name=sample.sample_name,
+                puck_name=sample.puck.puck_name if sample.puck else None,
+                dewar_name=sample.puck.dewar.dewar_name
                 if (sample.puck and sample.puck.dewar)
                 else None,
-                "images": [
-                    {"id": img.id, "filepath": img.filepath, "comment": img.comment}
+                images=[
+                    ImageInfo(
+                        id=img.id,
+                        filepath=img.filepath,
+                        event_type=img.sample_event.event_type
+                        if img.sample_event
+                        else "Unknown",
+                        comment=img.comment,
+                    )
                     for img in images
                 ],
-                "experiment_runs": [
-                    {
-                        "id": ex.id,
-                        "run_number": ex.run_number,
-                        "beamline_parameters": ex.beamline_parameters,
-                        "sample_id": ex.sample_id,
-                    }
+                experiment_runs=[
+                    ExperimentParametersRead(
+                        id=ex.id,
+                        run_number=ex.run_number,
+                        beamline_parameters=ex.beamline_parameters,
+                        sample_id=ex.sample_id,
+                    )
                     for ex in experiment_parameters
                 ],
-            }
+            )
         )
 
     return results
@@ -318,32 +331,49 @@ def create_experiment_parameters_for_sample(
     db.commit()
     db.refresh(new_exp)
 
+    # Create a "Collecting" sample event associated with the new experiment parameters
+    new_event = SampleEventModel(
+        sample_id=sample_id,
+        event_type="Collecting",  # The event type
+        timestamp=datetime.now(),  # Use current timestamp
+    )
+    db.add(new_event)
+    db.commit()
+
     return new_exp
 
 
-# @router.post("/results", response_model=ResultResponse)
-# def create_result(result: ResultCreate, db: Session = Depends(get_db)):
-#    # Validate sample_id and result_id (optional but recommended)
-#    sample = db.query(SampleModel).filter_by(id=result.sample_id).first()
-#    if not sample:
-#        raise HTTPException(status_code=404, detail="Sample not found")
-#
-#    experiment = db.query(ExperimentParameters).filter_by(id=result.result_id).first()
-#    if not experiment:
-#        raise HTTPException(status_code=404, detail="Experiment parameters not found")
-#
-#    # Create a new Results entry
-#    result_obj = Results(
-#        sample_id=result.sample_id,
-#        result_id=result.result_id,
-#        result=result.result
-#    )
-#    db.add(result_obj)
-#    db.commit()
-#    db.refresh(result_obj)
-#
-#    return result_obj
-#
+@router.post("/processing-results", response_model=ResultResponse)
+def create_result(payload: ResultCreate, db: Session = Depends(get_db)):
+    # Check experiment existence
+    experiment = (
+        db.query(ExperimentParametersModel)
+        .filter(ExperimentParametersModel.id == payload.run_id)
+        .first()
+    )
+    if not experiment:
+        raise HTTPException(
+            status_code=404, detail="Experiment parameters (run) not found"
+        )
+
+    result_entry = ResultsModel(
+        sample_id=payload.sample_id,
+        run_id=payload.run_id,
+        result=payload.result.model_dump(),  # Serialize entire result to JSON
+    )
+
+    db.add(result_entry)
+    db.commit()
+    db.refresh(result_entry)
+
+    return ResultResponse(
+        id=result_entry.id,
+        sample_id=result_entry.sample_id,
+        run_id=result_entry.run_id,
+        result=payload.result,  # return original payload directly
+    )
+
+
 # @router.get("/results", response_model=list[ResultResponse])
 # def get_results(sample_id: int, result_id: int, db: Session = Depends(get_db)):
 #    query = db.query(Results)
diff --git a/backend/app/schemas.py b/backend/app/schemas.py
index c00d2cb..1566b42 100644
--- a/backend/app/schemas.py
+++ b/backend/app/schemas.py
@@ -352,16 +352,6 @@ class SampleEventCreate(BaseModel):
     event_type: Literal[
         "Mounting", "Centering", "Failed", "Lost", "Collecting", "Unmounting"
     ]
-    # event_type: str
-    # Validate event_type against accepted event types
-    # @field_validator("event_type", mode="before")
-    # def validate_event_type(cls, value):
-    #    allowed = {"Mounting", "Centering", "Failed",
-    #    "Lost", "Collecting", "Unmounting"}
-    #    if value not in allowed:
-    #        raise ValueError(f"Invalid event_type: {value}.
-    #        Accepted values are: {allowed}")
-    #    return value
 
 
 class SampleEventResponse(SampleEventCreate):
@@ -374,10 +364,7 @@ class SampleEventResponse(SampleEventCreate):
 
 
 class Results(BaseModel):
-    id: int
-    pgroup: str
-    sample_id: int
-    method: str
+    pipeline: str
     resolution: float
     unit_cell: str
     spacegroup: str
@@ -393,10 +380,6 @@ class Results(BaseModel):
     unique_refl: int
     comments: Optional[constr(max_length=200)] = None
 
-    # Define attributes for Results here
-    class Config:
-        from_attributes = True
-
 
 class ContactCreate(BaseModel):
     pgroups: str
@@ -822,6 +805,21 @@ class ImageInfo(BaseModel):
     id: int
     filepath: str
     comment: Optional[str] = None
+    event_type: str
+    # run_number: Optional[int]
+
+    class Config:
+        from_attributes = True
+
+
+class characterizationParameters(BaseModel):
+    omegaStart_deg: float
+    oscillation_deg: float
+    omegaStep: float
+    chi: float
+    phi: float
+    numberOfImages: int
+    exposureTime_s: float
 
 
 class RotationParameters(BaseModel):
@@ -882,6 +880,7 @@ class BeamlineParameters(BaseModel):
     beamSizeWidth: Optional[float] = None
     beamSizeHeight: Optional[float] = None
     # dose_MGy: float
+    characterization: Optional[characterizationParameters] = None
     rotation: Optional[RotationParameters] = None
     gridScan: Optional[gridScanParamers] = None
     jet: Optional[jetParameters] = None
@@ -922,15 +921,18 @@ class SampleResult(BaseModel):
 
 class ResultCreate(BaseModel):
     sample_id: int
-    result_id: int
-    result: Optional[dict]
+    run_id: int
+    result: Results
+
+    class Config:
+        from_attributes = True
 
 
 class ResultResponse(BaseModel):
     id: int
     sample_id: int
-    result_id: int
-    result: Optional[dict]
+    run_id: int
+    result: Results
 
     class Config:
         from_attributes = True
diff --git a/backend/main.py b/backend/main.py
index 272c5fa..228bcec 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -156,8 +156,8 @@ def on_startup():
             load_slots_data(db)
         else:  # dev or test environments
             print(f"{environment.capitalize()} environment: Regenerating database.")
-            Base.metadata.drop_all(bind=engine)
-            Base.metadata.create_all(bind=engine)
+            # Base.metadata.drop_all(bind=engine)
+            # Base.metadata.create_all(bind=engine)
             # from sqlalchemy.engine import reflection
             # from app.models import ExperimentParameters  # adjust the import as needed
             # inspector = reflection.Inspector.from_engine(engine)
diff --git a/backend/tests/test_results.py b/backend/tests/test_results.py
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/fetch-openapi.js b/frontend/fetch-openapi.js
index 2166ff8..e718fe7 100644
--- a/frontend/fetch-openapi.js
+++ b/frontend/fetch-openapi.js
@@ -171,12 +171,12 @@ async function fetchAndGenerate() {
 const backendDirectory = (() => {
     switch (nodeEnv) {
         case 'prod':
-            return path.resolve('/home/jungfrau/heidi-v2/backend/app'); // Production path
+            return path.resolve('/home/jungfrau/aaredb/backend/app'); // Production path
         case 'test':
-            return path.resolve('/home/jungfrau/heidi-v2/backend/app'); // Test path
+            return path.resolve('/home/jungfrau/aaredb/backend/app'); // Test path
         case 'dev':
         default:
-            return path.resolve('/Users/gotthardg/PycharmProjects/heidi-v2/backend/app'); // Development path
+            return path.resolve('/Users/gotthardg/PycharmProjects/aaredb/backend/app'); // Development path
     }
 })();
 
diff --git a/frontend/src/components/ResultGrid.tsx b/frontend/src/components/ResultGrid.tsx
index 09ad8da..cfc6228 100644
--- a/frontend/src/components/ResultGrid.tsx
+++ b/frontend/src/components/ResultGrid.tsx
@@ -11,6 +11,8 @@ interface ImageInfo {
     id: number;
     filepath: string;
     comment?: string;
+    event_type: string;
+    run_number?:number;
 }
 
 // This represents an experiment run as returned by your API.
@@ -87,7 +89,7 @@ interface TreeRow {
     sample_name?: string;
     puck_name?: string;
     dewar_name?: string;
-    images?: ImageInfo[];
+    images?: ImageInfo[];  // Images associated explicitly with this row (especially run items)
     run_number?: number;
     beamline_parameters?: ExperimentParameters['beamline_parameters'];
     experimentType?: string;
@@ -176,7 +178,13 @@ const ResultGrid: React.FC<ResultGridProps> = ({ activePgroup }) => {
     }, []);
 
     useEffect(() => {
-        // Fetch sample details and construct rows
+        if (!OpenAPI.BASE) {
+            console.error('OpenAPI.BASE is not set. Falling back to a default value.');
+            return;
+        }
+
+        setBasePath(`${OpenAPI.BASE}/`);
+
         SamplesService.getSampleResultsSamplesResultsGet(activePgroup)
             .then((response: SampleResult[]) => {
                 const treeRows: TreeRow[] = [];
@@ -190,28 +198,27 @@ const ResultGrid: React.FC<ResultGridProps> = ({ activePgroup }) => {
                         sample_name: sample.sample_name,
                         puck_name: sample.puck_name,
                         dewar_name: sample.dewar_name,
-                        images: sample.images,
+                        images: sample.images.filter(img => img.event_type === "Centering"),
                     };
                     treeRows.push(sampleRow);
 
-                    if (sample.experiment_runs) {
-                        sample.experiment_runs.forEach((run) => {
-                            const experimentType = getExperimentType(run);
-                            const numImages = getNumberOfImages(run);
-                            const runRow: TreeRow = {
-                                id: `run-${sample.sample_id}-${run.run_number}`,
-                                hierarchy: [sample.sample_id, run.run_number],
-                                type: 'run',
-                                sample_id: sample.sample_id,
-                                run_number: run.run_number,
-                                beamline_parameters: run.beamline_parameters,
-                                experimentType,
-                                numberOfImages: numImages,
-                                images: sample.images,
-                            };
-                            treeRows.push(runRow);
-                        });
-                    }
+                    sample.experiment_runs?.forEach(run => {
+                        const experimentType = getExperimentType(run);
+                        const numImages = getNumberOfImages(run);
+                        const runRow: TreeRow = {
+                            id: `run-${sample.sample_id}-${run.run_number}`,
+                            hierarchy: [sample.sample_id, run.run_number],
+                            type: 'run',
+                            sample_id: sample.sample_id,
+                            run_number: run.run_number,
+                            beamline_parameters: run.beamline_parameters,
+                            experimentType,
+                            numberOfImages: numImages,
+                            images: sample.images.filter(img =>
+                            img.event_type === "Collecting" ),
+                        };
+                        treeRows.push(runRow);
+                    });
                 });
 
                 setRows(treeRows);
@@ -221,6 +228,7 @@ const ResultGrid: React.FC<ResultGridProps> = ({ activePgroup }) => {
             });
     }, [activePgroup]);
 
+
     // Define the grid columns
     const columns: GridColDef[] = [
         {
diff --git a/testfunctions.ipynb b/testfunctions.ipynb
index 2b39278..093c6a5 100644
--- a/testfunctions.ipynb
+++ b/testfunctions.ipynb
@@ -3,8 +3,8 @@
   {
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2025-03-14T12:34:36.688448Z",
-     "start_time": "2025-03-14T12:34:36.274011Z"
+     "end_time": "2025-03-17T10:32:07.119518Z",
+     "start_time": "2025-03-17T10:32:06.622836Z"
     }
    },
    "cell_type": "code",
@@ -17,6 +17,8 @@
     "from aareDBclient.rest import ApiException\n",
     "from pprint import pprint\n",
     "\n",
+    "from app.schemas import characterizationParameters, ResultCreate\n",
+    "\n",
     "#from app.data.data import sample\n",
     "\n",
     "#from aareDBclient import SamplesApi, ShipmentsApi, PucksApi\n",
@@ -383,8 +385,21 @@
   {
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2025-03-07T20:50:06.182786Z",
-     "start_time": "2025-03-07T20:50:06.165153Z"
+     "end_time": "2025-03-17T10:32:10.718097Z",
+     "start_time": "2025-03-17T10:32:10.716192Z"
+    }
+   },
+   "cell_type": "code",
+   "source": "sample_id = 247",
+   "id": "54d4d46ca558e7b9",
+   "outputs": [],
+   "execution_count": 2
+  },
+  {
+   "metadata": {
+    "ExecuteTime": {
+     "end_time": "2025-03-14T19:35:49.714724Z",
+     "start_time": "2025-03-14T19:35:49.691388Z"
     }
    },
    "cell_type": "code",
@@ -396,12 +411,13 @@
     "with aareDBclient.ApiClient(configuration) as api_client:\n",
     "    # Instance of the API client\n",
     "    api_instance = aareDBclient.SamplesApi(api_client)\n",
-    "    sample_id=258\n",
+    "    #sample_id=293\n",
     "    try:\n",
     "        # Define the payload with only `event_type`\n",
     "        sample_event_create = SampleEventCreate(\n",
     "            sample_id=sample_id,\n",
     "            event_type=\"Centering\"  # Valid event type\n",
+    "            #event_type=\"Collecting\"  # Valid event type\n",
     "        )\n",
     "\n",
     "        # Debug the payload before sending\n",
@@ -428,6 +444,16 @@
    ],
    "id": "4a0665f92756b486",
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 127.0.0.1:8000\n",
+      "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
+      "  warnings.warn(\n",
+      "DEBUG:urllib3.connectionpool:https://127.0.0.1:8000 \"POST /samples/samples/247/events HTTP/1.1\" 200 405\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
@@ -435,31 +461,23 @@
       "Payload being sent to API:\n",
       "{\"event_type\":\"Centering\"}\n",
       "API response:\n",
-      "('id', 258)\n",
-      "('sample_name', 'Sample258')\n",
-      "('position', 14)\n",
-      "('puck_id', 26)\n",
+      "('id', 247)\n",
+      "('sample_name', 'Sample247')\n",
+      "('position', 16)\n",
+      "('puck_id', 30)\n",
       "('crystalname', None)\n",
       "('proteinname', None)\n",
       "('positioninpuck', None)\n",
       "('priority', None)\n",
       "('comments', None)\n",
       "('data_collection_parameters', None)\n",
-      "('events', [SampleEventResponse(id=492, sample_id=258, event_type='Mounting', timestamp=datetime.datetime(2025, 3, 6, 13, 50)), SampleEventResponse(id=493, sample_id=258, event_type='Unmounting', timestamp=datetime.datetime(2025, 3, 6, 13, 50, 50)), SampleEventResponse(id=573, sample_id=258, event_type='Centering', timestamp=datetime.datetime(2025, 3, 7, 21, 50, 6))])\n",
+      "('events', [SampleEventResponse(event_type='Mounting', id=482, sample_id=247, timestamp=datetime.datetime(2025, 3, 13, 13, 39)), SampleEventResponse(event_type='Centering', id=483, sample_id=247, timestamp=datetime.datetime(2025, 3, 14, 20, 35, 49))])\n",
       "('mount_count', 0)\n",
       "('unmount_count', 0)\n"
      ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
-      "  warnings.warn(\n"
-     ]
     }
    ],
-   "execution_count": 46
+   "execution_count": 5
   },
   {
    "metadata": {},
@@ -486,8 +504,8 @@
   {
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2025-03-14T12:37:36.649779Z",
-     "start_time": "2025-03-14T12:37:36.597340Z"
+     "end_time": "2025-03-14T19:55:02.036739Z",
+     "start_time": "2025-03-14T19:55:02.011806Z"
     }
    },
    "cell_type": "code",
@@ -506,11 +524,15 @@
     "#    \"backend/tests/sample_image/90_700.jpg\",\n",
     "#]\n",
     "\n",
-    "file_paths = [\"backend/tests/sample_image/mount.jpeg.jpg\"]\n",
+    "#file_paths = [\"backend/tests/sample_image/mount.jpeg.jpg\"]\n",
+    "\n",
+    "#file_paths = [\n",
+    "#    \"backend/tests/sample_image/bb_raster_90.jpg\"\n",
+    "#]\n",
+    "\n",
+    "file_paths = [\"backend/tests/sample_image/after_dc.jpeg.jpg\"]\n",
     "\n",
     "\n",
-    "# Sample ID (ensure this exists on your backend)\n",
-    "sample_id = 299\n",
     "\n",
     "# Base URL for the upload endpoint\n",
     "url = f\"https://127.0.0.1:8000/samples/{sample_id}/upload-images\"\n",
@@ -548,25 +570,27 @@
    "id": "11f62976d2e7d9b1",
    "outputs": [
     {
-     "name": "stdout",
+     "name": "stderr",
      "output_type": "stream",
      "text": [
-      "Uploading mount.jpeg.jpg...\n",
-      "API Response for mount.jpeg.jpg:\n",
-      "404\n",
-      "{'detail': 'Sample not found'}\n"
+      "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 127.0.0.1:8000\n",
+      "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
+      "  warnings.warn(\n",
+      "DEBUG:urllib3.connectionpool:https://127.0.0.1:8000 \"POST /samples/247/upload-images HTTP/1.1\" 200 205\n"
      ]
     },
     {
-     "name": "stderr",
+     "name": "stdout",
      "output_type": "stream",
      "text": [
-      "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
-      "  warnings.warn(\n"
+      "Uploading after_dc.jpeg.jpg...\n",
+      "API Response for after_dc.jpeg.jpg:\n",
+      "200\n",
+      "{'pgroup': 'p20003', 'sample_id': 247, 'sample_event_id': 486, 'filepath': 'images/p20003/2025-03-14/Dewar Five/PKK007/16/Collecting_2025-03-14_20-54-48/after_dc.jpeg.jpg', 'status': 'active', 'comment': None, 'id': 8}\n"
      ]
     }
    ],
-   "execution_count": 2
+   "execution_count": 12
   },
   {
    "metadata": {},
@@ -579,8 +603,8 @@
   {
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2025-03-11T15:05:58.348843Z",
-     "start_time": "2025-03-11T15:05:58.331240Z"
+     "end_time": "2025-03-14T19:54:48.102322Z",
+     "start_time": "2025-03-14T19:54:48.080070Z"
     }
    },
    "cell_type": "code",
@@ -598,15 +622,25 @@
     "# Build the nested parameters\n",
     "rotation = RotationParameters(\n",
     "    omegaStart_deg=0.0,\n",
-    "    omegaStep=90.0,\n",
+    "    omegaStep=0.1,\n",
     "    phi=10.0,\n",
     "    chi=0.0,\n",
-    "    numberOfImages=4,\n",
+    "    numberOfImages=3600,\n",
     "    exposureTime_s=0.02\n",
     ")\n",
     "\n",
+    "#characterization = characterizationParameters(\n",
+    "#    omegaStart_deg=0.0,\n",
+    "#    omegaStep=90.0,\n",
+    "#    oscillation_deg=1.0,\n",
+    "#    phi=10.0,\n",
+    "#    chi=0.0,\n",
+    "#    numberOfImages=4,\n",
+    "#    exposureTime_s=0.02\n",
+    "#)\n",
+    "\n",
     "#gridscan = GridScanParamers(\n",
-    "#    xStart=0.0,\n",
+    "#    xStart=90.0,\n",
     "#    xStep=0.1,\n",
     "#    yStart=0.0,\n",
     "#    yStep= 0.1,\n",
@@ -644,6 +678,7 @@
     "    beamlineFluxAtSample_ph_s=0,\n",
     "    beamSizeWidth=30.0,\n",
     "    beamSizeHeight=30.0,\n",
+    "    #characterization=characterization\n",
     "    rotation=rotation  # Optional nested parameter\n",
     "    #gridScan=gridscan\n",
     "    # gridScan and jet are optional and can be added similarly\n",
@@ -655,7 +690,7 @@
     "experiment_params_payload = ExperimentParametersCreate(\n",
     "    # run_number can be omitted/ignored if computed on the server\n",
     "    beamline_parameters=beamline_params,\n",
-    "    sample_id=299  # change sample_id to an existing sample in your database\n",
+    "    sample_id=sample_id  # change sample_id to an existing sample in your database\n",
     ")\n",
     "\n",
     "# Now, use the API instance to send the POST request\n",
@@ -677,30 +712,119 @@
    ],
    "id": "421ba0710f29a5fa",
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 127.0.0.1:8000\n",
+      "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
+      "  warnings.warn(\n",
+      "DEBUG:urllib3.connectionpool:https://127.0.0.1:8000 \"POST /samples/samples/247/experiment_parameters HTTP/1.1\" 200 860\n"
+     ]
+    },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
       "API Response:\n",
-      "run_number=1 beamline_parameters=BeamlineParameters(synchrotron='Swiss Light Source', beamline='PXIII', detector=Detector(manufacturer='DECTRIS', model='PILATUS4 2M', type='photon-counting', serial_number='16684dscsd668468', detector_distance_mm=95.0, beam_center_x_px=512.0, beam_center_y_px=512.0, pixel_size_x_um=150.0, pixel_size_y_um=150.0), wavelength=1.0, ring_current_a=0.0, ring_mode='Machine Down', undulator=None, undulatorgap_mm=None, monochromator='Si111', transmission=1.0, focusing_optic='Kirkpatrick-Baez', beamline_flux_at_sample_ph_s=0.0, beam_size_width=30.0, beam_size_height=30.0, rotation=RotationParameters(omega_start_deg=0.0, omega_step=90.0, chi=0.0, phi=10.0, number_of_images=4, exposure_time_s=0.02), grid_scan=None, jet=None, cryojet_temperature_k=None, humidifier_temperature_k=None, humidifier_humidity=None) sample_id=299 id=1\n"
+      "run_number=3 beamline_parameters=BeamlineParameters(synchrotron='Swiss Light Source', beamline='PXIII', detector=Detector(manufacturer='DECTRIS', model='PILATUS4 2M', type='photon-counting', serial_number='16684dscsd668468', detector_distance_mm=95.0, beam_center_x_px=512.0, beam_center_y_px=512.0, pixel_size_x_um=150.0, pixel_size_y_um=150.0), wavelength=1.0, ring_current_a=0.0, ring_mode='Machine Down', undulator=None, undulatorgap_mm=None, monochromator='Si111', transmission=1.0, focusing_optic='Kirkpatrick-Baez', beamline_flux_at_sample_ph_s=0.0, beam_size_width=30.0, beam_size_height=30.0, characterization=None, rotation=RotationParameters(omega_start_deg=0.0, omega_step=0.1, chi=0.0, phi=10.0, number_of_images=3600, exposure_time_s=0.02), grid_scan=None, jet=None, cryojet_temperature_k=None, humidifier_temperature_k=None, humidifier_humidity=None) sample_id=247 id=3\n"
      ]
-    },
+    }
+   ],
+   "execution_count": 11
+  },
+  {
+   "metadata": {
+    "ExecuteTime": {
+     "end_time": "2025-03-17T10:46:08.211213Z",
+     "start_time": "2025-03-17T10:46:08.193139Z"
+    }
+   },
+   "cell_type": "code",
+   "source": [
+    "# %%\n",
+    "from app.schemas import ResultCreate, Results\n",
+    "from pprint import pprint\n",
+    "import random\n",
+    "import aareDBclient\n",
+    "from aareDBclient.rest import ApiException\n",
+    "\n",
+    "# Your actual sample and experiment IDs\n",
+    "sample_id = 123  # Replace with valid IDs\n",
+    "run_id = 1  # Replace with valid run_id\n",
+    "\n",
+    "# Create random Results payload\n",
+    "results_data = Results(\n",
+    "    pipeline=\"autoproc\",\n",
+    "    resolution=round(random.uniform(1.0, 4.0), 2),\n",
+    "    unit_cell=f\"{random.uniform(20, 120):.2f}, {random.uniform(20, 120):.2f}, \"\n",
+    "              f\"{random.uniform(20, 120):.2f}, {random.uniform(60, 120):.2f}, \"\n",
+    "              f\"{random.uniform(60, 120):.2f}, {random.uniform(60, 120):.2f}\",\n",
+    "    spacegroup=random.choice(['P212121', 'C2', 'P1', 'P21', 'P21212', 'P41212']),\n",
+    "    rmerge=round(random.uniform(0.02, 0.10), 3),\n",
+    "    rmeas=round(random.uniform(0.02, 0.15), 3),\n",
+    "    isig=round(random.uniform(1.0, 30.0), 2),\n",
+    "    cc=round(random.uniform(0.7, 1.0), 3),\n",
+    "    cchalf=round(random.uniform(0.7, 1.0), 3),\n",
+    "    completeness=round(random.uniform(85.0, 100.0), 2),\n",
+    "    multiplicity=round(random.uniform(1.0, 10.0), 2),\n",
+    "    nobs=random.randint(10000, 500000),\n",
+    "    total_refl=random.randint(5000, 250000),\n",
+    "    unique_refl=random.randint(5000, 100000),\n",
+    "    comments=\"Random auto-generated test entry\"\n",
+    ")\n",
+    "\n",
+    "payload = ResultCreate(sample_id=sample_id, run_id=run_id, result=results_data)\n",
+    "\n",
+    "# correct serialization, passing exact required dict structure\n",
+    "payload_dict = {\n",
+    "    \"sample_id\": sample_id,\n",
+    "    \"run_id\": run_id,\n",
+    "    \"result\": results_data.model_dump(),\n",
+    "}\n",
+    "\n",
+    "with aareDBclient.ApiClient(configuration) as api_client:\n",
+    "    api_instance = aareDBclient.SamplesApi(api_client)\n",
+    "\n",
+    "    try:\n",
+    "        api_response = api_instance.create_result_samples_processing_results_post(\n",
+    "            result_create=payload_dict\n",
+    "        )\n",
+    "\n",
+    "        print(\"API call successful:\")\n",
+    "        pprint(api_response)\n",
+    "\n",
+    "    except ApiException as e:\n",
+    "        print(f\"API call failed: {e}\")\n"
+   ],
+   "id": "3e3974d5df795c32",
+   "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
+      "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 127.0.0.1:8000\n",
       "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
-      "  warnings.warn(\n"
+      "  warnings.warn(\n",
+      "DEBUG:urllib3.connectionpool:https://127.0.0.1:8000 \"POST /samples/processing-results HTTP/1.1\" 200 369\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "API call successful:\n",
+      "ResultResponse(id=2, sample_id=123, run_id=1, result=Results(pipeline='autoproc', resolution=1.94, unit_cell='23.86, 89.07, 37.39, 63.99, 88.77, 81.42', spacegroup='P41212', rmerge=0.072, rmeas=0.07, isig=29.58, cc=0.758, cchalf=0.915, completeness=93.12, multiplicity=6.1, nobs=279922, total_refl=83994, unique_refl=47041, comments='Random auto-generated test entry'))\n"
      ]
     }
    ],
-   "execution_count": 49
+   "execution_count": 9
   },
   {
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2025-03-04T09:22:51.456656Z",
-     "start_time": "2025-03-04T09:22:51.403762Z"
+     "end_time": "2025-03-14T16:09:47.444375Z",
+     "start_time": "2025-03-14T16:09:47.402508Z"
     }
    },
    "cell_type": "code",
@@ -714,15 +838,15 @@
     "    # GET request: Fetch all pucks in the tell\n",
     "    try:\n",
     "        # Call the API method to fetch pucks\n",
-    "        all_results_response = api_instance.get_sample_results_samples_results_get(active_pgroup=\"p20001\")\n",
-    "\n",
-    "        # Debug response structure by printing it in JSON format\n",
-    "        formatted_response = json.dumps(\n",
-    "            [p.to_dict() for p in all_results_response],  # Assuming the API response can be converted to dicts\n",
-    "            indent=4  # Use indentation for readability\n",
-    "        )\n",
-    "        print(\"The response of PucksApi->get_all_pucks_in_tell (formatted):\\n\")\n",
-    "        print(formatted_response)\n",
+    "        all_results_response = api_instance.get_sample_results_samples_results_get(active_pgroup=\"p20003\")\n",
+    "        pprint(all_results_response)\n",
+    "        ## Debug response structure by printing it in JSON format\n",
+    "        #formatted_response = json.dumps(\n",
+    "        #    [p.to_dict() for p in all_results_response],  # Assuming the API response can be converted to dicts\n",
+    "        #    indent=4  # Use indentation for readability\n",
+    "        #)\n",
+    "        #print(\"The response of PucksApi->get_all_pucks_in_tell (formatted):\\n\")\n",
+    "        #print(formatted_response)\n",
     "\n",
     "        ## Iterate through each puck and print information\n",
     "        #for p in all_results_response:\n",
@@ -741,788 +865,52 @@
    "id": "6079a4f10102e906",
    "outputs": [
     {
-     "name": "stdout",
+     "name": "stderr",
      "output_type": "stream",
      "text": [
-      "The response of PucksApi->get_all_pucks_in_tell (formatted):\n",
-      "\n",
-      "[\n",
-      "    {\n",
-      "        \"sample_id\": 1,\n",
-      "        \"sample_name\": \"Sample001\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 2,\n",
-      "        \"sample_name\": \"Sample002\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 3,\n",
-      "        \"sample_name\": \"Sample003\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 4,\n",
-      "        \"sample_name\": \"Sample004\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 5,\n",
-      "        \"sample_name\": \"Sample005\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 6,\n",
-      "        \"sample_name\": \"Sample006\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 7,\n",
-      "        \"sample_name\": \"Sample007\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 8,\n",
-      "        \"sample_name\": \"Sample008\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 9,\n",
-      "        \"sample_name\": \"Sample009\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 10,\n",
-      "        \"sample_name\": \"Sample010\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 11,\n",
-      "        \"sample_name\": \"Sample011\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 12,\n",
-      "        \"sample_name\": \"Sample012\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 13,\n",
-      "        \"sample_name\": \"Sample013\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 14,\n",
-      "        \"sample_name\": \"Sample014\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 15,\n",
-      "        \"sample_name\": \"Sample015\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": [\n",
-      "            {\n",
-      "                \"run_number\": 1,\n",
-      "                \"beamline_parameters\": {\n",
-      "                    \"synchrotron\": \"Swiss Light Source\",\n",
-      "                    \"beamline\": \"PXIII\",\n",
-      "                    \"detector\": {\n",
-      "                        \"manufacturer\": \"DECTRIS\",\n",
-      "                        \"model\": \"PILATUS4 2M\",\n",
-      "                        \"type\": \"photon-counting\",\n",
-      "                        \"serialNumber\": \"16684dscsd668468\",\n",
-      "                        \"detectorDistance_mm\": 95.0,\n",
-      "                        \"beamCenterX_px\": 512.0,\n",
-      "                        \"beamCenterY_px\": 512.0,\n",
-      "                        \"pixelSizeX_um\": 150.0,\n",
-      "                        \"pixelSizeY_um\": 150.0\n",
-      "                    },\n",
-      "                    \"wavelength\": 1.0,\n",
-      "                    \"ringCurrent_A\": 0.0,\n",
-      "                    \"ringMode\": \"Machine Down\",\n",
-      "                    \"monochromator\": \"Si111\",\n",
-      "                    \"transmission\": 1.0,\n",
-      "                    \"focusingOptic\": \"Kirkpatrick-Baez\",\n",
-      "                    \"beamlineFluxAtSample_ph_s\": 0.0,\n",
-      "                    \"beamSizeWidth\": 30.0,\n",
-      "                    \"beamSizeHeight\": 30.0,\n",
-      "                    \"rotation\": {\n",
-      "                        \"omegaStart_deg\": 0.0,\n",
-      "                        \"omegaStep\": 0.5,\n",
-      "                        \"chi\": 0.0,\n",
-      "                        \"phi\": 10.0,\n",
-      "                        \"numberOfImages\": 3600,\n",
-      "                        \"exposureTime_s\": 0.02\n",
-      "                    },\n",
-      "                    \"undulator\": null,\n",
-      "                    \"undulatorgap_mm\": null,\n",
-      "                    \"gridScan\": null,\n",
-      "                    \"jet\": null,\n",
-      "                    \"cryojetTemperature_K\": null,\n",
-      "                    \"humidifierTemperature_K\": null,\n",
-      "                    \"humidifierHumidity\": null\n",
-      "                },\n",
-      "                \"sample_id\": 15,\n",
-      "                \"id\": 8\n",
-      "            },\n",
-      "            {\n",
-      "                \"run_number\": 2,\n",
-      "                \"beamline_parameters\": {\n",
-      "                    \"synchrotron\": \"Swiss Light Source\",\n",
-      "                    \"beamline\": \"PXIII\",\n",
-      "                    \"detector\": {\n",
-      "                        \"manufacturer\": \"DECTRIS\",\n",
-      "                        \"model\": \"PILATUS4 2M\",\n",
-      "                        \"type\": \"photon-counting\",\n",
-      "                        \"serialNumber\": \"16684dscsd668468\",\n",
-      "                        \"detectorDistance_mm\": 95.0,\n",
-      "                        \"beamCenterX_px\": 512.0,\n",
-      "                        \"beamCenterY_px\": 512.0,\n",
-      "                        \"pixelSizeX_um\": 150.0,\n",
-      "                        \"pixelSizeY_um\": 150.0\n",
-      "                    },\n",
-      "                    \"wavelength\": 1.0,\n",
-      "                    \"ringCurrent_A\": 0.0,\n",
-      "                    \"ringMode\": \"Machine Down\",\n",
-      "                    \"monochromator\": \"Si111\",\n",
-      "                    \"transmission\": 1.0,\n",
-      "                    \"focusingOptic\": \"Kirkpatrick-Baez\",\n",
-      "                    \"beamlineFluxAtSample_ph_s\": 0.0,\n",
-      "                    \"beamSizeWidth\": 30.0,\n",
-      "                    \"beamSizeHeight\": 30.0,\n",
-      "                    \"rotation\": {\n",
-      "                        \"omegaStart_deg\": 0.0,\n",
-      "                        \"omegaStep\": 90.0,\n",
-      "                        \"chi\": 0.0,\n",
-      "                        \"phi\": 10.0,\n",
-      "                        \"numberOfImages\": 4,\n",
-      "                        \"exposureTime_s\": 0.02\n",
-      "                    },\n",
-      "                    \"undulator\": null,\n",
-      "                    \"undulatorgap_mm\": null,\n",
-      "                    \"gridScan\": null,\n",
-      "                    \"jet\": null,\n",
-      "                    \"cryojetTemperature_K\": null,\n",
-      "                    \"humidifierTemperature_K\": null,\n",
-      "                    \"humidifierHumidity\": null\n",
-      "                },\n",
-      "                \"sample_id\": 15,\n",
-      "                \"id\": 9\n",
-      "            },\n",
-      "            {\n",
-      "                \"run_number\": 3,\n",
-      "                \"beamline_parameters\": {\n",
-      "                    \"synchrotron\": \"Swiss Light Source\",\n",
-      "                    \"beamline\": \"PXIII\",\n",
-      "                    \"detector\": {\n",
-      "                        \"manufacturer\": \"DECTRIS\",\n",
-      "                        \"model\": \"PILATUS4 2M\",\n",
-      "                        \"type\": \"photon-counting\",\n",
-      "                        \"serialNumber\": \"16684dscsd668468\",\n",
-      "                        \"detectorDistance_mm\": 95.0,\n",
-      "                        \"beamCenterX_px\": 512.0,\n",
-      "                        \"beamCenterY_px\": 512.0,\n",
-      "                        \"pixelSizeX_um\": 150.0,\n",
-      "                        \"pixelSizeY_um\": 150.0\n",
-      "                    },\n",
-      "                    \"wavelength\": 1.0,\n",
-      "                    \"ringCurrent_A\": 0.0,\n",
-      "                    \"ringMode\": \"Machine Down\",\n",
-      "                    \"monochromator\": \"Si111\",\n",
-      "                    \"transmission\": 1.0,\n",
-      "                    \"focusingOptic\": \"Kirkpatrick-Baez\",\n",
-      "                    \"beamlineFluxAtSample_ph_s\": 0.0,\n",
-      "                    \"beamSizeWidth\": 30.0,\n",
-      "                    \"beamSizeHeight\": 30.0,\n",
-      "                    \"gridScan\": {\n",
-      "                        \"xStart\": 0.0,\n",
-      "                        \"xStep\": 0.1,\n",
-      "                        \"yStart\": 0.0,\n",
-      "                        \"yStep\": 0.1,\n",
-      "                        \"zStart\": 0.0,\n",
-      "                        \"zStep\": 0.0,\n",
-      "                        \"numberOfImages\": 4600,\n",
-      "                        \"exposureTime_s\": 0.001\n",
-      "                    },\n",
-      "                    \"undulator\": null,\n",
-      "                    \"undulatorgap_mm\": null,\n",
-      "                    \"rotation\": null,\n",
-      "                    \"jet\": null,\n",
-      "                    \"cryojetTemperature_K\": null,\n",
-      "                    \"humidifierTemperature_K\": null,\n",
-      "                    \"humidifierHumidity\": null\n",
-      "                },\n",
-      "                \"sample_id\": 15,\n",
-      "                \"id\": 10\n",
-      "            }\n",
-      "        ]\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 16,\n",
-      "        \"sample_name\": \"Sample016\",\n",
-      "        \"puck_name\": \"PUCK-001\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [\n",
-      "            {\n",
-      "                \"id\": 3,\n",
-      "                \"filepath\": \"images/p20001/2025-02-26/Dewar One/PUCK-001/16/bb_raster_0.jpg\",\n",
-      "                \"comment\": null\n",
-      "            },\n",
-      "            {\n",
-      "                \"id\": 4,\n",
-      "                \"filepath\": \"images/p20001/2025-02-26/Dewar One/PUCK-001/16/bb_raster_90.jpg\",\n",
-      "                \"comment\": null\n",
-      "            }\n",
-      "        ],\n",
-      "        \"experiment_runs\": [\n",
-      "            {\n",
-      "                \"run_number\": 1,\n",
-      "                \"beamline_parameters\": {\n",
-      "                    \"synchrotron\": \"Swiss Light Source\",\n",
-      "                    \"beamline\": \"PXIII\",\n",
-      "                    \"detector\": {\n",
-      "                        \"manufacturer\": \"DECTRIS\",\n",
-      "                        \"model\": \"PILATUS4 2M\",\n",
-      "                        \"type\": \"photon-counting\",\n",
-      "                        \"serialNumber\": \"16684dscsd668468\",\n",
-      "                        \"detectorDistance_mm\": 95.0,\n",
-      "                        \"beamCenterX_px\": 512.0,\n",
-      "                        \"beamCenterY_px\": 512.0,\n",
-      "                        \"pixelSizeX_um\": 150.0,\n",
-      "                        \"pixelSizeY_um\": 150.0\n",
-      "                    },\n",
-      "                    \"wavelength\": 1.0,\n",
-      "                    \"ringCurrent_A\": 0.0,\n",
-      "                    \"ringMode\": \"Machine Down\",\n",
-      "                    \"monochromator\": \"Si111\",\n",
-      "                    \"transmission\": 1.0,\n",
-      "                    \"focusingOptic\": \"Kirkpatrick-Baez\",\n",
-      "                    \"beamlineFluxAtSample_ph_s\": 0.0,\n",
-      "                    \"beamSizeWidth\": 30.0,\n",
-      "                    \"beamSizeHeight\": 30.0,\n",
-      "                    \"rotation\": {\n",
-      "                        \"omegaStart_deg\": 0.0,\n",
-      "                        \"omegaStep\": 0.5,\n",
-      "                        \"chi\": 0.0,\n",
-      "                        \"phi\": 10.0,\n",
-      "                        \"numberOfImages\": 3600,\n",
-      "                        \"exposureTime_s\": 0.02\n",
-      "                    },\n",
-      "                    \"undulator\": null,\n",
-      "                    \"undulatorgap_mm\": null,\n",
-      "                    \"gridScan\": null,\n",
-      "                    \"jet\": null,\n",
-      "                    \"cryojetTemperature_K\": null,\n",
-      "                    \"humidifierTemperature_K\": null,\n",
-      "                    \"humidifierHumidity\": null\n",
-      "                },\n",
-      "                \"sample_id\": 16,\n",
-      "                \"id\": 5\n",
-      "            },\n",
-      "            {\n",
-      "                \"run_number\": 2,\n",
-      "                \"beamline_parameters\": {\n",
-      "                    \"synchrotron\": \"Swiss Light Source\",\n",
-      "                    \"beamline\": \"PXIII\",\n",
-      "                    \"detector\": {\n",
-      "                        \"manufacturer\": \"DECTRIS\",\n",
-      "                        \"model\": \"PILATUS4 2M\",\n",
-      "                        \"type\": \"photon-counting\",\n",
-      "                        \"serialNumber\": \"16684dscsd668468\",\n",
-      "                        \"detectorDistance_mm\": 95.0,\n",
-      "                        \"beamCenterX_px\": 512.0,\n",
-      "                        \"beamCenterY_px\": 512.0,\n",
-      "                        \"pixelSizeX_um\": 150.0,\n",
-      "                        \"pixelSizeY_um\": 150.0\n",
-      "                    },\n",
-      "                    \"wavelength\": 1.0,\n",
-      "                    \"ringCurrent_A\": 0.0,\n",
-      "                    \"ringMode\": \"Machine Down\",\n",
-      "                    \"monochromator\": \"Si111\",\n",
-      "                    \"transmission\": 1.0,\n",
-      "                    \"focusingOptic\": \"Kirkpatrick-Baez\",\n",
-      "                    \"beamlineFluxAtSample_ph_s\": 0.0,\n",
-      "                    \"beamSizeWidth\": 30.0,\n",
-      "                    \"beamSizeHeight\": 30.0,\n",
-      "                    \"rotation\": {\n",
-      "                        \"omegaStart_deg\": 0.0,\n",
-      "                        \"omegaStep\": 0.5,\n",
-      "                        \"chi\": 0.0,\n",
-      "                        \"phi\": 10.0,\n",
-      "                        \"numberOfImages\": 3600,\n",
-      "                        \"exposureTime_s\": 0.02\n",
-      "                    },\n",
-      "                    \"undulator\": null,\n",
-      "                    \"undulatorgap_mm\": null,\n",
-      "                    \"gridScan\": null,\n",
-      "                    \"jet\": null,\n",
-      "                    \"cryojetTemperature_K\": null,\n",
-      "                    \"humidifierTemperature_K\": null,\n",
-      "                    \"humidifierHumidity\": null\n",
-      "                },\n",
-      "                \"sample_id\": 16,\n",
-      "                \"id\": 6\n",
-      "            },\n",
-      "            {\n",
-      "                \"run_number\": 3,\n",
-      "                \"beamline_parameters\": {\n",
-      "                    \"synchrotron\": \"Swiss Light Source\",\n",
-      "                    \"beamline\": \"PXIII\",\n",
-      "                    \"detector\": {\n",
-      "                        \"manufacturer\": \"DECTRIS\",\n",
-      "                        \"model\": \"PILATUS4 2M\",\n",
-      "                        \"type\": \"photon-counting\",\n",
-      "                        \"serialNumber\": \"16684dscsd668468\",\n",
-      "                        \"detectorDistance_mm\": 95.0,\n",
-      "                        \"beamCenterX_px\": 512.0,\n",
-      "                        \"beamCenterY_px\": 512.0,\n",
-      "                        \"pixelSizeX_um\": 150.0,\n",
-      "                        \"pixelSizeY_um\": 150.0\n",
-      "                    },\n",
-      "                    \"wavelength\": 1.0,\n",
-      "                    \"ringCurrent_A\": 0.0,\n",
-      "                    \"ringMode\": \"Machine Down\",\n",
-      "                    \"monochromator\": \"Si111\",\n",
-      "                    \"transmission\": 1.0,\n",
-      "                    \"focusingOptic\": \"Kirkpatrick-Baez\",\n",
-      "                    \"beamlineFluxAtSample_ph_s\": 0.0,\n",
-      "                    \"beamSizeWidth\": 30.0,\n",
-      "                    \"beamSizeHeight\": 30.0,\n",
-      "                    \"rotation\": {\n",
-      "                        \"omegaStart_deg\": 0.0,\n",
-      "                        \"omegaStep\": 0.5,\n",
-      "                        \"chi\": 0.0,\n",
-      "                        \"phi\": 10.0,\n",
-      "                        \"numberOfImages\": 3600,\n",
-      "                        \"exposureTime_s\": 0.02\n",
-      "                    },\n",
-      "                    \"undulator\": null,\n",
-      "                    \"undulatorgap_mm\": null,\n",
-      "                    \"gridScan\": null,\n",
-      "                    \"jet\": null,\n",
-      "                    \"cryojetTemperature_K\": null,\n",
-      "                    \"humidifierTemperature_K\": null,\n",
-      "                    \"humidifierHumidity\": null\n",
-      "                },\n",
-      "                \"sample_id\": 16,\n",
-      "                \"id\": 7\n",
-      "            }\n",
-      "        ]\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 17,\n",
-      "        \"sample_name\": \"Sample017\",\n",
-      "        \"puck_name\": \"PUCK002\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 18,\n",
-      "        \"sample_name\": \"Sample018\",\n",
-      "        \"puck_name\": \"PUCK002\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 19,\n",
-      "        \"sample_name\": \"Sample019\",\n",
-      "        \"puck_name\": \"PUCK002\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 20,\n",
-      "        \"sample_name\": \"Sample020\",\n",
-      "        \"puck_name\": \"PUCK002\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 21,\n",
-      "        \"sample_name\": \"Sample021\",\n",
-      "        \"puck_name\": \"PUCK002\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 22,\n",
-      "        \"sample_name\": \"Sample022\",\n",
-      "        \"puck_name\": \"PUCK002\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 23,\n",
-      "        \"sample_name\": \"Sample023\",\n",
-      "        \"puck_name\": \"PUCK002\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 24,\n",
-      "        \"sample_name\": \"Sample024\",\n",
-      "        \"puck_name\": \"PUCK003\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 25,\n",
-      "        \"sample_name\": \"Sample025\",\n",
-      "        \"puck_name\": \"PUCK003\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 26,\n",
-      "        \"sample_name\": \"Sample026\",\n",
-      "        \"puck_name\": \"PUCK003\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 27,\n",
-      "        \"sample_name\": \"Sample027\",\n",
-      "        \"puck_name\": \"PUCK003\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 28,\n",
-      "        \"sample_name\": \"Sample028\",\n",
-      "        \"puck_name\": \"PUCK003\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 29,\n",
-      "        \"sample_name\": \"Sample029\",\n",
-      "        \"puck_name\": \"PUCK004\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 30,\n",
-      "        \"sample_name\": \"Sample030\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 31,\n",
-      "        \"sample_name\": \"Sample031\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 32,\n",
-      "        \"sample_name\": \"Sample032\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 33,\n",
-      "        \"sample_name\": \"Sample033\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 34,\n",
-      "        \"sample_name\": \"Sample034\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 35,\n",
-      "        \"sample_name\": \"Sample035\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 36,\n",
-      "        \"sample_name\": \"Sample036\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 37,\n",
-      "        \"sample_name\": \"Sample037\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 38,\n",
-      "        \"sample_name\": \"Sample038\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 39,\n",
-      "        \"sample_name\": \"Sample039\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 40,\n",
-      "        \"sample_name\": \"Sample040\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 41,\n",
-      "        \"sample_name\": \"Sample041\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 42,\n",
-      "        \"sample_name\": \"Sample042\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 43,\n",
-      "        \"sample_name\": \"Sample043\",\n",
-      "        \"puck_name\": \"PUCK005\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 44,\n",
-      "        \"sample_name\": \"Sample044\",\n",
-      "        \"puck_name\": \"PUCK006\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 45,\n",
-      "        \"sample_name\": \"Sample045\",\n",
-      "        \"puck_name\": \"PUCK006\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 46,\n",
-      "        \"sample_name\": \"Sample046\",\n",
-      "        \"puck_name\": \"PUCK006\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 47,\n",
-      "        \"sample_name\": \"Sample047\",\n",
-      "        \"puck_name\": \"PUCK006\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 48,\n",
-      "        \"sample_name\": \"Sample048\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 49,\n",
-      "        \"sample_name\": \"Sample049\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 50,\n",
-      "        \"sample_name\": \"Sample050\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 51,\n",
-      "        \"sample_name\": \"Sample051\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 52,\n",
-      "        \"sample_name\": \"Sample052\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 53,\n",
-      "        \"sample_name\": \"Sample053\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 54,\n",
-      "        \"sample_name\": \"Sample054\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 55,\n",
-      "        \"sample_name\": \"Sample055\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 56,\n",
-      "        \"sample_name\": \"Sample056\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 57,\n",
-      "        \"sample_name\": \"Sample057\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 58,\n",
-      "        \"sample_name\": \"Sample058\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 59,\n",
-      "        \"sample_name\": \"Sample059\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 60,\n",
-      "        \"sample_name\": \"Sample060\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    },\n",
-      "    {\n",
-      "        \"sample_id\": 61,\n",
-      "        \"sample_name\": \"Sample061\",\n",
-      "        \"puck_name\": \"PUCK007\",\n",
-      "        \"dewar_name\": \"Dewar One\",\n",
-      "        \"images\": [],\n",
-      "        \"experiment_runs\": []\n",
-      "    }\n",
-      "]\n"
+      "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 127.0.0.1:8000\n",
+      "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
+      "  warnings.warn(\n",
+      "DEBUG:urllib3.connectionpool:https://127.0.0.1:8000 \"GET /samples/results?active_pgroup=p20003 HTTP/1.1\" 200 4243\n"
      ]
     },
     {
-     "name": "stderr",
+     "name": "stdout",
      "output_type": "stream",
      "text": [
-      "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1097: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n",
-      "  warnings.warn(\n"
+      "[SampleResult(sample_id=215, sample_name='Sample215', puck_name='PKK004', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=216, sample_name='Sample216', puck_name='PKK004', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=217, sample_name='Sample217', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=218, sample_name='Sample218', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=219, sample_name='Sample219', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=220, sample_name='Sample220', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=221, sample_name='Sample221', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=222, sample_name='Sample222', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=223, sample_name='Sample223', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=224, sample_name='Sample224', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=225, sample_name='Sample225', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=226, sample_name='Sample226', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=227, sample_name='Sample227', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=228, sample_name='Sample228', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=229, sample_name='Sample229', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=230, sample_name='Sample230', puck_name='PKK005', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=231, sample_name='Sample231', puck_name='PKK006', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=232, sample_name='Sample232', puck_name='PKK006', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=233, sample_name='Sample233', puck_name='PKK006', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=234, sample_name='Sample234', puck_name='PKK006', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=235, sample_name='Sample235', puck_name='PKK006', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=236, sample_name='Sample236', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=237, sample_name='Sample237', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=238, sample_name='Sample238', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=239, sample_name='Sample239', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=240, sample_name='Sample240', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=241, sample_name='Sample241', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=242, sample_name='Sample242', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=243, sample_name='Sample243', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=244, sample_name='Sample244', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=245, sample_name='Sample245', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=246, sample_name='Sample246', puck_name='PKK007', dewar_name='Dewar Five', images=[], experiment_runs=[]),\n",
+      " SampleResult(sample_id=247, sample_name='Sample247', puck_name='PKK007', dewar_name='Dewar Five', images=[ImageInfo(id=1, filepath='images/p20003/2025-03-14/Dewar Five/PKK007/16/Mounting_2025-03-13_13-39-00/mount.jpeg.jpg', comment=None, event_type='Mounting')], experiment_runs=[])]\n"
      ]
     }
    ],
-- 
GitLab