diff --git a/backend/app/models.py b/backend/app/models.py index 68b6d78..349481a 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -317,8 +317,9 @@ class Jobs(Base): __tablename__ = "jobs" id = Column(Integer, primary_key=True, index=True) - experiment_parameters_id = Column(Integer, ForeignKey("experiment_parameters.id")) + sample_id = Column(Integer, ForeignKey("samples.id"), nullable=False) + run_id = Column(Integer, ForeignKey("experiment_parameters.id"), nullable=False) status = Column(String, nullable=False) - parameters = relationship(ExperimentParameters) + experiment_parameters = relationship(ExperimentParameters) created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, onupdate=func.now()) diff --git a/backend/app/routers/processing.py b/backend/app/routers/processing.py index 1a363d4..cc0b0c2 100644 --- a/backend/app/routers/processing.py +++ b/backend/app/routers/processing.py @@ -4,7 +4,13 @@ from fastapi import APIRouter, Depends from fastapi.encoders import jsonable_encoder from sqlalchemy.orm import Session from starlette.responses import StreamingResponse -from app.models import JobStatus, Jobs as JobModel +from app.models import ( + JobStatus, + Jobs as JobModel, + ExperimentParameters as ExperimentParametersModel, + Sample as SampleModel, +) +from app.schemas import JobsResponse, JobsUpdate from app.dependencies import get_db router = APIRouter() @@ -13,9 +19,37 @@ router = APIRouter() async def job_event_generator(db: Session): while True: jobs = db.query(JobModel).filter(JobModel.status == JobStatus.TODO).all() - if jobs: - job_payload = jsonable_encoder(jobs) - yield f"data: {json.dumps(job_payload)}\n\n" + job_items = [] + for job in jobs: + sample = db.query(SampleModel).filter_by(id=job.sample_id).first() + experiment = ( + db.query(ExperimentParametersModel) + .filter(ExperimentParametersModel.sample_id == sample.id) + .first() + ) + + job_item = JobsResponse( + job_id=job.id, + sample_id=sample.id, + run_id=getattr(experiment, "run_number", None), + sample_name=sample.sample_name, + status=job.status, + type=getattr(job, "type", "default_type"), + created_at=job.created_at, + updated_at=job.updated_at, + data_collection_parameters=sample.data_collection_parameters, + experiment_parameters=experiment.beamline_parameters + if experiment + else None, + ) + + job_items.append(job_item) + + if job_items: + # Use Pydantic's .json() for each item, if you need a fine structure, or: + serialized = jsonable_encoder(job_items) + yield f"data: {json.dumps(serialized)}\n\n" + await asyncio.sleep(5) @@ -25,3 +59,29 @@ async def job_event_generator(db: Session): @router.get("/jobs/stream") async def stream_jobs(db: Session = Depends(get_db)): return StreamingResponse(job_event_generator(db), media_type="text/event-stream") + + +@router.post( + "/jobs/update_status", response_model=JobsUpdate, operation_id="update_status" +) +def update_jobs_status(payload: JobsUpdate, db: Session = Depends(get_db)): + # Fetch the job by job_id + job = db.query(JobModel).filter(JobModel.id == payload.job_id).first() + if not job: + # Optionally, use HTTPException for proper status code + from fastapi import HTTPException + + raise HTTPException(status_code=404, detail="Job not found") + + # Update the status + job.status = payload.status + # Optionally update 'updated_at' + from sqlalchemy import func + + job.updated_at = func.now() + + db.commit() + db.refresh(job) + + # Return the updated job's info as response + return JobsUpdate(job_id=job.id, status=job.status) diff --git a/backend/app/routers/sample.py b/backend/app/routers/sample.py index c82c771..be9f0a1 100644 --- a/backend/app/routers/sample.py +++ b/backend/app/routers/sample.py @@ -351,8 +351,9 @@ def create_experiment_parameters_for_sample( db.commit() new_job = JobModel( - experiment_parameters_id=new_exp.id, # <-- Correct reference here - parameters=new_exp, # assuming params has a to_dict() method + sample_id=sample_id, + run_id=new_exp.id, + experiment_parameters=new_exp, # not sure yet status=JobStatus.TODO, ) db.add(new_job) diff --git a/backend/app/schemas.py b/backend/app/schemas.py index f236ef9..cfe22b9 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -944,16 +944,32 @@ class ResultResponse(BaseModel): class JobsCreate(BaseModel): - id: str - name: str + id: int + sample_id: int + run_id: int + sample_name: str status: str - type: str - start_time: datetime - end_time: datetime - description: Optional[str] - parameters: str - datacollectionparameters: DataCollectionParameters - beamlineparameters: BeamlineParameters + created_at: datetime + updated_at: datetime + experiment_parameters: BeamlineParameters class Config: from_attributes = True + + +class JobsResponse(BaseModel): + job_id: int + sample_id: int + run_id: int + sample_name: str + status: str + type: str + created_at: datetime + updated_at: Optional[datetime] + data_collection_parameters: Optional[DataCollectionParameters] = None + experiment_parameters: BeamlineParameters + + +class JobsUpdate(BaseModel): + job_id: int + status: str diff --git a/backend/main.py b/backend/main.py index 7c80506..e38944c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -128,8 +128,8 @@ async def lifespan(app: FastAPI): db = SessionLocal() try: if environment == "prod": - 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 inspector = reflection.Inspector.from_engine(engine) diff --git a/backend/propipe_sim.ipynb b/backend/propipe_sim.ipynb index 114fbd8..6e95bd7 100644 --- a/backend/propipe_sim.ipynb +++ b/backend/propipe_sim.ipynb @@ -9,7 +9,7 @@ "is_executing": true }, "ExecuteTime": { - "start_time": "2025-04-29T07:44:02.103530Z" + "start_time": "2025-04-29T12:21:15.813326Z" } }, "source": [ @@ -18,13 +18,24 @@ "import json\n", "\n", "SSE_URL = \"https://127.0.0.1:8000/processing/jobs/stream\"\n", + "UPDATE_URL = \"https://127.0.0.1:8000/processing/jobs/update_status\"\n", "\n", + "def submit_job_update(job_id, status):\n", + " payload = {\n", + " \"job_id\": job_id,\n", + " \"status\": status\n", + " }\n", + " try:\n", + " response = requests.post(UPDATE_URL, json=payload, verify=False)\n", + " if response.status_code == 200:\n", + " print(f\"✅ Job {job_id} status updated to '{status}'. Response: {response.json()}\")\n", + " else:\n", + " print(f\"❌ Failed to update job {job_id}. Status: {response.status_code}. Response: {response.text}\")\n", + " except Exception as e:\n", + " print(f\"Failed to submit update for Job {job_id}: {e}\")\n", "\n", - "#SSE_URL = \"https://mx-aare-test.psi.ch:1492/processing/jobs/stream\"\n", - "\n", - "\n", - "def listen_and_process_jobs(url):\n", - " print(\"Starting processing pipeline...\")\n", + "def listen_and_update_jobs(url):\n", + " print(\"Starting job status updater...\")\n", " with requests.get(url, stream=True, verify=False) as response:\n", " if response.status_code != 200:\n", " print(f\"Failed to connect with status code: {response.status_code}\")\n", @@ -37,69 +48,25 @@ " jobs = json.loads(event.data)\n", " print(f\"Jobs received: {jobs}\")\n", "\n", - " for job in jobs:\n", - " job_id = job.get(\"id\")\n", - " parameters = job.get(\"parameters\")\n", - " if parameters is None:\n", - " print(\n", - " f\"⚠️ Job {job_id if job_id is not None else '[unknown id]'} has no 'parameters'; skipping.\")\n", - " continue\n", - "\n", - " print(f\"Processing job ID: {job_id} with parameters: {parameters}\")\n", - "\n", - " # Your custom job-processing logic goes here\n", - " process_job_logic(job_id, parameters)\n", - "\n", - " # After job processing completes, send results & update job status\n", - " submit_job_result(job_id, processing_result={'success': True})\n", + " #for job in jobs:\n", + " # job_id = job.get(\"job_id\")\n", + " # print(f\"Job ID: {job_id}, Current status: {job.get('status')}\")\n", + " # # Immediately update status to \"submitted\"\n", + " # submit_job_update(job_id, \"submitted\")\n", " except json.JSONDecodeError as e:\n", " print(f\"Error decoding event data: {e}\")\n", " except Exception as e:\n", " print(f\"Unexpected error while processing event: {e}\")\n", "\n", - "\n", - "def process_job_logic(job_id, parameters):\n", - " print(f\"📦 {job_id} - Processing detailed logic here: {parameters}\")\n", - " import time\n", - " time.sleep(5)\n", - " print(f\"✅ Job {job_id} processing complete\")\n", - "\n", - "\n", - "def submit_job_result(job_id, processing_result):\n", - " import backend.aareDBclient as aareDBclient\n", - " from aareDBclient.models import ResultCreate\n", - "\n", - " configuration = aareDBclient.Configuration(\n", - " host=\"https://127.0.0.1:8000\",\n", - " verify_ssl=False\n", - " )\n", - "\n", - " with aareDBclient.ApiClient(configuration) as api_client:\n", - " api_instance = aareDBclient.ProcessingApi(api_client)\n", - "\n", - " result = ResultCreate(\n", - " job_id=job_id,\n", - " result=processing_result\n", - " )\n", - " try:\n", - " res = api_instance.submit_processing_result(result_create=result)\n", - " print(f\"Job {job_id} result submitted successfully! Backend Response: {res}\")\n", - " except aareDBclient.rest.ApiException as e:\n", - " print(f\"Failed to submit result for Job {job_id}: {e}\")\n", - "\n", - "\n", "if __name__ == \"__main__\":\n", - " listen_and_process_jobs(SSE_URL)" + " listen_and_update_jobs(SSE_URL)\n" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Starting processing pipeline...\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n" + "Starting job status updater...\n" ] }, { @@ -109,39 +76,6 @@ "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1103: 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" ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n", - "Jobs received: [{'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:40:46.419291', 'id': 1, 'experiment_parameters_id': 1}, {'status': 'todo', 'updated_at': None, 'created_at': '2025-04-29T07:41:44.451862', 'id': 2, 'experiment_parameters_id': 2}]\n", - "⚠️ Job 1 has no 'parameters'; skipping.\n", - "⚠️ Job 2 has no 'parameters'; skipping.\n" - ] } ], "execution_count": null diff --git a/testfunctions.ipynb b/testfunctions.ipynb index f1696c7..b0d4a74 100644 --- a/testfunctions.ipynb +++ b/testfunctions.ipynb @@ -3,8 +3,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-04-29T07:40:06.661672Z", - "start_time": "2025-04-29T07:40:05.953900Z" + "end_time": "2025-04-29T11:59:40.825956Z", + "start_time": "2025-04-29T11:59:40.822492Z" } }, "cell_type": "code", @@ -48,7 +48,7 @@ ] } ], - "execution_count": 2 + "execution_count": 31 }, { "metadata": {}, @@ -427,21 +427,21 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-04-29T07:40:05.945177Z", - "start_time": "2025-04-29T07:40:05.942144Z" + "end_time": "2025-04-29T12:00:18.905592Z", + "start_time": "2025-04-29T12:00:18.903773Z" } }, "cell_type": "code", - "source": "sample_id = 243", + "source": "sample_id = 250", "id": "54d4d46ca558e7b9", "outputs": [], - "execution_count": 1 + "execution_count": 32 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-04-29T07:40:22.013545Z", - "start_time": "2025-04-29T07:40:21.981147Z" + "end_time": "2025-04-29T12:00:20.537319Z", + "start_time": "2025-04-29T12:00:20.510157Z" } }, "cell_type": "code", @@ -493,7 +493,7 @@ "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): localhost:8000\n", "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1103: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. 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://localhost:8000 \"POST /samples/samples/243/events HTTP/1.1\" 200 413\n" + "DEBUG:urllib3.connectionpool:https://localhost:8000 \"POST /samples/samples/250/events HTTP/1.1\" 200 412\n" ] }, { @@ -503,9 +503,9 @@ "Payload being sent to API:\n", "{\"event_type\":\"Collecting\"}\n", "API response:\n", - "('id', 243)\n", - "('sample_name', 'Sample243')\n", - "('position', 10)\n", + "('id', 250)\n", + "('sample_name', 'Sample250')\n", + "('position', 9)\n", "('puck_id', 30)\n", "('crystalname', None)\n", "('proteinname', None)\n", @@ -513,13 +513,13 @@ "('priority', None)\n", "('comments', None)\n", "('data_collection_parameters', None)\n", - "('events', [SampleEventResponse(event_type='Mounting', id=478, sample_id=243, timestamp=datetime.datetime(2025, 4, 28, 13, 35)), SampleEventResponse(event_type='Collecting', id=479, sample_id=243, timestamp=datetime.datetime(2025, 4, 29, 7, 40, 22, 3703))])\n", + "('events', [SampleEventResponse(event_type='Mounting', id=490, sample_id=250, timestamp=datetime.datetime(2025, 4, 28, 13, 42)), SampleEventResponse(event_type='Collecting', id=491, sample_id=250, timestamp=datetime.datetime(2025, 4, 29, 12, 0, 20, 528955))])\n", "('mount_count', 0)\n", "('unmount_count', 0)\n" ] } ], - "execution_count": 3 + "execution_count": 33 }, { "metadata": {}, @@ -546,8 +546,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-04-29T07:40:39.462571Z", - "start_time": "2025-04-29T07:40:39.385378Z" + "end_time": "2025-04-29T12:21:22.613961Z", + "start_time": "2025-04-29T12:21:22.585856Z" } }, "cell_type": "code", @@ -618,7 +618,7 @@ "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:1103: 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/243/upload-images HTTP/1.1\" 200 205\n" + "DEBUG:urllib3.connectionpool:https://127.0.0.1:8000 \"POST /samples/250/upload-images HTTP/1.1\" 200 204\n" ] }, { @@ -628,11 +628,11 @@ "Uploading after_dc.jpeg.jpg...\n", "API Response for after_dc.jpeg.jpg:\n", "200\n", - "{'pgroup': 'p20003', 'sample_id': 243, 'sample_event_id': 479, 'filepath': 'images/p20003/2025-04-29/Dewar Five/PKK007/10/Collecting_2025-04-29_07-40-22/after_dc.jpeg.jpg', 'status': 'active', 'comment': None, 'id': 1}\n" + "{'pgroup': 'p20003', 'sample_id': 250, 'sample_event_id': 492, 'filepath': 'images/p20003/2025-04-29/Dewar Five/PKK007/9/Collecting_2025-04-29_12-00-30/after_dc.jpeg.jpg', 'status': 'active', 'comment': None, 'id': 2}\n" ] } ], - "execution_count": 4 + "execution_count": 36 }, { "metadata": {}, @@ -645,8 +645,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-04-29T07:44:50.945943Z", - "start_time": "2025-04-29T07:44:50.920743Z" + "end_time": "2025-04-29T12:21:30.879657Z", + "start_time": "2025-04-29T12:21:30.855622Z" } }, "cell_type": "code", @@ -761,7 +761,7 @@ "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): localhost:8000\n", "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1103: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. 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://localhost:8000 \"POST /samples/samples/243/experiment_parameters HTTP/1.1\" 200 860\n" + "DEBUG:urllib3.connectionpool:https://localhost:8000 \"POST /samples/samples/250/experiment_parameters HTTP/1.1\" 200 860\n" ] }, { @@ -769,17 +769,17 @@ "output_type": "stream", "text": [ "API Response:\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=243 id=3\n" + "run_number=2 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=250 id=2\n" ] } ], - "execution_count": 7 + "execution_count": 37 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-03-17T22:16:50.829755Z", - "start_time": "2025-03-17T22:16:50.791016Z" + "end_time": "2025-04-29T08:37:38.265277Z", + "start_time": "2025-04-29T08:37:38.237143Z" } }, "cell_type": "code", @@ -795,7 +795,7 @@ "\n", "# Your actual sample and experiment IDs\n", "sample_id = sample_id # Replace with valid IDs\n", - "run_id = 1 # Replace with valid run_id\n", + "run_id = 3 # Replace with valid run_id\n", "\n", "# Function to generate list of CurvePoint (resolution, value pairs)\n", "def logarithmic_decay_curve(length, min_res=4.0, max_res=1.0, max_value=1.0, min_value=0.0, noise=0.005, decimals=3):\n", @@ -865,10 +865,10 @@ "name": "stderr", "output_type": "stream", "text": [ - "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): 127.0.0.1:8000\n", - "/Users/gotthardg/PycharmProjects/aaredb/.venv/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", + "DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): localhost:8000\n", + "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/urllib3/connectionpool.py:1103: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. 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/processing-results HTTP/1.1\" 200 7218\n" + "DEBUG:urllib3.connectionpool:https://localhost:8000 \"POST /samples/processing-results HTTP/1.1\" 200 7199\n" ] }, { @@ -876,11 +876,11 @@ "output_type": "stream", "text": [ "API call successful:\n", - "ResultResponse(id=36, sample_id=247, run_id=1, result=Results(pipeline='autoproc', resolution=1.81, unit_cell='56.82, 75.31, 82.06, 91.76, 79.97, 79.75', spacegroup='P1', rmerge=0.097, rmeas=0.122, isig=13.86, cc=[CurvePoint(resolution=3.979, value=1.0), CurvePoint(resolution=3.964, value=0.997), CurvePoint(resolution=3.879, value=1.0), CurvePoint(resolution=3.814, value=0.999), CurvePoint(resolution=3.787, value=0.997), CurvePoint(resolution=3.767, value=1.0), CurvePoint(resolution=3.706, value=0.998), CurvePoint(resolution=3.68, value=1.0), CurvePoint(resolution=3.678, value=0.998), CurvePoint(resolution=3.677, value=0.998), CurvePoint(resolution=3.627, value=1.0), CurvePoint(resolution=3.619, value=1.0), CurvePoint(resolution=3.614, value=1.0), CurvePoint(resolution=3.598, value=0.998), CurvePoint(resolution=3.568, value=1.0), CurvePoint(resolution=3.477, value=0.999), CurvePoint(resolution=3.46, value=1.0), CurvePoint(resolution=3.44, value=1.0), CurvePoint(resolution=3.414, value=0.999), CurvePoint(resolution=3.341, value=0.997), CurvePoint(resolution=3.315, value=0.998), CurvePoint(resolution=3.258, value=0.995), CurvePoint(resolution=3.204, value=0.997), CurvePoint(resolution=3.182, value=0.996), CurvePoint(resolution=3.168, value=0.997), CurvePoint(resolution=3.07, value=0.997), CurvePoint(resolution=3.044, value=1.0), CurvePoint(resolution=3.037, value=0.999), CurvePoint(resolution=3.037, value=0.997), CurvePoint(resolution=3.024, value=0.996), CurvePoint(resolution=3.014, value=0.996), CurvePoint(resolution=3.009, value=0.998), CurvePoint(resolution=2.882, value=0.998), CurvePoint(resolution=2.798, value=0.997), CurvePoint(resolution=2.728, value=1.0), CurvePoint(resolution=2.722, value=0.998), CurvePoint(resolution=2.713, value=0.996), CurvePoint(resolution=2.712, value=1.0), CurvePoint(resolution=2.703, value=1.0), CurvePoint(resolution=2.587, value=0.998), CurvePoint(resolution=2.586, value=0.996), CurvePoint(resolution=2.57, value=0.996), CurvePoint(resolution=2.553, value=1.0), CurvePoint(resolution=2.539, value=0.999), CurvePoint(resolution=2.493, value=0.997), CurvePoint(resolution=2.483, value=0.998), CurvePoint(resolution=2.454, value=0.997), CurvePoint(resolution=2.435, value=1.0), CurvePoint(resolution=2.431, value=0.998), CurvePoint(resolution=2.418, value=1.0), CurvePoint(resolution=2.396, value=0.995), CurvePoint(resolution=2.36, value=1.0), CurvePoint(resolution=2.332, value=0.996), CurvePoint(resolution=2.323, value=0.998), CurvePoint(resolution=2.299, value=0.998), CurvePoint(resolution=2.294, value=1.0), CurvePoint(resolution=2.271, value=0.999), CurvePoint(resolution=2.267, value=1.0), CurvePoint(resolution=2.234, value=0.998), CurvePoint(resolution=2.216, value=1.0), CurvePoint(resolution=2.108, value=1.0), CurvePoint(resolution=2.028, value=0.994), CurvePoint(resolution=2.012, value=0.996), CurvePoint(resolution=2.007, value=0.996), CurvePoint(resolution=1.964, value=0.996), CurvePoint(resolution=1.92, value=1.0), CurvePoint(resolution=1.883, value=0.995), CurvePoint(resolution=1.824, value=0.996), CurvePoint(resolution=1.818, value=0.993), CurvePoint(resolution=1.817, value=0.993), CurvePoint(resolution=1.812, value=0.991), CurvePoint(resolution=1.769, value=0.99), CurvePoint(resolution=1.743, value=0.988), CurvePoint(resolution=1.732, value=0.992), CurvePoint(resolution=1.729, value=0.995), CurvePoint(resolution=1.689, value=0.993), CurvePoint(resolution=1.658, value=0.988), CurvePoint(resolution=1.654, value=0.984), CurvePoint(resolution=1.634, value=0.987), CurvePoint(resolution=1.608, value=0.984), CurvePoint(resolution=1.586, value=0.975), CurvePoint(resolution=1.559, value=0.974), CurvePoint(resolution=1.512, value=0.971), CurvePoint(resolution=1.485, value=0.965), CurvePoint(resolution=1.482, value=0.964), CurvePoint(resolution=1.479, value=0.963), CurvePoint(resolution=1.477, value=0.962), CurvePoint(resolution=1.434, value=0.948), CurvePoint(resolution=1.43, value=0.942), CurvePoint(resolution=1.401, value=0.931), CurvePoint(resolution=1.373, value=0.922), CurvePoint(resolution=1.333, value=0.889), CurvePoint(resolution=1.305, value=0.873), CurvePoint(resolution=1.253, value=0.814), CurvePoint(resolution=1.252, value=0.81), CurvePoint(resolution=1.216, value=0.765), CurvePoint(resolution=1.041, value=0.235), CurvePoint(resolution=1.04, value=0.23), CurvePoint(resolution=1.033, value=0.197), CurvePoint(resolution=1.015, value=0.096)], cchalf=[CurvePoint(resolution=3.985, value=1.0), CurvePoint(resolution=3.984, value=1.0), CurvePoint(resolution=3.974, value=1.0), CurvePoint(resolution=3.934, value=1.0), CurvePoint(resolution=3.895, value=0.998), CurvePoint(resolution=3.884, value=0.998), CurvePoint(resolution=3.833, value=0.996), CurvePoint(resolution=3.817, value=0.997), CurvePoint(resolution=3.794, value=0.995), CurvePoint(resolution=3.783, value=1.0), CurvePoint(resolution=3.782, value=1.0), CurvePoint(resolution=3.728, value=0.996), CurvePoint(resolution=3.728, value=0.999), CurvePoint(resolution=3.685, value=0.999), CurvePoint(resolution=3.637, value=1.0), CurvePoint(resolution=3.607, value=0.999), CurvePoint(resolution=3.606, value=1.0), CurvePoint(resolution=3.599, value=1.0), CurvePoint(resolution=3.549, value=0.995), CurvePoint(resolution=3.543, value=1.0), CurvePoint(resolution=3.464, value=1.0), CurvePoint(resolution=3.34, value=0.998), CurvePoint(resolution=3.295, value=1.0), CurvePoint(resolution=3.257, value=0.999), CurvePoint(resolution=3.254, value=1.0), CurvePoint(resolution=3.251, value=1.0), CurvePoint(resolution=3.251, value=1.0), CurvePoint(resolution=3.228, value=1.0), CurvePoint(resolution=3.227, value=1.0), CurvePoint(resolution=3.226, value=1.0), CurvePoint(resolution=3.184, value=0.995), CurvePoint(resolution=3.173, value=0.997), CurvePoint(resolution=3.08, value=1.0), CurvePoint(resolution=3.062, value=1.0), CurvePoint(resolution=3.04, value=1.0), CurvePoint(resolution=3.013, value=1.0), CurvePoint(resolution=2.965, value=1.0), CurvePoint(resolution=2.913, value=0.998), CurvePoint(resolution=2.876, value=1.0), CurvePoint(resolution=2.866, value=0.998), CurvePoint(resolution=2.849, value=1.0), CurvePoint(resolution=2.839, value=0.998), CurvePoint(resolution=2.816, value=1.0), CurvePoint(resolution=2.773, value=1.0), CurvePoint(resolution=2.747, value=0.995), CurvePoint(resolution=2.737, value=1.0), CurvePoint(resolution=2.733, value=0.998), CurvePoint(resolution=2.723, value=1.0), CurvePoint(resolution=2.713, value=1.0), CurvePoint(resolution=2.626, value=0.997), CurvePoint(resolution=2.583, value=0.996), CurvePoint(resolution=2.501, value=1.0), CurvePoint(resolution=2.493, value=1.0), CurvePoint(resolution=2.411, value=0.998), CurvePoint(resolution=2.31, value=1.0), CurvePoint(resolution=2.287, value=0.997), CurvePoint(resolution=2.246, value=0.995), CurvePoint(resolution=2.233, value=1.0), CurvePoint(resolution=2.191, value=0.998), CurvePoint(resolution=2.167, value=0.995), CurvePoint(resolution=2.149, value=0.996), CurvePoint(resolution=2.127, value=1.0), CurvePoint(resolution=2.114, value=1.0), CurvePoint(resolution=2.046, value=1.0), CurvePoint(resolution=2.004, value=0.996), CurvePoint(resolution=1.987, value=0.995), CurvePoint(resolution=1.908, value=0.993), CurvePoint(resolution=1.899, value=1.0), CurvePoint(resolution=1.856, value=0.995), CurvePoint(resolution=1.822, value=0.993), CurvePoint(resolution=1.812, value=0.997), CurvePoint(resolution=1.802, value=0.992), CurvePoint(resolution=1.796, value=0.995), CurvePoint(resolution=1.773, value=0.996), CurvePoint(resolution=1.767, value=0.991), CurvePoint(resolution=1.76, value=0.989), CurvePoint(resolution=1.742, value=0.991), CurvePoint(resolution=1.725, value=0.996), CurvePoint(resolution=1.723, value=0.995), CurvePoint(resolution=1.718, value=0.987), CurvePoint(resolution=1.687, value=0.989), CurvePoint(resolution=1.639, value=0.984), CurvePoint(resolution=1.598, value=0.982), CurvePoint(resolution=1.592, value=0.985), CurvePoint(resolution=1.494, value=0.963), CurvePoint(resolution=1.475, value=0.961), CurvePoint(resolution=1.449, value=0.954), CurvePoint(resolution=1.427, value=0.946), CurvePoint(resolution=1.402, value=0.929), CurvePoint(resolution=1.377, value=0.918), CurvePoint(resolution=1.324, value=0.889), CurvePoint(resolution=1.296, value=0.859), CurvePoint(resolution=1.253, value=0.814), CurvePoint(resolution=1.227, value=0.784), CurvePoint(resolution=1.225, value=0.773), CurvePoint(resolution=1.146, value=0.619), CurvePoint(resolution=1.118, value=0.547), CurvePoint(resolution=1.03, value=0.179), CurvePoint(resolution=1.013, value=0.087), CurvePoint(resolution=1.011, value=0.07)], completeness=86.92, multiplicity=5.46, nobs=48062, total_refl=73724, unique_refl=93185, comments='Random auto-generated test entry'))\n" + "ResultResponse(id=1, sample_id=243, run_id=3, result=Results(pipeline='autoproc', resolution=1.47, unit_cell='93.58, 89.37, 32.51, 60.74, 112.89, 91.46', spacegroup='C2', rmerge=0.097, rmeas=0.093, isig=6.21, cc=[CurvePoint(resolution=3.983, value=1.0), CurvePoint(resolution=3.965, value=1.0), CurvePoint(resolution=3.939, value=0.995), CurvePoint(resolution=3.907, value=0.998), CurvePoint(resolution=3.813, value=0.996), CurvePoint(resolution=3.756, value=0.997), CurvePoint(resolution=3.737, value=1.0), CurvePoint(resolution=3.708, value=1.0), CurvePoint(resolution=3.706, value=1.0), CurvePoint(resolution=3.701, value=0.996), CurvePoint(resolution=3.674, value=0.999), CurvePoint(resolution=3.65, value=0.997), CurvePoint(resolution=3.6, value=0.998), CurvePoint(resolution=3.563, value=0.997), CurvePoint(resolution=3.519, value=0.997), CurvePoint(resolution=3.386, value=0.999), CurvePoint(resolution=3.377, value=0.997), CurvePoint(resolution=3.375, value=1.0), CurvePoint(resolution=3.253, value=0.995), CurvePoint(resolution=3.221, value=0.996), CurvePoint(resolution=3.194, value=0.999), CurvePoint(resolution=3.182, value=0.999), CurvePoint(resolution=3.149, value=0.998), CurvePoint(resolution=3.128, value=0.998), CurvePoint(resolution=3.115, value=0.998), CurvePoint(resolution=3.101, value=0.999), CurvePoint(resolution=3.072, value=0.997), CurvePoint(resolution=3.018, value=0.999), CurvePoint(resolution=3.013, value=1.0), CurvePoint(resolution=2.96, value=1.0), CurvePoint(resolution=2.935, value=1.0), CurvePoint(resolution=2.882, value=1.0), CurvePoint(resolution=2.866, value=1.0), CurvePoint(resolution=2.855, value=1.0), CurvePoint(resolution=2.695, value=1.0), CurvePoint(resolution=2.689, value=1.0), CurvePoint(resolution=2.628, value=1.0), CurvePoint(resolution=2.62, value=0.997), CurvePoint(resolution=2.595, value=0.997), CurvePoint(resolution=2.563, value=0.996), CurvePoint(resolution=2.562, value=1.0), CurvePoint(resolution=2.559, value=1.0), CurvePoint(resolution=2.542, value=1.0), CurvePoint(resolution=2.518, value=0.998), CurvePoint(resolution=2.477, value=1.0), CurvePoint(resolution=2.395, value=1.0), CurvePoint(resolution=2.388, value=0.997), CurvePoint(resolution=2.388, value=0.996), CurvePoint(resolution=2.37, value=0.999), CurvePoint(resolution=2.361, value=0.995), CurvePoint(resolution=2.359, value=0.995), CurvePoint(resolution=2.356, value=0.998), CurvePoint(resolution=2.33, value=1.0), CurvePoint(resolution=2.25, value=0.996), CurvePoint(resolution=2.246, value=0.998), CurvePoint(resolution=2.242, value=1.0), CurvePoint(resolution=2.2, value=0.995), CurvePoint(resolution=2.18, value=1.0), CurvePoint(resolution=2.165, value=1.0), CurvePoint(resolution=2.154, value=1.0), CurvePoint(resolution=2.146, value=1.0), CurvePoint(resolution=2.036, value=1.0), CurvePoint(resolution=1.995, value=1.0), CurvePoint(resolution=1.958, value=0.996), CurvePoint(resolution=1.915, value=1.0), CurvePoint(resolution=1.912, value=0.996), CurvePoint(resolution=1.866, value=0.996), CurvePoint(resolution=1.779, value=0.99), CurvePoint(resolution=1.751, value=0.994), CurvePoint(resolution=1.75, value=0.989), CurvePoint(resolution=1.739, value=0.994), CurvePoint(resolution=1.69, value=0.993), CurvePoint(resolution=1.665, value=0.985), CurvePoint(resolution=1.662, value=0.987), CurvePoint(resolution=1.613, value=0.979), CurvePoint(resolution=1.609, value=0.981), CurvePoint(resolution=1.545, value=0.97), CurvePoint(resolution=1.49, value=0.963), CurvePoint(resolution=1.476, value=0.956), CurvePoint(resolution=1.468, value=0.956), CurvePoint(resolution=1.447, value=0.947), CurvePoint(resolution=1.422, value=0.944), CurvePoint(resolution=1.413, value=0.94), CurvePoint(resolution=1.403, value=0.927), CurvePoint(resolution=1.403, value=0.934), CurvePoint(resolution=1.368, value=0.915), CurvePoint(resolution=1.35, value=0.906), CurvePoint(resolution=1.229, value=0.784), CurvePoint(resolution=1.212, value=0.757), CurvePoint(resolution=1.206, value=0.749), CurvePoint(resolution=1.192, value=0.719), CurvePoint(resolution=1.144, value=0.613), CurvePoint(resolution=1.144, value=0.616), CurvePoint(resolution=1.138, value=0.605), CurvePoint(resolution=1.124, value=0.56), CurvePoint(resolution=1.104, value=0.504), CurvePoint(resolution=1.082, value=0.424), CurvePoint(resolution=1.079, value=0.407), CurvePoint(resolution=1.026, value=0.162), CurvePoint(resolution=1.0, value=0.005)], cchalf=[CurvePoint(resolution=3.988, value=0.997), CurvePoint(resolution=3.959, value=1.0), CurvePoint(resolution=3.886, value=1.0), CurvePoint(resolution=3.828, value=1.0), CurvePoint(resolution=3.814, value=0.996), CurvePoint(resolution=3.756, value=0.997), CurvePoint(resolution=3.721, value=1.0), CurvePoint(resolution=3.696, value=0.996), CurvePoint(resolution=3.67, value=0.996), CurvePoint(resolution=3.631, value=0.997), CurvePoint(resolution=3.607, value=0.998), CurvePoint(resolution=3.556, value=1.0), CurvePoint(resolution=3.549, value=0.995), CurvePoint(resolution=3.539, value=1.0), CurvePoint(resolution=3.538, value=1.0), CurvePoint(resolution=3.517, value=1.0), CurvePoint(resolution=3.514, value=1.0), CurvePoint(resolution=3.463, value=1.0), CurvePoint(resolution=3.434, value=0.999), CurvePoint(resolution=3.433, value=1.0), CurvePoint(resolution=3.419, value=1.0), CurvePoint(resolution=3.409, value=0.999), CurvePoint(resolution=3.389, value=0.997), CurvePoint(resolution=3.384, value=0.995), CurvePoint(resolution=3.355, value=0.996), CurvePoint(resolution=3.273, value=0.998), CurvePoint(resolution=3.239, value=1.0), CurvePoint(resolution=3.235, value=1.0), CurvePoint(resolution=3.23, value=0.996), CurvePoint(resolution=3.229, value=0.998), CurvePoint(resolution=3.222, value=1.0), CurvePoint(resolution=3.208, value=1.0), CurvePoint(resolution=3.133, value=0.998), CurvePoint(resolution=3.107, value=1.0), CurvePoint(resolution=3.106, value=0.996), CurvePoint(resolution=3.072, value=1.0), CurvePoint(resolution=3.005, value=0.997), CurvePoint(resolution=2.974, value=0.999), CurvePoint(resolution=2.947, value=1.0), CurvePoint(resolution=2.901, value=0.996), CurvePoint(resolution=2.874, value=0.998), CurvePoint(resolution=2.849, value=0.997), CurvePoint(resolution=2.842, value=0.996), CurvePoint(resolution=2.812, value=1.0), CurvePoint(resolution=2.79, value=1.0), CurvePoint(resolution=2.741, value=0.995), CurvePoint(resolution=2.719, value=1.0), CurvePoint(resolution=2.704, value=1.0), CurvePoint(resolution=2.695, value=0.997), CurvePoint(resolution=2.625, value=1.0), CurvePoint(resolution=2.624, value=1.0), CurvePoint(resolution=2.519, value=1.0), CurvePoint(resolution=2.518, value=1.0), CurvePoint(resolution=2.493, value=0.996), CurvePoint(resolution=2.457, value=0.997), CurvePoint(resolution=2.436, value=0.997), CurvePoint(resolution=2.427, value=1.0), CurvePoint(resolution=2.419, value=0.995), CurvePoint(resolution=2.348, value=0.996), CurvePoint(resolution=2.293, value=1.0), CurvePoint(resolution=2.29, value=0.999), CurvePoint(resolution=2.226, value=1.0), CurvePoint(resolution=2.137, value=0.995), CurvePoint(resolution=2.114, value=0.998), CurvePoint(resolution=2.064, value=1.0), CurvePoint(resolution=2.052, value=1.0), CurvePoint(resolution=2.05, value=1.0), CurvePoint(resolution=2.04, value=1.0), CurvePoint(resolution=2.031, value=1.0), CurvePoint(resolution=1.995, value=0.996), CurvePoint(resolution=1.986, value=1.0), CurvePoint(resolution=1.97, value=0.998), CurvePoint(resolution=1.966, value=1.0), CurvePoint(resolution=1.929, value=0.996), CurvePoint(resolution=1.854, value=0.995), CurvePoint(resolution=1.845, value=0.996), CurvePoint(resolution=1.823, value=0.995), CurvePoint(resolution=1.744, value=0.995), CurvePoint(resolution=1.732, value=0.989), CurvePoint(resolution=1.722, value=0.989), CurvePoint(resolution=1.711, value=0.994), CurvePoint(resolution=1.707, value=0.992), CurvePoint(resolution=1.555, value=0.98), CurvePoint(resolution=1.505, value=0.963), CurvePoint(resolution=1.459, value=0.958), CurvePoint(resolution=1.426, value=0.938), CurvePoint(resolution=1.419, value=0.943), CurvePoint(resolution=1.406, value=0.935), CurvePoint(resolution=1.396, value=0.929), CurvePoint(resolution=1.378, value=0.918), CurvePoint(resolution=1.308, value=0.874), CurvePoint(resolution=1.252, value=0.815), CurvePoint(resolution=1.212, value=0.756), CurvePoint(resolution=1.192, value=0.719), CurvePoint(resolution=1.189, value=0.719), CurvePoint(resolution=1.144, value=0.616), CurvePoint(resolution=1.143, value=0.617), CurvePoint(resolution=1.111, value=0.521), CurvePoint(resolution=1.095, value=0.471), CurvePoint(resolution=1.023, value=0.139)], completeness=94.67, multiplicity=8.01, nobs=263890, total_refl=142999, unique_refl=47873, comments='Random auto-generated test entry'))\n" ] } ], - "execution_count": 36 + "execution_count": 8 }, { "metadata": {