Skip to content

Commit

Permalink
added default_open field to details section of datasets
Browse files Browse the repository at this point in the history
  • Loading branch information
sherwoodf committed Aug 6, 2024
1 parent 2570be2 commit b8a10ac
Show file tree
Hide file tree
Showing 3 changed files with 210 additions and 49 deletions.
162 changes: 121 additions & 41 deletions bia-export/bia_export/website_conversion.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@

from pathlib import Path
import json
import logging
from .website_models import (
Study,
ExperimentalImagingDataset
ExperimentalImagingDataset,
ImageAcquisition,
BioSample,
SpecimenGrowthProtocol,
SpecimenImagingPrepartionProtocol,
)
from glob import glob
from typing import List, Type
Expand All @@ -20,88 +23,165 @@ def read_api_json_file(file_path: Path, object_type: Type[BaseModel]) -> BaseMod
"""
with open(file_path, "r") as object_file:
object_dict = json.load(object_file)

return object_type(**object_dict)


def read_all_json(directory_path: Path, object_type: Type[BaseModel]) -> List[BaseModel]:
def read_all_json(
directory_path: Path, object_type: Type[BaseModel]
) -> List[BaseModel]:
object_list = []
file_paths = glob(str(directory_path))
for file_path in file_paths:
object_list.append(read_api_json_file(file_path, object_type))
return object_list


def find_associated_objects(typed_associations: set, directory_path: Path, object_type: Type[BaseModel]) -> List[bia_data_model.UserIdentifiedObject]:
def find_associated_objects(
typed_associations: set,
directory_path: Path,
object_type: Type[bia_data_model.UserIdentifiedObject],
) -> List[dict]:
linked_object = []

if len(typed_associations) == 0:
return linked_object

typed_object_in_study: List[bia_data_model.UserIdentifiedObject] = read_all_json(directory_path, object_type)

typed_object_in_study: List[bia_data_model.UserIdentifiedObject] = read_all_json(
directory_path, object_type
)
for object in typed_object_in_study:
if object.title_id in typed_associations:
linked_object.append(object)
linked_object.append(object.model_dump())
return linked_object


def create_study(
accession_id: str,
root_directory: Path
) -> Study:

def create_study(accession_id: str, root_directory: Path) -> Study:

if root_directory:
study_path = root_directory.joinpath(f'studies/{accession_id}.json')
study_path = root_directory.joinpath(f"studies/{accession_id}.json")

logger.info(f"Loading study from {study_path}")

logger.info(f'Loading study from {study_path}')

api_study = read_api_json_file(study_path, bia_data_model.Study)
else:
#TODO: use client
# TODO: use client
raise NotImplementedError
study_dict = api_study.model_dump()
study_dict["experimental_imaging_component"] = create_experimental_imaging_datasets(accession_id, root_directory)
study_dict["experimental_imaging_component"] = create_experimental_imaging_datasets(
accession_id, root_directory
)
study = Study(**study_dict)

return study


def create_experimental_imaging_datasets(accession_id: str, root_directory: Path = None) -> List[ExperimentalImagingDataset]:
def create_experimental_imaging_datasets(
accession_id: str, root_directory: Path = None
) -> List[ExperimentalImagingDataset]:
eid_list = []
if root_directory:

eid_directory = root_directory.joinpath(f'experimental_imaging_datasets/{accession_id}/*.json')

api_eids: List[bia_data_model.ExperimentalImagingDataset] = read_all_json(eid_directory, bia_data_model.ExperimentalImagingDataset)

eid_directory = root_directory.joinpath(
f"experimental_imaging_datasets/{accession_id}/*.json"
)

api_eids: List[bia_data_model.ExperimentalImagingDataset] = read_all_json(
eid_directory, bia_data_model.ExperimentalImagingDataset
)

detail_map = {
ImageAcquisition: {
"source_directory": "image_acquisitions",
"association_field": "image_acquisition",
"bia_type": bia_data_model.ImageAcquisition,
"previously_displayed": set(),
},
BioSample: {
"source_directory": "biosamples",
"association_field": "biosample",
"bia_type": bia_data_model.BioSample,
"previously_displayed": set(),
},
SpecimenImagingPrepartionProtocol: {
"source_directory": "specimen_imaging_preparation_protocols",
"association_field": "specimen",
"bia_type": bia_data_model.SpecimenImagingPrepartionProtocol,
"previously_displayed": set(),
},
SpecimenGrowthProtocol: {
"source_directory": "specimen_growth_protocols",
"association_field": "specimen",
"bia_type": bia_data_model.SpecimenGrowthProtocol,
"previously_displayed": set(),
},
}

def process_details_section(
root_directory: Path,
accession_id: str,
detail_map_info: dict,
typed_associations: set,
):

detail_path = root_directory.joinpath(
f"{detail_map_info['source_directory']}/{accession_id}/*.json"
)
detail_linked_to_dataset = find_associated_objects(
typed_associations,
detail_path,
detail_map_info["bia_type"],
)

for detail in detail_linked_to_dataset:
if detail["uuid"] not in detail_map_info["previously_displayed"]:
detail["default_open"] = True
detail_map_info["previously_displayed"].add(detail["uuid"])
else:
detail["default_open"] = False

return detail_linked_to_dataset

for eid in api_eids:
eid_dict = eid.model_dump()

associations = eid.attribute["associations"]

association_by_type = {"biosample": set(), "image_acquisition": set(), "specimen": set()}
association_by_type = {
"biosample": set(),
"image_acquisition": set(),
"specimen": set(),
}
for association in associations:
for key in association_by_type.keys():
association_by_type[key].add(association[key])


biosample_directory = root_directory.joinpath(f'biosamples/{accession_id}/*.json')
sipp_directory = root_directory.joinpath(f'specimen_imaging_preparation_protocols/{accession_id}/*.json')
sgp_directory = root_directory.joinpath(f'specimen_growth_protocols/{accession_id}/*.json')
ia_directory = root_directory.joinpath(f'image_acquisitions/{accession_id}/*.json')

biosample_linked_to_dataset = find_associated_objects(association_by_type["biosample"], biosample_directory, bia_data_model.BioSample)
sipp_linked_to_dataset = find_associated_objects(association_by_type["specimen"], sipp_directory, bia_data_model.SpecimenImagingPrepartionProtocol)
sgps_linked_to_dataset = find_associated_objects(association_by_type["specimen"], sgp_directory, bia_data_model.SpecimenGrowthProtocol)
ia_linked_to_dataset = find_associated_objects(association_by_type["image_acquisition"], ia_directory, bia_data_model.ImageAcquisition)

eid_dict["biological_entity"] = biosample_linked_to_dataset
eid_dict["specimen_imaging_preparation_protocol"] = sipp_linked_to_dataset
eid_dict["specimen_growth_protocol"] = sgps_linked_to_dataset
eid_dict["acquisition_process"] = ia_linked_to_dataset
eid_dict["biological_entity"] = process_details_section(
root_directory,
accession_id,
detail_map[BioSample],
association_by_type["biosample"],
)
eid_dict["specimen_imaging_preparation_protocol"] = process_details_section(
root_directory,
accession_id,
detail_map[SpecimenImagingPrepartionProtocol],
association_by_type["specimen"],
)
eid_dict["specimen_growth_protocol"] = process_details_section(
root_directory,
accession_id,
detail_map[BioSample],
association_by_type["specimen"],
)
eid_dict["acquisition_process"] = process_details_section(
root_directory,
accession_id,
detail_map[ImageAcquisition],
association_by_type["image_acquisition"],
)

eid = ExperimentalImagingDataset(**eid_dict)
eid_list.append(eid)

return eid_list

44 changes: 36 additions & 8 deletions bia-export/bia_export/website_models.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,51 @@
from __future__ import annotations
from pydantic import Field
from pydantic import Field, BaseModel
from typing import List, Optional
from bia_shared_datamodels import bia_data_model


class Study(bia_data_model.Study):
experimental_imaging_component: Optional[List[ExperimentalImagingDataset]] = Field(default_factory=list, description="""A dataset of that is associated with the study.""")
experimental_imaging_component: Optional[List[ExperimentalImagingDataset]] = Field(
default_factory=list,
description="""A dataset of that is associated with the study.""",
)


class ExperimentalImagingDataset(bia_data_model.ExperimentalImagingDataset):
acquisition_process: list[bia_data_model.ImageAcquisition] = Field(
acquisition_process: list[ImageAcquisition] = Field(
description="""Processes involved in the creation of the images and files in this dataset."""
)
specimen_imaging_preparation_protocol: list[bia_data_model.SpecimenImagingPrepartionProtocol] = Field(
description="""Processes involved in the preprapartion of the samples for imaged."""
specimen_imaging_preparation_protocol: list[SpecimenImagingPrepartionProtocol] = (
Field(
description="""Processes involved in the preprapartion of the samples for imaged."""
)
)
biological_entity: list[bia_data_model.BioSample] = Field(
biological_entity: list[BioSample] = Field(
description="""The biological entity or entities that were imaged."""
)
specimen_growth_protocol: Optional[list[bia_data_model.SpecimenGrowthProtocol]] = Field(
description="""Processes involved in the growth of the samples that were then imaged."""
specimen_growth_protocol: Optional[list[SpecimenGrowthProtocol]] = Field(
default_factory=list,
description="""Processes involved in the growth of the samples that were then imaged.""",
)


class DetailSection(BaseModel):
default_open: bool = Field()


class ImageAcquisition(bia_data_model.ImageAcquisition, DetailSection):
pass


class BioSample(bia_data_model.BioSample, DetailSection):
pass


class SpecimenGrowthProtocol(bia_data_model.SpecimenGrowthProtocol, DetailSection):
pass


class SpecimenImagingPrepartionProtocol(
bia_data_model.SpecimenImagingPrepartionProtocol, DetailSection
):
pass
53 changes: 53 additions & 0 deletions bia-export/test/output_data/bia_export.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
"submitted_in_study_uuid": "a2fdbd58-ee11-4cd9-bc6a-f3d3da7fff71",
"acquisition_process": [
{
"default_open": true,
"title_id": "Test Primary Screen Image Acquisition",
"uuid": "c2e44a1b-a43c-476e-8ddf-8587f4c955b3",
"version": 1,
Expand All @@ -126,6 +127,7 @@
],
"specimen_imaging_preparation_protocol": [
{
"default_open": true,
"title_id": "Test specimen 1",
"uuid": "7199d730-29f1-4ad8-b599-e9089cbb2d7b",
"version": 1,
Expand All @@ -139,6 +141,7 @@
],
"biological_entity": [
{
"default_open": true,
"title_id": "Test Biosample 1",
"uuid": "64a67727-4e7c-469a-91c4-6219ae072e99",
"version": 1,
Expand All @@ -165,6 +168,7 @@
]
},
{
"default_open": true,
"title_id": "Test Biosample 2",
"uuid": "6950718c-4917-47a1-a807-11b874e80a23",
"version": 1,
Expand Down Expand Up @@ -192,6 +196,55 @@
}
],
"specimen_growth_protocol": []
},
{
"title_id": "Study Component 2",
"uuid": "850a1ca3-9681-4a8a-b625-477936fcb954",
"version": 1,
"model": {
"type_name": "ExperimentalImagingDataset",
"version": 1
},
"description": "Description of study component 2",
"attribute": {
"associations": [
{
"image_analysis": "Test image analysis",
"image_correlation": null,
"biosample": "Test Biosample 2 ",
"image_acquisition": "Test Primary Screen Image Acquisition",
"specimen": "Test specimen 2"
}
]
},
"analysis_method": [
{
"protocol_description": "Test image analysis",
"features_analysed": "Test image analysis overview"
}
],
"correlation_method": [],
"example_image_uri": [],
"submitted_in_study_uuid": "a2fdbd58-ee11-4cd9-bc6a-f3d3da7fff71",
"acquisition_process": [
{
"default_open": false,
"title_id": "Test Primary Screen Image Acquisition",
"uuid": "c2e44a1b-a43c-476e-8ddf-8587f4c955b3",
"version": 1,
"model": {
"type_name": "ImageAcquisition",
"version": 1
},
"protocol_description": "Test image acquisition parameters 1",
"imaging_instrument_description": "Test imaging instrument 1",
"fbbi_id": [],
"imaging_method_name": "confocal microscopy"
}
],
"specimen_imaging_preparation_protocol": [],
"biological_entity": [],
"specimen_growth_protocol": []
}
]
}

0 comments on commit b8a10ac

Please sign in to comment.