Skip to content

Commit 55ca500

Browse files
committed
When registering a new data collection group check other data collections in the group for matching grid square IDs and transfer grid squares to new data collection group
Both data collection groups will use the same data collection group IDs but will differ by tag
1 parent 547956b commit 55ca500

File tree

6 files changed

+85
-7
lines changed

6 files changed

+85
-7
lines changed

src/murfey/client/contexts/spa_metadata.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ def post_transfer(
176176
logger.warning(f"Cannot find Images-Disc* in {dcg_search_dir}")
177177
return
178178
dcg_tag = str(dcg_images_dirs[-1])
179+
gs_pix_positions = get_grid_square_atlas_positions(
180+
source_visit_dir / partial_path
181+
)
179182
dcg_data = {
180183
"experiment_type": "single particle",
181184
"experiment_type_id": 37,
@@ -187,11 +190,11 @@ def post_transfer(
187190
),
188191
"sample": environment.samples[source].sample,
189192
"atlas_pixel_size": atlas_pixel_size,
193+
"grid_squares_to_match": [
194+
int(gs) for gs in gs_pix_positions.keys()
195+
],
190196
}
191197
capture_post(url, json=dcg_data)
192-
gs_pix_positions = get_grid_square_atlas_positions(
193-
source_visit_dir / partial_path
194-
)
195198
for gs, pos_data in gs_pix_positions.items():
196199
if pos_data:
197200
capture_post(
@@ -228,14 +231,15 @@ def post_transfer(
228231
logger.warning(f"Cannot find Images-Disc* in {dcg_search_dir}")
229232
return
230233
dcg_tag = str(dcg_images_dirs[-1])
234+
gs_name = transferred_file.stem.split("_")[1]
231235
dcg_data = {
232236
"experiment_type": "single particle",
233237
"experiment_type_id": 37,
234238
"tag": dcg_tag,
239+
"grid_squares_to_match": [int(gs_name)],
235240
}
236241
capture_post(url, json=dcg_data)
237242

238-
gs_name = transferred_file.stem.split("_")[1]
239243
logger.info(
240244
f"Collecting foil hole positions for {str(transferred_file)} and grid square {int(gs_name)}"
241245
)

src/murfey/server/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2508,6 +2508,8 @@ def feedback_callback(header: dict, message: dict) -> None:
25082508
.where(db.DataCollectionGroup.tag == message.get("tag"))
25092509
).all():
25102510
dcgid = dcg_murfey[0].id
2511+
elif message.get("data_collection_group_id") is not None:
2512+
dcgid = message["data_collection_group_id"]
25112513
else:
25122514
if ispyb_session_id is None:
25132515
murfey_dcg = db.DataCollectionGroup(
@@ -2575,8 +2577,8 @@ def feedback_callback(header: dict, message: dict) -> None:
25752577
message["atlas"],
25762578
message["atlas_pixel_size"],
25772579
message["sample"],
2578-
experiment_type=message["experiment_type"],
2579-
experiment_type_id=message["experiment_type_id"],
2580+
experiment_type=message.get("experiment_type", ""),
2581+
experiment_type_id=message.get("experiment_type_id"),
25802582
)
25812583
_transport_object.transport.ack(header)
25822584
return None

src/murfey/server/api/__init__.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
from murfey.server.gain import Camera, prepare_eer_gain, prepare_gain
5252
from murfey.server.murfey_db import murfey_db
5353
from murfey.util import secure_path
54+
from murfey.util.atlas import check_for_common_grid_squares, replace_grid_square_tags
5455
from murfey.util.config import MachineConfig, from_file, settings
5556
from murfey.util.db import (
5657
AutoProcProgram,
@@ -1301,6 +1302,8 @@ def get_data_collections(
13011302
def register_dc_group(
13021303
visit_name, session_id: MurfeySessionID, dcg_params: DCGroupParameters, db=murfey_db
13031304
):
1305+
# need to check for matching grid squares if nothing is found based on tag
1306+
# if that matches then grid square tags need reassigning
13041307
ispyb_proposal_code = visit_name[:2]
13051308
ispyb_proposal_number = visit_name.split("-")[0][2:]
13061309
ispyb_visit_number = visit_name.split("-")[-1]
@@ -1343,6 +1346,28 @@ def register_dc_group(
13431346
dcg_murfey[0].atlas_id = atlas_id_response["return_value"]
13441347
db.add(dcg_murfey[0])
13451348
db.commit()
1349+
elif matching_dcg := check_for_common_grid_squares(
1350+
murfey_db,
1351+
dcg_params.tag,
1352+
session_id,
1353+
grid_square_names=dcg_params.grid_squares_to_match,
1354+
):
1355+
dcg_parameters = {
1356+
"data_collection_group_id": matching_dcg[0],
1357+
"start_time": str(datetime.datetime.now()),
1358+
"experiment_type": dcg_params.experiment_type,
1359+
"experiment_type_id": dcg_params.experiment_type_id,
1360+
"tag": dcg_params.tag,
1361+
"session_id": session_id,
1362+
"atlas": dcg_params.atlas,
1363+
"sample": dcg_params.sample,
1364+
"atlas_pixel_size": dcg_params.atlas_pixel_size,
1365+
}
1366+
if _transport_object:
1367+
_transport_object.send(
1368+
_transport_object.feedback_queue, {"register": "data_collection_group", **dcg_parameters, "microscope": instrument_name, "proposal_code": ispyb_proposal_code, "proposal_number": ispyb_proposal_number, "visit_number": ispyb_visit_number} # type: ignore
1369+
)
1370+
replace_grid_square_tags(murfey_db, matching_dcg[1], dcg_params.tag)
13461371
else:
13471372
dcg_parameters = {
13481373
"start_time": str(datetime.datetime.now()),

src/murfey/util/atlas.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from typing import List, Optional, Tuple
2+
3+
from sqlmodel import Session, select
4+
5+
from murfey.util.db import DataCollectionGroup, GridSquare
6+
7+
8+
def check_for_common_grid_squares(
9+
murfey_db: Session,
10+
tag: str,
11+
session_id: int,
12+
grid_square_names: Optional[List[int]] = None,
13+
) -> Tuple[Optional[int], str]:
14+
data_collection_groups = murfey_db.exec(
15+
select(DataCollectionGroup).where(DataCollectionGroup.session_id == session_id)
16+
).all()
17+
grid_squares_matching_tag = [
18+
gs.name
19+
for gs in murfey_db.exec(
20+
select(GridSquare)
21+
.where(GridSquare.tag == tag)
22+
.where(GridSquare.session_id == session_id)
23+
).all()
24+
]
25+
if grid_square_names is not None:
26+
grid_squares_matching_tag.extend(grid_square_names)
27+
for dcg in data_collection_groups:
28+
grid_squares = murfey_db.exec(
29+
select(GridSquare).where(GridSquare.tag == dcg.tag)
30+
).all()
31+
if set(grid_squares_matching_tag).intersection(
32+
{gs.name for gs in grid_squares}
33+
):
34+
return (dcg.id, dcg.tag)
35+
return (None, "")
36+
37+
38+
def replace_grid_square_tags(murfey_db: Session, old_tag: str, new_tag: str):
39+
grid_squares = murfey_db.exec(
40+
select(GridSquare).where(GridSquare.tag == old_tag)
41+
).all()
42+
for gs in grid_squares:
43+
gs.tag = new_tag
44+
murfey_db.add(grid_squares)
45+
murfey_db.commit()
46+
murfey_db.close()

src/murfey/util/db.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ class Tilt(SQLModel, table=True): # type: ignore
348348

349349

350350
class DataCollectionGroup(SQLModel, table=True): # type: ignore
351-
id: int = Field(primary_key=True, unique=True)
351+
id: int = Field(primary_key=True)
352352
session_id: int = Field(foreign_key="session.id", primary_key=True)
353353
tag: str = Field(primary_key=True)
354354
atlas_id: Optional[int] = None

src/murfey/util/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class DCGroupParameters(BaseModel):
4848
atlas: str = ""
4949
sample: Optional[int] = None
5050
atlas_pixel_size: int = 0
51+
grid_squares_to_match: List[int] = []
5152

5253

5354
class DCParameters(BaseModel):

0 commit comments

Comments
 (0)