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