Skip to content

Commit

Permalink
Allow links between ids in organ metadata files
Browse files Browse the repository at this point in the history
  • Loading branch information
axdanbol committed Feb 14, 2024
1 parent 798e9b4 commit bda8bdc
Showing 1 changed file with 42 additions and 6 deletions.
48 changes: 42 additions & 6 deletions src/algorithm/algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ def run(
"""
report = AlgorithmReport(output_matrix, output_annotations, output_report)
try:
metadata = self.__load_metadata(organ, organ_metadata)
resolved_organ, metadata = self.__load_metadata(organ, organ_metadata)
result = self.do_run(matrix, organ, metadata, t.cast(Options, options))
data = self.__post_process_result(result, organ, metadata)
data = self.__post_process_result(result, resolved_organ, metadata)
report.set_success(data)
except Exception as error:
report.set_failure(error)
Expand All @@ -81,24 +81,58 @@ def do_run(
"""
...

def __load_metadata(self, organ: str, organ_metadata: Path) -> OrganMetadata:
def __load_metadata(
self, organ: str, organ_metadata: Path
) -> t.Tuple[str, OrganMetadata]:
"""Loads metadata for an organ from file.
Args:
organ (str): Organ id
organ_metadata (Path): Path to metadata file
Returns:
OrganMetadata: Organ specific metadata
t.Tuple[str, OrganMetadata]: The resolved organ id and associated metadata
Raises:
ValueError: If the organ is not supported by the algorithm
"""
with open(organ_metadata) as file:
metadata = json.load(file)
return self.__resolve_metadata(organ, organ, metadata, set())

def __resolve_metadata(
self,
original_organ: str,
organ: str,
metadata: t.Dict[str, t.Union[str, OrganMetadata]],
seen: t.Set[str],
) -> t.Tuple[str, OrganMetadata]:
"""Resolves organ and metadata following links in the metadata table.
Args:
original_organ (str): Original organ id
organ (str): Organ id
metadata (t.Dict[str, t.Union[str, OrganMetadata]]): Loaded metadata table
seen (t.Set[str]): Set of seen organ ids used to detect cycles in the metadata table
Returns:
t.Tuple[str, OrganMetadata]: The resolved organ id and associated metadata
Raises:
ValueError: If resolving metadata for the organ fails
"""
if organ not in metadata:
raise ValueError(f"Organ {organ} is not supported")
return metadata[organ]
raise ValueError(f"Organ {original_organ} is not supported")
if organ in seen:
raise ValueError(
f"Circular metadata links detected for organ {original_organ}"
)

seen.add(organ)
value = metadata[organ]
if isinstance(value, str):
return self.__resolve_metadata(original_organ, value, metadata, seen)
return organ, value

def __post_process_result(
self, result: RunResult, organ: str, metadata: OrganMetadata
Expand All @@ -107,6 +141,8 @@ def __post_process_result(
Args:
result (RunResult): Run result dictionary
organ (str): Organ id
metadata (str): Organ metadata
Returns:
anndata.AnnData: Loaded h5ad data
Expand Down

0 comments on commit bda8bdc

Please sign in to comment.