Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.ext.rbvi.chimera

File ChimeraCommandsTest.java

 

Code metrics

2
79
5
1
220
141
6
0.08
15.8
5
1.2

Classes

Class Line # Actions
ChimeraCommandsTest 48 79 6 0
1.0100%
 

Contributing tests

This file is covered by 4 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.ext.rbvi.chimera;
22   
23    import static org.testng.Assert.assertEquals;
24    import static org.testng.Assert.assertTrue;
25   
26    import jalview.datamodel.Alignment;
27    import jalview.datamodel.AlignmentI;
28    import jalview.datamodel.ColumnSelection;
29    import jalview.datamodel.Sequence;
30    import jalview.datamodel.SequenceI;
31    import jalview.gui.AlignFrame;
32    import jalview.gui.JvOptionPane;
33    import jalview.gui.SequenceRenderer;
34    import jalview.schemes.JalviewColourScheme;
35    import jalview.structure.StructureMapping;
36    import jalview.structure.StructureMappingcommandSet;
37    import jalview.structure.StructureSelectionManager;
38   
39    import java.awt.Color;
40    import java.util.HashMap;
41    import java.util.LinkedHashMap;
42    import java.util.List;
43    import java.util.Map;
44   
45    import org.testng.annotations.BeforeClass;
46    import org.testng.annotations.Test;
47   
 
48    public class ChimeraCommandsTest
49    {
50   
 
51  1 toggle @BeforeClass(alwaysRun = true)
52    public void setUpJvOptionPane()
53    {
54  1 JvOptionPane.setInteractiveMode(false);
55  1 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
56    }
57   
 
58  1 toggle @Test(groups = { "Functional" })
59    public void testBuildColourCommands()
60    {
61   
62  1 Map<Object, AtomSpecModel> map = new LinkedHashMap<Object, AtomSpecModel>();
63  1 ChimeraCommands.addColourRange(map, Color.blue, 0, 2, 5, "A");
64  1 ChimeraCommands.addColourRange(map, Color.blue, 0, 7, 7, "B");
65  1 ChimeraCommands.addColourRange(map, Color.blue, 0, 9, 23, "A");
66  1 ChimeraCommands.addColourRange(map, Color.blue, 1, 1, 1, "A");
67  1 ChimeraCommands.addColourRange(map, Color.blue, 1, 4, 7, "B");
68  1 ChimeraCommands.addColourRange(map, Color.yellow, 1, 8, 8, "A");
69  1 ChimeraCommands.addColourRange(map, Color.yellow, 1, 3, 5, "A");
70  1 ChimeraCommands.addColourRange(map, Color.red, 0, 3, 5, "A");
71  1 ChimeraCommands.addColourRange(map, Color.red, 0, 6, 9, "A");
72   
73    // Colours should appear in the Chimera command in the order in which
74    // they were added; within colour, by model, by chain, ranges in start order
75  1 String command = ChimeraCommands.buildColourCommands(map).get(0);
76  1 assertEquals(
77    command,
78    "color #0000ff #0:2-5.A,9-23.A,7.B|#1:1.A,4-7.B; color #ffff00 #1:3-5.A,8.A; color #ff0000 #0:3-9.A");
79    }
80   
 
81  1 toggle @Test(groups = { "Functional" })
82    public void testBuildSetAttributeCommands()
83    {
84    /*
85    * make a map of { featureType, {featureValue, {residue range specification } } }
86    */
87  1 Map<String, Map<Object, AtomSpecModel>> featuresMap = new LinkedHashMap<String, Map<Object, AtomSpecModel>>();
88  1 Map<Object, AtomSpecModel> featureValues = new HashMap<Object, AtomSpecModel>();
89   
90    /*
91    * start with just one feature/value...
92    */
93  1 featuresMap.put("chain", featureValues);
94  1 ChimeraCommands.addColourRange(featureValues, "X", 0, 8, 20, "A");
95   
96  1 List<String> commands = ChimeraCommands
97    .buildSetAttributeCommands(featuresMap);
98  1 assertEquals(1, commands.size());
99   
100    /*
101    * feature name gets a jv_ namespace prefix
102    * feature value is quoted in case it contains spaces
103    */
104  1 assertEquals(commands.get(0), "setattr r jv_chain 'X' #0:8-20.A");
105   
106    // add same feature value, overlapping range
107  1 ChimeraCommands.addColourRange(featureValues, "X", 0, 3, 9, "A");
108    // same feature value, contiguous range
109  1 ChimeraCommands.addColourRange(featureValues, "X", 0, 21, 25, "A");
110  1 commands = ChimeraCommands.buildSetAttributeCommands(featuresMap);
111  1 assertEquals(1, commands.size());
112  1 assertEquals(commands.get(0), "setattr r jv_chain 'X' #0:3-25.A");
113   
114    // same feature value and model, different chain
115  1 ChimeraCommands.addColourRange(featureValues, "X", 0, 21, 25, "B");
116    // same feature value and chain, different model
117  1 ChimeraCommands.addColourRange(featureValues, "X", 1, 26, 30, "A");
118  1 commands = ChimeraCommands.buildSetAttributeCommands(featuresMap);
119  1 assertEquals(1, commands.size());
120  1 assertEquals(commands.get(0),
121    "setattr r jv_chain 'X' #0:3-25.A,21-25.B|#1:26-30.A");
122   
123    // same feature, different value
124  1 ChimeraCommands.addColourRange(featureValues, "Y", 0, 40, 50, "A");
125  1 commands = ChimeraCommands.buildSetAttributeCommands(featuresMap);
126  1 assertEquals(2, commands.size());
127    // commands are ordered by feature type but not by value
128    // so use contains to test for the expected command:
129  1 assertTrue(commands
130    .contains("setattr r jv_chain 'X' #0:3-25.A,21-25.B|#1:26-30.A"));
131  1 assertTrue(commands.contains("setattr r jv_chain 'Y' #0:40-50.A"));
132   
133  1 featuresMap.clear();
134  1 featureValues.clear();
135  1 featuresMap.put("side-chain binding!", featureValues);
136  1 ChimeraCommands.addColourRange(featureValues,
137    "<html>metal <a href=\"http:a.b.c/x\"> 'ion!", 0, 7, 15,
138    "A");
139    // feature names are sanitised to change non-alphanumeric to underscore
140    // feature values are sanitised to encode single quote characters
141  1 commands = ChimeraCommands.buildSetAttributeCommands(featuresMap);
142  1 assertTrue(commands
143    .contains("setattr r jv_side_chain_binding_ '<html>metal <a href=\"http:a.b.c/x\"> &#39;ion!' #0:7-15.A"));
144    }
145   
146    /**
147    * Tests for the method that prefixes and sanitises a feature name so it can
148    * be used as a valid, namespaced attribute name in Chimera
149    */
 
150  1 toggle @Test(groups = { "Functional" })
151    public void testMakeAttributeName()
152    {
153  1 assertEquals(ChimeraCommands.makeAttributeName(null), "jv_");
154  1 assertEquals(ChimeraCommands.makeAttributeName(""), "jv_");
155  1 assertEquals(ChimeraCommands.makeAttributeName("helix"), "jv_helix");
156  1 assertEquals(ChimeraCommands.makeAttributeName("Hello World 24"),
157    "jv_Hello_World_24");
158  1 assertEquals(
159    ChimeraCommands.makeAttributeName("!this is-a_very*{odd(name"),
160    "jv__this_is_a_very__odd_name");
161    // name ending in color gets underscore appended
162  1 assertEquals(ChimeraCommands.makeAttributeName("helixColor"),
163    "jv_helixColor_");
164    }
165   
 
166  1 toggle @Test(groups = { "Functional" })
167    public void testGetColourBySequenceCommands_hiddenColumns()
168    {
169    /*
170    * load these sequences, coloured by Strand propensity,
171    * with columns 2-4 hidden
172    */
173  1 SequenceI seq1 = new Sequence("seq1", "MHRSQSSSGG");
174  1 SequenceI seq2 = new Sequence("seq2", "MVRSNGGSSS");
175  1 AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
176  1 AlignFrame af = new AlignFrame(al, 800, 500);
177  1 af.changeColour_actionPerformed(JalviewColourScheme.Strand.toString());
178  1 ColumnSelection cs = new ColumnSelection();
179  1 cs.addElement(2);
180  1 cs.addElement(3);
181  1 cs.addElement(4);
182  1 af.getViewport().setColumnSelection(cs);
183  1 af.hideSelColumns_actionPerformed(null);
184  1 SequenceRenderer sr = new SequenceRenderer(af.getViewport());
185  1 SequenceI[][] seqs = new SequenceI[][] { { seq1 }, { seq2 } };
186  1 String[] files = new String[] { "seq1.pdb", "seq2.pdb" };
187  1 StructureSelectionManager ssm = new StructureSelectionManager();
188   
189    /*
190    * map residues 1-10 to residues 21-30 (atoms 105-150) in structures
191    */
192  1 HashMap<Integer, int[]> map = new HashMap<Integer, int[]>();
193  11 for (int pos = 1; pos <= seq1.getLength(); pos++)
194    {
195  10 map.put(pos, new int[] { 20 + pos, 5 * (20 + pos) });
196    }
197  1 StructureMapping sm1 = new StructureMapping(seq1, "seq1.pdb", "pdb1",
198    "A", map, null);
199  1 ssm.addStructureMapping(sm1);
200  1 StructureMapping sm2 = new StructureMapping(seq2, "seq2.pdb", "pdb2",
201    "B", map, null);
202  1 ssm.addStructureMapping(sm2);
203   
204  1 StructureMappingcommandSet[] commands = ChimeraCommands
205    .getColourBySequenceCommand(ssm, files, seqs, sr, af.alignPanel);
206  1 assertEquals(1, commands.length);
207  1 assertEquals(1, commands[0].commands.length);
208  1 String theCommand = commands[0].commands[0];
209    // M colour is #82827d (see strand.html help page)
210  1 assertTrue(theCommand.contains("color #82827d #0:21.A|#1:21.B"));
211    // H colour is #60609f
212  1 assertTrue(theCommand.contains("color #60609f #0:22.A"));
213    // V colour is #ffff00
214  1 assertTrue(theCommand.contains("color #ffff00 #1:22.B"));
215    // hidden columns are Gray (128, 128, 128)
216  1 assertTrue(theCommand.contains("color #808080 #0:23-25.A|#1:23-25.B"));
217    // S and G are both coloured #4949b6
218  1 assertTrue(theCommand.contains("color #4949b6 #0:26-30.A|#1:26-30.B"));
219    }
220    }