bb3510a03700feeddd228bd8e680e234c6f22aa9
[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.AlignmentAnnotation;
27 import jalview.datamodel.Annotation;
28 import jalview.datamodel.Profile;
29 import jalview.datamodel.Sequence;
30 import jalview.datamodel.SequenceI;
31
32 import org.testng.annotations.Test;
33
34 public class AAFrequencyTest
35 {
36   @Test(groups = { "Functional" })
37   public void testCalculate_noProfile()
38   {
39     SequenceI seq1 = new Sequence("Seq1", "CAG-T");
40     SequenceI seq2 = new Sequence("Seq2", "CAC-T");
41     SequenceI seq3 = new Sequence("Seq3", "C---G");
42     SequenceI seq4 = new Sequence("Seq4", "CA--t");
43     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
44     Profile[] result = new Profile[seq1.getLength()];
45
46     AAFrequency.calculate(seqs, 0, seq1.getLength(), result, false);
47
48     // col 0 is 100% C
49     Profile col = result[0];
50     assertEquals(100f, col.getPercentageIdentity(false));
51     assertEquals(100f, col.getPercentageIdentity(true));
52     assertEquals(4, col.getMaxCount());
53     assertEquals("C", col.getModalResidue());
54     assertNull(col.getCounts());
55
56     // col 1 is 75% A
57     col = result[1];
58     assertEquals(75f, col.getPercentageIdentity(false));
59     assertEquals(100f, col.getPercentageIdentity(true));
60     assertEquals(3, col.getMaxCount());
61     assertEquals("A", col.getModalResidue());
62
63     // col 2 is 50% G 50% C or 25/25 counting gaps
64     col = result[2];
65     assertEquals(25f, col.getPercentageIdentity(false));
66     assertEquals(50f, col.getPercentageIdentity(true));
67     assertEquals(1, col.getMaxCount());
68     assertEquals("CG", col.getModalResidue());
69
70     // col 3 is all gaps
71     col = result[3];
72     assertEquals(0f, col.getPercentageIdentity(false));
73     assertEquals(0f, col.getPercentageIdentity(true));
74     assertEquals(0, col.getMaxCount());
75     assertEquals("", col.getModalResidue());
76
77     // col 4 is 75% T 25% G
78     col = result[4];
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" }, enabled = false)
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
140   /**
141    * Test generation of consensus annotation with options 'include gaps'
142    * (profile percentages are of all sequences, whether gapped or not), and
143    * 'show logo' (the full profile with all residue percentages is reported in
144    * the description for the tooltip)
145    */
146   @Test(groups = { "Functional" })
147   public void testCompleteConsensus_includeGaps_showLogo()
148   {
149     /*
150      * first compute the profiles
151      */
152     SequenceI seq1 = new Sequence("Seq1", "CAG-T");
153     SequenceI seq2 = new Sequence("Seq2", "CAC-T");
154     SequenceI seq3 = new Sequence("Seq3", "C---G");
155     SequenceI seq4 = new Sequence("Seq4", "CA--t");
156     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
157     Profile[] profiles = new Profile[seq1.getLength()];
158     AAFrequency.calculate(seqs, 0, seq1.getLength(), profiles, true);
159
160     AlignmentAnnotation consensus = new AlignmentAnnotation("Consensus",
161             "PID", new Annotation[seq1.getLength()]);
162     AAFrequency
163             .completeConsensus(consensus, profiles, 0, 5, false, true, 4);
164
165     Annotation ann = consensus.annotations[0];
166     assertEquals("C 100%", ann.description);
167     assertEquals("C", ann.displayCharacter);
168     ann = consensus.annotations[1];
169     assertEquals("A 75%", ann.description);
170     assertEquals("A", ann.displayCharacter);
171     ann = consensus.annotations[2];
172     assertEquals("C 25%; G 25%", ann.description);
173     assertEquals("+", ann.displayCharacter);
174     ann = consensus.annotations[3];
175     assertEquals("", ann.description);
176     assertEquals("-", ann.displayCharacter);
177     ann = consensus.annotations[4];
178     assertEquals("T 75%; G 25%", ann.description);
179     assertEquals("T", ann.displayCharacter);
180   }
181
182   /**
183    * Test generation of consensus annotation with options 'ignore gaps' (profile
184    * percentages are of the non-gapped sequences) and 'no logo' (only the modal
185    * residue[s] percentage is reported in the description for the tooltip)
186    */
187   @Test(groups = { "Functional" })
188   public void testCompleteConsensus_ignoreGaps_noLogo()
189   {
190     /*
191      * first compute the profiles
192      */
193     SequenceI seq1 = new Sequence("Seq1", "CAG-T");
194     SequenceI seq2 = new Sequence("Seq2", "CAC-T");
195     SequenceI seq3 = new Sequence("Seq3", "C---G");
196     SequenceI seq4 = new Sequence("Seq4", "CA--t");
197     SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4 };
198     Profile[] profiles = new Profile[seq1.getLength()];
199     AAFrequency.calculate(seqs, 0, seq1.getLength(), profiles, true);
200   
201     AlignmentAnnotation consensus = new AlignmentAnnotation("Consensus",
202             "PID", new Annotation[seq1.getLength()]);
203     AAFrequency
204             .completeConsensus(consensus, profiles, 0, 5, true, false, 4);
205   
206     Annotation ann = consensus.annotations[0];
207     assertEquals("C 100%", ann.description);
208     assertEquals("C", ann.displayCharacter);
209     ann = consensus.annotations[1];
210     assertEquals("A 100%", ann.description);
211     assertEquals("A", ann.displayCharacter);
212     ann = consensus.annotations[2];
213     assertEquals("[CG] 50%", ann.description);
214     assertEquals("+", ann.displayCharacter);
215     ann = consensus.annotations[3];
216     assertEquals("", ann.description);
217     assertEquals("-", ann.displayCharacter);
218     ann = consensus.annotations[4];
219     assertEquals("T 75%", ann.description);
220     assertEquals("T", ann.displayCharacter);
221   }
222 }