JAL-2938 extracted base class for Hmmer colour schems
[jalview.git] / src / jalview / schemes / HmmerLocalBackground.java
1 package jalview.schemes;
2
3 import jalview.datamodel.AnnotatedCollectionI;
4 import jalview.datamodel.HiddenMarkovModel;
5 import jalview.datamodel.ResidueCount;
6
7 import java.util.HashMap;
8 import java.util.Map;
9
10 /**
11  * An HMM colour scheme that uses local (alignment or sub-group) background
12  * frequencies for residues
13  * 
14  * @author tzvanaalten
15  */
16 public class HmmerLocalBackground extends HmmerColourScheme
17 {
18   float logTotalCount;
19
20   /**
21    * Constructor given a Hidden Markov Model
22    * 
23    * @param sg
24    * 
25    * @param markov
26    */
27   public HmmerLocalBackground(AnnotatedCollectionI sg,
28           HiddenMarkovModel markov)
29   {
30     super(markov);
31     countFrequencies(sg);
32   }
33
34   /**
35    * Default constructor (required by ColourSchemes.loadColourSchemes)
36    */
37   public HmmerLocalBackground()
38   {
39   }
40
41   @Override
42   public String getSchemeName()
43   {
44     return JalviewColourScheme.HMMERA.toString();
45   }
46
47   /**
48    * Counts and stores the relative frequency of every residue in the alignment
49    * 
50    * @param sg
51    */
52   public void countFrequencies(AnnotatedCollectionI sg)
53   {
54     Map<Character, Float> freqs = new HashMap<>();
55     ResidueCount counts = new ResidueCount(sg.getSequences());
56     int total = counts.getTotalResidueCount(); // excludes gaps
57
58     for (char symbol : counts.getSymbolCounts().symbols)
59     {
60       double freq = counts.getCount(symbol) / (double) total;
61       freqs.put(symbol, (float) freq);
62     }
63
64     setFrequencies(freqs);
65
66     logTotalCount = (float) Math.log(total);
67   }
68
69   @Override
70   float getMaxInformationScore()
71   {
72     return logTotalCount;
73   }
74
75   @Override
76   protected HmmerColourScheme newInstance(AnnotatedCollectionI ac,
77           HiddenMarkovModel model)
78   {
79     return new HmmerLocalBackground(ac, model);
80   }
81 }