Skip to content

Commit 606a957

Browse files
committed
Resolved merge conflicts with 'main' branch
2 parents c281170 + 950afd3 commit 606a957

File tree

8 files changed

+80
-129
lines changed

8 files changed

+80
-129
lines changed

src/murfey/server/api/spa.py

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/murfey/server/api/workflow.py

Lines changed: 12 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import murfey.server.prometheus as prom
2828
from murfey.server import _transport_object
2929
from murfey.server.api.auth import MurfeySessionID, validate_instrument_token
30-
from murfey.server.api.spa import _cryolo_model_path
3130
from murfey.server.feedback import (
3231
_murfey_id,
3332
check_tilt_series_mc,
@@ -58,7 +57,11 @@
5857
TiltSeries,
5958
)
6059
from murfey.util.models import ProcessingParametersSPA, ProcessingParametersTomo
61-
from murfey.util.processing_params import default_spa_parameters
60+
from murfey.util.processing_params import (
61+
cryolo_model_path,
62+
default_spa_parameters,
63+
motion_corrected_mrc,
64+
)
6265
from murfey.util.tomo import midpoint
6366

6467
logger = getLogger("murfey.server.api.workflow")
@@ -365,29 +368,7 @@ async def request_spa_preprocessing(
365368
machine_config = get_machine_config(instrument_name=instrument_name)[
366369
instrument_name
367370
]
368-
parts = [secure_filename(p) for p in Path(proc_file.path).parts]
369-
visit_idx = parts.index(visit_name)
370-
core = Path("/") / Path(*parts[: visit_idx + 1])
371-
ppath = Path("/") / Path(*parts)
372-
sub_dataset = ppath.relative_to(core).parts[0]
373-
extra_path = machine_config.processed_extra_directory
374-
for i, p in enumerate(ppath.parts):
375-
if p.startswith("raw"):
376-
movies_path_index = i
377-
break
378-
else:
379-
raise ValueError(f"{proc_file.path} does not contain a raw directory")
380-
mrc_out = (
381-
core
382-
/ machine_config.processed_directory_name
383-
/ sub_dataset
384-
/ extra_path
385-
/ "MotionCorr"
386-
/ "job002"
387-
/ "Movies"
388-
/ "/".join(ppath.parts[movies_path_index + 1 : -1])
389-
/ str(ppath.stem + "_motion_corrected.mrc")
390-
)
371+
mrc_out = motion_corrected_mrc(Path(proc_file.path), visit_name, machine_config)
391372
try:
392373
collected_ids = db.exec(
393374
select(DataCollectionGroup, DataCollection, ProcessingJob, AutoProcProgram)
@@ -479,7 +460,7 @@ async def request_spa_preprocessing(
479460
),
480461
"do_icebreaker_jobs": default_spa_parameters.do_icebreaker_jobs,
481462
"cryolo_model_weights": str(
482-
_cryolo_model_path(visit_name, instrument_name)
463+
cryolo_model_path(visit_name, instrument_name)
483464
),
484465
},
485466
}
@@ -491,7 +472,8 @@ async def request_spa_preprocessing(
491472
_transport_object.send("processing_recipe", zocalo_message)
492473
else:
493474
logger.error(
494-
f"Pe-processing was requested for {sanitise(ppath.name)} but no Zocalo transport object was found"
475+
f"Pre-processing was requested for {sanitise(Path(proc_file.path).name)} "
476+
"but no Zocalo transport object was found"
495477
)
496478
return proc_file
497479

@@ -646,22 +628,7 @@ async def request_tomography_preprocessing(
646628
machine_config = get_machine_config(instrument_name=instrument_name)[
647629
instrument_name
648630
]
649-
visit_idx = Path(proc_file.path).parts.index(visit_name)
650-
core = Path(*Path(proc_file.path).parts[: visit_idx + 1])
651-
ppath = Path("/".join(secure_filename(p) for p in Path(proc_file.path).parts))
652-
sub_dataset = "/".join(ppath.relative_to(core).parts[:-1])
653-
extra_path = machine_config.processed_extra_directory
654-
mrc_out = (
655-
core
656-
/ machine_config.processed_directory_name
657-
/ sub_dataset
658-
/ extra_path
659-
/ "MotionCorr"
660-
/ "job002"
661-
/ "Movies"
662-
/ str(ppath.stem + "_motion_corrected.mrc")
663-
)
664-
mrc_out = Path("/".join(secure_filename(p) for p in mrc_out.parts))
631+
mrc_out = motion_corrected_mrc(Path(proc_file.path), visit_name, machine_config)
665632

666633
recipe_name = machine_config.recipes.get("em-tomo-preprocess", "em-tomo-preprocess")
667634

@@ -732,7 +699,8 @@ async def request_tomography_preprocessing(
732699
_transport_object.send("processing_recipe", zocalo_message)
733700
else:
734701
logger.error(
735-
f"Pe-processing was requested for {sanitise(ppath.name)} but no Zocalo transport object was found"
702+
f"Pre-processing was requested for {sanitise(Path(proc_file.path).name)} "
703+
f"but no Zocalo transport object was found"
736704
)
737705
return proc_file
738706
else:

src/murfey/server/feedback.py

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
get_microscope,
5252
get_security_config,
5353
)
54-
from murfey.util.processing_params import default_spa_parameters
54+
from murfey.util.processing_params import default_spa_parameters, motion_corrected_mrc
5555
from murfey.util.tomo import midpoint
5656

5757
logger = logging.getLogger("murfey.server.feedback")
@@ -106,37 +106,16 @@ def get_all_tilts(tilt_series_id: int) -> List[str]:
106106
).all()
107107
if not complete_results:
108108
return []
109+
visit_name = complete_results[0][2].visit
109110
instrument_name = complete_results[0][2].instrument_name
110111
results = [r[0] for r in complete_results]
111112
machine_config = get_machine_config(instrument_name=instrument_name)[
112113
instrument_name
113114
]
114-
115-
def _mc_path(mov_path: Path) -> str:
116-
for p in mov_path.parts:
117-
if "-" in p and p.startswith(("bi", "nr", "nt", "cm", "sw")):
118-
visit_name = p
119-
break
120-
else:
121-
raise ValueError(f"No visit found in {mov_path}")
122-
visit_idx = Path(mov_path).parts.index(visit_name)
123-
core = Path(*Path(mov_path).parts[: visit_idx + 1])
124-
ppath = Path(mov_path)
125-
sub_dataset = "/".join(ppath.relative_to(core).parts[:-1])
126-
extra_path = machine_config.processed_extra_directory
127-
mrc_out = (
128-
core
129-
/ machine_config.processed_directory_name
130-
/ sub_dataset
131-
/ extra_path
132-
/ "MotionCorr"
133-
/ "job002"
134-
/ "Movies"
135-
/ str(ppath.stem + "_motion_corrected.mrc")
136-
)
137-
return str(mrc_out)
138-
139-
return [_mc_path(Path(r.movie_path)) for r in results]
115+
return [
116+
str(motion_corrected_mrc(Path(r.movie_path), visit_name, machine_config))
117+
for r in results
118+
]
140119

141120

142121
def get_job_ids(tilt_series_id: int, appid: int) -> JobIDs:

src/murfey/server/main.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import murfey.server.api.prometheus
2323
import murfey.server.api.session_control
2424
import murfey.server.api.session_info
25-
import murfey.server.api.spa
2625
import murfey.server.api.websocket
2726
import murfey.server.api.workflow
2827
from murfey.server import template_files
@@ -90,7 +89,6 @@ class Settings(BaseSettings):
9089
app.include_router(murfey.server.api.workflow.correlative_router)
9190
app.include_router(murfey.server.api.workflow.spa_router)
9291
app.include_router(murfey.server.api.workflow.tomo_router)
93-
app.include_router(murfey.server.api.spa.router)
9492
app.include_router(murfey.server.api.clem.router)
9593

9694
app.include_router(murfey.server.api.prometheus.router)

src/murfey/util/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class MachineConfig(BaseModel): # type: ignore
5757
processing_enabled: bool = True
5858
process_by_default: bool = True
5959
gain_directory_name: str = "processing"
60+
process_multiple_datasets: bool = True
6061
processed_directory_name: str = "processed"
6162
processed_extra_directory: str = ""
6263
recipes: dict[str, str] = {

src/murfey/util/processing_params.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,55 @@
1+
from datetime import datetime
2+
from functools import lru_cache
3+
from pathlib import Path
14
from typing import Literal, Optional
25

36
from pydantic import BaseModel
7+
from werkzeug.utils import secure_filename
8+
9+
from murfey.util.config import MachineConfig, get_machine_config
10+
11+
12+
def motion_corrected_mrc(
13+
input_movie: Path, visit_name: str, machine_config: MachineConfig
14+
):
15+
parts = [secure_filename(p) for p in input_movie.parts]
16+
visit_idx = parts.index(visit_name)
17+
core = Path("/") / Path(*parts[: visit_idx + 1])
18+
ppath = Path("/") / Path(*parts)
19+
if machine_config.process_multiple_datasets:
20+
sub_dataset = ppath.relative_to(core).parts[0]
21+
else:
22+
sub_dataset = ""
23+
extra_path = machine_config.processed_extra_directory
24+
mrc_out = (
25+
core
26+
/ machine_config.processed_directory_name
27+
/ sub_dataset
28+
/ extra_path
29+
/ "MotionCorr"
30+
/ "job002"
31+
/ "Movies"
32+
/ ppath.parent.relative_to(core / sub_dataset)
33+
/ str(ppath.stem + "_motion_corrected.mrc")
34+
)
35+
return Path("/".join(secure_filename(p) for p in mrc_out.parts))
36+
37+
38+
@lru_cache(maxsize=5)
39+
def cryolo_model_path(visit: str, instrument_name: str) -> Path:
40+
machine_config = get_machine_config(instrument_name=instrument_name)[
41+
instrument_name
42+
]
43+
if machine_config.model_search_directory:
44+
visit_directory = (
45+
machine_config.rsync_basepath / str(datetime.now().year) / visit
46+
)
47+
possible_models = list(
48+
(visit_directory / machine_config.model_search_directory).glob("*.h5")
49+
)
50+
if possible_models:
51+
return sorted(possible_models, key=lambda x: x.stat().st_ctime)[-1]
52+
return machine_config.default_model
453

554

655
class CLEMAlignAndMergeParameters(BaseModel):

src/murfey/util/route_manifest.yaml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -980,14 +980,6 @@ murfey.server.api.session_info.tomo_router:
980980
type: str
981981
methods:
982982
- GET
983-
murfey.server.api.spa.router:
984-
- path: /sessions/{session_id}/cryolo_model
985-
function: get_cryolo_model_path
986-
path_params:
987-
- name: session_id
988-
type: int
989-
methods:
990-
- GET
991983
murfey.server.api.websocket.ws:
992984
- path: /ws/test/{client_id}
993985
function: websocket_endpoint

src/murfey/workflows/spa/flush_spa_preprocess.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from murfey.util.db import Session as MurfeySession
2525
from murfey.util.db import SPAFeedbackParameters, SPARelionParameters
2626
from murfey.util.models import FoilHoleParameters, GridSquareParameters
27-
from murfey.util.processing_params import default_spa_parameters
27+
from murfey.util.processing_params import cryolo_model_path, default_spa_parameters
2828
from murfey.util.spa_metadata import (
2929
GridSquareInfo,
3030
foil_hole_data,
@@ -314,15 +314,12 @@ def flush_spa_preprocess(message: dict, murfey_db: Session, demo: bool = False)
314314
).all()
315315
if not stashed_files:
316316
return True
317-
instrument_name = (
318-
murfey_db.exec(
319-
select(MurfeySession).where(MurfeySession.id == message["session_id"])
320-
)
321-
.one()
322-
.instrument_name
323-
)
324-
machine_config = get_machine_config(instrument_name=instrument_name)[
325-
instrument_name
317+
318+
murfey_session = murfey_db.exec(
319+
select(MurfeySession).where(MurfeySession.id == message["session_id"])
320+
).one()
321+
machine_config = get_machine_config(instrument_name=murfey_session.instrument_name)[
322+
murfey_session.instrument_name
326323
]
327324
recipe_name = machine_config.recipes.get("em-spa-preprocess", "em-spa-preprocess")
328325
collected_ids = murfey_db.exec(
@@ -424,6 +421,11 @@ def flush_spa_preprocess(message: dict, murfey_db: Session, demo: bool = False)
424421
else f.eer_fractionation_file
425422
),
426423
"do_icebreaker_jobs": default_spa_parameters.do_icebreaker_jobs,
424+
"cryolo_model_weights": str(
425+
cryolo_model_path(
426+
murfey_session.visit, murfey_session.instrument_name
427+
)
428+
),
427429
"foil_hole_id": foil_hole_id,
428430
},
429431
}

0 commit comments

Comments
 (0)