Merge branch 'develop' into features/JAL-2393customMatrices
[jalview.git] / test / jalview / analysis / PCATest.java
1 package jalview.analysis;
2
3 import static org.testng.Assert.assertNotNull;
4 import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
5
6 import jalview.analysis.scoremodels.FeatureDistanceModel;
7 import jalview.analysis.scoremodels.PIDModel;
8 import jalview.analysis.scoremodels.ScoreModels;
9 import jalview.analysis.scoremodels.SimilarityParams;
10 import jalview.api.analysis.ScoreModelI;
11 import jalview.api.analysis.SimilarityParamsI;
12 import jalview.api.analysis.ViewBasedAnalysisI;
13 import jalview.datamodel.AlignmentView;
14 import jalview.datamodel.SequenceFeature;
15 import jalview.datamodel.SequenceI;
16 import jalview.gui.AlignFrame;
17 import jalview.io.DataSourceType;
18 import jalview.io.FileLoader;
19 import jalview.math.MatrixI;
20
21 import org.testng.annotations.BeforeTest;
22 import org.testng.annotations.Test;
23
24 public class PCATest
25 {
26
27   private static final String TESTSEQS = ">s1\nAFRK\n>s2\nAFSS\n>s3\nAFTL\n>s4\nARSL\n";
28   private AlignFrame af;
29
30   @Test(groups = "Functional")
31   public void testComputeSimilarity_blosum62()
32   {
33     setUp();
34     SimilarityParamsI params = new SimilarityParams(true, false, true,
35             false);
36     AlignmentView view = af.getViewport().getAlignmentView(false);
37     ScoreModelI blosum62 = ScoreModels.getInstance().getBlosum62();
38     PCA pca = new PCA(view, blosum62, params);
39
40     MatrixI result = pca.computeSimilarity();
41     assertNotNull(result);
42
43     /*
44      * AFRK^AFRK = 4+6+5+5 = 20
45      * AFRK^AFSS = 4+6+-1+0 = 9
46      * AFRK^AFTL = 4+6+-1+-2 = 7
47      * AFRK^ARSL = 4+-3+-1+-2 = -2
48      */
49     assertArrayEquals(result.getRow(0), new double[] { 20, 9, 7, -2 },
50             0.00001d);
51   }
52
53   @BeforeTest(alwaysRun = true)
54   public void setUp()
55   {
56     af = new FileLoader().LoadFileWaitTillLoaded(TESTSEQS,
57             DataSourceType.PASTE);
58   }
59
60   @Test(groups = "Functional")
61   public void testComputeSimilarity_PID()
62   {
63     setUp();
64     SimilarityParamsI params = new SimilarityParams(true, false, true,
65             false);
66     AlignmentView view = af.getViewport().getAlignmentView(false);
67     ScoreModelI pid = new PIDModel();
68     PCA pca = new PCA(view, pid, params);
69   
70     MatrixI result = pca.computeSimilarity();
71     assertNotNull(result);
72   
73     /*
74      * AFRK^AFRK = 4 scaled to width
75      * AFRK^AFSS = 2
76      * AFRK^AFTL = 2
77      * AFRK^ARSL = 1
78      */
79     assertArrayEquals(new double[] { 4d, 2d, 2d, 1d },
80             result.getRow(0), 0.00001d);
81   }
82
83   @Test(groups = "Functional")
84   public void testComputeSimilarity_featureDistances()
85   {
86     setUp();
87     SimilarityParamsI params = new SimilarityParams(true, false, true,
88             false);
89     AlignmentView view = af.getViewport().getAlignmentView(false);
90     ScoreModelI featureModel = new FeatureDistanceModel();
91     PCA pca = new PCA(view, featureModel, params);
92   
93     MatrixI result = pca.computeSimilarity();
94   
95     /*
96      * no features = no scores!
97      */
98     assertArrayEquals(new double[] { 0d, 0d, 0d, 0d },
99             result.getRow(0), 0.00001d);
100
101     SequenceI[] seqs = af.getViewport().getAlignment().getSequencesArray();
102     seqs[0].addSequenceFeature(new SequenceFeature("Cath", "", 1, 4, 0f,
103             null));
104     seqs[1].addSequenceFeature(new SequenceFeature("Cath", "", 1, 4, 0f,
105             null));
106     seqs[2].addSequenceFeature(new SequenceFeature("Pfam", "", 1, 4, 0f,
107             null));
108     seqs[3].addSequenceFeature(new SequenceFeature("Pfam", "", 2, 3, 0f,
109             null));
110
111     af.getFeatureRenderer().findAllFeatures(true);
112     ((ViewBasedAnalysisI) featureModel)
113             .configureFromAlignmentView(af.alignPanel);
114
115     /*
116      * feature distance scores are (average number of features not shared):
117      * diagonal: 0
118      * seq1^seq2 0
119      * seq1^seq3 8 / 4 = 2
120      * seq1^seq4 6 / 4 = 1.5
121      * seq2^seq3 8 / 4 = 2
122      * seq2^seq4 6 / 3 = 1.5
123      * seq3^seq4 2 / 4 = 0.5
124      * so
125      * { 0, 0, 2, 1.5
126      *   0, 0, 2, 1.5
127      *   2, 2, 0, 0.5
128      *   1.5, 1.5, 0.5, 0 
129      *  }
130      * subtract each value from the max value to get similarity scores
131      */
132     result = pca.computeSimilarity();
133     // assertArrayEquals(new double[] { 2d, 2d, 0d, 0.5d }, result.getRow(0),
134     // 0.00001d);
135     // assertArrayEquals(new double[] { 2d, 2d, 0d, 0.5d }, result.getRow(1),
136     // 0.00001d);
137     // assertArrayEquals(new double[] { 0d, 0d, 2d, 1.5d }, result.getRow(2),
138     // 0.00001d);
139     // assertArrayEquals(new double[] { 0.5d, 0.5d, 1.5d, 2d },
140     // result.getRow(3), 0.00001d);
141
142     /*
143      * JAL-2424 bug means instead we get distance scores of
144      *  8 / 5 = 1.6
145      *  6 / 5 = 1.2
146      *  2 / 5 = 0.4
147      * so (until bug is fixed)
148      * { 0, 0, 1.6, 1.2
149      *   0, 0, 1.6, 1.2
150      *   1.6, 1.6, 0, 0.4
151      *   1.2, 1.2, 0.4, 0 
152      *  }
153      */
154     assertArrayEquals(new double[] { 1.6d, 1.6d, 0d, 0.4d },
155             result.getRow(0),
156             0.00001d);
157     assertArrayEquals(new double[] { 1.6d, 1.6d, 0d, 0.4d },
158             result.getRow(1),
159             0.00001d);
160     assertArrayEquals(new double[] { 0d, 0d, 1.6d, 1.2d },
161             result.getRow(2),
162             0.00001d);
163     assertArrayEquals(new double[] { 0.4d, 0.4d, 1.2d, 1.6d },
164             result.getRow(3), 0.00001d);
165   }
166 }