Skip to content

Commit c5aca0c

Browse files
committed
Updated Murfey database to integrate CLEM workflow with ISPyB
* Linked 'CLEMImageSeries' to 'DataCollectionGroup' and 'GridSquare' * Tried modern type hinting notation in 'CLEMImageSeries' table * Added new columns to 'CLEMImageSeries' to keep track of image search string (for globbing images with) and type of dataset (i.e., atlas or grid square) * Removed 'composite_image' column from 'CLEMImageSeries'
1 parent f511242 commit c5aca0c

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

src/murfey/util/db.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
of the sessions that Murfey is overseeing, along with the relationships between them.
44
"""
55

6+
from __future__ import annotations
7+
68
from datetime import datetime
79
from typing import List, Optional
810

@@ -230,58 +232,67 @@ class CLEMImageMetadata(SQLModel, table=True): # type: ignore
230232

231233
class CLEMImageSeries(SQLModel, table=True): # type: ignore
232234
"""
233-
Database recording the individual files associated with a series, which are to be
235+
Database recording the files and metadata associated with a series, which are to be
234236
processed together as a group. These files could stem from a parent LIF file, or
235237
have been compiled together from individual TIFF files.
236238
"""
237239

238-
id: Optional[int] = Field(default=None, primary_key=True)
240+
id: int | None = Field(default=None, primary_key=True)
239241
series_name: str = Field(
240242
index=True
241243
) # Name of the series, as determined from the metadata
244+
search_string: str | None = Field(default=None) # Path for globbing with
242245

243-
session: Optional["Session"] = Relationship(
244-
back_populates="image_series"
245-
) # Many to one
246-
session_id: Optional[int] = Field(
247-
foreign_key="session.id", default=None, unique=False
246+
session: Session | None = Relationship(back_populates="image_series") # Many to one
247+
session_id: int | None = Field(foreign_key="session.id", default=None, unique=False)
248+
249+
# Type of data (atlas/overview or grid square)
250+
data_type: str = Field(default="") # "atlas" or "grid_square"
251+
252+
# Link to data collection group
253+
data_collection_group: DataCollectionGroup | None = Relationship(
254+
back_populates="clem_image_series"
248255
)
256+
dcg_id: int | None = Field(foreign_key="datacollectiongroup.id", default=None)
257+
258+
# Link to grid squares
259+
grid_square: GridSquare | None = Relationship(back_populates="clem_image_series")
260+
grid_square_id: int | None = Field(foreign_key="gridsquare.id", default=None)
249261

250262
# The parent LIF file this series originates from, if any
251-
parent_lif: Optional["CLEMLIFFile"] = Relationship(
263+
parent_lif: CLEMLIFFile | None = Relationship(
252264
back_populates="child_series",
253265
) # Many to one
254-
parent_lif_id: Optional[int] = Field(
266+
parent_lif_id: int | None = Field(
255267
foreign_key="clemliffile.id",
256268
default=None,
257269
)
258270

259271
# The parent TIFF files used to build up the image stacks in the series, if any
260-
parent_tiffs: List["CLEMTIFFFile"] = Relationship(
272+
parent_tiffs: list[CLEMTIFFFile] = Relationship(
261273
back_populates="child_series", sa_relationship_kwargs={"cascade": "delete"}
262274
) # One to many
263275

264276
# Metadata file for this series
265-
associated_metadata: Optional["CLEMImageMetadata"] = Relationship(
277+
associated_metadata: CLEMImageMetadata | None = Relationship(
266278
back_populates="associated_series",
267279
) # One to one
268-
metadata_id: Optional[int] = Field(
280+
metadata_id: int | None = Field(
269281
foreign_key="clemimagemetadata.id",
270282
default=None,
271283
)
272284

273-
# Databases of the image stacks that comprise this series
274-
child_stacks: List["CLEMImageStack"] = Relationship(
285+
# Image stack entries that are part of this series
286+
child_stacks: list[CLEMImageStack] = Relationship(
275287
back_populates="parent_series",
276288
sa_relationship_kwargs={"cascade": "delete"},
277289
) # One to many
278-
279-
# Process checklist for series
280290
number_of_members: int = (
281291
0 # Expected number of image stacks belonging to this series
282292
)
293+
294+
# Composite images
283295
composite_created: bool = False # Has a composite image been created?
284-
composite_image: Optional[str] = None # Full path to composite image
285296

286297

287298
class CLEMImageStack(SQLModel, table=True): # type: ignore
@@ -389,6 +400,10 @@ class DataCollectionGroup(SQLModel, table=True): # type: ignore
389400
back_populates="data_collection_group",
390401
sa_relationship_kwargs={"cascade": "delete"},
391402
)
403+
clem_image_series: list["CLEMImageSeries"] = Relationship(
404+
back_populates="data_collection_group",
405+
sa_relationship_kwargs={"cascade": "delete"},
406+
)
392407
notification_parameters: List["NotificationParameter"] = Relationship(
393408
back_populates="data_collection_group",
394409
sa_relationship_kwargs={"cascade": "delete"},
@@ -591,6 +606,9 @@ class GridSquare(SQLModel, table=True): # type: ignore
591606
pixel_size: Optional[float] = None
592607
image: str = ""
593608
session: Optional[Session] = Relationship(back_populates="grid_squares")
609+
clem_image_series: list["CLEMImageSeries"] = Relationship(
610+
back_populates="grid_square", sa_relationship_kwargs={"cascade": "delete"}
611+
)
594612
foil_holes: List["FoilHole"] = Relationship(
595613
back_populates="grid_square", sa_relationship_kwargs={"cascade": "delete"}
596614
)

0 commit comments

Comments
 (0)