X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fext%2Fjmol%2FPDBFileWithJmolTest.java;h=4dc709554e5070b74d7c0e3e9b3d1e8b5891af67;hb=a064561d8665ee9db217b17cda826fceac90cbbc;hp=ef142870fd635e818885ac21766aedd036578e26;hpb=fc56d1454866629d66e5d37070c4bd76a968ccce;p=jalview.git diff --git a/test/jalview/ext/jmol/PDBFileWithJmolTest.java b/test/jalview/ext/jmol/PDBFileWithJmolTest.java index ef14287..4dc7095 100644 --- a/test/jalview/ext/jmol/PDBFileWithJmolTest.java +++ b/test/jalview/ext/jmol/PDBFileWithJmolTest.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -20,10 +20,10 @@ */ package jalview.ext.jmol; -import static org.junit.Assert.*; - -import java.util.Vector; +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertTrue; +import jalview.bin.Cache; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; @@ -31,7 +31,13 @@ import jalview.gui.AlignFrame; import jalview.io.AppletFormatAdapter; import jalview.io.FileLoader; -import org.junit.Test; +import java.util.Vector; + +import org.jmol.c.STR; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import MCview.PDBfile; /** * @author jimp @@ -39,26 +45,72 @@ import org.junit.Test; */ public class PDBFileWithJmolTest { - String[] testFile = new String[] - { "./examples/1GAQ.txt" }; // , "./examples/DNMT1_MOUSE.pdb" }; + /* + * 1GAQ has been reduced to alpha carbons only + * 1QCF is the full PDB file including headers, HETATM etc + */ + String[] testFile = new String[] { "./examples/1GAQ.txt", + "./test/jalview/ext/jmol/1QCF.pdb" }; // , - @Test - public void testAlignmentLoader() throws Exception - { - for (String f:testFile) { + //@formatter:off + // a modified and very cut-down extract of 4UJ4 + String pdbWithChainBreak = + "HEADER TRANSPORT PROTEIN 08-APR-15 4UJ4\n" + + // chain B has missing residues; these should all go in the same sequence: + "ATOM 1909 CA VAL B 358 21.329 -19.739 -67.740 1.00201.05 C\n" + + "ATOM 1916 CA GLY B 359 21.694 -23.563 -67.661 1.00198.09 C\n" + + "ATOM 1920 CA LYS B 367 32.471 -12.135 -77.100 1.00257.97 C\n" + + "ATOM 1925 CA ALA B 368 31.032 -9.324 -74.946 1.00276.01 C\n" + + // switch to chain C; should be a separate sequence + "ATOM 1930 CA SER C 369 32.589 -7.517 -71.978 1.00265.44 C\n" + + "ATOM 1936 CA ALA C 370 31.650 -6.849 -68.346 1.00249.48 C\n"; + //@formatter:on + + //@formatter:off + // a very cut-down extract of 1ejg + String pdbWithAltLoc = + "HEADER TRANSPORT PROTEIN 08-APR-15 1EJG\n" + + "ATOM 448 CA ALA A 24 6.619 16.195 1.970 1.00 1.65 C\n" + + "ATOM 458 CA ALEU A 25 3.048 14.822 1.781 0.57 1.48 C\n" + + // alternative residue 25 entries (with ILE instead of LEU) should be ignored: + "ATOM 478 CA BILE A 25 3.048 14.822 1.781 0.21 1.48 C\n" + + // including the next altloc causes the unit test to fail but it works with the full file + // not sure why! + // "ATOM 479 CA CILE A 25 3.048 14.822 1.781 0.22 1.48 C\n" + + "ATOM 512 CA CYS A 26 4.137 11.461 3.154 1.00 1.52 C\n"; + //@formatter:on + + @BeforeMethod(alwaysRun = true) + public void setUp() + { + Cache.applicationProperties.setProperty("STRUCT_FROM_PDB", + Boolean.TRUE.toString()); + Cache.applicationProperties.setProperty("ADD_SS_ANN", + Boolean.TRUE.toString()); + } + + @Test(groups = { "Functional" }) + public void testAlignmentLoader() throws Exception + { + for (String f : testFile) + { FileLoader fl = new jalview.io.FileLoader(false); - AlignFrame af = fl.LoadFileWaitTillLoaded(f, AppletFormatAdapter.FILE); + AlignFrame af = fl + .LoadFileWaitTillLoaded(f, AppletFormatAdapter.FILE); validateSecStrRows(af.getViewport().getAlignment()); } - } - @Test + } + + @Test(groups = { "Functional" }) public void testFileParser() throws Exception { for (String pdbStr : testFile) { + PDBfile mctest = new PDBfile(false, false, false, pdbStr, + AppletFormatAdapter.FILE); PDBFileWithJmol jtest = new PDBFileWithJmol(pdbStr, jalview.io.AppletFormatAdapter.FILE); - Vector seqs = jtest.getSeqs(); + Vector seqs = jtest.getSeqs(), mcseqs = mctest.getSeqs(); assertTrue( "No sequences extracted from testfile\n" @@ -67,8 +119,11 @@ public class PDBFileWithJmolTest && seqs.size() > 0); for (SequenceI sq : seqs) { - AlignmentI al = new Alignment(new SequenceI[] - { sq }); + assertEquals("JMol didn't process " + pdbStr + + " to the same sequence as MCView", + sq.getSequenceAsString(), mcseqs.remove(0) + .getSequenceAsString()); + AlignmentI al = new Alignment(new SequenceI[] { sq }); validateSecStrRows(al); } } @@ -76,26 +131,111 @@ public class PDBFileWithJmolTest private void validateSecStrRows(AlignmentI al) { - if (!al.isNucleotide()) { for (SequenceI asq : al.getSequences()) { SequenceI sq = asq; - while (sq.getDatasetSequence()!=null && sq.getAnnotation()==null) + boolean hasDs = false; + while (sq.getDatasetSequence() != null + && sq.getAnnotation() == null) + { + sq = sq.getDatasetSequence(); + hasDs = true; + } + checkFirstAAIsAssoc(sq); + if (hasDs) { - sq = asq.getDatasetSequence(); + // also verify if alignment sequence has annotation on it + // that is correctly mapped + checkFirstAAIsAssoc(asq); } - assertTrue( - "No secondary structure assigned for protein sequence.", - sq.getAnnotation() != null - && sq.getAnnotation().length >= 1 - && sq.getAnnotation()[0].hasIcons); - assertTrue( - "Secondary structure not associated for sequence " - + sq.getName(), - sq.getAnnotation()[0].sequenceRef == sq); } } } + + private void checkFirstAAIsAssoc(SequenceI sq) + { + assertTrue("No secondary structure assigned for protein sequence.", + sq.getAnnotation() != null && sq.getAnnotation().length >= 1 + && sq.getAnnotation()[0].hasIcons); + assertTrue( + "Secondary structure not associated for sequence " + + sq.getName(), sq.getAnnotation()[0].sequenceRef == sq); + } + + /** + * Test parsing a chain with missing residues + * + * @throws Exception + */ + @Test(groups = { "Functional" }) + public void testParse_missingResidues() throws Exception + { + PDBfile mctest = new PDBfile(false, false, false, pdbWithChainBreak, + AppletFormatAdapter.PASTE); + PDBFileWithJmol jtest = new PDBFileWithJmol(pdbWithChainBreak, + jalview.io.AppletFormatAdapter.PASTE); + Vector seqs = jtest.getSeqs(); + Vector mcseqs = mctest.getSeqs(); + + assertEquals("Failed to find 2 sequences\n", 2, seqs.size()); + assertEquals("Failed to find 2 sequences\n", 2, mcseqs.size()); + assertEquals("VGKA", seqs.get(0).getSequenceAsString()); + assertEquals("VGKA", mcseqs.get(0).getSequenceAsString()); + assertEquals("SA", seqs.get(1).getSequenceAsString()); + assertEquals("SA", mcseqs.get(1).getSequenceAsString()); + } + + /** + * Test parsing a chain with 'altloc' residues + * + * @throws Exception + */ + @Test(groups = { "Functional" }) + public void testParse_alternativeResidues() throws Exception + { + PDBfile mctest = new PDBfile(false, false, false, pdbWithAltLoc, + AppletFormatAdapter.PASTE); + PDBFileWithJmol jtest = new PDBFileWithJmol(pdbWithAltLoc, + jalview.io.AppletFormatAdapter.PASTE); + Vector seqs = jtest.getSeqs(); + Vector mcseqs = mctest.getSeqs(); + + assertEquals("Failed to find 1 sequence\n", 1, seqs.size()); + assertEquals("Failed to find 1 sequence\n", 1, mcseqs.size()); + assertEquals("ALC", seqs.get(0).getSequenceAsString()); + assertEquals("ALC", mcseqs.get(0).getSequenceAsString()); + } + + @Test(groups = "Functional") + public void testSetSecondaryStructure() + { + PDBFileWithJmol testee = new PDBFileWithJmol(); + char[] struct = new char[10]; + char[] structCode = new char[10]; + struct[0] = '1'; + structCode[0] = '1'; + + testee.setSecondaryStructure(STR.NONE, 0, struct, structCode); + testee.setSecondaryStructure(STR.HELIX, 1, struct, structCode); + testee.setSecondaryStructure(STR.HELIX310, 2, struct, structCode); + testee.setSecondaryStructure(STR.HELIXALPHA, 3, struct, structCode); + testee.setSecondaryStructure(STR.HELIXPI, 4, struct, structCode); + testee.setSecondaryStructure(STR.SHEET, 5, struct, structCode); + + assertEquals(0, struct[0]); + assertEquals('H', struct[1]); + assertEquals('3', struct[2]); + assertEquals('H', struct[3]); + assertEquals('P', struct[4]); + assertEquals('E', struct[5]); + + assertEquals(0, structCode[0]); + assertEquals('H', structCode[1]); + assertEquals('H', structCode[2]); + assertEquals('H', structCode[3]); + assertEquals('H', structCode[4]); + assertEquals('E', structCode[5]); + } }