2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
21 package jalview.renderer;
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertFalse;
25 import static org.testng.AssertJUnit.assertTrue;
27 import jalview.analysis.Conservation;
28 import jalview.datamodel.Profile;
29 import jalview.datamodel.ProfileI;
30 import jalview.datamodel.Profiles;
31 import jalview.datamodel.ProfilesI;
32 import jalview.datamodel.ResidueCount;
33 import jalview.datamodel.SecondaryStructureCount;
34 import jalview.datamodel.Sequence;
35 import jalview.datamodel.SequenceI;
36 import jalview.schemes.ColourSchemeI;
37 import jalview.schemes.PIDColourScheme;
38 import jalview.schemes.ResidueProperties;
39 import jalview.schemes.UserColourScheme;
40 import jalview.schemes.ZappoColourScheme;
42 import java.awt.Color;
43 import java.util.Collections;
45 import org.testng.annotations.Test;
47 public class ResidueShaderTest
50 @Test(groups = "Functional")
51 public void testAboveThreshold()
54 * make up profiles for this alignment:
60 ProfileI[] profiles = new ProfileI[4];
61 profiles[0] = new Profile(4, 0, 2, "AS");
62 profiles[1] = new Profile(4, 0, 4, "R");
63 profiles[2] = new Profile(4, 4, 0, "");
64 profiles[3] = new Profile(4, 1, 2, "T");
65 ResidueShader ccs = new ResidueShader(new PIDColourScheme());
66 ccs.setConsensus(new Profiles(profiles));
71 ccs.setThreshold(0, true);
72 assertTrue(ccs.aboveThreshold('a', 0));
73 assertTrue(ccs.aboveThreshold('S', 0));
74 assertTrue(ccs.aboveThreshold('W', 0));
75 assertTrue(ccs.aboveThreshold('R', 1));
76 assertTrue(ccs.aboveThreshold('W', 2));
77 assertTrue(ccs.aboveThreshold('t', 3));
78 assertTrue(ccs.aboveThreshold('Q', 3));
81 * with threshold, include gaps
83 ccs.setThreshold(60, false);
84 assertFalse(ccs.aboveThreshold('a', 0));
85 assertFalse(ccs.aboveThreshold('S', 0));
86 assertTrue(ccs.aboveThreshold('R', 1));
87 assertFalse(ccs.aboveThreshold('W', 2));
88 assertFalse(ccs.aboveThreshold('t', 3)); // 50% < 60%
91 * with threshold, ignore gaps
93 ccs.setThreshold(60, true);
94 assertFalse(ccs.aboveThreshold('a', 0));
95 assertFalse(ccs.aboveThreshold('S', 0));
96 assertTrue(ccs.aboveThreshold('R', 1));
97 assertFalse(ccs.aboveThreshold('W', 2));
98 assertTrue(ccs.aboveThreshold('t', 3)); // 67% > 60%
102 * Test colour bleaching based on conservation score and conservation slider.
103 * Scores of 10 or 11 should leave colours unchanged. Gap is always white.
105 @Test(groups = "Functional")
106 public void testApplyConservation()
108 ResidueShader ccs = new ResidueShader(new PIDColourScheme());
110 // no conservation present - no fading
111 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 12));
114 * stub Conservation to return a given consensus string
116 final String consSequence = "0123456789+*-";
117 Conservation cons = new Conservation(null,
118 Collections.<SequenceI> emptyList(), 0, 0)
121 public SequenceI getConsSequence()
123 return new Sequence("seq", consSequence);
126 ccs.setConservation(cons);
128 // column out of range:
129 assertEquals(Color.RED,
130 ccs.applyConservation(Color.RED, consSequence.length()));
133 * with 100% threshold, 'fade factor' is
134 * (11-score)/10 * 100/20 = (11-score)/2
135 * which is >= 1 for all scores i.e. all fade to white except +, *
137 ccs.setConservationInc(100);
138 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 0));
139 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 1));
140 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 2));
141 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 3));
142 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 4));
143 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 5));
144 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 6));
145 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 7));
146 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 8));
147 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 9));
148 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 10));
149 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 11));
150 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 12));
153 * with 0% threshold, there should be no fading
155 ccs.setConservationInc(0);
156 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 0));
157 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 1));
158 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 2));
159 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 3));
160 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 4));
161 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 5));
162 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 6));
163 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 7));
164 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 8));
165 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 9));
166 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 10));
167 assertEquals(Color.RED, ccs.applyConservation(Color.RED, 11));
168 assertEquals(Color.WHITE, ccs.applyConservation(Color.RED, 12)); // gap
171 * with 40% threshold, 'fade factor' is
172 * (11-score)/10 * 40/20 = (11-score)/5
173 * which is {>1, >1, >1, >1, >1, >1, 1, 0.8, 0.6, 0.4} for score 0-9
174 * e.g. score 7 colour fades 80% of the way to white (255, 255, 255)
176 ccs.setConservationInc(40);
177 Color colour = new Color(155, 105, 55);
178 assertEquals(Color.WHITE, ccs.applyConservation(colour, 0));
179 assertEquals(Color.WHITE, ccs.applyConservation(colour, 1));
180 assertEquals(Color.WHITE, ccs.applyConservation(colour, 2));
181 assertEquals(Color.WHITE, ccs.applyConservation(colour, 3));
182 assertEquals(Color.WHITE, ccs.applyConservation(colour, 4));
183 assertEquals(Color.WHITE, ccs.applyConservation(colour, 5));
184 assertEquals(Color.WHITE, ccs.applyConservation(colour, 6));
185 assertEquals(new Color(235, 225, 215),
186 ccs.applyConservation(colour, 7));
187 assertEquals(new Color(215, 195, 175),
188 ccs.applyConservation(colour, 8));
189 assertEquals(new Color(195, 165, 135),
190 ccs.applyConservation(colour, 9));
191 assertEquals(colour, ccs.applyConservation(colour, 10));
192 assertEquals(colour, ccs.applyConservation(colour, 11));
193 assertEquals(Color.WHITE, ccs.applyConservation(colour, 12));
196 @Test(groups = "Functional")
197 public void testFindColour_gapColour()
200 * normally, a gap is coloured white
202 ResidueShader rs = new ResidueShader(new ZappoColourScheme());
203 assertEquals(Color.white, rs.findColour(' ', 7, null));
206 * a User Colour Scheme may specify a bespoke gap colour
208 Color[] colours = new Color[ResidueProperties.maxProteinIndex + 1];
209 colours[5] = Color.blue; // Q colour
210 colours[23] = Color.red; // gap colour
211 ColourSchemeI cs = new UserColourScheme(colours);
212 rs = new ResidueShader(cs);
214 assertEquals(Color.red, rs.findColour(' ', 7, null));
215 assertEquals(Color.blue, rs.findColour('Q', 7, null));
218 * stub Conservation to return a given consensus string
220 final String consSequence = "0123456789+*-";
221 Conservation cons = new Conservation(null,
222 Collections.<SequenceI> emptyList(), 0, 0)
225 public SequenceI getConsSequence()
227 return new Sequence("seq", consSequence);
230 rs.setConservation(cons);
233 * with 0% threshold, there should be no fading
235 rs.setConservationInc(0);
236 assertEquals(Color.red, rs.findColour(' ', 7, null));
237 assertEquals(Color.blue, rs.findColour('Q', 7, null));
240 * with 40% threshold, 'fade factor' is
241 * (11-score)/10 * 40/20 = (11-score)/5
242 * so position 7, score 7 fades 80% of the way to white (255, 255, 255)
244 rs.setConservationInc(40);
247 * gap colour is unchanged for Conservation
249 assertEquals(Color.red, rs.findColour(' ', 7, null));
250 assertEquals(Color.red, rs.findColour('-', 7, null));
251 assertEquals(Color.red, rs.findColour('.', 7, null));
254 * residue colour is faded 80% of the way from
255 * blue(0, 0, 255) to white(255, 255, 255)
256 * making (204, 204, 255)
258 assertEquals(new Color(204, 204, 255), rs.findColour('Q', 7, null));
261 * turn off By Conservation, apply Above Identity Threshold
262 * providing a stub Consensus that has modal residue "Q" with pid 60%
264 rs.setConservationApplied(false);
265 ProfilesI consensus = getStubConsensus("Q", 60f);
266 rs.setConsensus(consensus);
268 // with consensus pid (60) above threshold (50), colours are unchanged
269 rs.setThreshold(50, false);
270 assertEquals(Color.blue, rs.findColour('Q', 7, null));
271 assertEquals(Color.red, rs.findColour('-', 7, null));
273 // with consensus pid (60) below threshold (70),
274 // residue colour becomes white, gap colour is unchanged
275 rs.setThreshold(70, false);
276 assertEquals(Color.white, rs.findColour('Q', 7, null));
277 assertEquals(Color.red, rs.findColour('-', 7, null));
281 * @param modalResidue
285 protected ProfilesI getStubConsensus(final String modalResidue,
288 ProfilesI consensus = new ProfilesI()
292 public ProfileI get(int i)
294 return new ProfileI()
297 public void setCounts(ResidueCount residueCounts)
302 public float getPercentageIdentity(boolean ignoreGaps)
308 public ResidueCount getCounts()
314 public int getHeight()
320 public int getGapped()
326 public int getMaxCount()
332 public String getModalResidue()
338 public int getNonGapped()
344 public void setSSCounts(
345 SecondaryStructureCount secondaryStructureCount)
347 // TODO Auto-generated method stub
352 public float getSSPercentageIdentity(boolean ignoreGaps)
354 // TODO Auto-generated method stub
359 public int getMaxSSCount()
361 // TODO Auto-generated method stub
366 public String getModalSS()
368 // TODO Auto-generated method stub
373 public SecondaryStructureCount getSSCounts()
375 // TODO Auto-generated method stub
382 public int getStartColumn()
388 public int getEndColumn()