Skip to content

Commit 02e8c19

Browse files
committed
Refactored 'murfey.server.api.file_manip' into 'file_io_instrument', 'file_io_frontend', and 'file_io_shared' due to frontened and instrument accessing the same functions; moved 'process_gain()' into 'file_io_shared' so that it can be called from both with proper validation; updated route manifest and client-side URL lookups to reflect this
1 parent d5efb6f commit 02e8c19

File tree

10 files changed

+151
-94
lines changed

10 files changed

+151
-94
lines changed

src/murfey/client/contexts/spa.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ def post_transfer(
581581
eer_fractionation_file = None
582582
if file_transferred_to.suffix == ".eer":
583583
response = capture_post(
584-
f"{str(environment.url.geturl())}{url_path_for('file_manip.router', 'write_eer_fractionation_file', visit_name=environment.visit, session_id=environment.murfey_session)}",
584+
f"{str(environment.url.geturl())}{url_path_for('file_io_instrument.router', 'write_eer_fractionation_file', visit_name=environment.visit, session_id=environment.murfey_session)}",
585585
json={
586586
"eer_path": str(file_transferred_to),
587587
"fractionation": environment.data_collection_parameters[

src/murfey/client/contexts/tomo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ def _add_tilt(
317317
eer_fractionation_file = None
318318
if environment.data_collection_parameters.get("num_eer_frames"):
319319
response = requests.post(
320-
f"{str(environment.url.geturl())}{url_path_for('file_manip.router', 'write_eer_fractionation_file', visit_name=environment.visit, session_id=environment.murfey_session)}",
320+
f"{str(environment.url.geturl())}{url_path_for('file_io_instrument.router', 'write_eer_fractionation_file', visit_name=environment.visit, session_id=environment.murfey_session)}",
321321
json={
322322
"num_frames": environment.data_collection_parameters[
323323
"num_eer_frames"

src/murfey/client/multigrid_control.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ def _start_rsyncer(
251251
log.info(f"starting rsyncer: {source}")
252252
if transfer:
253253
# Always make sure the destination directory exists
254-
make_directory_url = f"{self.murfey_url}{url_path_for('file_manip.router', 'make_rsyncer_destination', session_id=self.session_id)}"
254+
make_directory_url = f"{self.murfey_url}{url_path_for('file_io_instrument.router', 'make_rsyncer_destination', session_id=self.session_id)}"
255255
capture_post(make_directory_url, json={"destination": destination})
256256
if self._environment:
257257
self._environment.default_destinations[source] = destination
@@ -437,7 +437,7 @@ def _start_dc(self, json, from_form: bool = False):
437437
log.info("Registering tomography processing parameters")
438438
if self._environment.data_collection_parameters.get("num_eer_frames"):
439439
eer_response = requests.post(
440-
f"{str(self._environment.url.geturl())}{url_path_for('file_manip.router', 'write_eer_fractionation_file', visit_name=self._environment.visit, session_id=self._environment.murfey_session)}",
440+
f"{str(self._environment.url.geturl())}{url_path_for('file_io_instrument.router', 'write_eer_fractionation_file', visit_name=self._environment.visit, session_id=self._environment.murfey_session)}",
441441
json={
442442
"num_frames": self._environment.data_collection_parameters[
443443
"num_eer_frames"

src/murfey/client/tui/app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ def _start_rsyncer(
209209
log.info(f"starting rsyncer: {source}")
210210
if transfer:
211211
# Always make sure the destination directory exists
212-
make_directory_url = f"{str(self._url.geturl())}{url_path_for('file_manip.router', 'make_rsyncer_destination', session_id=self._environment.murfey_session)}"
212+
make_directory_url = f"{str(self._url.geturl())}{url_path_for('file_io_instrument.router', 'make_rsyncer_destination', session_id=self._environment.murfey_session)}"
213213
capture_post(make_directory_url, json={"destination": destination})
214214
if self._environment:
215215
self._environment.default_destinations[source] = destination
@@ -488,7 +488,7 @@ def _start_dc(self, json, from_form: bool = False):
488488
log.info("Registering tomography processing parameters")
489489
if self.app._environment.data_collection_parameters.get("num_eer_frames"):
490490
eer_response = requests.post(
491-
f"{str(self.app._environment.url.geturl())}{url_path_for('file_manip.router', 'write_eer_fractionation_file', visit_name=self.app._environment.visit, session_id=self.app._environment.murfey_session)}",
491+
f"{str(self.app._environment.url.geturl())}{url_path_for('file_io_instrument.router', 'write_eer_fractionation_file', visit_name=self.app._environment.visit, session_id=self.app._environment.murfey_session)}",
492492
json={
493493
"num_frames": self.app._environment.data_collection_parameters[
494494
"num_eer_frames"

src/murfey/client/tui/screens.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def determine_default_destination(
110110
_default = environment.destination_registry[source_name]
111111
else:
112112
suggested_path_response = capture_post(
113-
url=f"{str(environment.url.geturl())}{url_path_for('file_manip.router', 'suggest_path', visit_name=visit, session_id=environment.murfey_session)}",
113+
url=f"{str(environment.url.geturl())}{url_path_for('file_io_instrument.router', 'suggest_path', visit_name=visit, session_id=environment.murfey_session)}",
114114
json={
115115
"base_path": f"{destination}/{visit}/{mid_path.parent if include_mid_path else ''}/raw",
116116
"touch": touch,
@@ -906,7 +906,7 @@ def on_button_pressed(self, event):
906906
f"Gain reference file {posix_path(self._dir_tree._gain_reference)!r} was not successfully transferred to {visit_path}/processing"
907907
)
908908
process_gain_response = requests.post(
909-
url=f"{str(self.app._environment.url.geturl())}{url_path_for('file_manip.router', 'process_gain', session_id=self.app._environment.murfey_session)}",
909+
url=f"{str(self.app._environment.url.geturl())}{url_path_for('file_io_instrument.router', 'process_gain', session_id=self.app._environment.murfey_session)}",
910910
json={
911911
"gain_ref": str(self._dir_tree._gain_reference),
912912
"eer": bool(
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from logging import getLogger
2+
3+
from fastapi import APIRouter, Depends
4+
5+
from murfey.server.api.auth import MurfeySessionIDFrontend as MurfeySessionID
6+
from murfey.server.api.auth import validate_token
7+
from murfey.server.api.file_io_shared import GainReference
8+
from murfey.server.api.file_io_shared import process_gain as _process_gain
9+
from murfey.server.murfey_db import murfey_db
10+
11+
logger = getLogger("murfey.server.api.file_io_frontend")
12+
13+
14+
router = APIRouter(
15+
prefix="/file_io/frontend",
16+
dependencies=[Depends(validate_token)],
17+
tags=["File I/O: Frontend"],
18+
)
19+
20+
21+
@router.post("/sessions/{session_id}/process_gain")
22+
async def process_gain(
23+
session_id: MurfeySessionID, gain_reference_params: GainReference, db=murfey_db
24+
):
25+
result = await _process_gain(session_id, gain_reference_params, db)
26+
return result

src/murfey/server/api/file_manip.py renamed to src/murfey/server/api/file_io_instrument.py

Lines changed: 8 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@
1010

1111
from murfey.server.api.auth import MurfeySessionIDInstrument as MurfeySessionID
1212
from murfey.server.api.auth import validate_instrument_token
13-
from murfey.server.gain import Camera, prepare_eer_gain, prepare_gain
13+
from murfey.server.api.file_io_shared import GainReference
14+
from murfey.server.api.file_io_shared import process_gain as _process_gain
1415
from murfey.server.murfey_db import murfey_db
1516
from murfey.util import sanitise, secure_path
1617
from murfey.util.config import get_machine_config
1718
from murfey.util.db import Session, SessionProcessingParameters
1819
from murfey.util.eer import num_frames
1920

20-
logger = getLogger("murfey.server.api.file_manip")
21+
logger = getLogger("murfey.server.api.file_io_instrument")
22+
2123

2224
router = APIRouter(
23-
prefix="/file_manipulation",
25+
prefix="/file_io/instrument",
2426
dependencies=[Depends(validate_instrument_token)],
25-
tags=["File Manipulation"],
27+
tags=["File I/O: Instrument"],
2628
)
2729

2830

@@ -107,85 +109,12 @@ def make_rsyncer_destination(session_id: int, destination: Dest, db=murfey_db):
107109
return destination
108110

109111

110-
class GainReference(BaseModel):
111-
gain_ref: Path
112-
rescale: bool = True
113-
eer: bool = False
114-
tag: str = ""
115-
116-
117112
@router.post("/sessions/{session_id}/process_gain")
118113
async def process_gain(
119114
session_id: MurfeySessionID, gain_reference_params: GainReference, db=murfey_db
120115
):
121-
murfey_session = db.exec(select(Session).where(Session.id == session_id)).one()
122-
visit_name = murfey_session.visit
123-
instrument_name = murfey_session.instrument_name
124-
machine_config = get_machine_config(instrument_name=instrument_name)[
125-
instrument_name
126-
]
127-
camera = getattr(Camera, machine_config.camera)
128-
if gain_reference_params.eer:
129-
executables = machine_config.external_executables_eer
130-
else:
131-
executables = machine_config.external_executables
132-
env = machine_config.external_environment
133-
safe_path_name = secure_filename(gain_reference_params.gain_ref.name)
134-
filepath = (
135-
Path(machine_config.rsync_basepath)
136-
/ str(datetime.now().year)
137-
/ secure_filename(visit_name)
138-
/ machine_config.gain_directory_name
139-
)
140-
141-
# Check under previous year if the folder doesn't exist
142-
if not filepath.exists():
143-
filepath_prev = filepath
144-
filepath = (
145-
Path(machine_config.rsync_basepath)
146-
/ str(datetime.now().year - 1)
147-
/ secure_filename(visit_name)
148-
/ machine_config.gain_directory_name
149-
)
150-
# If it's not in the previous year, it's a genuine error
151-
if not filepath.exists():
152-
log_message = (
153-
"Unable to find gain reference directory under "
154-
f"{str(filepath_prev)!r} or {str(filepath)}"
155-
)
156-
logger.error(log_message)
157-
raise FileNotFoundError(log_message)
158-
159-
if gain_reference_params.eer:
160-
new_gain_ref, new_gain_ref_superres = await prepare_eer_gain(
161-
filepath / safe_path_name,
162-
executables,
163-
env,
164-
tag=gain_reference_params.tag,
165-
)
166-
else:
167-
new_gain_ref, new_gain_ref_superres = await prepare_gain(
168-
camera,
169-
filepath / safe_path_name,
170-
executables,
171-
env,
172-
rescale=gain_reference_params.rescale,
173-
tag=gain_reference_params.tag,
174-
)
175-
if new_gain_ref and new_gain_ref_superres:
176-
return {
177-
"gain_ref": new_gain_ref.relative_to(Path(machine_config.rsync_basepath)),
178-
"gain_ref_superres": new_gain_ref_superres.relative_to(
179-
Path(machine_config.rsync_basepath)
180-
),
181-
}
182-
elif new_gain_ref:
183-
return {
184-
"gain_ref": new_gain_ref.relative_to(Path(machine_config.rsync_basepath)),
185-
"gain_ref_superres": None,
186-
}
187-
else:
188-
return {"gain_ref": str(filepath / safe_path_name), "gain_ref_superres": None}
116+
result = await _process_gain(session_id, gain_reference_params, db)
117+
return result
189118

190119

191120
class FractionationParameters(BaseModel):
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from datetime import datetime
2+
from logging import getLogger
3+
from pathlib import Path
4+
5+
from pydantic import BaseModel
6+
from sqlmodel import select
7+
from werkzeug.utils import secure_filename
8+
9+
from murfey.server.gain import Camera, prepare_eer_gain, prepare_gain
10+
from murfey.server.murfey_db import murfey_db
11+
from murfey.util.config import get_machine_config
12+
from murfey.util.db import Session
13+
14+
logger = getLogger("murfey.server.api.file_io_shared")
15+
16+
17+
class GainReference(BaseModel):
18+
gain_ref: Path
19+
rescale: bool = True
20+
eer: bool = False
21+
tag: str = ""
22+
23+
24+
async def process_gain(
25+
session_id: int, gain_reference_params: GainReference, db=murfey_db
26+
):
27+
murfey_session = db.exec(select(Session).where(Session.id == session_id)).one()
28+
visit_name = murfey_session.visit
29+
instrument_name = murfey_session.instrument_name
30+
machine_config = get_machine_config(instrument_name=instrument_name)[
31+
instrument_name
32+
]
33+
camera = getattr(Camera, machine_config.camera)
34+
if gain_reference_params.eer:
35+
executables = machine_config.external_executables_eer
36+
else:
37+
executables = machine_config.external_executables
38+
env = machine_config.external_environment
39+
safe_path_name = secure_filename(gain_reference_params.gain_ref.name)
40+
filepath = (
41+
Path(machine_config.rsync_basepath)
42+
/ str(datetime.now().year)
43+
/ secure_filename(visit_name)
44+
/ machine_config.gain_directory_name
45+
)
46+
47+
# Check under previous year if the folder doesn't exist
48+
if not filepath.exists():
49+
filepath_prev = filepath
50+
filepath = (
51+
Path(machine_config.rsync_basepath)
52+
/ str(datetime.now().year - 1)
53+
/ secure_filename(visit_name)
54+
/ machine_config.gain_directory_name
55+
)
56+
# If it's not in the previous year, it's a genuine error
57+
if not filepath.exists():
58+
log_message = (
59+
"Unable to find gain reference directory under "
60+
f"{str(filepath_prev)!r} or {str(filepath)}"
61+
)
62+
logger.error(log_message)
63+
raise FileNotFoundError(log_message)
64+
65+
if gain_reference_params.eer:
66+
new_gain_ref, new_gain_ref_superres = await prepare_eer_gain(
67+
filepath / safe_path_name,
68+
executables,
69+
env,
70+
tag=gain_reference_params.tag,
71+
)
72+
else:
73+
new_gain_ref, new_gain_ref_superres = await prepare_gain(
74+
camera,
75+
filepath / safe_path_name,
76+
executables,
77+
env,
78+
rescale=gain_reference_params.rescale,
79+
tag=gain_reference_params.tag,
80+
)
81+
if new_gain_ref and new_gain_ref_superres:
82+
return {
83+
"gain_ref": new_gain_ref.relative_to(Path(machine_config.rsync_basepath)),
84+
"gain_ref_superres": new_gain_ref_superres.relative_to(
85+
Path(machine_config.rsync_basepath)
86+
),
87+
}
88+
elif new_gain_ref:
89+
return {
90+
"gain_ref": new_gain_ref.relative_to(Path(machine_config.rsync_basepath)),
91+
"gain_ref_superres": None,
92+
}
93+
else:
94+
return {"gain_ref": str(filepath / safe_path_name), "gain_ref_superres": None}

src/murfey/server/main.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
import murfey.server.api.bootstrap
1515
import murfey.server.api.clem
1616
import murfey.server.api.display
17-
import murfey.server.api.file_manip
17+
import murfey.server.api.file_io_frontend
18+
import murfey.server.api.file_io_instrument
1819
import murfey.server.api.hub
1920
import murfey.server.api.instrument
2021
import murfey.server.api.mag_table
@@ -71,7 +72,8 @@ class Settings(BaseSettings):
7172
app.include_router(murfey.server.api.display.router)
7273
app.include_router(murfey.server.api.processing_parameters.router)
7374

74-
app.include_router(murfey.server.api.file_manip.router)
75+
app.include_router(murfey.server.api.file_io_frontend.router)
76+
app.include_router(murfey.server.api.file_io_instrument.router)
7577

7678
app.include_router(murfey.server.api.instrument.router)
7779

src/murfey/util/route_manifest.yaml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,14 @@ murfey.server.api.display.router:
410410
type: int
411411
methods:
412412
- GET
413-
murfey.server.api.file_manip.router:
414-
- path: /file_manipulation/visits/{visit_name}/{session_id}/suggested_path
413+
murfey.server.api.file_io_frontend.router:
414+
- path: /file_io/frontend/sessions/{session_id}/process_gain
415+
function: process_gain
416+
path_params: []
417+
methods:
418+
- POST
419+
murfey.server.api.file_io_instrument.router:
420+
- path: /file_io/instrument/visits/{visit_name}/{session_id}/suggested_path
415421
function: suggest_path
416422
path_params:
417423
- name: visit_name
@@ -420,19 +426,19 @@ murfey.server.api.file_manip.router:
420426
type: int
421427
methods:
422428
- POST
423-
- path: /file_manipulation/sessions/{session_id}/make_rsyncer_destination
429+
- path: /file_io/instrument/sessions/{session_id}/make_rsyncer_destination
424430
function: make_rsyncer_destination
425431
path_params:
426432
- name: session_id
427433
type: int
428434
methods:
429435
- POST
430-
- path: /file_manipulation/sessions/{session_id}/process_gain
436+
- path: /file_io/instrument/sessions/{session_id}/process_gain
431437
function: process_gain
432438
path_params: []
433439
methods:
434440
- POST
435-
- path: /file_manipulation/visits/{visit_name}/{session_id}/eer_fractionation_file
441+
- path: /file_io/instrument/visits/{visit_name}/{session_id}/eer_fractionation_file
436442
function: write_eer_fractionation_file
437443
path_params:
438444
- name: visit_name

0 commit comments

Comments
 (0)