*/
private Mapping mapToHmmConsensus;
+ // stores background frequencies of alignment from which this model came
+ private Map<Character, Float> backgroundFrequencies;
+
/**
* Constructor
*/
}
/**
- * Copy constructor
+ * Copy constructor given a new aligned sequence with which to associate the
+ * HMM profile
*
* @param hmm
+ * @param sq
*/
- public HiddenMarkovModel(HiddenMarkovModel hmm)
+ public HiddenMarkovModel(HiddenMarkovModel hmm, SequenceI sq)
{
super();
this.fileProperties = new HashMap<>(hmm.fileProperties);
this.nodes = new ArrayList<>(hmm.nodes);
this.symbolIndexLookup = hmm.symbolIndexLookup;
this.fileHeader = new String(hmm.fileHeader);
+ this.hmmSeq = sq;
+ this.backgroundFrequencies = hmm.getBackgroundFrequencies();
+ if (sq.getDatasetSequence() == hmm.mapToHmmConsensus.getTo())
+ {
+ // same dataset sequence e.g. after realigning search results
+ this.mapToHmmConsensus = hmm.mapToHmmConsensus;
+ }
+ else
+ {
+ // different dataset sequence e.g. after loading HMM from project
+ this.mapToHmmConsensus = new Mapping(sq.getDatasetSequence(),
+ hmm.mapToHmmConsensus.getMap());
+ }
}
/**
int start = hasMap ? getNode(1).getResidueNumber() : 1;
int endResNo = hasMap ? getNode(nodes.size() - 1).getResidueNumber()
: (start + getLength() - 1);
- char[] sequence = new char[endResNo - start + 1];
+ char[] sequence = new char[endResNo];
int lastResNo = start - 1;
- int seqOffset = 0;
+ int seqOffset = -1;
int gapCount = 0;
+
+ for (int seqN = 0; seqN < start; seqN++)
+ {
+ sequence[seqN] = GAP_DASH;
+ seqOffset++;
+ }
+
for (int nodeNo = 1; nodeNo < nodes.size(); nodeNo++)
{
HMMNode node = nodes.get(nodeNo);
*/
while (resNo > lastResNo + 1)
{
- sequence[seqOffset++] = '-';
+ sequence[seqOffset++] = GAP_DASH;
lastResNo++;
gapCount++;
}
lastResNo - gapCount);
seq.createDatasetSequence();
seq.setHMM(this);
- seq.setIsHMMConsensusSequence(true);
-
this.hmmSeq = seq;
/*
public void setNodes(List<HMMNode> nodeList)
{
nodes = nodeList;
- buildConsensusSequence();
+ if (nodes.size() > 1)
+ {
+ buildConsensusSequence();
+ }
+ }
+
+ /**
+ * Sets the aligned consensus sequence this HMM is the model for
+ *
+ * @param hmmSeq
+ */
+ public void setHmmSeq(SequenceI hmmSeq)
+ {
+ this.hmmSeq = hmmSeq;
+ }
+
+ public void setBackgroundFrequencies(Map<Character, Float> bkgdFreqs)
+ {
+ backgroundFrequencies = bkgdFreqs;
+ }
+
+ public void setBackgroundFrequencies(ResidueCount bkgdFreqs)
+ {
+ backgroundFrequencies = new HashMap<>();
+
+ int total = bkgdFreqs.getTotalResidueCount();
+
+ for (char c : bkgdFreqs.getSymbolCounts().symbols)
+ {
+ backgroundFrequencies.put(c, bkgdFreqs.getCount(c) * 1f / total);
+ }
+
+ }
+
+ public Map<Character, Float> getBackgroundFrequencies()
+ {
+ return backgroundFrequencies;
}
}