JAl-2629 add new HMMER colour scheme class
[jalview.git] / src / jalview / schemes / HMMERAlignmentColourScheme.java
1 package jalview.schemes;
2
3 import jalview.datamodel.AnnotatedCollectionI;
4 import jalview.datamodel.HiddenMarkovModel;
5 import jalview.datamodel.SequenceCollectionI;
6 import jalview.datamodel.SequenceI;
7 import jalview.util.ColorUtils;
8 import jalview.util.Comparison;
9
10 import java.awt.Color;
11 import java.util.List;
12 import java.util.Map;
13
14 public class HMMERAlignmentColourScheme extends ResidueColourScheme
15 {
16
17   AnnotatedCollectionI alignment;
18
19   HiddenMarkovModel hmm;
20
21   boolean peptideSpecific;
22
23   boolean nucleotideSpecific;
24
25   public HMMERAlignmentColourScheme(HiddenMarkovModel markov)
26   {
27     hmm = markov;
28   }
29
30   public HMMERAlignmentColourScheme()
31   {
32
33   }
34
35   @Override
36   public Color findColour(char symbol, int position, SequenceI seq,
37           String consensusResidue, float pid)
38   {
39     if (hmm == null)
40     {
41       return Color.white;
42     }
43     return findColour(symbol, position);
44   }
45
46   /**
47    * Returns the colour at a particular symbol at a column in the alignment.
48    * 
49    * @param symbol
50    * @param position
51    * @return Red for an insertion, white for a gap, orange for a negative
52    *         information content, white to blue for increasing information
53    *         content.
54    */
55   private Color findColour(char symbol, int position)
56   {
57
58     if (Comparison.isGap(symbol))
59     {
60       return Color.white;
61     }
62     if (Character.isLowerCase(symbol))
63     {
64       symbol = Character.toUpperCase(symbol);
65     }
66     Double prob;
67     prob = hmm.getMatchEmissionProbability(position, symbol);
68     double freq = 0;
69     String alpha = hmm.getAlphabetType();
70     if (!ResidueProperties.backgroundFrequencies.get(alpha)
71             .containsKey(symbol))
72     {
73       return Color.white;
74     }
75     else
76     {
77       freq = ResidueProperties.backgroundFrequencies.get(alpha).get(symbol);
78     }
79     if (prob == 0)
80     {
81       return new Color(230, 0, 0);
82     }
83     Double value = Math.log(prob / freq);
84     Color colour = null;
85     if (value > 0)
86     {
87
88       colour = ColorUtils.getGraduatedColour(value.floatValue(), 0,
89               Color.WHITE, 4.52f, Color.blue);
90     }
91     else if (value < 0)
92     {
93       return Color.ORANGE;
94
95     }
96     return colour;
97
98   }
99
100   @Override
101   public void alignmentChanged(AnnotatedCollectionI collection,
102           Map<SequenceI, SequenceCollectionI> hiddenReps)
103   {
104     List<SequenceI> seqs = collection.getSequences();
105     for (SequenceI seq : seqs)
106     {
107       if (seq.isHMMConsensusSequence())
108       {
109         hmm = seq.getHMM();
110         break;
111       }
112     }
113
114   }
115
116   @Override
117   public ColourSchemeI getInstance(AnnotatedCollectionI sg,
118           Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
119   {
120     HiddenMarkovModel markov = null;
121     List<SequenceI> seqs = sg.getSequences();
122     for (SequenceI seq : seqs)
123     {
124       if (seq.getHMM() != null)
125       {
126         markov = seq.getHMM();
127         break;
128       }
129     }
130     HMMERColourScheme colour = new HMMERColourScheme(markov);
131     return colour;
132
133   }
134
135   @Override
136   public boolean isApplicableTo(AnnotatedCollectionI ac)
137   {
138     return true;
139
140   }
141
142   @Override
143   public String getSchemeName()
144   {
145
146     return JalviewColourScheme.HMMERA.name();
147   }
148
149   @Override
150   public boolean isSimple()
151   {
152     return false;
153   }
154
155 }
156