2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.structure;
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertTrue;
26 import jalview.bin.Cache;
27 import jalview.datamodel.AlignmentAnnotation;
28 import jalview.datamodel.Annotation;
29 import jalview.datamodel.Sequence;
30 import jalview.datamodel.SequenceI;
31 import jalview.gui.AlignFrame;
32 import jalview.gui.JvOptionPane;
33 import jalview.io.DataSourceType;
34 import jalview.io.FileFormat;
35 import jalview.io.FileLoader;
36 import jalview.io.StructureFile;
38 import org.testng.Assert;
39 import org.testng.AssertJUnit;
40 import org.testng.annotations.BeforeClass;
41 import org.testng.annotations.Test;
45 @BeforeClass(alwaysRun = true)
51 @BeforeClass(alwaysRun = true)
52 public void setUpJvOptionPane()
54 JvOptionPane.setInteractiveMode(false);
55 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
61 * 1QCF|A/101-121 SFQKGDQMVVLEESGEWWKAR Ser 114 jumps to Gly 116 at position
62 * 115 in PDB Res Numbering secondary structure numbers in jmol seem to be in
63 * msd numbering, not pdb res numbering.
65 @Test(groups = { "Functional" }, enabled = false)
66 public void pdbEntryPositionMap() throws Exception
68 Assert.fail("This test intentionally left to fail");
69 for (int offset = 0; offset < 20; offset += 6)
71 // check we put the secondary structure in the right position
72 Sequence uprot = new Sequence("TheProtSeq",
73 "DAWEIPRESLKLEKKLGAGQFGEVWMATYNKHTKVAVKTMKPGSMSVEAFLAEANVMKTL");
74 uprot.setStart(offset + 258); // make it harder - create a fake
75 // relocation problem for jalview to
77 uprot.setEnd(uprot.getStart() + uprot.getLength() - 1);
78 // original numbers taken from
79 // http://www.ebi.ac.uk/pdbe-srv/view/entry/1qcf/secondary.html
80 // these are in numbering relative to the subsequence above
81 int coils[] = { 266, 275, 278, 287, 289, 298, 302, 316 }, helices[] = new int[]
82 { 303, 315 }, sheets[] = new int[] { 267, 268, 269, 270 };
84 StructureSelectionManager ssm = StructureSelectionManager
85 .getStructureSelectionManager(null);
86 StructureFile pmap = ssm.setMapping(true, new SequenceI[] { uprot },
87 new String[] { "A" }, "test/jalview/ext/jmol/1QCF.pdb",
89 assertTrue(pmap != null);
90 SequenceI protseq = pmap.getSeqsAsArray()[0];
91 AlignmentAnnotation pstra = protseq
92 .getAnnotation("Secondary Structure")[0];
94 pstra.restrict((pinds = protseq.findIndex(258) - 1),
95 pinde = (protseq.findIndex(317) - 1));
97 System.out.println("PDB Annot");
98 for (char c : protseq.getSubSequence(pinds, pinde).getSequence())
100 System.out.print(c + ", ");
102 System.out.println("\n" + pstra + "\n\nsubsequence\n");
103 for (char c : uprot.getSequence())
105 System.out.print(c + ", ");
107 System.out.println("");
108 for (AlignmentAnnotation ss : uprot
109 .getAnnotation("Secondary Structure"))
111 ss.adjustForAlignment();
112 System.out.println("Uniprot Annot\n" + ss);
113 assertTrue(ss.hasIcons);
115 for (int p : helices)
117 Annotation a = ss.annotations[op = (uprot.findIndex(offset + p) - 1)];
119 "Expected a helix at position " + p + uprot.getCharAt(op)
120 + " but got coil", a != null);
121 assertEquals("Expected a helix at position " + p,
122 a.secondaryStructure, expected);
127 Annotation a = ss.annotations[uprot.findIndex(offset + p) - 1];
129 "Expected a strand at position " + p + " but got coil",
131 assertEquals("Expected a strand at position " + p,
132 a.secondaryStructure, expected);
137 Annotation a = ss.annotations[uprot.findIndex(offset + p) - 1];
138 assertTrue("Expected coil at position " + p + " but got "
139 + a.secondaryStructure, a == null);
145 @Test(groups = { "Functional" }, enabled = false)
146 public void testPDBentryMapping() throws Exception
148 Assert.fail("This test intentionally left to fail");
149 Sequence sq = new Sequence(
150 "1GAQ A subseq 126 to 219",
151 "EIVKGVCSNFLCDLQPGDNVQITGPVGKEMLMPKDPNATIIMLATGTGIAPFRSFLWKMFFEKHDDYKFNGLGWLFLGVPTSSSLLYKEEFGKM");
152 Sequence sq1 = new Sequence(sq);
154 StructureSelectionManager ssm = StructureSelectionManager
155 .getStructureSelectionManager(null);
156 // Associate the 1GAQ pdb file with the subsequence 'imported' from another
158 StructureFile pde = ssm.setMapping(true, new SequenceI[] { sq },
160 { "A" }, inFile = "examples/1gaq.txt", DataSourceType.FILE);
161 assertTrue("PDB File couldn't be found", pde != null);
162 StructureMapping[] mp = ssm.getMapping(inFile);
163 assertTrue("No mappings made.", mp != null && mp.length > 0);
164 int nsecStr = 0, nsTemp = 0;
165 // test for presence of transferred annotation on sequence
166 for (AlignmentAnnotation alan : sq.getAnnotation())
172 if (alan.graph == alan.LINE_GRAPH)
178 "Only one secondary structure should be transferred to associated sequence.",
181 "Only two line graphs should be transferred to associated sequence.",
183 // Now test the transfer function and compare annotated positions
184 for (StructureMapping origMap : mp)
186 if (origMap.getSequence() == sq)
188 assertEquals("Mapping was incomplete.", sq.getLength() - 1,
189 (origMap.getPDBResNum(sq.getEnd()) - origMap
190 .getPDBResNum(sq.getStart())));
191 // sanity check - if this fails, mapping from first position in sequence
192 // we want to transfer to is not where we expect
193 assertEquals(1, origMap.getSeqPos(126));
194 SequenceI firstChain = pde.getSeqs().get(0);
195 // Compare the annotated positions on the PDB chain sequence with the
196 // annotation on the associated sequence
197 for (AlignmentAnnotation alan : firstChain.getAnnotation())
199 AlignmentAnnotation transfer = origMap.transfer(alan);
200 System.out.println("pdb:" + firstChain.getSequenceAsString());
201 System.out.println("ann:" + alan.toString());
202 System.out.println("pdb:" + sq.getSequenceAsString());
203 System.out.println("ann:" + transfer.toString());
205 for (int p = 0, pSize = firstChain.getLength(); p < pSize; p++)
207 // walk along the pdb chain's jalview sequence
209 int fpos = origMap.getSeqPos(rseqpos = firstChain
211 // only look at positions where there is a corresponding position in
217 // p is index into PDB residue entries
218 // rseqpos is pdb sequence position for position p
219 // fpos is sequence position for associated position for rseqpos
220 // tanpos is the column for the mapped sequence position
221 int tanpos = sq.findIndex(fpos) - 1;
222 if (tanpos < 0 || transfer.annotations.length <= tanpos)
224 // gone beyond mapping to the sequence
228 Annotation a = transfer.annotations[tanpos], b = alan.annotations[p];
229 assertEquals("Non-equivalent annotation element at " + p + "("
230 + rseqpos + ")" + " expected at " + fpos + " (alIndex "
231 + tanpos + ")", a == null ? a : a.toString(),
232 b == null ? b : b.toString());
233 System.out.print("(" + a + "|" + b + ")");
242 * corner case for pdb mapping - revealed a problem with the AlignSeq->Mapping
246 @Test(groups = { "Functional" })
247 public void mapFer1From3W5V() throws Exception
249 AlignFrame seqf = new FileLoader(false)
250 .loadFileWaitTillLoaded(
251 ">FER1_MAIZE/1-150 Ferredoxin-1, chloroplast precursor\nMATVLGSPRAPAFFFSSSSLRAAPAPTAVALPAAKVGIMGRSASSRRRLRAQATYNVKLITPEGEVELQVPD\nDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDDGQIADGWVLTCHAYPTSDVVIETHKE\nEELTGA",
252 DataSourceType.PASTE, FileFormat.Fasta);
253 SequenceI newseq = seqf.getViewport().getAlignment().getSequenceAt(0);
254 StructureSelectionManager ssm = StructureSelectionManager
255 .getStructureSelectionManager(null);
256 StructureFile pmap = ssm.setMapping(true, new SequenceI[] { newseq },
257 new String[] { null }, "examples/3W5V.pdb",
258 DataSourceType.FILE);
261 AssertJUnit.fail("Couldn't make a mapping for 3W5V to FER1_MAIZE");
266 * compare reference annotation for imported pdb sequence to identical
267 * seuqence with transferred annotation from mapped pdb file
269 @Test(groups = { "Functional" })
270 public void compareTransferredToRefPDBAnnot() throws Exception
272 StructureImportSettings.setProcessSecondaryStructure(true);
273 StructureImportSettings.setVisibleChainAnnotation(true);
274 StructureImportSettings.setShowSeqFeatures(true);
275 AlignFrame ref = new FileLoader(false)
276 .LoadFileWaitTillLoaded("test/jalview/ext/jmol/1QCF.pdb",
277 DataSourceType.FILE);
278 SequenceI refseq = ref.getViewport().getAlignment().getSequenceAt(0);
279 SequenceI newseq = new Sequence(refseq.getName() + "Copy",
280 refseq.getSequenceAsString());
281 // make it harder by shifting the copy vs the reference
282 newseq.setStart(refseq.getStart() + 25);
283 newseq.setEnd(refseq.getLength() + 25 + refseq.getStart());
284 StructureSelectionManager ssm = StructureSelectionManager
285 .getStructureSelectionManager(null);
286 ssm.setProcessSecondaryStructure(true);
287 ssm.setAddTempFacAnnot(true);
288 StructureFile pmap = ssm.setMapping(true, new SequenceI[] { newseq },
289 new String[] { null }, "test/jalview/ext/jmol/1QCF.pdb",
290 DataSourceType.FILE);
291 assertTrue(pmap != null);
292 assertEquals("Original and copied sequence of different lengths.",
293 refseq.getLength(), newseq.getLength());
294 assertTrue(refseq.getAnnotation() != null
295 && refseq.getAnnotation().length > 0);
296 assertTrue(newseq.getAnnotation() != null
297 && newseq.getAnnotation().length > 0);
298 for (AlignmentAnnotation oannot : refseq.getAnnotation())
300 for (AlignmentAnnotation tannot : newseq.getAnnotation(oannot.label))
302 for (int p = 0, pSize = refseq.getLength(); p < pSize; p++)
304 Annotation orig = oannot.annotations[p], tran = tannot.annotations[p];
305 assertTrue("Mismatch: coil and non coil site " + p, orig == tran
306 || orig != null && tran != null);
309 assertEquals("Mismatch in secondary structure at site " + p,
310 tran.secondaryStructure, orig.secondaryStructure);