Clover icon

Coverage Report

  1. Project Clover database Mon Sep 2 2024 17:57:51 BST
  2. Package jalview.renderer.seqfeatures

File FeatureColourFinderTest.java

 

Code metrics

0
221
18
1
598
350
18
0.08
12.28
18
1

Classes

Class Line # Actions
FeatureColourFinderTest 64 221 18
0.995815999.6%
 

Contributing tests

This file is covered by 16 tests. .

Source view

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.renderer.seqfeatures;
22   
23    import static org.testng.Assert.assertEquals;
24    import static org.testng.Assert.assertFalse;
25    import static org.testng.Assert.assertNotEquals;
26    import static org.testng.Assert.assertNull;
27    import static org.testng.Assert.assertTrue;
28   
29    import java.awt.Color;
30    import java.util.List;
31   
32    import org.testng.annotations.BeforeMethod;
33    import org.testng.annotations.BeforeTest;
34    import org.testng.annotations.Test;
35   
36    import jalview.api.FeatureColourI;
37    import jalview.datamodel.SequenceFeature;
38    import jalview.datamodel.SequenceI;
39    import jalview.gui.AlignFrame;
40    import jalview.gui.AlignViewport;
41    import jalview.io.DataSourceType;
42    import jalview.io.FileLoader;
43    import jalview.schemes.FeatureColour;
44    import jalview.viewmodel.seqfeatures.FeatureRendererModel;
45    import jalview.viewmodel.seqfeatures.FeatureRendererModel.FeatureSettingsBean;
46   
47    /**
48    * Unit tests for feature colour determination, including but not limited to
49    * <ul>
50    * <li>gap position</li>
51    * <li>no features present</li>
52    * <li>features present but show features turned off</li>
53    * <li>features displayed but selected feature turned off</li>
54    * <li>features displayed but feature group turned off</li>
55    * <li>feature displayed but none at the specified position</li>
56    * <li>multiple features at position, with no transparency</li>
57    * <li>multiple features at position, with transparency</li>
58    * <li>score graduated feature colour</li>
59    * <li>contact feature start at the selected position</li>
60    * <li>contact feature end at the selected position</li>
61    * <li>contact feature straddling the selected position (not shown)</li>
62    * </ul>
63    */
 
64    public class FeatureColourFinderTest
65    {
66    private AlignViewport av;
67   
68    private SequenceI seq;
69   
70    private FeatureColourFinder finder;
71   
72    private AlignFrame af;
73   
74    private FeatureRendererModel fr;
75   
 
76  4 toggle @BeforeTest(alwaysRun = true)
77    public void setUp()
78    {
79    // aligned column 8 is sequence position 6
80  4 String s = ">s1\nABCDE---FGHIJKLMNOPQRSTUVWXYZ\n";
81  4 af = new FileLoader().LoadFileWaitTillLoaded(s, DataSourceType.PASTE);
82  4 av = af.getViewport();
83  4 seq = av.getAlignment().getSequenceAt(0);
84  4 fr = af.getFeatureRenderer();
85  4 finder = new FeatureColourFinder(fr);
86    }
87   
88    /**
89    * Clear down any sequence features before each test (not as easy as it
90    * sounds...)
91    */
 
92  16 toggle @BeforeMethod(alwaysRun = true)
93    public void setUpBeforeTest()
94    {
95  16 List<SequenceFeature> sfs = seq.getSequenceFeatures();
96  16 for (SequenceFeature sf : sfs)
97    {
98  22 seq.deleteFeature(sf);
99    }
100  16 fr.findAllFeatures(true);
101   
102    /*
103    * reset all feature groups to visible
104    */
105  16 for (String group : fr.getGroups(false))
106    {
107  0 fr.setGroupVisibility(group, true);
108    }
109   
110  16 fr.clearRenderOrder();
111  16 av.setShowSequenceFeatures(true);
112    }
113   
 
114  1 toggle @Test(groups = "Functional")
115    public void testFindFeatureColour_noFeatures()
116    {
117  1 av.setShowSequenceFeatures(false);
118  1 Color c = finder.findFeatureColour(Color.blue, seq, 10);
119  1 assertEquals(c, Color.blue);
120   
121  1 av.setShowSequenceFeatures(true);
122  1 c = finder.findFeatureColour(Color.blue, seq, 10);
123  1 assertEquals(c, Color.blue);
124    }
125   
 
126  1 toggle @Test(groups = "Functional")
127    public void testFindFeatureColour_noFeaturesShown()
128    {
129  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
130    Float.NaN, "MetalGroup"));
131  1 fr.featuresAdded();
132  1 av.setShowSequenceFeatures(false);
133  1 Color c = finder.findFeatureColour(Color.blue, seq, 10);
134  1 assertEquals(c, Color.blue);
135    }
136   
 
137  1 toggle @Test(groups = "Functional")
138    public void testFindFeatureColour_singleFeatureAtPosition()
139    {
140  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
141    Float.NaN, "MetalGroup"));
142  1 fr.setColour("Metal", new FeatureColour(Color.red));
143  1 fr.featuresAdded();
144  1 av.setShowSequenceFeatures(true);
145  1 Color c = finder.findFeatureColour(Color.blue, seq, 10);
146  1 assertEquals(c, Color.red);
147    }
148   
149    /**
150    * feature colour at a gap is null (not white) - a user defined colour scheme
151    * can then provide a bespoke gap colour if configured to do so
152    */
 
153  1 toggle @Test(groups = "Functional")
154    public void testFindFeatureColour_gapPosition()
155    {
156  1 seq.addSequenceFeature(
157    new SequenceFeature("Metal", "Metal", 2, 12, 0f, null));
158  1 fr.setColour("Metal", new FeatureColour(Color.red));
159  1 fr.featuresAdded();
160  1 av.setShowSequenceFeatures(true);
161  1 Color c = finder.findFeatureColour(null, seq, 6);
162  1 assertNull(c);
163    }
164   
165    /**
166    * Nested features coloured by label - expect the colour of the enclosed
167    * feature
168    */
 
169  1 toggle @Test(groups = "Functional")
170    public void testFindFeatureColour_nestedFeatures()
171    {
172  1 SequenceFeature sf1 = new SequenceFeature("domain", "peptide", 1, 120,
173    0f, null);
174  1 seq.addSequenceFeature(sf1);
175  1 SequenceFeature sf2 = new SequenceFeature("domain", "binding", 10, 20,
176    0f, null);
177  1 seq.addSequenceFeature(sf2);
178  1 FeatureColourI fc = new FeatureColour(Color.red);
179  1 fc.setColourByLabel(true);
180  1 fr.setColour("domain", fc);
181  1 fr.featuresAdded();
182  1 av.setShowSequenceFeatures(true);
183  1 Color c = finder.findFeatureColour(null, seq, 15);
184  1 assertEquals(c, fr.getColor(sf2, fc));
185    }
186   
 
187  1 toggle @Test(groups = "Functional")
188    public void testFindFeatureColour_multipleFeaturesAtPositionNoTransparency()
189    {
190    /*
191    * featuresAdded -> FeatureRendererModel.updateRenderOrder which adds any
192    * new features 'on top' (but reverses the order of any added features)
193    */
194  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
195    Float.NaN, "MetalGroup"));
196  1 FeatureColour red = new FeatureColour(Color.red);
197  1 fr.setColour("Metal", red);
198  1 fr.featuresAdded();
199  1 seq.addSequenceFeature(new SequenceFeature("Domain", "Domain", 4, 15,
200    Float.NaN, "DomainGroup"));
201  1 FeatureColour green = new FeatureColour(Color.green);
202  1 fr.setColour("Domain", green);
203  1 fr.featuresAdded();
204  1 av.setShowSequenceFeatures(true);
205   
206    /*
207    * expect Domain (green) to be rendered above Metal (red)
208    */
209  1 Color c = finder.findFeatureColour(Color.blue, seq, 10);
210  1 assertEquals(c, Color.green);
211   
212    /*
213    * now promote Metal above Domain
214    * - currently no way other than mimicking reordering of
215    * table in Feature Settings
216    */
217  1 FeatureSettingsBean[] data = new FeatureSettingsBean[2];
218  1 data[0] = new FeatureSettingsBean("Metal", red, null, true);
219  1 data[1] = new FeatureSettingsBean("Domain", green, null, true);
220  1 fr.setFeaturePriority(data);
221  1 c = finder.findFeatureColour(Color.blue, seq, 10);
222  1 assertEquals(c, Color.red);
223   
224    /*
225    * ..and turn off display of Metal
226    */
227  1 data[0] = new FeatureSettingsBean("Metal", red, null, false);
228  1 fr.setFeaturePriority(data);
229  1 c = finder.findFeatureColour(Color.blue, seq, 10);
230  1 assertEquals(c, Color.green);
231    }
232   
 
233  1 toggle @Test(groups = "Functional")
234    public void testFindFeatureColour_singleFeatureNotAtPosition()
235    {
236  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 8, 12,
237    Float.NaN, "MetalGroup"));
238  1 fr.setColour("Metal", new FeatureColour(Color.red));
239  1 fr.featuresAdded();
240  1 av.setShowSequenceFeatures(true);
241    // column 2 = sequence position 3
242  1 Color c = finder.findFeatureColour(Color.blue, seq, 2);
243  1 assertEquals(c, Color.blue);
244    }
245   
 
246  1 toggle @Test(groups = "Functional")
247    public void testFindFeatureColour_featureTypeNotDisplayed()
248    {
249  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
250    Float.NaN, "MetalGroup"));
251  1 FeatureColour red = new FeatureColour(Color.red);
252  1 fr.setColour("Metal", red);
253  1 fr.featuresAdded();
254  1 av.setShowSequenceFeatures(true);
255  1 Color c = finder.findFeatureColour(Color.blue, seq, 10);
256  1 assertEquals(c, Color.red);
257   
258    /*
259    * turn off display of Metal - is this the easiest way to do it??
260    */
261  1 FeatureSettingsBean[] data = new FeatureSettingsBean[1];
262  1 data[0] = new FeatureSettingsBean("Metal", red, null, false);
263  1 fr.setFeaturePriority(data);
264  1 c = finder.findFeatureColour(Color.blue, seq, 10);
265  1 assertEquals(c, Color.blue);
266   
267    /*
268    * turn display of Metal back on
269    */
270  1 data[0] = new FeatureSettingsBean("Metal", red, null, true);
271  1 fr.setFeaturePriority(data);
272  1 c = finder.findFeatureColour(Color.blue, seq, 10);
273  1 assertEquals(c, Color.red);
274    }
275   
 
276  1 toggle @Test(groups = "Functional")
277    public void testFindFeatureColour_featureGroupNotDisplayed()
278    {
279  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
280    Float.NaN, "MetalGroup"));
281  1 FeatureColour red = new FeatureColour(Color.red);
282  1 fr.setColour("Metal", red);
283  1 fr.featuresAdded();
284  1 av.setShowSequenceFeatures(true);
285  1 Color c = finder.findFeatureColour(Color.blue, seq, 10);
286  1 assertEquals(c, Color.red);
287   
288    /*
289    * turn off display of MetalGroup
290    */
291  1 fr.setGroupVisibility("MetalGroup", false);
292  1 c = finder.findFeatureColour(Color.blue, seq, 10);
293  1 assertEquals(c, Color.blue);
294   
295    /*
296    * turn display of MetalGroup back on
297    */
298  1 fr.setGroupVisibility("MetalGroup", true);
299  1 c = finder.findFeatureColour(Color.blue, seq, 10);
300  1 assertEquals(c, Color.red);
301    }
302   
 
303  1 toggle @Test(groups = "Functional")
304    public void testFindFeatureColour_contactFeature()
305    {
306    /*
307    * currently contact feature == type "Disulphide Bond" or "Disulfide Bond" !!
308    */
309  1 seq.addSequenceFeature(new SequenceFeature("Disulphide Bond", "Contact",
310    2, 12, Float.NaN, "Disulphide"));
311  1 fr.setColour("Disulphide Bond", new FeatureColour(Color.red));
312  1 fr.featuresAdded();
313  1 av.setShowSequenceFeatures(true);
314   
315    /*
316    * Contact positions are residues 2 and 12
317    * which are columns 1 and 14
318    * positions in between don't count for a contact feature!
319    */
320  1 Color c = finder.findFeatureColour(Color.blue, seq, 10);
321  1 assertEquals(c, Color.blue);
322  1 c = finder.findFeatureColour(Color.blue, seq, 8);
323  1 assertEquals(c, Color.blue);
324  1 c = finder.findFeatureColour(Color.blue, seq, 1);
325  1 assertEquals(c, Color.red);
326  1 c = finder.findFeatureColour(Color.blue, seq, 14);
327  1 assertEquals(c, Color.red);
328    }
329   
 
330  1 toggle @Test(groups = "Functional")
331    public void testFindFeatureAtEnd()
332    {
333    /*
334    * terminal residue feature
335    */
336  1 seq.addSequenceFeature(new SequenceFeature("PDBRESNUM", "pdb res 1",
337    seq.getEnd(), seq.getEnd(), Float.NaN, "1seq.pdb"));
338  1 fr.setColour("PDBRESNUM", new FeatureColour(Color.red));
339  1 fr.featuresAdded();
340  1 av.setShowSequenceFeatures(true);
341   
342    /*
343    * final column should have PDBRESNUM feature, the others not
344    */
345  1 Color c = finder.findFeatureColour(Color.blue, seq,
346    seq.getLength() - 2);
347  1 assertNotEquals(c, Color.red);
348  1 c = finder.findFeatureColour(Color.blue, seq, seq.getLength() - 1);
349  1 assertEquals(c, Color.red);
350    }
351   
 
352  1 toggle @Test(groups = "Functional")
353    public void testFindFeatureColour_graduatedFeatureColour()
354    {
355  1 seq.addSequenceFeature(new SequenceFeature("kd", "hydrophobicity", 2, 2,
356    0f, "KdGroup"));
357  1 seq.addSequenceFeature(new SequenceFeature("kd", "hydrophobicity", 4, 4,
358    5f, "KdGroup"));
359  1 seq.addSequenceFeature(new SequenceFeature("kd", "hydrophobicity", 7, 7,
360    10f, "KdGroup"));
361   
362    /*
363    * graduated colour from 0 to 10
364    */
365  1 Color min = new Color(100, 50, 150);
366  1 Color max = new Color(200, 0, 100);
367  1 FeatureColourI fc = new FeatureColour(null, min, max, null, 0, 10);
368  1 fr.setColour("kd", fc);
369  1 fr.featuresAdded();
370  1 av.setShowSequenceFeatures(true);
371   
372    /*
373    * position 2, column 1, score 0 - minimum colour in range
374    */
375  1 Color c = finder.findFeatureColour(Color.blue, seq, 1);
376  1 assertEquals(c, min);
377   
378    /*
379    * position 7, column 9, score 10 - maximum colour in range
380    */
381  1 c = finder.findFeatureColour(Color.blue, seq, 9);
382  1 assertEquals(c, max);
383   
384    /*
385    * position 4, column 3, score 5 - half way from min to max
386    */
387  1 c = finder.findFeatureColour(Color.blue, seq, 3);
388  1 assertEquals(c, new Color(150, 25, 125));
389    }
390   
 
391  1 toggle @Test(groups = "Functional")
392    public void testFindFeatureColour_transparencySingleFeature()
393    {
394  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
395    Float.NaN, "MetalGroup"));
396  1 FeatureColour red = new FeatureColour(Color.red);
397  1 fr.setColour("Metal", red);
398  1 fr.featuresAdded();
399  1 av.setShowSequenceFeatures(true);
400   
401    /*
402    * the FeatureSettings transparency slider has range 0-70 which
403    * corresponds to a transparency value of 1 - 0.3
404    * A value of 0.4 gives a combination of
405    * 0.4 * red(255, 0, 0) + 0.6 * cyan(0, 255, 255) = (102, 153, 153)
406    */
407  1 fr.setTransparency(0.4f);
408  1 Color c = finder.findFeatureColour(Color.cyan, seq, 10);
409  1 assertEquals(c, new Color(102, 153, 153));
410    }
411   
 
412  1 toggle @Test(groups = "Functional")
413    public void testFindFeatureColour_transparencyTwoFeatures()
414    {
415  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
416    Float.NaN, "MetalGroup"));
417  1 FeatureColour red = new FeatureColour(Color.red);
418  1 fr.setColour("Metal", red);
419  1 fr.featuresAdded();
420  1 seq.addSequenceFeature(new SequenceFeature("Domain", "Domain", 4, 15,
421    Float.NaN, "DomainGroup"));
422  1 FeatureColour green = new FeatureColour(Color.green);
423  1 fr.setColour("Domain", green);
424  1 fr.featuresAdded();
425  1 av.setShowSequenceFeatures(true);
426   
427    /*
428    * Domain (green) rendered above Metal (red) above background (cyan)
429    * 1) 0.6 * red(255, 0, 0) + 0.4 * cyan(0, 255, 255) = (153, 102, 102)
430    * 2) 0.6* green(0, 255, 0) + 0.4 * (153, 102, 102) = (61, 194, 41) rounded
431    */
432  1 fr.setTransparency(0.6f);
433  1 Color c = finder.findFeatureColour(Color.cyan, seq, 10);
434  1 assertEquals(c, new Color(61, 194, 41));
435   
436    /*
437    * now promote Metal above Domain
438    * - currently no way other than mimicking reordering of
439    * table in Feature Settings
440    * Metal (red) rendered above Domain (green) above background (cyan)
441    * 1) 0.6 * green(0, 255, 0) + 0.4 * cyan(0, 255, 255) = (0, 255, 102)
442    * 2) 0.6* red(255, 0, 0) + 0.4 * (0, 255, 102) = (153, 102, 41) rounded
443    */
444  1 FeatureSettingsBean[] data = new FeatureSettingsBean[2];
445  1 data[0] = new FeatureSettingsBean("Metal", red, null, true);
446  1 data[1] = new FeatureSettingsBean("Domain", green, null, true);
447  1 fr.setFeaturePriority(data);
448  1 c = finder.findFeatureColour(Color.cyan, seq, 10);
449  1 assertEquals(c, new Color(153, 102, 41));
450   
451    /*
452    * ..and turn off display of Metal
453    * Domain (green) above background (pink)
454    * 0.6 * green(0, 255, 0) + 0.4 * pink(255, 175, 175) = (102, 223, 70)
455    */
456  1 data[0] = new FeatureSettingsBean("Metal", red, null, false);
457  1 fr.setFeaturePriority(data);
458  1 c = finder.findFeatureColour(Color.pink, seq, 10);
459  1 assertEquals(c, new Color(102, 223, 70));
460    }
461   
 
462  1 toggle @Test(groups = "Functional")
463    public void testNoFeaturesDisplayed()
464    {
465    /*
466    * no features on alignment to render
467    */
468  1 assertTrue(finder.noFeaturesDisplayed());
469   
470    /*
471    * add a feature
472    * it will be automatically set visible but we leave
473    * the viewport configured not to show features
474    */
475  1 av.setShowSequenceFeatures(false);
476  1 seq.addSequenceFeature(new SequenceFeature("Metal", "Metal", 2, 12,
477    Float.NaN, "MetalGroup"));
478  1 FeatureColour red = new FeatureColour(Color.red);
479  1 fr.setColour("Metal", red);
480  1 fr.featuresAdded();
481  1 assertTrue(finder.noFeaturesDisplayed());
482   
483    /*
484    * turn on feature display
485    */
486  1 av.setShowSequenceFeatures(true);
487  1 assertFalse(finder.noFeaturesDisplayed());
488   
489    /*
490    * turn off display of Metal
491    */
492  1 FeatureSettingsBean[] data = new FeatureSettingsBean[1];
493  1 data[0] = new FeatureSettingsBean("Metal", red, null, false);
494  1 fr.setFeaturePriority(data);
495  1 assertTrue(finder.noFeaturesDisplayed());
496   
497    /*
498    * turn display of Metal back on
499    */
500  1 fr.setVisible("Metal");
501  1 assertFalse(finder.noFeaturesDisplayed());
502   
503    /*
504    * turn off MetalGroup - has no effect here since the group of a
505    * sequence feature instance is independent of its type
506    */
507  1 fr.setGroupVisibility("MetalGroup", false);
508  1 assertFalse(finder.noFeaturesDisplayed());
509   
510    /*
511    * a finder with no feature renderer
512    */
513  1 FeatureColourFinder finder2 = new FeatureColourFinder(null);
514  1 assertTrue(finder2.noFeaturesDisplayed());
515    }
516   
 
517  1 toggle @Test(groups = "Functional")
518    public void testFindFeatureColour_graduatedWithThreshold()
519    {
520  1 String kdFeature = "kd";
521  1 String metalFeature = "Metal";
522  1 seq.addSequenceFeature(new SequenceFeature(kdFeature, "hydrophobicity",
523    2, 2, 0f, "KdGroup"));
524  1 seq.addSequenceFeature(new SequenceFeature(kdFeature, "hydrophobicity",
525    4, 4, 5f, "KdGroup"));
526  1 seq.addSequenceFeature(new SequenceFeature(metalFeature, "Fe", 4, 4, 5f,
527    "MetalGroup"));
528  1 seq.addSequenceFeature(new SequenceFeature(kdFeature, "hydrophobicity",
529    7, 7, 10f, "KdGroup"));
530   
531    /*
532    * kd feature has graduated colour from 0 to 10
533    * above threshold value of 5
534    */
535  1 Color min = new Color(100, 50, 150);
536  1 Color max = new Color(200, 0, 100);
537  1 FeatureColourI fc = new FeatureColour(null, min, max, null, 0, 10);
538  1 fc.setAboveThreshold(true);
539  1 fc.setThreshold(5f);
540  1 fr.setColour(kdFeature, fc);
541  1 FeatureColour green = new FeatureColour(Color.green);
542  1 fr.setColour(metalFeature, green);
543  1 fr.featuresAdded();
544   
545    /*
546    * render order is kd above Metal
547    */
548  1 FeatureSettingsBean[] data = new FeatureSettingsBean[2];
549  1 data[0] = new FeatureSettingsBean(kdFeature, fc, null, true);
550  1 data[1] = new FeatureSettingsBean(metalFeature, green, null, true);
551  1 fr.setFeaturePriority(data);
552   
553  1 av.setShowSequenceFeatures(true);
554   
555    /*
556    * position 2, column 1, score 0 - below threshold - default colour
557    */
558  1 Color c = finder.findFeatureColour(Color.blue, seq, 1);
559  1 assertEquals(c, Color.blue);
560   
561    /*
562    * position 4, column 3, score 5 - at threshold
563    * should return Green (colour of Metal feature)
564    */
565  1 c = finder.findFeatureColour(Color.blue, seq, 3);
566  1 assertEquals(c, Color.green);
567   
568    /*
569    * position 7, column 9, score 10 - maximum colour in range
570    */
571  1 c = finder.findFeatureColour(Color.blue, seq, 9);
572  1 assertEquals(c, max);
573   
574    /*
575    * now colour below threshold of 5
576    */
577  1 fc.setBelowThreshold(true);
578   
579    /*
580    * position 2, column 1, score 0 - min colour
581    */
582  1 c = finder.findFeatureColour(Color.blue, seq, 1);
583  1 assertEquals(c, min);
584   
585    /*
586    * position 4, column 3, score 5 - at threshold
587    * should return Green (colour of Metal feature)
588    */
589  1 c = finder.findFeatureColour(Color.blue, seq, 3);
590  1 assertEquals(c, Color.green);
591   
592    /*
593    * position 7, column 9, score 10 - above threshold - default colour
594    */
595  1 c = finder.findFeatureColour(Color.blue, seq, 9);
596  1 assertEquals(c, Color.blue);
597    }
598    }