Merge branch 'develop' into features/r2_11_2_alphafold/JAL-629
[jalview.git] / src / jalview / datamodel / ContactMatrix.java
index b4f7c07..8434b4a 100644 (file)
@@ -1,7 +1,13 @@
 package jalview.datamodel;
 
+import java.awt.Color;
 import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.HashMap;
 import java.util.List;
+import java.util.StringTokenizer;
+
+import jalview.bin.Console;
 
 public abstract class ContactMatrix implements ContactMatrixI
 {
@@ -166,4 +172,113 @@ public abstract class ContactMatrix implements ContactMatrixI
   {
     return "Contact Matrix";
   }
+
+  List<BitSet> groups = null;
+
+  @Override
+  public void updateGroups(List<BitSet> colGroups)
+  {
+    groups = colGroups;
+    colorMap = new HashMap<>();
+  }
+
+  @Override
+  public boolean hasGroups()
+  {
+    return groups != null && groups.size() > 0;
+  }
+
+  @Override
+  public List<BitSet> getGroups()
+  {
+    return groups;
+  }
+
+  @Override
+  public BitSet getGroupsFor(int column)
+  {
+    for (BitSet gp : groups)
+    {
+      if (gp.get(column))
+      {
+        return gp;
+      }
+    }
+    return ContactMatrixI.super.getGroupsFor(column);
+  }
+
+  HashMap<BitSet, Color> colorMap = new HashMap<>();
+
+  @Override
+  public Color getColourForGroup(BitSet bs)
+  {
+    if (bs == null)
+    {
+      return Color.white;
+    }
+    Color groupCol = colorMap.get(bs);
+    if (groupCol == null)
+    {
+      return Color.white;
+    }
+    return groupCol;
+  }
+
+  @Override
+  public void setColorForGroup(BitSet bs, Color color)
+  {
+    colorMap.put(bs, color);
+  }
+
+  public static String contactToFloatString(ContactMatrixI cm)
+  {
+    StringBuilder sb = new StringBuilder();
+    for (int c = 0; c < cm.getWidth(); c++)
+    {
+      ContactListI cl = cm.getContactList(c);
+      if (cl != null)
+      {
+        for (int h = 0; h <= cl.getContactHeight(); h++)
+        {
+          if (sb.length() > 0)
+          {
+            sb.append('\t');
+          }
+          sb.append(cl.getContactAt(h));
+        }
+      }
+    }
+    return sb.toString();
+  }
+
+  public static float[][] fromFloatStringToContacts(String values, int cols,
+          int rows)
+  {
+    float[][] vals = new float[cols][rows];
+    StringTokenizer tabsep = new StringTokenizer(values, "" + '\t');
+    int c = 0, r = 0;
+
+    while (tabsep.hasMoreTokens())
+    {
+      double elem = Double.valueOf(tabsep.nextToken());
+      vals[c][r++] = (float) elem;
+      if (r >= vals[c].length)
+      {
+        r = 0;
+        c++;
+      }
+      if (c >= vals.length)
+      {
+
+        break;
+      }
+    }
+    if (tabsep.hasMoreElements())
+    {
+      Console.warn(
+              "Ignoring additional elements for Float string to contact matrix parsing.");
+    }
+
+    return vals;
+  }
 }