Source code for attitude.orientation.grouped

from .pca import PCAOrientation, centered
import numpy as N
from copy import copy
"""
A helper class and functions for grouped orientations
"""
[docs]class GroupedPlaneError(Exception): pass
[docs]class GroupedOrientation(PCAOrientation): def __init__(self, *orientations, **kwargs): self.same_plane = kwargs.pop("same_plane", False) all_values = N.vstack([o.array for o in orientations]) if self.same_plane: array = all_values else: array = N.vstack([o.centered_array for o in orientations]) for o in orientations: if hasattr(o,'members'): raise GroupedPlaneError("Cannot group already-grouped planes") o.member_of = self self.members = orientations super().__init__(array,**kwargs) self.mean = all_values.mean(axis=0)
[docs] def to_mapping(self,**values): values.setdefault('centered_array',None) values['members'] = [a.hash for a in self.members] return super().to_mapping(**values)
[docs]def create_groups(orientations, *groups, **kwargs): """ Create groups of an orientation measurement dataset """ grouped = [] # Copy all datasets to be safe (this could be bad for # memory usage, so can be disabled). if kwargs.pop('copy', True): orientations = [copy(o) for o in orientations] for o in orientations: # Get rid of and recreate group membership o.member_of = None try: grouped += o.members for a in o.members: a.member_of = o except AttributeError: pass def find(uid): try: val = next(x for x in orientations if x.hash == uid) if val in grouped: raise GroupedPlaneError("{} is already in a group." .format(val.hash)) return val except StopIteration: raise KeyError("No measurement of with hash {} found" .format(uid)) for uid_list in groups: vals = [find(uid) for uid in uid_list] o = GroupedOrientation(*vals, **kwargs) orientations.append(o) return orientations
[docs]def disable_orientations(orientations, *to_disable): for uid in to_disable: try: val = next(x for x in orientations if x.hash == uid) val.disabled = True except StopIteration: raise KeyError("No measurement of with hash {} found" .format(uid)) return orientations