X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FHiddenMarkovModel.java;h=e74d8261693634fadb0a5d2627d16343ccfb8fd2;hb=d6cace53173ae859bfd93f5e8a13be427864afd1;hp=4ecdf534882cbd2d0daf1f95fa2d956c4f5084a3;hpb=e1e9f9f44944414e474ed500bc9e06f79dae76c7;p=jalview.git diff --git a/src/jalview/datamodel/HiddenMarkovModel.java b/src/jalview/datamodel/HiddenMarkovModel.java index 4ecdf53..e74d826 100644 --- a/src/jalview/datamodel/HiddenMarkovModel.java +++ b/src/jalview/datamodel/HiddenMarkovModel.java @@ -33,7 +33,8 @@ public class HiddenMarkovModel // 0. Node 0 contains average emission probabilities for each symbol List nodes = new ArrayList<>(); - // contains the HMM node for each alignment column + // contains the HMM node for each alignment column, alignment columns start at + // index 0; Map nodeLookup = new HashMap<>(); // contains the symbol index for each symbol @@ -124,11 +125,12 @@ public class HiddenMarkovModel public HiddenMarkovModel(HiddenMarkovModel hmm) { super(); - this.fileProperties = hmm.fileProperties; - this.symbols = hmm.symbols; - this.nodes = hmm.nodes; - this.nodeLookup = hmm.nodeLookup; - this.symbolIndexLookup = hmm.symbolIndexLookup; + this.fileProperties = new HashMap<>(hmm.fileProperties); + this.symbols = new ArrayList<>(hmm.symbols); + this.nodes = new ArrayList<>(hmm.nodes); + this.nodeLookup = new HashMap<>(hmm.nodeLookup); + this.symbolIndexLookup = new HashMap<>( + hmm.symbolIndexLookup); this.numberOfSymbols = hmm.numberOfSymbols; this.fileHeader = new String(hmm.fileHeader); } @@ -390,9 +392,9 @@ public class HiddenMarkovModel return 0d; } symbolIndex = symbolIndexLookup.get(symbol); - if (nodeLookup.containsKey(alignColumn + 1)) + if (nodeLookup.containsKey(alignColumn)) { - nodeIndex = nodeLookup.get(alignColumn + 1); + nodeIndex = nodeLookup.get(alignColumn); probability = getNode(nodeIndex).getMatchEmissions().get(symbolIndex); return probability; } @@ -425,9 +427,9 @@ public class HiddenMarkovModel return 0d; } symbolIndex = symbolIndexLookup.get(symbol); - if (nodeLookup.containsKey(alignColumn + 1)) + if (nodeLookup.containsKey(alignColumn)) { - nodeIndex = nodeLookup.get(alignColumn + 1); + nodeIndex = nodeLookup.get(alignColumn); probability = getNode(nodeIndex).getInsertEmissions() .get(symbolIndex); return probability; @@ -457,9 +459,9 @@ public class HiddenMarkovModel int transitionIndex; int nodeIndex; Double probability; - if (nodeLookup.containsKey(alignColumn + 1)) + if (nodeLookup.containsKey(alignColumn)) { - nodeIndex = nodeLookup.get(alignColumn + 1); + nodeIndex = nodeLookup.get(alignColumn); probability = getNode(nodeIndex).getStateTransitions() .get(transition); return probability; @@ -482,7 +484,7 @@ public class HiddenMarkovModel public Integer getNodeAlignmentColumn(int nodeIndex) { Integer value = nodes.get(nodeIndex).getAlignmentColumn(); - return value - 1; + return value; } /** @@ -950,7 +952,7 @@ public class HiddenMarkovModel public Integer findNodeIndex(int alignmentColumn) { Integer index; - index = nodeLookup.get(alignmentColumn + 1); + index = nodeLookup.get(alignmentColumn); return index; } @@ -983,7 +985,7 @@ public class HiddenMarkovModel * The length of the longest sequence in the existing alignment. * @return */ - public Sequence getConsensusSequence(int length) + public Sequence getConsensusSequence() { int start; int end; @@ -991,8 +993,8 @@ public class HiddenMarkovModel start = getNodeAlignmentColumn(1); modelLength = getLength(); end = getNodeAlignmentColumn(modelLength); - char[] sequence = new char[length]; - for (int index = 0; index < length; index++) + char[] sequence = new char[end]; + for (int index = 0; index < end; index++) { Character character; @@ -1018,7 +1020,7 @@ public class HiddenMarkovModel * Maps the nodes of the hidden Markov model to the reference annotation and * then deletes this annotation. */ - public void mapToReferenceAnnotation(AlignFrame af) + public void mapToReferenceAnnotation(AlignFrame af, SequenceI seq) { AlignmentAnnotation annotArray[] = af.getViewport().getAlignment() .getAlignmentAnnotation(); @@ -1037,10 +1039,56 @@ public class HiddenMarkovModel return; } - mapToReferenceAnnotation(reference); + mapToReferenceAnnotation(reference, seq); af.getViewport().getAlignment().deleteAnnotation(reference); } + public void mapToReferenceAnnotation(AlignmentAnnotation reference, + SequenceI seq) + { + HiddenMarkovModel hmm = seq.getHMM(); + Annotation[] annots = reference.annotations; + { + int nodeIndex = 0; + for (int col = 0; col < annots.length; col++) + { + String character = annots[col].displayCharacter; + if ("x".equals(character) || "X".equals(character)) + { + nodeIndex++; + if (nodeIndex < hmm.getNodes().size()) + { + HMMNode node = hmm.getNode(nodeIndex); + int alignPos = getNodeAlignmentColumn(nodeIndex); + char seqCharacter = seq.getCharAt(alignPos); + if (alignPos >= seq.getLength() || col >= seq.getLength()) + { + seq.insertCharAt(seq.getLength(), + (alignPos + 1) - seq.getLength(), + '-'); + } + seq.getSequence()[alignPos] = '-'; + seq.getSequence()[col] = seqCharacter; + node.setAlignmentColumn(col); + hmm.nodeLookup.put(col, nodeIndex); + } + else + { + System.out.println( + "The reference annotation contains more consensus columns than the hidden Markov model"); + break; + } + } + else + { + hmm.nodeLookup.remove(col); + } + } + + } + + } + public void mapToReferenceAnnotation(AlignmentAnnotation reference) { Annotation[] annots = reference.annotations; @@ -1054,8 +1102,9 @@ public class HiddenMarkovModel nodeIndex++; if (nodeIndex < nodes.size()) { - nodes.get(nodeIndex).setAlignmentColumn(col + 1); - nodeLookup.put(col + 1, nodeIndex); + HMMNode node = nodes.get(nodeIndex); + node.setAlignmentColumn(col + 1); + nodeLookup.put(col, nodeIndex); } else { @@ -1066,7 +1115,7 @@ public class HiddenMarkovModel } else { - nodeLookup.remove(col + 1); + nodeLookup.remove(col); } } @@ -1074,15 +1123,11 @@ public class HiddenMarkovModel } - public SequenceI initHMMSequence(AlignFrame af, int position) + public SequenceI initHMMSequence() { - AlignmentI alignment = af.getViewport().getAlignment(); - int length = alignment.getWidth(); - Sequence consensus = getConsensusSequence(length); + Sequence consensus = getConsensusSequence(); consensus.setIsHMMConsensusSequence(true); consensus.setHMM(this); - SequenceI[] consensusArr = new Sequence[] { consensus }; - alignment.getSequences().add(position, consensus); return consensus; }