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.analysis.scoremodels;
23 import static org.testng.Assert.assertEquals;
24 import static org.testng.Assert.assertTrue;
26 import jalview.api.analysis.ScoreModelI;
27 import jalview.api.analysis.SimilarityParamsI;
28 import jalview.datamodel.Alignment;
29 import jalview.datamodel.AlignmentAnnotation;
30 import jalview.datamodel.AlignmentI;
31 import jalview.datamodel.AlignmentView;
32 import jalview.datamodel.Annotation;
33 import jalview.datamodel.Sequence;
34 import jalview.datamodel.SequenceFeature;
35 import jalview.datamodel.SequenceI;
36 import jalview.gui.AlignFrame;
37 import jalview.gui.AlignViewport;
38 import jalview.gui.JvOptionPane;
39 import jalview.io.DataSourceType;
40 import jalview.io.FileLoader;
41 import jalview.math.MatrixI;
43 import org.testng.Assert;
44 import org.testng.annotations.BeforeClass;
45 import org.testng.annotations.Test;
47 // This class tests methods in Class SecondaryStructureDistanceModel
48 public class SecondaryStructureDistanceModelTest
51 @BeforeClass(alwaysRun = true)
52 public void setUpJvOptionPane()
54 JvOptionPane.setInteractiveMode(false);
55 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
58 public static String alntestFile = "FER1_MESCR/72-76 DVYIL\nFER1_SPIOL/71-75 DVYIL\nFER3_RAPSA/21-25 DVYVL\nFER1_MAIZE/73-77 DVYIL\n";
60 int[] sf1 = new int[] { 74, 74, 73, 73, 23, 23, -1, -1 };
62 int[] sf2 = new int[] { -1, -1, 74, 75, -1, -1, 76, 77 };
64 int[] sf3 = new int[] { -1, -1, -1, -1, -1, -1, 76, 77 };
68 * Load test alignment and add features to sequences:
69 * FER1_MESCR FER1_SPIOL FER3_RAPSA FER1_MAIZE
77 public AlignFrame getTestAlignmentFrame()
79 AlignFrame alf = new FileLoader(false)
80 .LoadFileWaitTillLoaded(alntestFile, DataSourceType.PASTE);
81 AlignmentI al = alf.getViewport().getAlignment();
82 Assert.assertEquals(al.getHeight(), 4);
83 Assert.assertEquals(al.getWidth(), 5);
84 for (int i = 0; i < 4; i++)
86 SequenceI ds = al.getSequenceAt(i).getDatasetSequence();
89 ds.addSequenceFeature(new SequenceFeature("sf1", "sf1", sf1[i * 2],
90 sf1[i * 2 + 1], "sf1"));
94 ds.addSequenceFeature(new SequenceFeature("sf2", "sf2", sf2[i * 2],
95 sf2[i * 2 + 1], "sf2"));
99 ds.addSequenceFeature(new SequenceFeature("sf3", "sf3", sf3[i * 2],
100 sf3[i * 2 + 1], "sf3"));
103 alf.setShowSeqFeatures(true);
104 alf.getFeatureRenderer().setVisible("sf1");
105 alf.getFeatureRenderer().setVisible("sf2");
106 alf.getFeatureRenderer().setVisible("sf3");
107 alf.getFeatureRenderer().findAllFeatures(true);
109 alf.getFeatureRenderer().getDisplayedFeatureTypes().size(), 3,
110 "Number of feature types");
111 assertTrue(alf.getCurrentView().areFeaturesDisplayed());
118 * Verify computed distances of sequences with similar secondary structures
120 @Test(groups = "Functional")
121 public void testFindDistances_AllSimilar()
123 AlignFrame af = setupAlignmentView("All Similar");
124 AlignViewport viewport = af.getViewport();
125 AlignmentView view = viewport.getAlignmentView(false);
127 ScoreModelI sm = new SecondaryStructureDistanceModel();
128 sm = ScoreModels.getInstance().getScoreModel(sm.getName(),
132 * feature distance model always normalises by region width
135 SimilarityParamsI params = new SimilarityParams(false, true, true, true);
136 MatrixI distances = sm.findDistances(view, params);
137 assertEquals(distances.getValue(0, 0), 0d);
138 assertEquals(distances.getValue(1, 1), 0d);
139 assertEquals(distances.getValue(0, 1), 0d / 4);
140 assertEquals(distances.getValue(1, 0), 0d / 4);
144 * Verify computed distances of sequences with partially similar secondary structures
146 @Test(groups = "Functional")
147 public void testFindDistances_PartiallySimilar()
149 AlignFrame af = setupAlignmentView("Partially Similar");
150 AlignViewport viewport = af.getViewport();
151 AlignmentView view = viewport.getAlignmentView(false);
153 ScoreModelI sm = new SecondaryStructureDistanceModel();
154 sm = ScoreModels.getInstance().getScoreModel(sm.getName(),
158 * score = 0 + 0 + 2 + 2 = 4/4
160 SimilarityParamsI params = new SimilarityParams(false, true, true, true);
161 MatrixI distances = sm.findDistances(view, params);
162 assertEquals(distances.getValue(0, 0), 0d);
163 assertEquals(distances.getValue(1, 1), 0d);
164 assertEquals(distances.getValue(0, 1), 1d); // should be 13d/6
165 assertEquals(distances.getValue(1, 0), 1d);
169 * Verify computed distances of sequences with dissimilar secondary structures
171 @Test(groups = "Functional")
172 public void testFindDistances_notSimilar()
174 AlignFrame af = setupAlignmentView("Not Similar");
175 AlignViewport viewport = af.getViewport();
176 AlignmentView view = viewport.getAlignmentView(false);
178 ScoreModelI sm = new SecondaryStructureDistanceModel();
179 sm = ScoreModels.getInstance().getScoreModel(sm.getName(),
183 * score = 2 + 2 + 2 + 2 = 8/4
185 SimilarityParamsI params = new SimilarityParams(false, true, true, true);
186 MatrixI distances = sm.findDistances(view, params);
187 assertEquals(distances.getValue(0, 0), 0d);
188 assertEquals(distances.getValue(1, 1), 0d);
189 assertEquals(distances.getValue(0, 1), 2d);
190 assertEquals(distances.getValue(1, 0), 2d);
194 * Verify computed distances of sequences with gap
196 @Test(groups = "Functional")
197 public void testFindDistances_withGap()
199 AlignFrame af = setupAlignmentViewWithGap("Not Similar");
200 AlignViewport viewport = af.getViewport();
201 AlignmentView view = viewport.getAlignmentView(false);
203 ScoreModelI sm = new SecondaryStructureDistanceModel();
204 sm = ScoreModels.getInstance().getScoreModel(sm.getName(),
208 * feature distance model always normalises by region width
209 * gap-gap is always included (but scores zero)
210 * the only variable parameter is 'includeGaps'
215 * score = 0 + 0 + 1 + 0 = 1/4
217 SimilarityParamsI params = new SimilarityParams(false, true, true, true);
218 MatrixI distances = sm.findDistances(view, params);
219 assertEquals(distances.getValue(0, 0), 0d);
220 assertEquals(distances.getValue(1, 1), 0d);
221 assertEquals(distances.getValue(0, 1), 1d/4);
222 assertEquals(distances.getValue(1, 0), 1d/4);
226 * score = 0 + 0 + 0 + 0 = 0/4
229 SimilarityParamsI params2 = new SimilarityParams(false, true, false, true);
230 MatrixI distances2 = sm.findDistances(view, params2);
231 assertEquals(distances2.getValue(0, 1), 0d);
232 assertEquals(distances2.getValue(1, 0), 0d);
248 protected AlignFrame setupAlignmentView(String similar)
251 * sequences without gaps
253 SequenceI s1 = new Sequence("s1", "FRKS");
254 SequenceI s2 = new Sequence("s2", "FSJL");
256 s1.addSequenceFeature(
257 new SequenceFeature("chain", null, 1, 4, 0f, null));
258 s1.addSequenceFeature(
259 new SequenceFeature("domain", null, 1, 4, 0f, null));
260 s2.addSequenceFeature(
261 new SequenceFeature("chain", null, 1, 4, 0f, null));
262 s2.addSequenceFeature(
263 new SequenceFeature("metal", null, 1, 4, 0f, null));
264 s2.addSequenceFeature(
265 new SequenceFeature("Pfam", null, 1, 4, 0f, null));
269 * Set up secondary structure annotations
271 Annotation ssE = new Annotation("","",'E',0);
272 Annotation ssH = new Annotation("","",'H',0);
273 Annotation ssS = new Annotation(".","",' ',0);
278 /* All secondary structure annotations are similar for each column
287 if(similar == "All Similar") {
289 anns1 = new Annotation[] { ssE, ssH, ssS, ssE};
290 anns2 = new Annotation[] { ssE, ssH, ssS, ssE};
294 /* All secondary structure annotations are dissimilar for each column
303 else if(similar == "Not Similar") {
305 anns1 = new Annotation[] { ssE, ssE, ssS, ssE};
306 anns2 = new Annotation[] { ssH, ssH, ssE, ssS};
320 anns1 = new Annotation[] { ssH, ssE, ssS, ssE};
321 anns2 = new Annotation[] { ssH, ssE, ssE, ssS};
325 AlignmentAnnotation ann1 = new AlignmentAnnotation("Secondary Structure",
326 "Secondary Structure", anns1);
327 AlignmentAnnotation ann2 = new AlignmentAnnotation("Secondary Structure",
328 "Secondary Structure", anns2);
330 s1.addAlignmentAnnotation(ann1);
331 s2.addAlignmentAnnotation(ann2);
333 AlignmentI al = new Alignment(new SequenceI[] { s1, s2 });
334 AlignFrame af = new AlignFrame(al, 300, 300);
335 af.setShowSeqFeatures(true);
336 af.getFeatureRenderer().findAllFeatures(true);
354 protected AlignFrame setupAlignmentViewWithGap(String similar)
357 SequenceI s1 = new Sequence("s1", "FR S");
358 SequenceI s2 = new Sequence("s2", "FSJL");
360 s1.addSequenceFeature(
361 new SequenceFeature("chain", null, 1, 3, 0f, null));
362 s1.addSequenceFeature(
363 new SequenceFeature("domain", null, 1, 3, 0f, null));
364 s2.addSequenceFeature(
365 new SequenceFeature("chain", null, 1, 4, 0f, null));
366 s2.addSequenceFeature(
367 new SequenceFeature("metal", null, 1, 4, 0f, null));
368 s2.addSequenceFeature(
369 new SequenceFeature("Pfam", null, 1, 4, 0f, null));
372 Annotation ssE = new Annotation("","",'E',0);
373 Annotation ssH = new Annotation("","",'H',0);
374 Annotation ssS = new Annotation(".","",' ',0);
379 anns1 = new Annotation[] { ssH, ssE, ssS};
380 anns2 = new Annotation[] { ssH, ssE, ssE, ssS};
382 AlignmentAnnotation ann1 = new AlignmentAnnotation("Secondary Structure",
383 "Secondary Structure", anns1);
384 AlignmentAnnotation ann2 = new AlignmentAnnotation("Secondary Structure",
385 "Secondary Structure", anns2);
387 s1.addAlignmentAnnotation(ann1);
388 s2.addAlignmentAnnotation(ann2);
390 AlignmentI al = new Alignment(new SequenceI[] { s1, s2 });
391 AlignFrame af = new AlignFrame(al, 300, 300);
392 af.setShowSeqFeatures(true);
393 af.getFeatureRenderer().findAllFeatures(true);