X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fanalysis%2Fscoremodels%2FFeatureDistanceModelTest.java;h=16ca70d13b7ae7c9ee0b1079948854fc08e79a68;hb=b87e96a7592f21c11e2e3a218b24de524c3a39fc;hp=8b848299a92730f9ff23adbe81b5929b4fc75637;hpb=fcb39fa3bc47777bf4e0eb209f765dd254dc3cb9;p=jalview.git diff --git a/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java b/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java index 8b84829..16ca70d 100644 --- a/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java +++ b/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java @@ -21,14 +21,22 @@ package jalview.analysis.scoremodels; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import jalview.api.analysis.ScoreModelI; +import jalview.api.analysis.SimilarityParamsI; +import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; +import jalview.datamodel.AlignmentView; +import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; +import jalview.gui.AlignViewport; import jalview.gui.JvOptionPane; import jalview.io.DataSourceType; import jalview.io.FileLoader; +import jalview.math.MatrixI; import java.util.Arrays; @@ -77,18 +85,18 @@ public class FeatureDistanceModelTest SequenceI ds = al.getSequenceAt(i).getDatasetSequence(); if (sf1[i * 2] > 0) { - ds.addSequenceFeature(new SequenceFeature("sf1", "sf1", "sf1", - sf1[i * 2], sf1[i * 2 + 1], "sf1")); + ds.addSequenceFeature(new SequenceFeature("sf1", "sf1", sf1[i * 2], + sf1[i * 2 + 1], "sf1")); } if (sf2[i * 2] > 0) { - ds.addSequenceFeature(new SequenceFeature("sf2", "sf2", "sf2", - sf2[i * 2], sf2[i * 2 + 1], "sf2")); + ds.addSequenceFeature(new SequenceFeature("sf2", "sf2", sf2[i * 2], + sf2[i * 2 + 1], "sf2")); } if (sf3[i * 2] > 0) { - ds.addSequenceFeature(new SequenceFeature("sf3", "sf3", "sf3", - sf3[i * 2], sf3[i * 2 + 1], "sf3")); + ds.addSequenceFeature(new SequenceFeature("sf3", "sf3", sf3[i * 2], + sf3[i * 2 + 1], "sf3")); } } alf.setShowSeqFeatures(true); @@ -98,7 +106,7 @@ public class FeatureDistanceModelTest alf.getFeatureRenderer().findAllFeatures(true); Assert.assertEquals(alf.getFeatureRenderer().getDisplayedFeatureTypes() .size(), 3, "Number of feature types"); - Assert.assertTrue(alf.getCurrentView().areFeaturesDisplayed()); + assertTrue(alf.getCurrentView().areFeaturesDisplayed()); return alf; } @@ -106,16 +114,17 @@ public class FeatureDistanceModelTest public void testFeatureScoreModel() throws Exception { AlignFrame alf = getTestAlignmentFrame(); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - Assert.assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView() - .getAlignPanel())); + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + alf.getCurrentView().getAlignPanel()); alf.selectAllSequenceMenuItem_actionPerformed(null); - float[][] dm = fsm.findDistances(alf.getViewport().getAlignmentView( - true)); - Assert.assertTrue(dm[0][2] == 0f, + MatrixI dm = sm.findDistances( + alf.getViewport().getAlignmentView(true), + SimilarityParams.Jalview); + assertEquals(dm.getValue(0, 2), 0d, "FER1_MESCR (0) should be identical with RAPSA (2)"); - Assert.assertTrue(dm[0][1] > dm[0][2], + assertTrue(dm.getValue(0, 1) > dm.getValue(0, 2), "FER1_MESCR (0) should be further from SPIOL (1) than it is from RAPSA (2)"); } @@ -125,15 +134,16 @@ public class FeatureDistanceModelTest AlignFrame alf = getTestAlignmentFrame(); // hiding first two columns shouldn't affect the tree alf.getViewport().hideColumns(0, 1); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - Assert.assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView() - .getAlignPanel())); + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + alf.getCurrentView().getAlignPanel()); alf.selectAllSequenceMenuItem_actionPerformed(null); - float[][] dm = fsm.findDistances(alf.getViewport().getAlignmentView( - true)); - Assert.assertTrue(dm[0][2] == 0f, + MatrixI dm = sm.findDistances( + alf.getViewport().getAlignmentView(true), + SimilarityParams.Jalview); + assertEquals(dm.getValue(0, 2), 0d, "FER1_MESCR (0) should be identical with RAPSA (2)"); - Assert.assertTrue(dm[0][1] > dm[0][2], + assertTrue(dm.getValue(0, 1) > dm.getValue(0, 2), "FER1_MESCR (0) should be further from SPIOL (1) than it is from RAPSA (2)"); } @@ -144,21 +154,25 @@ public class FeatureDistanceModelTest // hide columns and check tree changes alf.getViewport().hideColumns(3, 4); alf.getViewport().hideColumns(0, 1); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - Assert.assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView() - .getAlignPanel())); + // getName() can become static in Java 8 + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + alf.getCurrentView().getAlignPanel()); alf.selectAllSequenceMenuItem_actionPerformed(null); - float[][] dm = fsm.findDistances(alf.getViewport().getAlignmentView( - true)); - Assert.assertTrue( - dm[0][2] == 0f, + MatrixI dm = sm.findDistances( + alf.getViewport().getAlignmentView(true), + SimilarityParams.Jalview); + assertEquals( + dm.getValue(0, 2), + 0d, "After hiding last two columns FER1_MESCR (0) should still be identical with RAPSA (2)"); - Assert.assertTrue( - dm[0][1] == 0f, + assertEquals( + dm.getValue(0, 1), + 0d, "After hiding last two columns FER1_MESCR (0) should now also be identical with SPIOL (1)"); for (int s = 0; s < 3; s++) { - Assert.assertTrue(dm[s][3] > 0f, "After hiding last two columns " + assertTrue(dm.getValue(s, 3) > 0d, "After hiding last two columns " + alf.getViewport().getAlignment().getSequenceAt(s).getName() + "(" + s + ") should still be distinct from FER1_MAIZE (3)"); } @@ -179,28 +193,28 @@ public class FeatureDistanceModelTest SequenceFeature sf = null; sf = new SequenceFeature("disulphide bond", "", 2, 5, Float.NaN, ""); aseq.addSequenceFeature(sf); - Assert.assertTrue(sf.isContactFeature()); + assertTrue(sf.isContactFeature()); af.refreshFeatureUI(true); af.getFeatureRenderer().setAllVisible(Arrays.asList("disulphide bond")); Assert.assertEquals(af.getFeatureRenderer().getDisplayedFeatureTypes() .size(), 1, "Should be just one feature type displayed"); // step through and check for pointwise feature presence/absence - Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtRes(aseq, 1) + Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtColumn(aseq, 1) .size(), 0); // step through and check for pointwise feature presence/absence - Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtRes(aseq, 2) + Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtColumn(aseq, 2) .size(), 1); // step through and check for pointwise feature presence/absence - Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtRes(aseq, 3) + Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtColumn(aseq, 3) .size(), 0); // step through and check for pointwise feature presence/absence - Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtRes(aseq, 4) + Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtColumn(aseq, 4) .size(), 0); // step through and check for pointwise feature presence/absence - Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtRes(aseq, 5) + Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtColumn(aseq, 5) .size(), 1); // step through and check for pointwise feature presence/absence - Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtRes(aseq, 6) + Assert.assertEquals(af.getFeatureRenderer().findFeaturesAtColumn(aseq, 6) .size(), 0); } @@ -240,20 +254,102 @@ public class FeatureDistanceModelTest alf.setShowSeqFeatures(true); alf.getFeatureRenderer().findAllFeatures(true); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - Assert.assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView() - .getAlignPanel())); + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + alf.getCurrentView().getAlignPanel()); alf.selectAllSequenceMenuItem_actionPerformed(null); - float[][] distances = fsm.findDistances(alf.getViewport() - .getAlignmentView(true)); - assertEquals(distances.length, 2); - assertEquals(distances[0][0], 0f); - assertEquals(distances[1][1], 0f); - // these left to fail pending resolution of - // JAL-2424 (dividing score by 6, not 5) - assertEquals(distances[0][1], 1f); - assertEquals(distances[1][0], 1f); + AlignmentView alignmentView = alf.getViewport() + .getAlignmentView(true); + MatrixI distances = sm.findDistances(alignmentView, + SimilarityParams.Jalview); + assertEquals(distances.width(), 2); + assertEquals(distances.height(), 2); + assertEquals(distances.getValue(0, 0), 0d); + assertEquals(distances.getValue(1, 1), 0d); + + assertEquals(distances.getValue(0, 1), 1d, + "expected identical pairs. (check normalisation for similarity score)"); + assertEquals(distances.getValue(1, 0), 1d); + } + + /** + * Verify computed distances with varying parameter options + */ + @Test(groups = "Functional") + public void testFindDistances_withParams() + { + AlignFrame af = setupAlignmentView(); + AlignViewport viewport = af.getViewport(); + AlignmentView view = viewport.getAlignmentView(false); + + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + af.alignPanel); + + /* + * feature distance model always normalises by region width + * gap-gap is always included (but scores zero) + * the only variable parameter is 'includeGaps' + */ + + /* + * include gaps + * score = 3 + 3 + 0 + 2 + 3 + 2 = 13/6 + */ + SimilarityParamsI params = new SimilarityParams(true, true, true, true); + MatrixI distances = sm.findDistances(view, params); + assertEquals(distances.getValue(0, 0), 0d); + assertEquals(distances.getValue(1, 1), 0d); + assertEquals(distances.getValue(0, 1), 13d / 6); // should be 13d/6 + assertEquals(distances.getValue(1, 0), 13d / 6); + + /* + * exclude gaps + * score = 3 + 3 + 0 + 0 + 0 + 0 = 6/6 + */ + params = new SimilarityParams(true, true, false, true); + distances = sm.findDistances(view, params); + assertEquals(distances.getValue(0, 1), 6d / 6);// should be 6d/6 + } + + /** + *
+   * Set up
+   *   column      1 2 3 4 5 6
+   *        seq s1 F R - K - S
+   *        seq s2 F S - - L
+   *   s1 chain    c c   c   c
+   *   s1 domain   d d   d   d
+   *   s2 chain    c c     c
+   *   s2 metal    m m     m
+   *   s2 Pfam     P P     P
+   *      scores:  3 3 0 2 3 2
+   * 
+ * + * @return + */ + protected AlignFrame setupAlignmentView() + { + /* + * for now, using space for gap to match callers of + * AlignmentView.getSequenceStrings() + * may change this to '-' (with corresponding change to matrices) + */ + SequenceI s1 = new Sequence("s1", "FR K S"); + SequenceI s2 = new Sequence("s2", "FS L"); + + s1.addSequenceFeature(new SequenceFeature("chain", null, 1, 4, 0f, null)); + s1.addSequenceFeature(new SequenceFeature("domain", null, 1, 4, 0f, + null)); + s2.addSequenceFeature(new SequenceFeature("chain", null, 1, 3, 0f, null)); + s2.addSequenceFeature(new SequenceFeature("metal", null, 1, 3, 0f, null)); + s2.addSequenceFeature(new SequenceFeature("Pfam", null, 1, 3, 0f, null)); + AlignmentI al = new Alignment(new SequenceI[] { s1, s2 }); + AlignFrame af = new AlignFrame(al, 300, 300); + af.setShowSeqFeatures(true); + af.getFeatureRenderer().findAllFeatures(true); + return af; } }