X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FMapping.java;h=bd83fe9bb91bba216a59cc590838484209b1b6c5;hb=0ff10fddf3364f8a3c657355cfb4bc45ab5485a8;hp=1272538fb41432cf9599a93b22a09f9b81f9e7fd;hpb=4d7f98a6dd54d9863ba449ec79dcd95d25ed863d;p=jalview.git diff --git a/src/jalview/datamodel/Mapping.java b/src/jalview/datamodel/Mapping.java index 1272538..bd83fe9 100644 --- a/src/jalview/datamodel/Mapping.java +++ b/src/jalview/datamodel/Mapping.java @@ -48,6 +48,11 @@ public class Mapping private final char[] alignedSeq; /* + * the sequence start residue + */ + private int start; + + /* * Next position (base 0) in the aligned sequence */ private int alignedColumn = 0; @@ -90,13 +95,14 @@ public class Mapping /** * Constructor * - * @param cs - * the aligned sequence characters + * @param seq + * the aligned sequence * @param gapChar */ - public AlignedCodonIterator(char[] cs, char gapChar) + public AlignedCodonIterator(SequenceI seq, char gapChar) { - this.alignedSeq = cs; + this.alignedSeq = seq.getSequence(); + this.start = seq.getStart(); this.gap = gapChar; fromRanges = map.getFromRanges().iterator(); toRanges = map.getToRanges().iterator(); @@ -149,8 +155,9 @@ public class Mapping int[] alignedCodon = getAlignedCodon(codon); String peptide = getPeptide(); + int peptideCol = toPosition - 1 - Mapping.this.to.getStart(); return new AlignedCodon(alignedCodon[0], alignedCodon[1], - alignedCodon[2], peptide); + alignedCodon[2], peptide, peptideCol); } /** @@ -158,6 +165,8 @@ public class Mapping * sequence. * * @return + * @throws NoSuchElementException + * if the 'toRange' is exhausted (nothing to map to) */ private String getPeptide() { @@ -165,7 +174,8 @@ public class Mapping // i.e. code like getNextCodon() if (toPosition <= currentToRange[1]) { - char pep = Mapping.this.to.getSequence()[toPosition - 1]; + SequenceI seq = Mapping.this.to; + char pep = seq.getSequence()[toPosition - seq.getStart()]; toPosition++; return String.valueOf(pep); } @@ -242,8 +252,11 @@ public class Mapping */ private int getAlignedColumn(int sequencePos) { - while (alignedBases < sequencePos - && alignedColumn < alignedSeq.length) + /* + * allow for offset e.g. treat pos 8 as 2 if sequence starts at 7 + */ + int truePos = sequencePos - (start - 1); + while (alignedBases < truePos && alignedColumn < alignedSeq.length) { if (alignedSeq[alignedColumn++] != gap) { @@ -683,6 +696,7 @@ public class Mapping * * @see java.lang.Object#finalize() */ + @Override protected void finalize() throws Throwable { map = null; @@ -690,9 +704,28 @@ public class Mapping super.finalize(); } + /** + * Returns an iterator which can serve up the aligned codon column positions + * and their corresponding peptide products + * + * @param seq + * an aligned (i.e. possibly gapped) sequence + * @param gapChar + * @return + */ public Iterator getCodonIterator(SequenceI seq, char gapChar) { - return new AlignedCodonIterator(seq.getSequence(), gapChar); + return new AlignedCodonIterator(seq, gapChar); + } + + /** + * Readable representation for debugging only, not guaranteed not to change + */ + @Override + public String toString() + { + return String.format("%s %s", this.map.toString(), this.to == null ? "" + : this.to.getName()); } }