X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Fanalysis%2Fscoremodels%2FPIDModelTest.java;h=24ddad4095e8db424ae56a1dc6fd2b3a20cfea72;hb=4d5f77436c8d77a776ca7c042611f36238c97057;hp=24b44a3c7fe6652f7237bf5e343b4970a1a03035;hpb=5346ea15df13baf5b342e467b70358c2212fd1ef;p=jalview.git diff --git a/test/jalview/analysis/scoremodels/PIDModelTest.java b/test/jalview/analysis/scoremodels/PIDModelTest.java index 24b44a3..24ddad4 100644 --- a/test/jalview/analysis/scoremodels/PIDModelTest.java +++ b/test/jalview/analysis/scoremodels/PIDModelTest.java @@ -1,7 +1,28 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.analysis.scoremodels; import static org.testng.Assert.assertEquals; +import jalview.api.analysis.SimilarityParamsI; import jalview.util.Comparison; import org.testng.annotations.Test; @@ -31,53 +52,160 @@ public class PIDModelTest @Test(groups = "Functional") public void testComputePID_matchesComparisonPID() { + SimilarityParamsI params = new SimilarityParams(true, true, true, true); + /* * same length, no gaps */ String s1 = "ARFNQDWSGI"; String s2 = "ARKNQDQSGI"; - double newScore = new PIDModel().computePID(s1, s2, - SimilarityParams.Jalview); + + new PIDModel(); + double newScore = PIDModel.computePID(s1, s2, params); double oldScore = Comparison.PID(s1, s2); assertEquals(newScore, oldScore, DELTA); + // and verify PIDModel calculation is symmetric + assertEquals(newScore, PIDModel.computePID(s2, s1, params)); /* * same length, with gaps */ s1 = "-RFNQDWSGI"; s2 = "ARKNQ-QSGI"; - newScore = new PIDModel().computePID(s1, s2, - SimilarityParams.Jalview); + new PIDModel(); + newScore = PIDModel.computePID(s1, s2, params); oldScore = Comparison.PID(s1, s2); assertEquals(newScore, oldScore, DELTA); + assertEquals(newScore, PIDModel.computePID(s2, s1, params)); /* * s2 longer than s1, with gaps */ s1 = "ARK-"; s2 = "-RFNQ"; - newScore = new PIDModel().computePID(s1, s2, - SimilarityParams.Jalview); + new PIDModel(); + newScore = PIDModel.computePID(s1, s2, params); oldScore = Comparison.PID(s1, s2); assertEquals(newScore, oldScore, DELTA); + assertEquals(newScore, PIDModel.computePID(s2, s1, params)); /* * s1 longer than s2, with gaps */ s1 = "-RFNQ"; s2 = "ARK-"; - newScore = new PIDModel().computePID(s1, s2, - SimilarityParams.Jalview); + new PIDModel(); + newScore = PIDModel.computePID(s1, s2, params); oldScore = Comparison.PID(s1, s2); assertEquals(newScore, oldScore, DELTA); + assertEquals(newScore, PIDModel.computePID(s2, s1, params)); /* * same but now also with gapped columns */ s1 = "-R-F-NQ"; s2 = "AR-K--"; - newScore = new PIDModel().computePID(s1, s2, SimilarityParams.Jalview); + new PIDModel(); + newScore = PIDModel.computePID(s1, s2, params); oldScore = Comparison.PID(s1, s2); assertEquals(newScore, oldScore, DELTA); + assertEquals(newScore, PIDModel.computePID(s2, s1, params)); + } + + /** + * Tests for percentage identity variants where only the shorter length of two + * sequences is used + */ + @Test(groups = "Functional") + public void testComputePID_matchShortestSequence() + { + String s1 = "FR-K-S"; + String s2 = "FS--L"; + + /* + * match gap-gap and gap-char + * PID = 4/5 = 80% + */ + SimilarityParamsI params = new SimilarityParams(true, true, true, true); + assertEquals(PIDModel.computePID(s1, s2, params), 80d); + assertEquals(PIDModel.computePID(s2, s1, params), 80d); + + /* + * match gap-char but not gap-gap + * PID = 3/4 = 75% + */ + params = new SimilarityParams(false, true, true, true); + assertEquals(PIDModel.computePID(s1, s2, params), 75d); + assertEquals(PIDModel.computePID(s2, s1, params), 75d); + + /* + * include gaps but don't match them + * include gap-gap, counted as identity + * PID = 2/5 = 40% + */ + params = new SimilarityParams(true, false, true, true); + assertEquals(PIDModel.computePID(s1, s2, params), 40d); + assertEquals(PIDModel.computePID(s2, s1, params), 40d); + + /* + * include gaps but don't match them + * exclude gap-gap + * PID = 1/4 = 25% + */ + params = new SimilarityParams(false, false, true, true); + assertEquals(PIDModel.computePID(s1, s2, params), 25d); + assertEquals(PIDModel.computePID(s2, s1, params), 25d); + } + + /** + * Tests for percentage identity variants where the longer length of two + * sequences is used + */ + @Test(groups = "Functional") + public void testComputePID_matchLongestSequence() + { + String s1 = "FR-K-S"; + String s2 = "FS--L"; + + /* + * match gap-gap and gap-char + * shorter sequence treated as if with trailing gaps + * PID = 5/6 = 83.333...% + */ + SimilarityParamsI params = new SimilarityParams(true, true, true, + false); + assertEquals(PIDModel.computePID(s1, s2, params), 500d / 6); + assertEquals(PIDModel.computePID(s2, s1, params), 500d / 6); + + /* + * match gap-char but not gap-gap + * PID = 4/5 = 80% + */ + params = new SimilarityParams(false, true, true, false); + assertEquals(PIDModel.computePID(s1, s2, params), 80d); + assertEquals(PIDModel.computePID(s2, s1, params), 80d); + + /* + * include gaps but don't match them + * include gap-gap, counted as identity + * PID = 2/6 = 33.333...% + */ + params = new SimilarityParams(true, false, true, false); + assertEquals(PIDModel.computePID(s1, s2, params), 100d / 3); + assertEquals(PIDModel.computePID(s2, s1, params), 100d / 3); + + /* + * include gaps but don't match them + * exclude gap-gap + * PID = 1/5 = 25% + */ + params = new SimilarityParams(false, false, true, false); + assertEquals(PIDModel.computePID(s1, s2, params), 20d); + assertEquals(PIDModel.computePID(s2, s1, params), 20d); + + /* + * no tests for matchGaps=true, includeGaps=false + * as it don't make sense + */ } }