X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fanalysis%2Fscoremodels%2FFeatureDistanceModelTest.java;h=92f15429a87778b1fb22cd891e4561bed9021693;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=cd6d7f510089b68d8aff8b75a6dcc153e75ce4ab;hpb=7f5ab7d1f58d870622968e0e6a430f33403b8e4f;p=jalview.git diff --git a/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java b/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java index cd6d7f5..92f1542 100644 --- a/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java +++ b/test/jalview/analysis/scoremodels/FeatureDistanceModelTest.java @@ -23,10 +23,16 @@ 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; @@ -69,8 +75,8 @@ public class FeatureDistanceModelTest */ public AlignFrame getTestAlignmentFrame() { - AlignFrame alf = new FileLoader(false).LoadFileWaitTillLoaded( - alntestFile, DataSourceType.PASTE); + AlignFrame alf = new FileLoader(false) + .LoadFileWaitTillLoaded(alntestFile, DataSourceType.PASTE); AlignmentI al = alf.getViewport().getAlignment(); Assert.assertEquals(al.getHeight(), 4); Assert.assertEquals(al.getWidth(), 5); @@ -79,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,8 +104,9 @@ public class FeatureDistanceModelTest alf.getFeatureRenderer().setVisible("sf2"); alf.getFeatureRenderer().setVisible("sf3"); alf.getFeatureRenderer().findAllFeatures(true); - Assert.assertEquals(alf.getFeatureRenderer().getDisplayedFeatureTypes() - .size(), 3, "Number of feature types"); + Assert.assertEquals( + alf.getFeatureRenderer().getDisplayedFeatureTypes().size(), 3, + "Number of feature types"); assertTrue(alf.getCurrentView().areFeaturesDisplayed()); return alf; } @@ -108,14 +115,13 @@ public class FeatureDistanceModelTest public void testFeatureScoreModel() throws Exception { AlignFrame alf = getTestAlignmentFrame(); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView() - .getAlignPanel())); + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + alf.getCurrentView().getAlignPanel()); alf.selectAllSequenceMenuItem_actionPerformed(null); - MatrixI dm = fsm - .findDistances(alf.getViewport().getAlignmentView( - true)); + 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)"); assertTrue(dm.getValue(0, 1) > dm.getValue(0, 2), @@ -128,13 +134,12 @@ public class FeatureDistanceModelTest AlignFrame alf = getTestAlignmentFrame(); // hiding first two columns shouldn't affect the tree alf.getViewport().hideColumns(0, 1); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView() - .getAlignPanel())); + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + alf.getCurrentView().getAlignPanel()); alf.selectAllSequenceMenuItem_actionPerformed(null); - MatrixI dm = fsm - .findDistances(alf.getViewport().getAlignmentView( - true)); + 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)"); assertTrue(dm.getValue(0, 1) > dm.getValue(0, 2), @@ -148,26 +153,25 @@ public class FeatureDistanceModelTest // hide columns and check tree changes alf.getViewport().hideColumns(3, 4); alf.getViewport().hideColumns(0, 1); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - 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); - MatrixI dm = fsm - .findDistances(alf.getViewport().getAlignmentView( - true)); - assertEquals( - dm.getValue(0, 2), - 0d, + 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)"); - assertEquals( - dm.getValue(0, 1), - 0d, + 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++) { - 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)"); + 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)"); } } @@ -189,26 +193,33 @@ public class FeatureDistanceModelTest 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"); + 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) - .size(), 0); + 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) - .size(), 1); + 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) - .size(), 0); + 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) - .size(), 0); + 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) - .size(), 1); + 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) - .size(), 0); + Assert.assertEquals( + af.getFeatureRenderer().findFeaturesAtColumn(aseq, 6).size(), + 0); } @Test(groups = { "Functional" }) @@ -232,36 +243,120 @@ public class FeatureDistanceModelTest * 20120 (two features of the same type doesn't affect score) * giving an average (pairwise distance) of 5/5 or 1.0 */ - s1.addSequenceFeature(new SequenceFeature("domain", null, 1, 3, 0f, - null)); - s1.addSequenceFeature(new SequenceFeature("variant", null, 2, 4, 0f, - null)); - s1.addSequenceFeature(new SequenceFeature("variant", null, 3, 5, 0f, - null)); - s2.addSequenceFeature(new SequenceFeature("domain", null, 2, 4, 0f, - null)); - s2.addSequenceFeature(new SequenceFeature("variant", null, 1, 2, 0f, - null)); - s2.addSequenceFeature(new SequenceFeature("variant", null, 5, 5, 0f, - null)); + s1.addSequenceFeature( + new SequenceFeature("domain", null, 1, 3, 0f, null)); + s1.addSequenceFeature( + new SequenceFeature("variant", null, 2, 4, 0f, null)); + s1.addSequenceFeature( + new SequenceFeature("variant", null, 3, 5, 0f, null)); + s2.addSequenceFeature( + new SequenceFeature("domain", null, 2, 4, 0f, null)); + s2.addSequenceFeature( + new SequenceFeature("variant", null, 1, 2, 0f, null)); + s2.addSequenceFeature( + new SequenceFeature("variant", null, 5, 5, 0f, null)); alf.setShowSeqFeatures(true); alf.getFeatureRenderer().findAllFeatures(true); - FeatureDistanceModel fsm = new FeatureDistanceModel(); - assertTrue(fsm.configureFromAlignmentView(alf.getCurrentView() - .getAlignPanel())); + ScoreModelI sm = new FeatureDistanceModel(); + sm = ScoreModels.getInstance().getScoreModel(sm.getName(), + alf.getCurrentView().getAlignPanel()); alf.selectAllSequenceMenuItem_actionPerformed(null); - MatrixI distances = fsm.findDistances(alf.getViewport() - .getAlignmentView(true)); + 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); - // these left to fail pending resolution of - // JAL-2424 (dividing score by 6, not 5) - assertEquals(distances.getValue(0, 1), 1f); - assertEquals(distances.getValue(1, 0), 1f); + + 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; } }