package jalview.analysis; import static org.testng.Assert.assertNotNull; import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; import jalview.analysis.scoremodels.FeatureDistanceModel; import jalview.analysis.scoremodels.PIDModel; import jalview.analysis.scoremodels.ScoreModels; import jalview.analysis.scoremodels.SimilarityParams; import jalview.api.analysis.ScoreModelI; import jalview.api.analysis.SimilarityParamsI; import jalview.api.analysis.ViewBasedAnalysisI; import jalview.datamodel.AlignmentView; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.io.DataSourceType; import jalview.io.FileLoader; import jalview.math.MatrixI; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class PCATest { private static final String TESTSEQS = ">s1\nAFRK\n>s2\nAFSS\n>s3\nAFTL\n>s4\nARSL\n"; private AlignFrame af; @Test(groups = "Functional") public void testComputeSimilarity_blosum62() { setUp(); SimilarityParamsI params = new SimilarityParams(true, false, true, false); AlignmentView view = af.getViewport().getAlignmentView(false); ScoreModelI blosum62 = ScoreModels.getInstance().getBlosum62(); PCA pca = new PCA(view, blosum62, params); MatrixI result = pca.computeSimilarity(); assertNotNull(result); /* * AFRK^AFRK = 4+6+5+5 = 20 * AFRK^AFSS = 4+6+-1+0 = 9 * AFRK^AFTL = 4+6+-1+-2 = 7 * AFRK^ARSL = 4+-3+-1+-2 = -2 */ assertArrayEquals(result.getRow(0), new double[] { 20, 9, 7, -2 }, 0.00001d); } @BeforeTest(alwaysRun = true) public void setUp() { af = new FileLoader().LoadFileWaitTillLoaded(TESTSEQS, DataSourceType.PASTE); } @Test(groups = "Functional") public void testComputeSimilarity_PID() { setUp(); SimilarityParamsI params = new SimilarityParams(true, false, true, false); AlignmentView view = af.getViewport().getAlignmentView(false); ScoreModelI pid = new PIDModel(); PCA pca = new PCA(view, pid, params); MatrixI result = pca.computeSimilarity(); assertNotNull(result); /* * AFRK^AFRK = 4 scaled to width * AFRK^AFSS = 2 * AFRK^AFTL = 2 * AFRK^ARSL = 1 */ assertArrayEquals(new double[] { 4d, 2d, 2d, 1d }, result.getRow(0), 0.00001d); } @Test(groups = "Functional") public void testComputeSimilarity_featureDistances() { setUp(); SimilarityParamsI params = new SimilarityParams(true, false, true, false); AlignmentView view = af.getViewport().getAlignmentView(false); ScoreModelI featureModel = new FeatureDistanceModel(); PCA pca = new PCA(view, featureModel, params); MatrixI result = pca.computeSimilarity(); /* * no features = no scores! */ assertArrayEquals(new double[] { 0d, 0d, 0d, 0d }, result.getRow(0), 0.00001d); SequenceI[] seqs = af.getViewport().getAlignment().getSequencesArray(); seqs[0].addSequenceFeature(new SequenceFeature("Cath", "", 1, 4, 0f, null)); seqs[1].addSequenceFeature(new SequenceFeature("Cath", "", 1, 4, 0f, null)); seqs[2].addSequenceFeature(new SequenceFeature("Pfam", "", 1, 4, 0f, null)); seqs[3].addSequenceFeature(new SequenceFeature("Pfam", "", 2, 3, 0f, null)); af.getFeatureRenderer().findAllFeatures(true); ((ViewBasedAnalysisI) featureModel) .configureFromAlignmentView(af.alignPanel); /* * feature distance scores are (average number of features not shared): * diagonal: 0 * seq1^seq2 0 * seq1^seq3 8 / 4 = 2 * seq1^seq4 6 / 4 = 1.5 * seq2^seq3 8 / 4 = 2 * seq2^seq4 6 / 3 = 1.5 * seq3^seq4 2 / 4 = 0.5 * so * { 0, 0, 2, 1.5 * 0, 0, 2, 1.5 * 2, 2, 0, 0.5 * 1.5, 1.5, 0.5, 0 * } * subtract each value from the max value to get similarity scores */ result = pca.computeSimilarity(); // assertArrayEquals(new double[] { 2d, 2d, 0d, 0.5d }, result.getRow(0), // 0.00001d); // assertArrayEquals(new double[] { 2d, 2d, 0d, 0.5d }, result.getRow(1), // 0.00001d); // assertArrayEquals(new double[] { 0d, 0d, 2d, 1.5d }, result.getRow(2), // 0.00001d); // assertArrayEquals(new double[] { 0.5d, 0.5d, 1.5d, 2d }, // result.getRow(3), 0.00001d); /* * JAL-2424 bug means instead we get distance scores of * 8 / 5 = 1.6 * 6 / 5 = 1.2 * 2 / 5 = 0.4 * so (until bug is fixed) * { 0, 0, 1.6, 1.2 * 0, 0, 1.6, 1.2 * 1.6, 1.6, 0, 0.4 * 1.2, 1.2, 0.4, 0 * } */ assertArrayEquals(new double[] { 1.6d, 1.6d, 0d, 0.4d }, result.getRow(0), 0.00001d); assertArrayEquals(new double[] { 1.6d, 1.6d, 0d, 0.4d }, result.getRow(1), 0.00001d); assertArrayEquals(new double[] { 0d, 0d, 1.6d, 1.2d }, result.getRow(2), 0.00001d); assertArrayEquals(new double[] { 0.4d, 0.4d, 1.2d, 1.6d }, result.getRow(3), 0.00001d); } }