|
3 | 3 | of the sessions that Murfey is overseeing, along with the relationships between them. |
4 | 4 | """ |
5 | 5 |
|
| 6 | +from __future__ import annotations |
| 7 | + |
6 | 8 | from datetime import datetime |
7 | 9 | from typing import List, Optional |
8 | 10 |
|
@@ -230,58 +232,67 @@ class CLEMImageMetadata(SQLModel, table=True): # type: ignore |
230 | 232 |
|
231 | 233 | class CLEMImageSeries(SQLModel, table=True): # type: ignore |
232 | 234 | """ |
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 |
234 | 236 | processed together as a group. These files could stem from a parent LIF file, or |
235 | 237 | have been compiled together from individual TIFF files. |
236 | 238 | """ |
237 | 239 |
|
238 | | - id: Optional[int] = Field(default=None, primary_key=True) |
| 240 | + id: int | None = Field(default=None, primary_key=True) |
239 | 241 | series_name: str = Field( |
240 | 242 | index=True |
241 | 243 | ) # Name of the series, as determined from the metadata |
| 244 | + search_string: str | None = Field(default=None) # Path for globbing with |
242 | 245 |
|
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" |
248 | 255 | ) |
| 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) |
249 | 261 |
|
250 | 262 | # The parent LIF file this series originates from, if any |
251 | | - parent_lif: Optional["CLEMLIFFile"] = Relationship( |
| 263 | + parent_lif: CLEMLIFFile | None = Relationship( |
252 | 264 | back_populates="child_series", |
253 | 265 | ) # Many to one |
254 | | - parent_lif_id: Optional[int] = Field( |
| 266 | + parent_lif_id: int | None = Field( |
255 | 267 | foreign_key="clemliffile.id", |
256 | 268 | default=None, |
257 | 269 | ) |
258 | 270 |
|
259 | 271 | # 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( |
261 | 273 | back_populates="child_series", sa_relationship_kwargs={"cascade": "delete"} |
262 | 274 | ) # One to many |
263 | 275 |
|
264 | 276 | # Metadata file for this series |
265 | | - associated_metadata: Optional["CLEMImageMetadata"] = Relationship( |
| 277 | + associated_metadata: CLEMImageMetadata | None = Relationship( |
266 | 278 | back_populates="associated_series", |
267 | 279 | ) # One to one |
268 | | - metadata_id: Optional[int] = Field( |
| 280 | + metadata_id: int | None = Field( |
269 | 281 | foreign_key="clemimagemetadata.id", |
270 | 282 | default=None, |
271 | 283 | ) |
272 | 284 |
|
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( |
275 | 287 | back_populates="parent_series", |
276 | 288 | sa_relationship_kwargs={"cascade": "delete"}, |
277 | 289 | ) # One to many |
278 | | - |
279 | | - # Process checklist for series |
280 | 290 | number_of_members: int = ( |
281 | 291 | 0 # Expected number of image stacks belonging to this series |
282 | 292 | ) |
| 293 | + |
| 294 | + # Composite images |
283 | 295 | composite_created: bool = False # Has a composite image been created? |
284 | | - composite_image: Optional[str] = None # Full path to composite image |
285 | 296 |
|
286 | 297 |
|
287 | 298 | class CLEMImageStack(SQLModel, table=True): # type: ignore |
@@ -389,6 +400,10 @@ class DataCollectionGroup(SQLModel, table=True): # type: ignore |
389 | 400 | back_populates="data_collection_group", |
390 | 401 | sa_relationship_kwargs={"cascade": "delete"}, |
391 | 402 | ) |
| 403 | + clem_image_series: list["CLEMImageSeries"] = Relationship( |
| 404 | + back_populates="data_collection_group", |
| 405 | + sa_relationship_kwargs={"cascade": "delete"}, |
| 406 | + ) |
392 | 407 | notification_parameters: List["NotificationParameter"] = Relationship( |
393 | 408 | back_populates="data_collection_group", |
394 | 409 | sa_relationship_kwargs={"cascade": "delete"}, |
@@ -591,6 +606,9 @@ class GridSquare(SQLModel, table=True): # type: ignore |
591 | 606 | pixel_size: Optional[float] = None |
592 | 607 | image: str = "" |
593 | 608 | 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 | + ) |
594 | 612 | foil_holes: List["FoilHole"] = Relationship( |
595 | 613 | back_populates="grid_square", sa_relationship_kwargs={"cascade": "delete"} |
596 | 614 | ) |
|
0 commit comments