Source code for pymaid.fetch.landmarks

import typing as tp

import pandas as pd

from ..utils import _eval_remote_instance, DataFrameBuilder


[docs]def get_landmarks( with_locations=True, remote_instance=None ) -> tp.Tuple[ pd.DataFrame, tp.Optional[pd.DataFrame] ]: """Get all landmarks from CATMAID, optionall with locations associated with them. Parameters ---------- with_locations : bool, optional Whether to also return a location table, by default True remote_instance : pymaid.CatmaidInstance, optional Returns ------- 2-tuple of (DataFrame, optional DataFrame) The first element is a DataFrame with columns landmark_id, name, user_id, project_id, creation_time, edition_time. The second element is optionally a DataFrame with columns location_id, x, y, z, landmark_id. Examples -------- >>> # Join the two tables to find all landmark locations >>> landmarks, locations = pymaid.get_landmarks(True) >>> combined = landmarks.merge(locations, on="landmark_id") """ cm = _eval_remote_instance(remote_instance) url = cm.make_url( cm.project_id, "landmarks", with_locations="true", ) landmark_builder = DataFrameBuilder( ["landmark_id", "name", "user_id", "project_id", "creation_time", "edition_time"], ["uint64", "str", "uint64", "uint64", "datetime64[ns]", "datetime64[ns]"] ) location_builder = DataFrameBuilder( ["location_id", "x", "y", "z", "landmark_id"], ["uint64", "float64", "float64", "float64", "uint64"] ) for landmark in cm.fetch(url): landmark_builder.append_row([ landmark["id"], landmark["name"], landmark["user"], landmark["project"], landmark["creation_time"], landmark["edition_time"] ]) if not with_locations: continue for location in landmark["locations"]: location_builder.append_row( [ location["id"], location["x"], location["y"], location["z"], landmark["id"], ] ) landmarks = landmark_builder.build() if with_locations: return landmarks, location_builder.build() else: return landmarks, None
[docs]def get_landmark_groups( with_locations=False, with_members=False, remote_instance=None ) -> tp.Tuple[ pd.DataFrame, tp.Optional[pd.DataFrame], tp.Optional[tp.Dict[int, tp.List[int]]] ]: """Get the landmark groups, optionally with IDs of their members and locations. Parameters ---------- with_locations : bool, optional Return a DataFrame of locations associated with group members, by default False with_members : bool, optional Return a dict of group IDs to landmark IDs, by default False remote_instance : pymaid.CatmaidInstance, optional Returns ------- 3-tuple of (dataframe, optional dataframe, optional dict[int, int]) The first element is a DataFrame with columns group_id, name, user_id, project_id, creation_time, edition_time. The second element is optionally a DataFrame with columns location_id, x, y, z, group_id. The third element is optionally a dict mapping group ID to a list of landmark IDs (members of that group). Examples -------- >>> # Join the group and location tables >>> groups, locations, _ = pymaid.get_landmark_groups(True, False) >>> combined = groups.merge(locations, on="group_id") """ cm = _eval_remote_instance(remote_instance) url = cm.make_url( cm.project_id, "landmarks", "groups", with_locations=str(with_locations).lower(), with_members=str(with_members).lower(), ) group_builder = DataFrameBuilder( ["group_id", "name", "user_id", "project_id", "creation_time", "edition_time"], ["uint64", "str", "uint64", "uint64", "datetime64[ns]", "datetime64[ns]"] ) location_builder = DataFrameBuilder( ["location_id", "x", "y", "z", "group_id"], ["uint64", "float64", "float64", "float64", "uint64"] ) members = None if with_members: members = dict() for group in cm.fetch(url): group_builder.append_row([ group["id"], group["name"], group["user"], group["project"], group["creation_time"], group["edition_time"] ]) if members is not None: members[group["id"]] = group["members"] if not with_locations: continue for location in group["locations"]: location_builder.append_row( [ location["id"], location["x"], location["y"], location["z"], group["id"], ] ) groups = group_builder.build() if with_locations: locations = location_builder.build() else: locations = None return groups, locations, members