Skip to content

Commit fe9abef

Browse files
Remove the need for a picker id during classification (#764)
Inserting the picker id into the ParticleClassificationGroup table in ispyb creates a race condition which we have previously worked around. Given the picker id is optional we should just not do this. Particularly needed for doppio live.
1 parent 51a324e commit fe9abef

5 files changed

Lines changed: 1 addition & 111 deletions

File tree

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/picking.py

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99
from murfey.server import _transport_object
1010
from murfey.server.feedback import (
1111
_app_id,
12-
_flush_class2d,
1312
_pj_id,
14-
_register_class_selection,
1513
)
1614
from murfey.util.config import get_machine_config
1715
from murfey.util.db import (
@@ -24,7 +22,6 @@
2422
NotificationValue,
2523
ParticleSizes,
2624
ProcessingJob,
27-
SelectionStash,
2825
Session as MurfeySession,
2926
SPARelionParameters,
3027
)
@@ -84,40 +81,8 @@ def _register_picked_particles_use_diameter(message: dict, _db: Session):
8481
select(SPARelionParameters).where(SPARelionParameters.pj_id == pj_id)
8582
).one()
8683
relion_options = dict(relion_params)
87-
feedback_params = _db.exec(
88-
select(ClassificationFeedbackParameters).where(
89-
ClassificationFeedbackParameters.pj_id == pj_id
90-
)
91-
).one()
92-
9384
particle_diameter = relion_params.particle_diameter
9485

95-
if feedback_params.picker_ispyb_id is None:
96-
if not _transport_object:
97-
feedback_params.picker_ispyb_id = 1000
98-
else:
99-
assert feedback_params.picker_murfey_id is not None
100-
feedback_params.picker_ispyb_id = _transport_object.do_buffer_lookup(
101-
message["program_id"], feedback_params.picker_murfey_id
102-
)
103-
if feedback_params.picker_ispyb_id is not None:
104-
_flush_class2d(message["session_id"], message["program_id"], _db)
105-
_db.add(feedback_params)
106-
_db.commit()
107-
selection_stash = _db.exec(
108-
select(SelectionStash).where(SelectionStash.pj_id == pj_id)
109-
).all()
110-
for s in selection_stash:
111-
_register_class_selection(
112-
{
113-
"session_id": s.session_id,
114-
"class_selection_score": s.class_selection_score or 0,
115-
},
116-
_db=_db,
117-
)
118-
_db.delete(s)
119-
_db.commit()
120-
12186
if not particle_diameter:
12287
# If the diameter has not been calculated then find it
12388
picking_db = _db.exec(
@@ -256,34 +221,6 @@ def _register_picked_particles_use_boxsize(message: dict, _db: Session):
256221
relion_params = _db.exec(
257222
select(SPARelionParameters).where(SPARelionParameters.pj_id == pj_id)
258223
).one()
259-
feedback_params = _db.exec(
260-
select(ClassificationFeedbackParameters).where(
261-
ClassificationFeedbackParameters.pj_id == pj_id
262-
)
263-
).one()
264-
265-
if feedback_params.picker_ispyb_id is None and _transport_object:
266-
assert feedback_params.picker_murfey_id is not None
267-
feedback_params.picker_ispyb_id = _transport_object.do_buffer_lookup(
268-
message["program_id"], feedback_params.picker_murfey_id
269-
)
270-
if feedback_params.picker_ispyb_id is not None:
271-
_flush_class2d(message["session_id"], message["program_id"], _db)
272-
_db.add(feedback_params)
273-
_db.commit()
274-
selection_stash = _db.exec(
275-
select(SelectionStash).where(SelectionStash.pj_id == pj_id)
276-
).all()
277-
for s in selection_stash:
278-
_register_class_selection(
279-
{
280-
"session_id": s.session_id,
281-
"class_selection_score": s.class_selection_score or 0,
282-
},
283-
_db=_db,
284-
)
285-
_db.delete(s)
286-
_db.commit()
287224

288225
# Send the message to extraction with the box sizes
289226
zocalo_message: dict = {

src/murfey/workflows/tomo/picking.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ def _register_picked_tomogram_use_diameter(message: dict, murfey_db: Session):
135135
"autoproc_program_id": _app_id(pj_id, murfey_db),
136136
"batch_size": default_tomo_parameters.batch_size_2d,
137137
"nr_classes": default_tomo_parameters.nr_classes_2d,
138-
"picker_id": None,
139138
"class2d_grp_uuid": class2d_grp_uuid,
140139
"class_uuids": class_uuids,
141140
"next_job": feedback_params.next_job,
@@ -177,7 +176,6 @@ def _register_picked_tomogram_use_diameter(message: dict, murfey_db: Session):
177176
"autoproc_program_id": _app_id(pj_id, murfey_db),
178177
"batch_size": default_tomo_parameters.batch_size_2d,
179178
"nr_classes": default_tomo_parameters.nr_classes_2d,
180-
"picker_id": None,
181179
"class2d_grp_uuid": class2d_grp_uuid,
182180
"class_uuids": class_uuids,
183181
"next_job": feedback_params.next_job,

tests/workflows/tomo/test_tomo_picking.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,6 @@ def test_picked_tomogram_run_class2d_with_diameter(
222222
"autoproc_program_id": 0,
223223
"batch_size": 5000,
224224
"nr_classes": 5,
225-
"picker_id": None,
226225
"class2d_grp_uuid": 6,
227226
"class_uuids": {str(i): i for i in range(1, 6)},
228227
"next_job": 9,
@@ -312,7 +311,6 @@ def test_picked_tomogram_run_class2d_estimate_diameter(
312311
"autoproc_program_id": 0,
313312
"batch_size": 5000,
314313
"nr_classes": 5,
315-
"picker_id": None,
316314
"class2d_grp_uuid": 12,
317315
"class_uuids": {str(i): i + 6 for i in range(1, 6)},
318316
"next_job": 9,
@@ -336,7 +334,6 @@ def test_picked_tomogram_run_class2d_estimate_diameter(
336334
"autoproc_program_id": 0,
337335
"batch_size": 5000,
338336
"nr_classes": 5,
339-
"picker_id": None,
340337
"class2d_grp_uuid": 18,
341338
"class_uuids": {str(i): i + 12 for i in range(1, 6)},
342339
"next_job": 11,

0 commit comments

Comments
 (0)