X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FHiddenMarkovModel.java;h=6b8b09562dcdc9011c9d910201630d068ed37c78;hb=747167089ecf8d6afc70d417f5a20352e029bd95;hp=a4270cd9791f8466af07b737efe1c058d2bf034b;hpb=bb9cbefb3041ef5aba75b9e41d2fa3b2bb891e89;p=jalview.git diff --git a/src/jalview/datamodel/HiddenMarkovModel.java b/src/jalview/datamodel/HiddenMarkovModel.java index a4270cd..6b8b095 100644 --- a/src/jalview/datamodel/HiddenMarkovModel.java +++ b/src/jalview/datamodel/HiddenMarkovModel.java @@ -74,6 +74,9 @@ public class HiddenMarkovModel */ private Mapping mapToHmmConsensus; + // stores background frequencies of alignment from which this model came + private Map backgroundFrequencies; + /** * Constructor */ @@ -82,11 +85,13 @@ public class HiddenMarkovModel } /** - * 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); @@ -94,6 +99,19 @@ public class HiddenMarkovModel 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()); + } } /** @@ -506,12 +524,19 @@ public class HiddenMarkovModel 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); @@ -522,7 +547,7 @@ public class HiddenMarkovModel */ while (resNo > lastResNo + 1) { - sequence[seqOffset++] = '-'; + sequence[seqOffset++] = GAP_DASH; lastResNo++; gapCount++; } @@ -549,8 +574,6 @@ public class HiddenMarkovModel lastResNo - gapCount); seq.createDatasetSequence(); seq.setHMM(this); - seq.setIsHMMConsensusSequence(true); - this.hmmSeq = seq; /* @@ -606,7 +629,44 @@ public class HiddenMarkovModel public void setNodes(List 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 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 getBackgroundFrequencies() + { + return backgroundFrequencies; + } + }