Merge branch 'develop' into features/JAL-4134_use_annotation_row_for_colours_and_groups
[jalview.git] / src / jalview / project / Jalview2XML.java
index 913dffe..6f26036 100644 (file)
@@ -96,6 +96,7 @@ import jalview.datamodel.ContactMatrixI;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.GeneLocus;
 import jalview.datamodel.GraphLine;
+import jalview.datamodel.GroupSet;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.Point;
 import jalview.datamodel.RnaViewerModel;
@@ -152,6 +153,7 @@ import jalview.viewmodel.ViewportRanges;
 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
 import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
 import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
+import jalview.ws.datamodel.MappableContactMatrixI;
 import jalview.ws.datamodel.alphafold.PAEContactMatrix;
 import jalview.ws.jws2.Jws2Discoverer;
 import jalview.ws.jws2.dm.AAConSettings;
@@ -194,6 +196,7 @@ import jalview.xml.binding.jalview.JalviewModel.Viewport.HiddenColumns;
 import jalview.xml.binding.jalview.JalviewModel.Viewport.Overview;
 import jalview.xml.binding.jalview.JalviewUserColours;
 import jalview.xml.binding.jalview.JalviewUserColours.Colour;
+import jalview.xml.binding.jalview.MapListType;
 import jalview.xml.binding.jalview.MapListType.MapListFrom;
 import jalview.xml.binding.jalview.MapListType.MapListTo;
 import jalview.xml.binding.jalview.Mapping;
@@ -2323,8 +2326,7 @@ public class Jalview2XML
               {
                 for (BitSet gp : cm.getGroups())
                 {
-                  BigInteger val = new BigInteger(gp.toByteArray());
-                  xmlmat.getGroups().add(val.toString());
+                  xmlmat.getGroups().add(stringifyBitset(gp));
                 }
               }
               if (cm.hasTree())
@@ -2337,8 +2339,39 @@ public class Jalview2XML
               {
                 xmlmat.setCutHeight(cm.getCutHeight());
               }
-
               // set/get properties
+              if (cm instanceof MappableContactMatrixI)
+              {
+                jalview.util.MapList mlst = ((MappableContactMatrixI) cm)
+                        .getMapFor(annotation.sequenceRef);
+                if (mlst != null)
+                {
+                  MapListType mp = new MapListType();
+                  List<int[]> r = mlst.getFromRanges();
+                  for (int[] range : r)
+                  {
+                    MapListFrom mfrom = new MapListFrom();
+                    mfrom.setStart(range[0]);
+                    mfrom.setEnd(range[1]);
+                    // mp.addMapListFrom(mfrom);
+                    mp.getMapListFrom().add(mfrom);
+                  }
+                  r = mlst.getToRanges();
+                  for (int[] range : r)
+                  {
+                    MapListTo mto = new MapListTo();
+                    mto.setStart(range[0]);
+                    mto.setEnd(range[1]);
+                    // mp.addMapListTo(mto);
+                    mp.getMapListTo().add(mto);
+                  }
+                  mp.setMapFromUnit(
+                          BigInteger.valueOf(mlst.getFromRatio()));
+                  mp.setMapToUnit(BigInteger.valueOf(mlst.getToRatio()));
+                  xmlmat.setMapping(mp);
+                }
+              }
+              // and add to model
               an.getContactmatrix().add(xmlmat);
             }
           }
@@ -2446,6 +2479,43 @@ public class Jalview2XML
 
   }
 
+  private String stringifyBitset(BitSet gp)
+  {
+    StringBuilder sb = new StringBuilder();
+    for (long val : gp.toLongArray())
+    {
+      if (sb.length() > 0)
+      {
+        sb.append(",");
+      }
+      sb.append(val);
+    }
+    return sb.toString();
+  }
+
+  private BitSet deStringifyBitset(String stringified)
+  {
+    if ("".equals(stringified) || stringified == null)
+    {
+      return new BitSet();
+    }
+    String[] longvals = stringified.split(",");
+    long[] newlongvals = new long[longvals.length];
+    for (int lv = 0; lv < longvals.length; lv++)
+    {
+      try
+      {
+        newlongvals[lv] = Long.valueOf(longvals[lv]);
+      } catch (Exception x)
+      {
+        errorMessage += "Couldn't destringify bitset from: '" + stringified
+                + "'";
+        newlongvals[lv] = 0;
+      }
+    }
+    return BitSet.valueOf(newlongvals);
+
+  }
   private CalcIdParam createCalcIdParam(String calcId, AlignViewport av)
   {
     AutoCalcSetting settings = av.getCalcIdSettingsFor(calcId);
@@ -3975,25 +4045,39 @@ public class Jalview2XML
                           .fromFloatStringToContacts(xmlmat.getElements(),
                                   xmlmat.getCols().intValue(),
                                   xmlmat.getRows().intValue());
+                  jalview.util.MapList mapping = null;
+                  if (xmlmat.getMapping() != null)
+                  {
+                    MapListType m = xmlmat.getMapping();
+                    // Mapping m = dr.getMapping();
+                    int fr[] = new int[m.getMapListFrom().size() * 2];
+                    Iterator<MapListFrom> from = m.getMapListFrom()
+                            .iterator();// enumerateMapListFrom();
+                    for (int _i = 0; from.hasNext(); _i += 2)
+                    {
+                      MapListFrom mf = from.next();
+                      fr[_i] = mf.getStart();
+                      fr[_i + 1] = mf.getEnd();
+                    }
+                    int fto[] = new int[m.getMapListTo().size() * 2];
+                    Iterator<MapListTo> to = m.getMapListTo().iterator();// enumerateMapListTo();
+                    for (int _i = 0; to.hasNext(); _i += 2)
+                    {
+                      MapListTo mf = to.next();
+                      fto[_i] = mf.getStart();
+                      fto[_i + 1] = mf.getEnd();
+                    }
 
-                  PAEContactMatrix newpae = new PAEContactMatrix(
-                          jaa.sequenceRef, elements);
+                    mapping = new jalview.util.MapList(fr, fto,
+                            m.getMapFromUnit().intValue(),
+                            m.getMapToUnit().intValue());
+                  }
                   List<BitSet> newgroups = new ArrayList<BitSet>();
                   if (xmlmat.getGroups().size() > 0)
                   {
                     for (String sgroup : xmlmat.getGroups())
                     {
-                      try
-                      {
-                        BigInteger group = new BigInteger(sgroup);
-                        newgroups.add(BitSet.valueOf(group.toByteArray()));
-                      } catch (NumberFormatException nfe)
-                      {
-                        Console.error(
-                                "Problem parsing groups for a contact matrix (\""
-                                        + sgroup + "\"",
-                                nfe);
-                      }
+                      newgroups.add(deStringifyBitset(sgroup));
                     }
                   }
                   String nwk = xmlmat.getNewick().size() > 0
@@ -4004,12 +4088,14 @@ public class Jalview2XML
                     Console.log.info(
                             "Ignoring additional clusterings for contact matrix");
                   }
-
                   String treeMethod = xmlmat.getTreeMethod();
                   double thresh = xmlmat.getCutHeight() != null
                           ? xmlmat.getCutHeight()
                           : 0;
-                  newpae.restoreGroups(newgroups, treeMethod, nwk, thresh);
+                  GroupSet grpset = new GroupSet();
+                  grpset.restoreGroups(newgroups, treeMethod, nwk, thresh);
+                  PAEContactMatrix newpae = new PAEContactMatrix(
+                          jaa.sequenceRef, mapping, elements, grpset);
                   jaa.sequenceRef.addContactListFor(jaa, newpae);
                 }
               }