Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.structures.models

File AAStructureBindingModelTest.java

 

Code metrics

8
79
33
1
457
315
37
0.47
2.39
33
1.12

Classes

Class Line # Actions
AAStructureBindingModelTest 62 79 37 38
0.6833333468.3%
 

Contributing tests

This file is covered by 3 tests. .

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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.
11    *
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.
16    *
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.
20    */
21    package jalview.structures.models;
22   
23    import static org.testng.Assert.assertFalse;
24    import static org.testng.AssertJUnit.assertEquals;
25    import static org.testng.AssertJUnit.assertTrue;
26   
27    import jalview.api.AlignmentViewPanel;
28    import jalview.api.FeatureRenderer;
29    import jalview.api.SequenceRenderer;
30    import jalview.datamodel.Alignment;
31    import jalview.datamodel.AlignmentI;
32    import jalview.datamodel.HiddenColumns;
33    import jalview.datamodel.PDBEntry;
34    import jalview.datamodel.PDBEntry.Type;
35    import jalview.datamodel.Sequence;
36    import jalview.datamodel.SequenceI;
37    import jalview.gui.JvOptionPane;
38    import jalview.io.DataSourceType;
39    import jalview.io.FileFormats;
40    import jalview.schemes.ColourSchemeI;
41    import jalview.structure.AtomSpec;
42    import jalview.structure.StructureMappingcommandSet;
43    import jalview.structure.StructureSelectionManager;
44    import jalview.structures.models.AAStructureBindingModel.SuperposeData;
45   
46    import java.awt.Color;
47    import java.io.IOException;
48    import java.util.Arrays;
49    import java.util.BitSet;
50    import java.util.List;
51   
52    import org.testng.annotations.BeforeClass;
53    import org.testng.annotations.BeforeMethod;
54    import org.testng.annotations.Test;
55   
56    /**
57    * Unit tests for non-abstract methods of abstract base class
58    *
59    * @author gmcarstairs
60    *
61    */
 
62    public class AAStructureBindingModelTest
63    {
64   
 
65  1 toggle @BeforeClass(alwaysRun = true)
66    public void setUpJvOptionPane()
67    {
68  1 JvOptionPane.setInteractiveMode(false);
69  1 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
70    }
71   
72    /*
73    * Scenario: Jalview has 4 sequences, corresponding to 1YCS (chains A and B), 3A6S|B, 1OOT|A
74    */
75    private static final String PDB_1 = "HEADER COMPLEX (ANTI-ONCOGENE/ANKYRIN REPEATS) 30-SEP-96 1YCS \n"
76    + "ATOM 2 CA VAL A 97 24.134 4.926 45.821 1.00 47.43 C \n"
77    + "ATOM 9 CA PRO A 98 25.135 8.584 46.217 1.00 41.60 C \n"
78    + "ATOM 16 CA SER A 99 28.243 9.596 44.271 1.00 39.63 C \n"
79    + "ATOM 22 CA GLN A 100 31.488 10.133 46.156 1.00 35.60 C \n"
80    // artificial jump in residue numbering to prove it is correctly
81    // mapped:
82    + "ATOM 31 CA LYS A 102 33.323 11.587 43.115 1.00 41.69 C \n"
83    + "ATOM 1857 CA GLU B 374 9.193 -16.005 95.870 1.00 54.22 C \n"
84    + "ATOM 1866 CA ILE B 375 7.101 -14.921 92.847 1.00 46.82 C \n"
85    + "ATOM 1874 CA VAL B 376 10.251 -13.625 91.155 1.00 47.80 C \n"
86    + "ATOM 1881 CA LYS B 377 11.767 -17.068 91.763 1.00 50.21 C \n"
87    + "ATOM 1890 CA PHE B 378 8.665 -18.948 90.632 1.00 44.85 C \n";
88   
89    private static final String PDB_2 = "HEADER HYDROLASE 09-SEP-09 3A6S \n"
90    + "ATOM 2 CA MET B 1 15.366 -11.648 24.854 1.00 32.05 C \n"
91    + "ATOM 10 CA LYS B 2 16.846 -9.215 22.340 1.00 25.68 C \n"
92    + "ATOM 19 CA LYS B 3 15.412 -6.335 20.343 1.00 19.42 C \n"
93    + "ATOM 28 CA LEU B 4 15.629 -5.719 16.616 1.00 15.49 C \n"
94    + "ATOM 36 CA GLN B 5 14.412 -2.295 15.567 1.00 12.19 C \n";
95   
96    private static final String PDB_3 = "HEADER STRUCTURAL GENOMICS 04-MAR-03 1OOT \n"
97    + "ATOM 2 CA SER A 7 29.427 3.330 -6.578 1.00 32.50 C \n"
98    + "ATOM 8 CA PRO A 8 29.975 3.340 -2.797 1.00 17.62 C \n"
99    + "ATOM 16 CA ALYS A 9 26.958 3.024 -0.410 0.50 8.78 C \n"
100    + "ATOM 33 CA ALA A 10 26.790 4.320 3.172 1.00 11.98 C \n"
101    + "ATOM 39 CA AVAL A 12 24.424 3.853 6.106 0.50 13.83 C \n";
102   
103    /**
104    * Multichain PDB with identical sequences imported - Binding should correctly
105    * recover chain mappings for each derived sequence
106    */
107    private static final String PDB_4_MC = "HEADER HYDROLASE 09-SEP-09 3A6S \n"
108    + "ATOM 2 CA MET A 1 15.366 -11.648 24.854 1.00 32.05 C \n"
109    + "ATOM 10 CA LYS A 2 16.846 -9.215 22.340 1.00 25.68 C \n"
110    + "ATOM 19 CA LYS A 3 15.412 -6.335 20.343 1.00 19.42 C \n"
111    + "ATOM 28 CA LEU A 4 15.629 -5.719 16.616 1.00 15.49 C \n"
112    + "ATOM 36 CA GLN A 5 14.412 -2.295 15.567 1.00 12.19 C \n"
113    + "ATOM 1030 CA MET B 1 18.869 -7.572 3.432 1.00 31.52 C \n"
114    + "ATOM 1038 CA LYS B 2 19.182 -10.025 6.313 1.00 26.41 C \n"
115    + "ATOM 1047 CA LYS B 3 17.107 -12.963 7.534 1.00 19.71 C \n"
116    + "ATOM 1056 CA LEU B 4 16.142 -13.579 11.164 1.00 14.81 C \n"
117    + "ATOM 1064 CA GLN B 5 14.648 -17.005 11.785 1.00 13.38 C \n";
118   
119    // TODO: JAL-2227 - import mmCIF PISA assembly & identify master/copy chains
120   
 
121  1 toggle @Test(groups= {"Functional"})
122    public void testImportPDBPreservesChainMappings() throws IOException
123    {
124  1 AlignmentI importedAl = new jalview.io.FormatAdapter().readFile(
125    PDB_4_MC, DataSourceType.PASTE, FileFormats.getInstance()
126    .forName(jalview.io.FileFormat.PDB.toString()));
127    // ideally, we would match on the actual data for the 'File' handle for
128    // pasted files,
129    // see JAL-623 - pasting is still not correctly handled...
130  1 PDBEntry importedPDB = new PDBEntry("3A6S", "", Type.PDB,
131    "Paste");
132  1 AAStructureBindingModel binder = new AAStructureBindingModel(
133    new StructureSelectionManager(), new PDBEntry[]
134    { importedPDB },
135    new SequenceI[][]
136    { importedAl.getSequencesArray() }, null)
137    {
138   
 
139  0 toggle @Override
140    public void updateColours(Object source)
141    {
142    // TODO Auto-generated method stub
143   
144    }
145   
 
146  0 toggle @Override
147    public void releaseReferences(Object svl)
148    {
149    // TODO Auto-generated method stub
150   
151    }
152   
 
153  0 toggle @Override
154    public String[] getStructureFiles()
155    {
156    // TODO Auto-generated method stub
157  0 return null;
158    }
159   
 
160  0 toggle @Override
161    public String superposeStructures(AlignmentI[] alignments,
162    int[] structureIndices, HiddenColumns[] hiddenCols)
163    {
164    // TODO Auto-generated method stub
165  0 return null;
166    }
167   
 
168  0 toggle @Override
169    public void setJalviewColourScheme(ColourSchemeI cs)
170    {
171    // TODO Auto-generated method stub
172   
173    }
174   
 
175  0 toggle @Override
176    public void setBackgroundColour(Color col)
177    {
178    // TODO Auto-generated method stub
179   
180    }
181   
 
182  0 toggle @Override
183    public void highlightAtoms(List<AtomSpec> atoms)
184    {
185    // TODO Auto-generated method stub
186   
187    }
188   
 
189  0 toggle @Override
190    public SequenceRenderer getSequenceRenderer(AlignmentViewPanel alignment)
191    {
192    // TODO Auto-generated method stub
193  0 return null;
194    }
195   
 
196  0 toggle @Override
197    public FeatureRenderer getFeatureRenderer(AlignmentViewPanel alignment)
198    {
199    // TODO Auto-generated method stub
200  0 return null;
201    }
202   
 
203  0 toggle @Override
204    protected StructureMappingcommandSet[] getColourBySequenceCommands(
205    String[] files, SequenceRenderer sr, AlignmentViewPanel avp)
206    {
207    // TODO Auto-generated method stub
208  0 return null;
209    }
210   
 
211  0 toggle @Override
212    public List<String> getChainNames()
213    {
214    // TODO Auto-generated method stub
215  0 return null;
216    }
217   
 
218  0 toggle @Override
219    protected void colourBySequence(
220    StructureMappingcommandSet[] colourBySequenceCommands)
221    {
222    // TODO Auto-generated method stub
223   
224    }
225   
 
226  0 toggle @Override
227    public void colourByCharge()
228    {
229    // TODO Auto-generated method stub
230   
231    }
232   
 
233  0 toggle @Override
234    public void colourByChain()
235    {
236    // TODO Auto-generated method stub
237   
238    }
239    };
240  1 String[][] chains = binder.getChains();
241  1 assertFalse(chains == null || chains[0] == null,
242    "No chains discovered by binding");
243  1 assertEquals(2, chains[0].length);
244  1 assertEquals("A", chains[0][0]);
245  1 assertEquals("B", chains[0][1]);
246    }
247    AAStructureBindingModel testee;
248   
249    AlignmentI al = null;
250   
251    /**
252    * Set up test conditions with three aligned sequences,
253    */
 
254  3 toggle @BeforeMethod(alwaysRun = true)
255    public void setUp()
256    {
257  3 SequenceI seq1a = new Sequence("1YCS|A", "-VPSQK");
258  3 SequenceI seq1b = new Sequence("1YCS|B", "EIVKF-");
259  3 SequenceI seq2 = new Sequence("3A6S", "MK-KLQ");
260  3 SequenceI seq3 = new Sequence("1OOT", "SPK-AV");
261  3 al = new Alignment(new SequenceI[] { seq1a, seq1b, seq2, seq3 });
262  3 al.setDataset(null);
263   
264    /*
265    * give pdb files the name generated by Jalview for PASTE source
266    */
267  3 PDBEntry[] pdbFiles = new PDBEntry[3];
268  3 pdbFiles[0] = new PDBEntry("1YCS", "A", Type.PDB, "INLINE1YCS");
269  3 pdbFiles[1] = new PDBEntry("3A6S", "B", Type.PDB, "INLINE3A6S");
270  3 pdbFiles[2] = new PDBEntry("1OOT", "A", Type.PDB, "INLINE1OOT");
271  3 SequenceI[][] seqs = new SequenceI[3][];
272  3 seqs[0] = new SequenceI[] { seq1a, seq1b };
273  3 seqs[1] = new SequenceI[] { seq2 };
274  3 seqs[2] = new SequenceI[] { seq3 };
275  3 StructureSelectionManager ssm = new StructureSelectionManager();
276   
277  3 ssm.setMapping(new SequenceI[] { seq1a, seq1b }, null, PDB_1,
278    DataSourceType.PASTE, null);
279  3 ssm.setMapping(new SequenceI[] { seq2 }, null, PDB_2,
280    DataSourceType.PASTE, null);
281  3 ssm.setMapping(new SequenceI[] { seq3 }, null, PDB_3,
282    DataSourceType.PASTE, null);
283   
284  3 testee = new AAStructureBindingModel(ssm, pdbFiles, seqs, null)
285    {
 
286  3 toggle @Override
287    public String[] getStructureFiles()
288    {
289  3 return new String[] { "INLINE1YCS", "INLINE3A6S", "INLINE1OOT" };
290    }
291   
 
292  0 toggle @Override
293    public void updateColours(Object source)
294    {
295    }
296   
 
297  0 toggle @Override
298    public void releaseReferences(Object svl)
299    {
300    }
301   
 
302  0 toggle @Override
303    public void highlightAtoms(List<AtomSpec> atoms)
304    {
305    }
306   
 
307  0 toggle @Override
308    public List<String> getChainNames()
309    {
310  0 return null;
311    }
312   
 
313  0 toggle @Override
314    public void setJalviewColourScheme(ColourSchemeI cs)
315    {
316    }
317   
 
318  0 toggle @Override
319    public String superposeStructures(AlignmentI[] als, int[] alm,
320    HiddenColumns[] alc)
321    {
322  0 return null;
323    }
324   
 
325  0 toggle @Override
326    public void setBackgroundColour(Color col)
327    {
328    }
329   
 
330  0 toggle @Override
331    protected StructureMappingcommandSet[] getColourBySequenceCommands(
332    String[] files, SequenceRenderer sr, AlignmentViewPanel avp)
333    {
334  0 return null;
335    }
336   
 
337  0 toggle @Override
338    public SequenceRenderer getSequenceRenderer(
339    AlignmentViewPanel alignment)
340    {
341  0 return null;
342    }
343   
 
344  0 toggle @Override
345    protected void colourBySequence(
346    StructureMappingcommandSet[] colourBySequenceCommands)
347    {
348    }
349   
 
350  0 toggle @Override
351    public void colourByChain()
352    {
353    }
354   
 
355  0 toggle @Override
356    public void colourByCharge()
357    {
358    }
359   
 
360  0 toggle @Override
361    public FeatureRenderer getFeatureRenderer(
362    AlignmentViewPanel alignment)
363    {
364  0 return null;
365    }
366    };
367    }
368   
369    /**
370    * Verify that the method determines that columns 2, 5 and 6 of the alignment
371    * are alignable in structure
372    */
 
373  1 toggle @Test(groups = { "Functional" })
374    public void testFindSuperposableResidues()
375    {
376    /*
377    * create a data bean to hold data per structure file
378    */
379  1 SuperposeData[] structs = new SuperposeData[testee.getStructureFiles().length];
380  4 for (int i = 0; i < structs.length; i++)
381    {
382  3 structs[i] = testee.new SuperposeData(al.getWidth());
383    }
384    /*
385    * initialise BitSet of 'superposable columns' to true (would be false for
386    * hidden columns)
387    */
388  1 BitSet matched = new BitSet();
389  7 for (int i = 0; i < al.getWidth(); i++)
390    {
391  6 matched.set(i);
392    }
393   
394  1 int refStructure = testee
395    .findSuperposableResidues(al, matched, structs);
396   
397  1 assertEquals(0, refStructure);
398   
399    /*
400    * only ungapped, structure-mapped columns are superposable
401    */
402  1 assertFalse(matched.get(0)); // gap in first sequence
403  1 assertTrue(matched.get(1));
404  1 assertFalse(matched.get(2)); // gap in third sequence
405  1 assertFalse(matched.get(3)); // gap in fourth sequence
406  1 assertTrue(matched.get(4));
407  1 assertTrue(matched.get(5)); // gap in second sequence
408   
409  1 assertEquals("1YCS", structs[0].pdbId);
410  1 assertEquals("3A6S", structs[1].pdbId);
411  1 assertEquals("1OOT", structs[2].pdbId);
412  1 assertEquals("A", structs[0].chain); // ? struct has chains A _and_ B
413  1 assertEquals("B", structs[1].chain);
414  1 assertEquals("A", structs[2].chain);
415    // the 0's for unsuperposable positions propagate down the columns:
416  1 assertEquals("[0, 97, 98, 99, 100, 102]",
417    Arrays.toString(structs[0].pdbResNo));
418  1 assertEquals("[0, 2, 0, 3, 4, 5]", Arrays.toString(structs[1].pdbResNo));
419  1 assertEquals("[0, 8, 0, 0, 10, 12]",
420    Arrays.toString(structs[2].pdbResNo));
421    }
422   
 
423  1 toggle @Test(groups = { "Functional" })
424    public void testFindSuperposableResidues_hiddenColumn()
425    {
426  1 SuperposeData[] structs = new SuperposeData[al.getHeight()];
427  5 for (int i = 0; i < structs.length; i++)
428    {
429  4 structs[i] = testee.new SuperposeData(al.getWidth());
430    }
431    /*
432    * initialise BitSet of 'superposable columns' to true (would be false for
433    * hidden columns)
434    */
435  1 BitSet matched = new BitSet();
436  7 for (int i = 0; i < al.getWidth(); i++)
437    {
438  6 matched.set(i);
439    }
440   
441    // treat column 5 of the alignment as hidden
442  1 matched.clear(4);
443   
444  1 int refStructure = testee
445    .findSuperposableResidues(al, matched, structs);
446   
447  1 assertEquals(0, refStructure);
448   
449    // only ungapped, structure-mapped columns are not superposable
450  1 assertFalse(matched.get(0));
451  1 assertTrue(matched.get(1));
452  1 assertFalse(matched.get(2));
453  1 assertFalse(matched.get(3));
454  1 assertFalse(matched.get(4)); // superposable, but hidden, column
455  1 assertTrue(matched.get(5));
456    }
457    }