JAL-4134 JAL-3855 store/restore groups, tree and threshold used to cluster a PAE...
[jalview.git] / src / jalview / project / Jalview2XML.java
index 8142435..36c87ce 100644 (file)
@@ -26,6 +26,7 @@ import static jalview.math.RotatableMatrix.Axis.Z;
 
 import java.awt.Color;
 import java.awt.Font;
+import java.awt.FontMetrics;
 import java.awt.Rectangle;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
@@ -44,6 +45,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.BitSet;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.GregorianCalendar;
@@ -2306,7 +2308,28 @@ public class Jalview2XML
               xmlmat.setType(cm.getType());
               xmlmat.setRows(BigInteger.valueOf(cm.getWidth()));
               xmlmat.setCols(BigInteger.valueOf(cm.getHeight()));
-              xmlmat.setValue(ContactMatrix.contactToFloatString(cm));
+              // consider using an opaque to/from -> allow instance to control its representation ?
+              xmlmat.setElements(ContactMatrix.contactToFloatString(cm));
+              if (cm.hasGroups())
+              {
+                for (BitSet gp: cm.getGroups())
+                {
+                  BigInteger val = new BigInteger(gp.toByteArray());
+                  xmlmat.getGroups().add(val.toString());
+                }
+              }
+              if (cm.hasTree())
+              {
+                // provenance object for tree ?
+                xmlmat.getNewick().add(cm.getNewick());
+                xmlmat.setTreeMethod(cm.getTreeMethod());
+              }
+              if (cm.hasCutHeight())
+              {
+                xmlmat.setCutHeight(cm.getCutHeight());
+              }
+              
+              // set/get properties
               an.getContactmatrix().add(xmlmat);
             }
           }
@@ -2341,10 +2364,9 @@ public class Jalview2XML
       {
         for (String pr : annotation.getProperties())
         {
-          jalview.xml.binding.jalview.Annotation.Property prop = new jalview.xml.binding.jalview.Annotation.Property();
+          jalview.xml.binding.jalview.Property prop = new jalview.xml.binding.jalview.Property();
           prop.setName(pr);
           prop.setValue(annotation.getProperty(pr));
-          // an.addProperty(prop);
           an.getProperty().add(prop);
         }
       }
@@ -3919,7 +3941,7 @@ public class Jalview2XML
         jaa.setCalcId(annotation.getCalcId());
         if (annotation.getProperty().size() > 0)
         {
-          for (Annotation.Property prop : annotation.getProperty())
+          for (jalview.xml.binding.jalview.Property prop : annotation.getProperty())
           {
             jaa.setProperty(prop.getName(), prop.getValue());
           }
@@ -3940,12 +3962,36 @@ public class Jalview2XML
                 else
                 {
                   float[][] elements = ContactMatrix
-                          .fromFloatStringToContacts(xmlmat.getValue(),
+                          .fromFloatStringToContacts(xmlmat.getElements(),
                                   xmlmat.getCols().intValue(),
                                   xmlmat.getRows().intValue());
 
                   PAEContactMatrix newpae = new PAEContactMatrix(
                           jaa.sequenceRef, elements);
+                  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);
+                      }
+                    }
+                  }
+                  String nwk=xmlmat.getNewick().size()>0 ? xmlmat.getNewick().get(0):null;
+                  if  (xmlmat.getNewick().size()>1)
+                  {
+                    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);
                   jaa.sequenceRef.addContactListFor(jaa, newpae);
                 }
               }
@@ -4882,14 +4928,14 @@ public class Jalview2XML
     viewport.setIncrement(safeInt(view.getConsThreshold()));
     viewport.setShowJVSuffix(safeBoolean(view.isShowFullId()));
     viewport.setRightAlignIds(safeBoolean(view.isRightAlignIds()));
+    viewport.setFont(new Font(view.getFontName(),
+            safeInt(view.getFontStyle()), safeInt(view.getFontSize())),
+            (view.getCharWidth()!=null) ? false : true);
     if (view.getCharWidth()!=null)
     {
       viewport.setCharWidth(view.getCharWidth());
       viewport.setCharHeight(view.getCharHeight());
     }
-    viewport.setFont(new Font(view.getFontName(),
-            safeInt(view.getFontStyle()), safeInt(view.getFontSize())),
-            true);
     ViewStyleI vs = viewport.getViewStyle();
     vs.setScaleProteinAsCdna(view.isScaleProteinAsCdna());
     viewport.setViewStyle(vs);