Merge branch 'develop' into releases/Release_2_11_Branch
[jalview.git] / examples / groovy / colourUnconserved.groovy
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 import java.awt.Color
22 import jalview.schemes.ColourSchemeI
23 import jalview.schemes.ColourSchemes
24 import jalview.datamodel.AnnotatedCollectionI
25 import jalview.datamodel.SequenceI
26 import jalview.datamodel.SequenceCollectionI
27 import jalview.api.AlignViewportI
28 import jalview.util.Comparison
29
30 /*
31  * Closure that defines a colour scheme where non-consensus residues are pink,
32  * other residues (and gaps) are white
33  */
34 def unconserved
35 unconserved = { ->
36   [
37     /*
38      * name shown in the colour menu
39      */
40     getSchemeName: { -> 'Unconserved' },
41     
42     /*
43      * to make a new instance for each alignment view
44      */
45     getInstance: { view, coll -> unconserved() },
46     
47     /*
48      * method only needed if colour scheme has to recalculate
49      * values when an alignment is modified
50      */
51     alignmentChanged: { AnnotatedCollectionI coll, Map<SequenceI, SequenceCollectionI> map -> },
52     
53     /*
54      * determine colour for a residue at an aligned position of a
55      * sequence, given consensus residue(s) for the column and the
56      * consensus percentage identity score for the column
57      */
58     findColour: { char res, int col, SequenceI seq, String consensus, float pid -> 
59         if ('a' <= res && res <= 'z')
60         {
61             res -= ('a' - 'A');
62         }
63         if (Comparison.isGap(res) || consensus.contains(String.valueOf(res)))
64         {
65             Color.white
66         } else 
67         {
68             Color.pink
69         }
70     },
71     
72     /*
73      * true means applicable to nucleotide or peptide data
74      */
75     isApplicableTo: {AnnotatedCollectionI coll -> true},
76     
77     /*
78      * simple colour schemes are those that depend on the residue
79      * only (these are also available to colour structure viewers)
80      */
81     isSimple: { false }
82  ] as ColourSchemeI
83 }
84
85 ColourSchemes.instance.registerColourScheme(unconserved())