Source code for arcade_collection.convert.convert_to_simularium_objects

import numpy as np
import pandas as pd

from arcade_collection.convert.convert_to_simularium import convert_to_simularium


[docs]def convert_to_simularium_objects( series_key: str, simulation_type: str, categories: pd.DataFrame, regions: list[str], frame_spec: tuple[int, int, int], box: tuple[int, int, int], ds: tuple[float, float, float], dt: float, colors: dict[str, str], group_size: int, url: str, jitter: float = 1.0, ) -> str: """ Convert data to Simularium trajectory using mesh objects. Parameters ---------- series_key Simulation series key. simulation_type : {'potts'} Simulation type. categories Simulation data containing ID, FRAME, and CATEGORY. regions List of regions. frame_spec Specification for simulation ticks. box Size of bounding box. ds Spatial scaling in um/voxel. dt Temporal scaling in hours/tick. colors Map of category to colors. group_size Number of objects in each mesh group. url URL for mesh object files. jitter Relative jitter applied to colors (set to 0 for exact colors). Returns ------- : Simularium trajectory. """ if simulation_type == "potts": frames = list(map(int, np.arange(*frame_spec))) length, width, height = box data = format_potts_for_objects( categories, frames, group_size, regions, length, width, height ) else: message = f"invalid simulation type {simulation_type}" raise ValueError(message) return convert_to_simularium( series_key, simulation_type, data, length, width, height, ds, dt, colors, url, jitter )
[docs]def format_potts_for_objects( categories: pd.DataFrame, frames: list[int], group_size: int, regions: list[str], length: int, width: int, height: int, ) -> pd.DataFrame: """ Format ``potts`` simulation data for object-based Simularium trajectory. Parameters ---------- categories Simulation data containing ID, FRAME, and CATEGORY. frames List of frames. group_size Number of objects in each mesh group. regions List of regions. length Length of bounding box. width Width of bounding box. height Height of bounding box. Returns ------- : Data formatted for trajectory. """ data: list[list[object]] = [] center = [length / 2, width / 2, height / 2] for frame in frames: frame_categories = categories[categories["FRAME"] == frame] index_offset = 0 for category, category_group in frame_categories.groupby("CATEGORY"): ids = list(category_group["ID"].values) group_ids = [ids[i : i + group_size] for i in range(0, len(ids), group_size)] for i, _ in enumerate(group_ids): index = i + index_offset for region in regions: name = f"{region}#{category}#{index}#{frame}" data = [*data, [name, int(frame), 1, *center, [], "OBJ"]] index_offset = index_offset + len(group_ids) return pd.DataFrame( data, columns=["name", "frame", "radius", "x", "y", "z", "points", "display"] )