From e05ad4f9199d673b327277d1266d97f3a51419ae Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Mon, 20 Oct 2014 18:24:41 +0100 Subject: [PATCH] JAL-674 methods and test for PDB derived annotation stored and recovered in project --- src/MCview/PDBfile.java | 23 ++++++- test/jalview/io/AnnotatedPDBFileInputTest.java | 88 +++++++++++++++++++++++- 2 files changed, 108 insertions(+), 3 deletions(-) diff --git a/src/MCview/PDBfile.java b/src/MCview/PDBfile.java index 7e37277..019aba9 100755 --- a/src/MCview/PDBfile.java +++ b/src/MCview/PDBfile.java @@ -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 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) diff --git a/test/jalview/io/AnnotatedPDBFileInputTest.java b/test/jalview/io/AnnotatedPDBFileInputTest.java index acc2cb8..7e99409 100644 --- a/test/jalview/io/AnnotatedPDBFileInputTest.java +++ b/test/jalview/io/AnnotatedPDBFileInputTest.java @@ -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) 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); + } + } + } + } } -- 1.7.10.2