diff --git a/src/geomtree/geomtree.py b/src/geomtree/geomtree.py index 2e4515d7386ad5def634221f137d8859a44b57a7..16a8a04b025a89e79b324d5bc660d7515258740e 100644 --- a/src/geomtree/geomtree.py +++ b/src/geomtree/geomtree.py @@ -8,14 +8,16 @@ from scipy.linalg import svd, det class GeomTree(Tree): - __slots__ = 'my_geometry' + __slots__ = 'my_geometry', 'my_subtree_geometry' def __init__(self,tf=None): super().__init__() if tf is not None: self.my_geometry = tf + self.compute_subtree_geometry() else: self.my_geometry = AffineTransform() + self.compute_subtree_geometry() def get_actor(self,axis=False,alpha=0.95,opacity=0.2,show_ellipsoid=True): actors = [] @@ -50,6 +52,15 @@ class GeomTree(Tree): geometry.update(child.get_geometry()) return geometry + def compute_subtree_geometry(self): + from geomtree.point_cloud import PointCloud + pts=[] + qr = np.sqrt(chi2.ppf(0.95, 3)) + for st in self.list_of_subtrees(): + tf=st.my_geometry + pts.append(np.array([tf.translation + qr*a for a in tf.linear.T]+[tf.translation - qr*a for a in tf.linear.T])) + self.subtree_geometry = minimal_volume_enclosing_ellipsoid(PointCloud(pts)) + def align_centers(t1,t2,tree_type="unordered", rmsd=True): """ If the two trees are isomorphic, find the best alignment of centers of the two trees via Kabsch algorithm