JAL-98 use Profile to store consensus, ResidueCount for fast compact
[jalview.git] / test / jalview / analysis / AAFrequencyTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.analysis;
22
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertNull;
25
26 import jalview.datamodel.Sequence;
27 import jalview.datamodel.SequenceI;
28
29 import org.testng.annotations.Test;
30
31 public class AAFrequencyTest
32 {
33   private static final String C = AAFrequency.MAXCOUNT;
34
35   private static final String R = AAFrequency.MAXRESIDUE;
36
37   private static final String G = AAFrequency.PID_GAPS;
38
39   private static final String N = AAFrequency.PID_NOGAPS;
40
41   private static final String P = AAFrequency.PROFILE;
42
43   @Test(groups = { "Functional" })
44   public void testCalculate_noProfile()
45   {
46     SequenceI seq1 = new Sequence("Seq1", "CAGT");
47     SequenceI seq2 = new Sequence("Seq2", "CACT");
48     SequenceI seq3 = new Sequence("Seq3", "C--G");
49     SequenceI seq4 = new Sequence("Seq4", "CA-t");
50     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
51     Profile[] result = new Profile[seq1.getLength()];
52
53     AAFrequency.calculate(seqs, 0, seq1.getLength(), result, false);
54
55     // col 0 is 100% C
56     Profile col = result[0];
57     assertEquals(100f, col.getPercentageIdentity(false));
58     assertEquals(100f, col.getPercentageIdentity(true));
59     assertEquals(4, col.getMaxCount());
60     assertEquals("C", col.getModalResidue());
61     assertNull(col.getCounts());
62
63     // col 1 is 75% A
64     col = result[1];
65     assertEquals(75f, col.getPercentageIdentity(false));
66     assertEquals(100f, col.getPercentageIdentity(true));
67     assertEquals(3, col.getMaxCount());
68     assertEquals("A", col.getModalResidue());
69
70     // col 2 is 50% G 50% C or 25/25 counting gaps
71     col = result[2];
72     assertEquals(25f, col.getPercentageIdentity(false));
73     assertEquals(50f, col.getPercentageIdentity(true));
74     assertEquals(1, col.getMaxCount());
75     assertEquals("CG", col.getModalResidue());
76
77     // col 3 is 75% T 25% G
78     col = result[3];
79     assertEquals(75f, col.getPercentageIdentity(false));
80     assertEquals(75f, col.getPercentageIdentity(true));
81     assertEquals(3, col.getMaxCount());
82     assertEquals("T", col.getModalResidue());
83   }
84
85   @Test(groups = { "Functional" })
86   public void testCalculate_withProfile()
87   {
88     SequenceI seq1 = new Sequence("Seq1", "CAGT");
89     SequenceI seq2 = new Sequence("Seq2", "CACT");
90     SequenceI seq3 = new Sequence("Seq3", "C--G");
91     SequenceI seq4 = new Sequence("Seq4", "CA-t");
92     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
93     Profile[] result = new Profile[seq1.getLength()];
94
95     AAFrequency.calculate(seqs, 0, seq1.getLength(), result, true);
96     Profile profile = result[0];
97     assertEquals(4, profile.getCounts().getCount('C'));
98     assertEquals(4, profile.getHeight());
99     assertEquals(4, profile.getNonGapped());
100
101     profile = result[1];
102     assertEquals(3, profile.getCounts().getCount('A'));
103     assertEquals(4, profile.getHeight());
104     assertEquals(3, profile.getNonGapped());
105
106     profile = result[2];
107     assertEquals(1, profile.getCounts().getCount('C'));
108     assertEquals(1, profile.getCounts().getCount('G'));
109     assertEquals(4, profile.getHeight());
110     assertEquals(2, profile.getNonGapped());
111
112     profile = result[3];
113     assertEquals(3, profile.getCounts().getCount('T'));
114     assertEquals(1, profile.getCounts().getCount('G'));
115     assertEquals(4, profile.getHeight());
116     assertEquals(4, profile.getNonGapped());
117   }
118
119   @Test(groups = { "Functional" })
120   public void testCalculate_withProfileTiming()
121   {
122     SequenceI seq1 = new Sequence("Seq1", "CAGT");
123     SequenceI seq2 = new Sequence("Seq2", "CACT");
124     SequenceI seq3 = new Sequence("Seq3", "C--G");
125     SequenceI seq4 = new Sequence("Seq4", "CA-t");
126     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
127     Profile[] result = new Profile[seq1.getLength()];
128
129     // ensure class loaded and initialized
130     AAFrequency.calculate(seqs, 0, seq1.getLength(), result, true);
131     int reps = 100000;
132     long start = System.currentTimeMillis();
133     for (int i = 0; i < reps; i++)
134     {
135       AAFrequency.calculate(seqs, 0, seq1.getLength(), result, true);
136     }
137     System.out.println(System.currentTimeMillis() - start);
138   }
139 }