From 7ec075caae8d3fb64b79a2ee7f4913d43892ea83 Mon Sep 17 00:00:00 2001
From: Florian Ingels <florian.ingels@inria.fr>
Date: Fri, 3 Jun 2022 16:57:45 +0200
Subject: [PATCH] Added subtree geometry

---
 src/geomtree/geomtree.py | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/geomtree/geomtree.py b/src/geomtree/geomtree.py
index 2e4515d..16a8a04 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
-- 
GitLab