JAL-3855 auto select clusters and fix up colouring/propagation on calculation & tree...
[jalview.git] / src / jalview / datamodel / GroupSet.java
index b4d3e64..db38e7b 100644 (file)
@@ -16,12 +16,12 @@ public class GroupSet implements GroupSetI
 
   public GroupSet(GroupSet grps)
   {
-    abs=grps.abs;
-    colorMap=new HashMap<BitSet, Color>(grps.colorMap);
-    groups=new ArrayList<BitSet>(grps.groups);
-    newick=grps.newick;
-    thresh=grps.thresh;
-    treeType=grps.treeType;
+    abs = grps.abs;
+    colorMap = new HashMap<BitSet, Color>(grps.colorMap);
+    groups = new ArrayList<BitSet>(grps.groups);
+    newick = grps.newick;
+    thresh = grps.thresh;
+    treeType = grps.treeType;
   }
 
   public GroupSet()
@@ -36,7 +36,7 @@ public class GroupSet implements GroupSetI
     thresh = thresh2;
     groups = groups2;
     treeType = treeType2;
-    newick=newick2;
+    newick = newick2;
   }
 
   @Override
@@ -59,9 +59,9 @@ public class GroupSet implements GroupSetI
     return newick != null && newick.length() > 0;
   }
 
-  boolean abs=false;
+  boolean abs = false;
 
-  double thresh=0;
+  double thresh = 0;
 
   String treeType = null;
 
@@ -145,30 +145,59 @@ public class GroupSet implements GroupSetI
     return treeType;
   }
 
-  public static GroupSet makeGroups(ContactMatrixI matrix, float thresh,
+  public static GroupSet makeGroups(ContactMatrixI matrix, boolean autoCut)
+  {
+    return makeGroups(matrix, autoCut, 0, autoCut);
+  }
+  public static GroupSet makeGroups(ContactMatrixI matrix, boolean auto, float thresh,
           boolean abs)
   {
     AverageDistanceEngine clusterer = new AverageDistanceEngine(null, null,
-            matrix);
+            matrix, true);
     double height = clusterer.findHeight(clusterer.getTopNode());
+    Console.debug("Column tree height: " + height);
     String newick = new jalview.io.NewickFile(clusterer.getTopNode(), false,
             true).print();
     String treeType = "UPGMA";
     Console.trace("Newick string\n" + newick);
 
     List<BinaryNode> nodegroups;
-    if (abs ? height > thresh : 0 < thresh && thresh < 1)
+    float cut = -1f;
+    if (auto)
     {
-      float cut = abs ? (float) (thresh / height) : thresh;
-      Console.debug("Threshold " + cut + " for height=" + height);
-
-      nodegroups = clusterer.groupNodes(cut);
+      double rootw = 0;
+      int p = 2;
+      BinaryNode bn = clusterer.getTopNode();
+      while (p-- > 0 & bn.left() != null)
+      {
+        if (bn.left() != null)
+        {
+          bn = bn.left();
+        }
+        if (bn.left() != null)
+        {
+          rootw = bn.height;
+        }
+      }
+      thresh = Math.max((float) (rootw / height) - 0.01f, 0);
+      cut = thresh;
+      nodegroups = clusterer.groupNodes(thresh);
     }
     else
     {
-      nodegroups = new ArrayList<BinaryNode>();
-      nodegroups.add(clusterer.getTopNode());
+      if (abs ? (height > thresh) : (0 < thresh && thresh < 1))
+      {
+        cut = abs ? thresh : (float) (thresh * height);
+        Console.debug("Threshold " + cut + " for height=" + height);
+        nodegroups = clusterer.groupNodes(cut);
+      }
+      else
+      {
+        nodegroups = new ArrayList<BinaryNode>();
+        nodegroups.add(clusterer.getTopNode());
+      }
     }
+    
     List<BitSet> groups = new ArrayList<>();
     for (BinaryNode root : nodegroups)
     {
@@ -179,7 +208,8 @@ public class GroupSet implements GroupSetI
       }
       groups.add(gpset);
     }
-    GroupSet grps = new GroupSet(abs,thresh,groups,treeType, newick);
+    GroupSet grps = new GroupSet(abs, (cut == -1f) ? thresh : cut, groups,
+            treeType, newick);
     return grps;
   }