JAL-4124 add strategic newlines in matrix stringified representation so it doesn...
authorJames Procter <j.procter@dundee.ac.uk>
Fri, 1 Sep 2023 15:09:51 +0000 (16:09 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Fri, 1 Sep 2023 15:09:51 +0000 (16:09 +0100)
src/jalview/datamodel/ContactMatrix.java
test/jalview/project/Jalview2xmlTests.java

index 32fa5b1..2e12a91 100644 (file)
@@ -176,13 +176,21 @@ public abstract class ContactMatrix extends GroupSetHolder implements ContactMat
     for (int c = 0; c < cm.getWidth(); c++)
     {
       ContactListI cl = cm.getContactList(c);
+      long lastsb=-1;
       if (cl != null)
       {
         for (int h = 0; h <= cl.getContactHeight(); h++)
         {
           if (sb.length() > 0)
           {
-            sb.append('\t');
+            if (sb.length()-lastsb>320)
+            {
+              // newline
+              sb.append('\n');
+              lastsb=sb.length();
+            } else {
+              sb.append('\t');
+            }
           }
           sb.append(cl.getContactAt(h));
         }
@@ -195,7 +203,7 @@ public abstract class ContactMatrix extends GroupSetHolder implements ContactMat
           int rows)
   {
     float[][] vals = new float[cols][rows];
-    StringTokenizer tabsep = new StringTokenizer(values, "" + '\t');
+    StringTokenizer tabsep = new StringTokenizer(values, "" + '\t'+'\n');
     int c = 0, r = 0;
     while (tabsep.hasMoreTokens())
     {
index cbbd0dc..e39d900 100644 (file)
@@ -67,6 +67,7 @@ import jalview.datamodel.HiddenSequences;
 import jalview.datamodel.Mapping;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.PDBEntry.Type;
+import jalview.datamodel.Sequence;
 import jalview.datamodel.Sequence.DBModList;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceFeature;
@@ -1547,6 +1548,44 @@ public class Jalview2xmlTests extends Jalview2xmlBase
   }
 
   @Test(groups = { "Functional" })
+  public void testMatrixToFloatsAndBack()
+  {
+    int imax=2000;
+    int i=imax;
+    SequenceI sq = new Sequence("dummy","SEQ");
+    while (sq.getLength()<i)
+    {
+      sq.setSequence(sq.getSequenceAsString()+'Q');
+    }
+    float[][] paevals = new float[i][i];
+    for (i = imax - 1; i >= 0; i--)
+    {
+      for (int j = 0; j <= i; j++)
+      {
+        paevals[i][j] = ((i - j < 2)
+                || ((i > 1 && i < 5) && (j > 1 && i < 5))) ? 1 : 0f;
+        paevals[j][i] = -paevals[i][j];
+      }
+    }
+    PAEContactMatrix dummyMat = new PAEContactMatrix(sq, paevals);
+    String content = ContactMatrix.contactToFloatString(dummyMat);
+    Assert.assertTrue(content.contains("\t1.")); // at least one element must be
+                                                 // 1
+    float[][] vals = ContactMatrix.fromFloatStringToContacts(content,
+            sq.getLength(), sq.getLength());
+    assertEquals(vals[3][4], paevals[3][4]);
+    assertEquals(vals[4][3], paevals[4][3]);
+    
+    // test recovery
+    for (i=0;i<imax;i++)
+    {
+      for (int j=0;j<imax;j++)
+      {
+        assertEquals(vals[i][j],paevals[i][j]);
+      }
+    }
+  }
+  @Test(groups = { "Functional" })
   public void testPAEsaveRestore() throws Exception
   {
     Desktop.instance.closeAll_actionPerformed(null);