d7a5e65160fb43f8d63fc3c5016066e26048753b
[jalview.git] / src / jalview / schemes / HmmerLocalBackground.java
1 package jalview.schemes;
2
3 import jalview.datamodel.AnnotatedCollectionI;
4 import jalview.datamodel.ResidueCount;
5 import jalview.datamodel.SequenceI;
6
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10
11 /**
12  * An HMM colour scheme that uses local (alignment or sub-group) background
13  * frequencies for residues
14  * 
15  * @author tzvanaalten
16  */
17 public class HmmerLocalBackground extends HmmerColourScheme
18 {
19   float logTotalCount;
20
21   /**
22    * Constructor given a Hidden Markov Model
23    * 
24    * @param sg
25    * 
26    * @param markov
27    */
28   public HmmerLocalBackground(AnnotatedCollectionI ac)
29   {
30     super(ac.getHmmConsensus());
31     countFrequencies(ac);
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    * (apart from any HMM consensus sequences)
50    * 
51    * @param sg
52    */
53   public void countFrequencies(AnnotatedCollectionI sg)
54   {
55     // TODO or total counts in Consensus Profile (how do we get at it?)?
56     Map<Character, Float> freqs = new HashMap<>();
57
58     /*
59      * count symbols, excluding any HMM consensus sequences
60      */
61     ResidueCount counts = new ResidueCount();
62     List<SequenceI> seqs = sg.getSequences();
63     for (SequenceI seq : seqs)
64     {
65       if (!seq.isHMMConsensusSequence())
66       {
67         for (char c : seq.getSequence())
68         {
69           counts.add(c);
70         }
71       }
72     }
73     int total = counts.getTotalResidueCount(); // excludes gaps
74
75     for (char symbol : counts.getSymbolCounts().symbols)
76     {
77       double freq = counts.getCount(symbol) / (double) total;
78       freqs.put(symbol, (float) freq);
79     }
80
81     setFrequencies(freqs);
82
83     logTotalCount = (float) Math.log(total);
84   }
85
86   @Override
87   float getMaxInformationScore()
88   {
89     return logTotalCount;
90   }
91
92   @Override
93   protected HmmerColourScheme newInstance(AnnotatedCollectionI ac)
94   {
95     return new HmmerLocalBackground(ac);
96   }
97 }