X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FHiddenMarkovModel.java;h=6b8b09562dcdc9011c9d910201630d068ed37c78;hb=bea1d9b563d2fea018de3dbde9112dd59149126e;hp=3c2c437643bb2a2a9b9f275db06246a18c24e558;hpb=37f0332f53a8564ba7a9d55b993f8bfd2f368c80;p=jalview.git diff --git a/src/jalview/datamodel/HiddenMarkovModel.java b/src/jalview/datamodel/HiddenMarkovModel.java index 3c2c437..6b8b095 100644 --- a/src/jalview/datamodel/HiddenMarkovModel.java +++ b/src/jalview/datamodel/HiddenMarkovModel.java @@ -1,6 +1,5 @@ package jalview.datamodel; -import jalview.bin.Cache; import jalview.io.HMMFile; import jalview.schemes.ResidueProperties; import jalview.util.Comparison; @@ -75,6 +74,9 @@ public class HiddenMarkovModel */ private Mapping mapToHmmConsensus; + // stores background frequencies of alignment from which this model came + private Map backgroundFrequencies; + /** * Constructor */ @@ -98,13 +100,17 @@ public class HiddenMarkovModel 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 { - Cache.log.error("Error: HMM copied with change of mapped sequence"); + // different dataset sequence e.g. after loading HMM from project + this.mapToHmmConsensus = new Mapping(sq.getDatasetSequence(), + hmm.mapToHmmConsensus.getMap()); } } @@ -518,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); @@ -534,7 +547,7 @@ public class HiddenMarkovModel */ while (resNo > lastResNo + 1) { - sequence[seqOffset++] = '-'; + sequence[seqOffset++] = GAP_DASH; lastResNo++; gapCount++; } @@ -631,5 +644,29 @@ public class HiddenMarkovModel { 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; + } + }