Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added default_open field to details section of datasets #140

Merged
merged 5 commits into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 122 additions & 42 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))
file_paths = sorted(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
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"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"
}
Loading
Loading