Skip to content

Commit fdda3fe

Browse files
committed
Merged recent changes from 'main' branch
2 parents 2af8eb0 + fe9abef commit fdda3fe

11 files changed

Lines changed: 153 additions & 124 deletions

File tree

src/murfey/client/contexts/atlas.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from murfey.client.context import Context, _atlas_destination, _get_source
88
from murfey.client.instance_environment import MurfeyInstanceEnvironment
99
from murfey.util.client import capture_post
10+
from murfey.util.spa_metadata import get_grid_square_atlas_positions
1011

1112
logger = logging.getLogger("murfey.client.contexts.atlas")
1213

@@ -158,3 +159,52 @@ def post_transfer_epu(
158159
logger.info(
159160
f"Registered data collection group for atlas {str(transferred_atlas_jpg)!r}"
160161
)
162+
163+
elif environment and transferred_file.name == "Atlas.dm":
164+
# Register all grid squares on this atlas
165+
gs_pix_positions = get_grid_square_atlas_positions(transferred_file)
166+
for gs, pos_data in gs_pix_positions.items():
167+
if pos_data:
168+
capture_post(
169+
base_url=str(environment.url.geturl()),
170+
router_name="session_control.spa_router",
171+
function_name="register_grid_square",
172+
token=self._token,
173+
instrument_name=environment.instrument_name,
174+
session_id=environment.murfey_session,
175+
gsid=int(gs),
176+
data={
177+
"tag": str(transferred_file.parent),
178+
"x_location": pos_data[0],
179+
"y_location": pos_data[1],
180+
"x_stage_position": pos_data[2],
181+
"y_stage_position": pos_data[3],
182+
"width": pos_data[4],
183+
"height": pos_data[5],
184+
"angle": pos_data[6],
185+
},
186+
)
187+
if gs_pix_positions:
188+
for p in transferred_file.parts:
189+
if p.startswith("Sample"):
190+
sample = int(p.replace("Sample", ""))
191+
break
192+
else:
193+
logger.warning(
194+
f"Sample could not be identified for {transferred_file}"
195+
)
196+
return
197+
capture_post(
198+
base_url=str(environment.url.geturl()),
199+
router_name="session_control.spa_router",
200+
function_name="register_atlas",
201+
token=self._token,
202+
instrument_name=environment.instrument_name,
203+
session_id=environment.murfey_session,
204+
data={
205+
"name": f"{environment.visit}-sample-{sample}",
206+
"acquisition_uuid": environment.acquisition_uuid,
207+
"register_grid": True,
208+
"tag": str(transferred_file.parent),
209+
},
210+
)

src/murfey/client/contexts/spa_metadata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def post_transfer(
152152
"angle": pos_data[6],
153153
},
154154
)
155-
if pos_data:
155+
if gs_pix_positions:
156156
capture_post(
157157
base_url=str(environment.url.geturl()),
158158
router_name="session_control.spa_router",

src/murfey/server/api/session_control.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ def get_foil_hole(
359359

360360
class AtlasRegistration(BaseModel):
361361
name: str
362-
acquisition_uuid: str
362+
acquisition_uuid: str | None
363363
storage_folder: str = ""
364364
register_grid: bool = False
365365
tag: str = ""
@@ -371,7 +371,7 @@ def register_atlas(
371371
atlas_registration_data: AtlasRegistration,
372372
db=murfey_db,
373373
):
374-
if SMARTEM_ACTIVE:
374+
if SMARTEM_ACTIVE and atlas_registration_data.acquisition_uuid is not None:
375375
session = db.exec(select(Session).where(Session.id == session_id)).one()
376376
machine_config = get_machine_config(session.instrument_name)[
377377
session.instrument_name
@@ -382,7 +382,7 @@ def register_atlas(
382382
)
383383
grid_uuid = None
384384
if atlas_registration_data.tag:
385-
dcg = murfey_db.exec(
385+
dcg = db.exec(
386386
select(DataCollectionGroup)
387387
.where(DataCollectionGroup.session_id == session_id)
388388
.where(DataCollectionGroup.tag == atlas_registration_data.tag)
@@ -410,7 +410,9 @@ def register_atlas(
410410
if atlas_registration_data.register_grid:
411411
smartem_client.grid_registered(grid_uuid)
412412
else:
413-
logger.info("smartem deactivated so did not register atlas")
413+
logger.info(
414+
f"smartem deactivated so did not register atlas for {sanitise(str(atlas_registration_data.acquisition_uuid))}"
415+
)
414416

415417

416418
class SquareRegistration(BaseModel):

src/murfey/server/api/workflow.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ def register_dc_group(
232232
)
233233
).all():
234234
# Case where we switch from atlas to processing
235+
original_tag = dcg_murfey[0].tag
235236
dcg_murfey[0].tag = dcg_params.tag or dcg_murfey[0].tag
236237
if _transport_object:
237238
_transport_object.send(
@@ -243,6 +244,13 @@ def register_dc_group(
243244
},
244245
)
245246
db.add(dcg_murfey[0])
247+
for grid_square in db.exec(
248+
select(GridSquare)
249+
.where(GridSquare.tag == original_tag)
250+
.where(GridSquare.session_id == session_id)
251+
).all():
252+
grid_square.tag = dcg_params.tag or original_tag
253+
db.add(grid_square)
246254
db.commit()
247255
else:
248256
dcg_parameters = {

src/murfey/server/feedback.py

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,6 @@ def _release_2d_hold(message: dict, _db):
354354
"nr_classes": default_spa_parameters.nr_classes_2d,
355355
"do_icebreaker_jobs": default_spa_parameters.do_icebreaker_jobs,
356356
"class2d_fraction_of_classes_to_remove": default_spa_parameters.fraction_of_classes_to_remove_2d,
357-
"picker_id": feedback_params.picker_ispyb_id,
358357
"class_uuids": _2d_class_murfey_ids(
359358
first_class2d.particles_file, message["program_id"], _db
360359
),
@@ -432,7 +431,6 @@ def _release_3d_hold(message: dict, _db):
432431
"mask_diameter": relion_params.mask_diameter or 0,
433432
"do_initial_model": False if feedback_params.initial_model else True,
434433
"initial_model_file": feedback_params.initial_model,
435-
"picker_id": feedback_params.picker_ispyb_id,
436434
"class_uuids": _3d_class_murfey_ids(
437435
class3d_params.particles_file, _app_id(pj_id, _db), _db
438436
),
@@ -518,7 +516,6 @@ def _release_refine_hold(message: dict, _db):
518516
"symmetry": relion_params.symmetry,
519517
"node_creator_queue": machine_config.node_creator_queue,
520518
"nr_iter": default_spa_parameters.nr_iter_3d,
521-
"picker_id": feedback_params.picker_ispyb_id,
522519
"refined_class_uuid": _refine_murfey_id(
523520
refine_dir=refine_params.refine_dir,
524521
tag=refine_params.tag,
@@ -590,13 +587,6 @@ def _register_incomplete_2d_batch(message: dict, _db):
590587
feedback_params.hold_class2d = True
591588
relion_options = dict(relion_params)
592589
other_options = dict(feedback_params)
593-
if other_options["picker_ispyb_id"] is None:
594-
logger.info("No ISPyB particle picker ID yet")
595-
feedback_params.hold_class2d = False
596-
_db.add(feedback_params)
597-
_db.commit()
598-
_db.expunge(feedback_params)
599-
return
600590
_db.add(feedback_params)
601591
_db.commit()
602592
_db.expunge(feedback_params)
@@ -630,7 +620,6 @@ def _register_incomplete_2d_batch(message: dict, _db):
630620
"batch_is_complete": False,
631621
"particle_diameter": relion_options["particle_diameter"],
632622
"combine_star_job_number": -1,
633-
"picker_id": other_options["picker_ispyb_id"],
634623
"nr_iter": default_spa_parameters.nr_iter_2d,
635624
"batch_size": default_spa_parameters.batch_size_2d,
636625
"nr_classes": default_spa_parameters.nr_classes_2d,
@@ -694,7 +683,7 @@ def _register_complete_2d_batch(message: dict, _db):
694683
).one()
695684
_db.expunge(relion_params)
696685
_db.expunge(feedback_params)
697-
if feedback_params.hold_class2d or feedback_params.picker_ispyb_id is None:
686+
if feedback_params.hold_class2d:
698687
feedback_params.rerun_class2d = True
699688
_db.add(feedback_params)
700689
_db.commit()
@@ -792,7 +781,6 @@ def _register_complete_2d_batch(message: dict, _db):
792781
"mask_diameter": relion_params.mask_diameter or 0,
793782
"combine_star_job_number": feedback_params.star_combination_job,
794783
"autoselect_min_score": 0,
795-
"picker_id": feedback_params.picker_ispyb_id,
796784
"class_uuids": class_uuids,
797785
"class2d_grp_uuid": class2d_grp_uuid,
798786
"nr_iter": default_spa_parameters.nr_iter_2d,
@@ -867,7 +855,6 @@ def _register_complete_2d_batch(message: dict, _db):
867855
"mask_diameter": relion_params.mask_diameter or 0,
868856
"combine_star_job_number": feedback_params.star_combination_job,
869857
"autoselect_min_score": feedback_params.class_selection_score or 0,
870-
"picker_id": feedback_params.picker_ispyb_id,
871858
"class_uuids": class_uuids,
872859
"class2d_grp_uuid": class2d_grp_uuid,
873860
"nr_iter": default_spa_parameters.nr_iter_2d,
@@ -958,7 +945,6 @@ def _flush_class2d(
958945
"mask_diameter": relion_params.mask_diameter or 0,
959946
"combine_star_job_number": feedback_params.star_combination_job,
960947
"autoselect_min_score": feedback_params.class_selection_score or 0,
961-
"picker_id": feedback_params.picker_ispyb_id,
962948
"class_uuids": _2d_class_murfey_ids(
963949
saved_message.particles_file, _app_id(pj_id, _db), _db
964950
),
@@ -1008,16 +994,6 @@ def _register_class_selection(message: dict, _db):
1008994
).one()
1009995
_db.expunge(feedback_params)
1010996

1011-
if feedback_params.picker_ispyb_id is None:
1012-
selection_stash = db.SelectionStash(
1013-
pj_id=pj_id,
1014-
class_selection_score=message["class_selection_score"] or 0,
1015-
)
1016-
_db.add(selection_stash)
1017-
_db.commit()
1018-
_db.close()
1019-
return
1020-
1021997
feedback_params.class_selection_score = message.get("class_selection_score") or 0
1022998
feedback_params.hold_class2d = False
1023999
_flush_class2d(
@@ -1285,7 +1261,6 @@ def _register_3d_batch(message: dict, _db):
12851261
"particle_diameter": relion_options["particle_diameter"],
12861262
"mask_diameter": relion_options["mask_diameter"] or 0,
12871263
"do_initial_model": True,
1288-
"picker_id": other_options["picker_ispyb_id"],
12891264
"class_uuids": {i + 1: m for i, m in enumerate(class_uuids)},
12901265
"class3d_grp_uuid": class3d_grp_uuid,
12911266
"nr_iter": default_spa_parameters.nr_iter_3d,
@@ -1326,7 +1301,6 @@ def _register_3d_batch(message: dict, _db):
13261301
"mask_diameter": relion_options["mask_diameter"] or 0,
13271302
"do_initial_model": False,
13281303
"initial_model_file": other_options["initial_model"],
1329-
"picker_id": other_options["picker_ispyb_id"],
13301304
"class_uuids": _3d_class_murfey_ids(
13311305
class3d_params.particles_file, _app_id(pj_id, _db), _db
13321306
),
@@ -1535,7 +1509,6 @@ def _register_refinement(message: dict, _db):
15351509
db.ClassificationFeedbackParameters.pj_id == pj_id_params
15361510
)
15371511
).one()
1538-
other_options = dict(feedback_params)
15391512

15401513
if feedback_params.hold_refine:
15411514
# If waiting then save the message
@@ -1627,7 +1600,6 @@ def _register_refinement(message: dict, _db):
16271600
"symmetry": relion_options["symmetry"],
16281601
"node_creator_queue": machine_config.node_creator_queue,
16291602
"nr_iter": default_spa_parameters.nr_iter_3d,
1630-
"picker_id": other_options["picker_ispyb_id"],
16311603
"refined_class_uuid": _refine_murfey_id(
16321604
refine_dir=refine_params.refine_dir,
16331605
tag=refine_params.tag,
@@ -1762,7 +1734,6 @@ def _register_bfactors(message: dict, _db):
17621734
"particle_diameter": relion_options["particle_diameter"],
17631735
"mask_diameter": relion_options["mask_diameter"] or 0,
17641736
"node_creator_queue": machine_config.node_creator_queue,
1765-
"picker_id": feedback_params.picker_ispyb_id,
17661737
"refined_grp_uuid": bfactor_params.refined_grp_uuid,
17671738
"refined_class_uuid": bfactor_params.refined_class_uuid,
17681739
"session_id": message["session_id"],

src/murfey/util/db.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,6 @@ class ProcessingJob(SQLModel, table=True): # type: ignore
339339
auto_proc_programs: List["AutoProcProgram"] = Relationship(
340340
back_populates="processing_job", sa_relationship_kwargs={"cascade": "delete"}
341341
)
342-
selection_stash: List["SelectionStash"] = Relationship(
343-
back_populates="processing_job", sa_relationship_kwargs={"cascade": "delete"}
344-
)
345342
particle_sizes: List["ParticleSizes"] = Relationship(
346343
back_populates="processing_job", sa_relationship_kwargs={"cascade": "delete"}
347344
)
@@ -393,15 +390,6 @@ class PreprocessStash(SQLModel, table=True): # type: ignore
393390
foil_hole: Optional["FoilHole"] = Relationship(back_populates="preprocess_stashes")
394391

395392

396-
class SelectionStash(SQLModel, table=True): # type: ignore
397-
id: Optional[int] = Field(default=None, primary_key=True)
398-
class_selection_score: float
399-
pj_id: int = Field(foreign_key="processingjob.processingJobId")
400-
processing_job: Optional[ProcessingJob] = Relationship(
401-
back_populates="selection_stash"
402-
)
403-
404-
405393
class TomographyProcessingParameters(SQLModel, table=True): # type: ignore
406394
dcg_id: int = Field(
407395
primary_key=True, foreign_key="datacollectiongroup.dataCollectionGroupId"
@@ -717,7 +705,6 @@ class ClassificationFeedbackParameters(SQLModel, table=True): # type: ignore
717705
initial_model: str
718706
next_job: int
719707
picker_murfey_id: Optional[int] = Field(default=None, foreign_key="murfeyledger.id")
720-
picker_ispyb_id: Optional[int] = None
721708
processing_job: Optional[ProcessingJob] = Relationship(
722709
back_populates="classification_feedback_parameters"
723710
)

src/murfey/workflows/spa/flush_spa_preprocess.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ def register_foil_hole(
297297
)
298298
fh_data = SmartEMFoilHoleData(
299299
id=str(foil_hole_params.name),
300+
gridsquare_id=str(gs.name),
300301
gridsquare_uuid=gs.smartem_uuid,
301302
x_location=(
302303
int(foil_hole_params.x_location)

0 commit comments

Comments
 (0)