11from __future__ import annotations
22
3- import asyncio
4- import datetime
53import logging
64import os
75from functools import lru_cache
108
119from fastapi import APIRouter , Depends , Request
1210from fastapi .responses import FileResponse , HTMLResponse
13- from ispyb .sqlalchemy import AutoProcProgram as ISPyBAutoProcProgram
14- from ispyb .sqlalchemy import (
15- BLSample ,
16- BLSampleGroup ,
17- BLSampleImage ,
18- BLSession ,
19- BLSubSample ,
20- Proposal ,
21- )
11+ from ispyb .sqlalchemy import BLSample , BLSampleGroup , BLSampleImage , BLSubSample
2212from PIL import Image
2313from prometheus_client import Counter , Gauge
2414from pydantic import BaseModel
25- from sqlalchemy import func
26- from sqlalchemy .exc import OperationalError
2715from sqlmodel import select
2816from werkzeug .utils import secure_filename
2917
4331from murfey .util import safe_run
4432from murfey .util .config import MachineConfig , from_file , settings
4533from murfey .util .db import (
46- AutoProcProgram ,
4734 ClientEnvironment ,
4835 DataCollection ,
4936 DataCollectionGroup ,
5037 FoilHole ,
5138 GridSquare ,
5239 MagnificationLookup ,
53- Movie ,
5440 ProcessingJob ,
5541 RsyncInstance ,
5642 Session ,
5743 SPAFeedbackParameters ,
5844 SPARelionParameters ,
59- Tilt ,
60- TiltSeries ,
6145)
6246from murfey .util .models import (
6347 BLSampleImageParameters ,
7357 RsyncerInfo ,
7458 RsyncerSource ,
7559 Sample ,
76- SessionInfo ,
77- TiltInfo ,
7860)
7961from murfey .workflows .spa .flush_spa_preprocess import (
8062 register_foil_hole ,
@@ -156,47 +138,6 @@ def remove_mag_table_row(mag: int, db=murfey_db):
156138 db .commit ()
157139
158140
159- @router .get ("/instruments/{instrument_name}/instrument_name" )
160- def get_instrument_display_name (instrument_name : str ) -> str :
161- machine_config = get_machine_config (instrument_name = instrument_name )[
162- instrument_name
163- ]
164- if machine_config :
165- return machine_config .display_name
166- return ""
167-
168-
169- @router .get ("/instruments/{instrument_name}/visits/" )
170- def all_visit_info (instrument_name : str , request : Request , db = murfey .server .ispyb .DB ):
171- visits = murfey .server .ispyb .get_all_ongoing_visits (instrument_name , db )
172-
173- if visits :
174- return_query = [
175- {
176- "Start date" : visit .start ,
177- "End date" : visit .end ,
178- "Visit name" : visit .name ,
179- "Time remaining" : str (visit .end - datetime .datetime .now ()),
180- }
181- for visit in visits
182- ] # "Proposal title": visit.proposal_title
183- log .debug (
184- f"{ len (visits )} visits active for { sanitise (instrument_name )= } : { ', ' .join (v .name for v in visits )} "
185- )
186- return templates .TemplateResponse (
187- request = request ,
188- name = "activevisits.html" ,
189- context = {"info" : return_query , "microscope" : instrument_name },
190- )
191- else :
192- log .debug (f"No visits identified for { sanitise (instrument_name )= } " )
193- return templates .TemplateResponse (
194- request = request ,
195- name = "activevisits.html" ,
196- context = {"info" : [], "microscope" : instrument_name },
197- )
198-
199-
200141@router .post ("/visits/{visit_name}" )
201142def register_client_to_visit (visit_name : str , client_info : ClientInfo , db = murfey_db ):
202143 client_env = db .exec (
@@ -215,14 +156,6 @@ def register_client_to_visit(visit_name: str, client_info: ClientInfo, db=murfey
215156 return client_info
216157
217158
218- @router .get ("/num_movies" )
219- def count_number_of_movies (db = murfey_db ) -> Dict [str , int ]:
220- res = db .exec (
221- select (Movie .tag , func .count (Movie .murfey_id )).group_by (Movie .tag )
222- ).all ()
223- return {r [0 ]: r [1 ] for r in res }
224-
225-
226159@router .post ("/sessions/{session_id}/rsyncer" )
227160def register_rsyncer (session_id : int , rsyncer_info : RsyncerInfo , db = murfey_db ):
228161 visit_name = db .exec (select (Session ).where (Session .id == session_id )).one ().visit
@@ -457,38 +390,6 @@ def post_foil_hole(
457390 return register_foil_hole (session_id , gs_name , foil_hole_params , db )
458391
459392
460- @router .post ("/visits/{visit_name}/{session_id}/tilt" )
461- async def register_tilt (
462- visit_name : str , session_id : MurfeySessionID , tilt_info : TiltInfo , db = murfey_db
463- ):
464- def _add_tilt ():
465- tilt_series_id = (
466- db .exec (
467- select (TiltSeries )
468- .where (TiltSeries .tag == tilt_info .tilt_series_tag )
469- .where (TiltSeries .session_id == session_id )
470- .where (TiltSeries .rsync_source == tilt_info .source )
471- )
472- .one ()
473- .id
474- )
475- if db .exec (
476- select (Tilt )
477- .where (Tilt .movie_path == tilt_info .movie_path )
478- .where (Tilt .tilt_series_id == tilt_series_id )
479- ).all ():
480- return
481- tilt = Tilt (movie_path = tilt_info .movie_path , tilt_series_id = tilt_series_id )
482- db .add (tilt )
483- db .commit ()
484-
485- try :
486- _add_tilt ()
487- except OperationalError :
488- await asyncio .sleep (30 )
489- _add_tilt ()
490-
491-
492393@router .get ("/visit/{visit_name}/samples" )
493394def get_samples (visit_name : str , db = murfey .server .ispyb .DB ) -> List [Sample ]:
494395 return murfey .server .ispyb .get_sub_samples_from_visit (visit_name , db = db )
@@ -538,52 +439,6 @@ def register_sample_image(
538439 return {"success" : False }
539440
540441
541- @router .get ("/instruments/{instrument_name}/visits/{visit_name}" )
542- def visit_info (
543- request : Request , instrument_name : str , visit_name : str , db = murfey .server .ispyb .DB
544- ):
545- query = (
546- db .query (BLSession )
547- .join (Proposal )
548- .filter (
549- BLSession .proposalId == Proposal .proposalId ,
550- BLSession .beamLineName == instrument_name ,
551- BLSession .endDate > datetime .datetime .now (),
552- BLSession .startDate < datetime .datetime .now (),
553- )
554- .add_columns (
555- BLSession .startDate ,
556- BLSession .endDate ,
557- BLSession .beamLineName ,
558- Proposal .proposalCode ,
559- Proposal .proposalNumber ,
560- BLSession .visit_number ,
561- Proposal .title ,
562- )
563- .all ()
564- )
565- if query :
566- return_query = [
567- {
568- "Start date" : id .startDate ,
569- "End date" : id .endDate ,
570- "Beamline name" : id .beamLineName ,
571- "Visit name" : visit_name ,
572- "Time remaining" : str (id .endDate - datetime .datetime .now ()),
573- }
574- for id in query
575- if id .proposalCode + str (id .proposalNumber ) + "-" + str (id .visit_number )
576- == visit_name
577- ] # "Proposal title": id.title
578- return templates .TemplateResponse (
579- request = request ,
580- name = "visit.html" ,
581- context = {"visit" : return_query },
582- )
583- else :
584- return None
585-
586-
587442@router .post ("/instruments/{instrument_name}/feedback" )
588443async def send_murfey_message (instrument_name : str , msg : RegistrationMessage ):
589444 if _transport_object :
@@ -697,56 +552,6 @@ async def make_gif(
697552 return {"output_gif" : str (output_path )}
698553
699554
700- @router .get ("/new_client_id/" )
701- async def new_client_id (db = murfey_db ):
702- clients = db .exec (select (ClientEnvironment )).all ()
703- if not clients :
704- return {"new_id" : 0 }
705- sorted_ids = sorted ([c .client_id for c in clients ])
706- return {"new_id" : sorted_ids [- 1 ] + 1 }
707-
708-
709- @router .post ("/instruments/{instrument_name}/clients/{client_id}/session" )
710- def link_client_to_session (
711- instrument_name : str , client_id : int , sess : SessionInfo , db = murfey_db
712- ):
713- sid = sess .session_id
714- if sid is None :
715- s = Session (name = sess .session_name , instrument_name = instrument_name )
716- db .add (s )
717- db .commit ()
718- sid = s .id
719- client = db .exec (
720- select (ClientEnvironment ).where (ClientEnvironment .client_id == client_id )
721- ).one ()
722- client .session_id = sid
723- db .add (client )
724- db .commit ()
725- db .close ()
726- return sid
727-
728-
729- @router .post ("/sessions/{session_id}/successful_processing" )
730- def register_processing_success_in_ispyb (
731- session_id : MurfeySessionID , db = murfey .server .ispyb .DB , murfey_db = murfey_db
732- ):
733- collected_ids = murfey_db .exec (
734- select (DataCollectionGroup , DataCollection , ProcessingJob , AutoProcProgram )
735- .where (DataCollectionGroup .session_id == session_id )
736- .where (DataCollection .dcg_id == DataCollectionGroup .id )
737- .where (ProcessingJob .dc_id == DataCollection .id )
738- .where (AutoProcProgram .pj_id == ProcessingJob .id )
739- ).all ()
740- appids = [c [3 ].id for c in collected_ids ]
741- if _transport_object :
742- apps = db .query (ISPyBAutoProcProgram ).filter (
743- ISPyBAutoProcProgram .autoProcProgramId .in_ (appids )
744- )
745- for updated in apps :
746- updated .processingStatus = True
747- _transport_object .do_update_processing_status (updated )
748-
749-
750555@router .post ("/visits/{visit_name}/monitoring/{on}" )
751556def change_monitoring_status (visit_name : str , on : int ):
752557 prom .monitoring_switch .labels (visit = visit_name )
0 commit comments