Source code for arcade_collection.input.convert_to_locations_file
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
import pandas as pd
[docs]def convert_to_locations_file(samples: pd.DataFrame) -> list[dict]:
"""
Convert all samples to location objects.
Parameters
----------
samples
Sample cell ids and coordinates.
Returns
-------
:
List of location objects formatted for ARCADE.
"""
locations: list[dict] = []
samples_by_id = samples.groupby("id")
for i, (_, group) in enumerate(samples_by_id):
locations.append(convert_to_location(i + 1, group))
return locations
[docs]def convert_to_location(cell_id: int, samples: pd.DataFrame) -> dict:
"""
Convert samples to location object.
Parameters
----------
cell_id
Unique cell id.
samples
Sample coordinates for a single object.
Returns
-------
:
Location object formatted for ARCADE.
"""
center = get_center_voxel(samples)
if "region" in samples.columns and not samples["region"].isna().all():
voxels = [
{"region": region, "voxels": get_location_voxels(samples, region)}
for region in samples["region"].unique()
]
else:
voxels = [{"region": "UNDEFINED", "voxels": get_location_voxels(samples)}]
return {
"id": cell_id,
"center": center,
"location": voxels,
}
[docs]def get_center_voxel(samples: pd.DataFrame) -> tuple[int, int, int]:
"""
Get coordinates of center voxel of samples.
Parameters
----------
samples
Sample cell ids and coordinates.
Returns
-------
:
Center voxel.
"""
center_x = int(samples["x"].mean())
center_y = int(samples["y"].mean())
center_z = int(samples["z"].mean())
return (center_x, center_y, center_z)
[docs]def get_location_voxels(
samples: pd.DataFrame, region: str | None = None
) -> list[tuple[int, int, int]]:
"""
Get list of voxel coordinates from samples dataframe.
Parameters
----------
samples
Sample cell ids and coordinates.
region
Region key.
Returns
-------
:
List of voxel coordinates.
"""
if region is not None:
region_samples = samples[samples["region"] == region]
voxels_x = region_samples["x"]
voxels_y = region_samples["y"]
voxels_z = region_samples["z"]
else:
voxels_x = samples["x"]
voxels_y = samples["y"]
voxels_z = samples["z"]
return list(zip(voxels_x, voxels_y, voxels_z))