JAL-674 methods and test for PDB derived annotation stored and recovered in project
authorJim Procter <j.procter@dundee.ac.uk>
Mon, 20 Oct 2014 17:24:41 +0000 (18:24 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Tue, 21 Oct 2014 10:34:54 +0000 (11:34 +0100)
src/MCview/PDBfile.java
test/jalview/io/AnnotatedPDBFileInputTest.java

index 7e37277..019aba9 100755 (executable)
@@ -272,11 +272,30 @@ public class PDBfile extends jalview.io.AlignFile
     markCalcIds();
   }
 
+  private static String calcIdPrefix = "JalviewPDB:";
+
+  public static boolean isCalcIdHandled(String calcId)
+  {
+    return calcId != null
+            && (calcId.startsWith(calcIdPrefix) && calcId.indexOf(
+                    calcIdPrefix,
+            calcIdPrefix.length() + 1) > -1);
+  }
   public static boolean isCalcIdForFile(String calcId, String pdbFile)
   {
-    return (calcId != null && calcId.startsWith("JalviewPDB:" + pdbFile
-            + ":JalviewPDB:"));
+    return (calcId != null && calcId.startsWith(calcIdPrefix + pdbFile
+            + ":" + calcIdPrefix));
   }
+
+  public static String relocateCalcId(String calcId,
+          Hashtable<String, String> alreadyLoadedPDB) throws Exception
+  {
+    int s = calcIdPrefix.length(), end = calcId.indexOf(calcIdPrefix, s);
+    String between = calcId.substring(s, end - 1);
+    return calcIdPrefix + alreadyLoadedPDB.get(between) + ":"
+            + calcId.substring(end);
+  }
+
   private void markCalcIds()
   {
     for (SequenceI sq : seqs)
index acc2cb8..7e99409 100644 (file)
@@ -1,14 +1,21 @@
 package jalview.io;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 
+import java.io.File;
+import java.util.Vector;
+
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class AnnotatedPDBFileInputTest
@@ -17,6 +24,9 @@ public class AnnotatedPDBFileInputTest
   AlignmentI al;
 
   String pdbStr = "examples/2GIS.pdb";
+
+  String pdbId;
+
   @Before
   public void setup() throws Exception
   {
@@ -24,6 +34,8 @@ public class AnnotatedPDBFileInputTest
     AlignFrame af = loader.LoadFileWaitTillLoaded(pdbStr,
             FormatAdapter.FILE);
     al = af.getViewport().getAlignment();
+    pdbId = ((PDBEntry) al.getSequenceAt(0).getDatasetSequence().getPDBId()
+            .get(0)).getId();
   }
 
   @Test
@@ -56,7 +68,7 @@ public class AnnotatedPDBFileInputTest
       {
 
         System.out.println("CalcId: " + aa.getCalcId());
-        assertTrue(MCview.PDBfile.isCalcIdForFile(aa.getCalcId(), pdbStr));
+        assertTrue(MCview.PDBfile.isCalcIdForFile(aa.getCalcId(), pdbId));
       }
     }
   }
@@ -89,4 +101,78 @@ public class AnnotatedPDBFileInputTest
       }
     }
   }
+
+  /**
+   * @throws java.lang.Exception
+   */
+  @BeforeClass
+  public static void setUpBeforeClass() throws Exception
+  {
+    jalview.bin.Jalview.main(new String[]
+    { "-props", "test/src/jalview/io/testProps.jvprops" });
+  }
+
+  /**
+   * @throws java.lang.Exception
+   */
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception
+  {
+    jalview.gui.Desktop.instance.closeAll_actionPerformed(null);
+
+  }
+
+  @Test
+  public void testJalviewProjectRelocationAnnotation() throws Exception
+  {
+
+    String inFile = "examples/2GIS.pdb";
+    String tfile = File.createTempFile("JalviewTest", ".jvp")
+            .getAbsolutePath();
+    AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded(
+            inFile, FormatAdapter.FILE);
+    assertTrue("Didn't read input file " + inFile, af != null);
+    assertTrue("Failed to store as a project.",
+            af.saveAlignment(tfile, "Jalview"));
+    af.closeMenuItem_actionPerformed(true);
+    af = null;
+    af = new jalview.io.FileLoader().LoadFileWaitTillLoaded(tfile,
+            FormatAdapter.FILE);
+    assertTrue("Failed to import new project", af != null);
+    for (SequenceI asq : af.getViewport().getAlignment().getSequences())
+    {
+      SequenceI sq = asq;
+      while (sq.getDatasetSequence() != null)
+      {
+        sq = sq.getDatasetSequence();
+      }
+      assertNotNull(sq.getPDBId());
+      assertEquals("Expected only one PDB ID", sq.getPDBId().size(), 1);
+      for (PDBEntry pdbentry : (Vector<PDBEntry>) sq.getPDBId())
+      {
+        System.err.println("PDB Entry " + pdbentry.getId() + " "
+                + pdbentry.getFile());
+        boolean exists = false, found = false;
+        for (AlignmentAnnotation ana : sq.getAnnotation())
+        {
+          System.err.println("CalcId " + ana.getCalcId());
+          if (ana.getCalcId() != null
+                  && MCview.PDBfile.isCalcIdHandled(ana.getCalcId()))
+          {
+            exists = true;
+            if (MCview.PDBfile.isCalcIdForFile(ana.getCalcId(),
+                    pdbentry.getId()))
+            {
+              found = true;
+            }
+          }
+        }
+        if (exists)
+        {
+          assertTrue("Couldn't find any annotation for " + pdbentry.getId()
+                  + " (file handle " + pdbentry.getFile() + ")", found);
+        }
+      }
+    }
+  }
 }