private final char[] alignedSeq;
/*
+ * the sequence start residue
+ */
+ private int start;
+
+ /*
* Next position (base 0) in the aligned sequence
*/
private int alignedColumn = 0;
/**
* 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();
{
// TODO should ideally handle toRatio other than 1 as well...
// i.e. code like getNextCodon()
- if (toPosition <= currentToRange[1]) {
- char pep = Mapping.this.to.getSequence()[toPosition - 1];
+ if (toPosition <= currentToRange[1])
+ {
+ SequenceI seq = Mapping.this.to;
+ char pep = seq.getSequence()[toPosition - seq.getStart()];
toPosition++;
return String.valueOf(pep);
}
*/
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)
{
int[] mp = map.shiftFrom(pos);
if (mp != null)
{
- return new int[]
- { mp[0], mp[0] + mp[2] * (map.getToRatio() - 1) };
+ return new int[] { mp[0], mp[0] + mp[2] * (map.getToRatio() - 1) };
}
}
return null;
}
}
// give up and just return the feature.
- return new SequenceFeature[]
- { f };
+ return new SequenceFeature[] { f };
}
/**
}
return map.locateInFrom(from, to);
}
- return new int[]
- { from, to };
+ return new int[] { from, to };
}
/**
}
return map.locateInTo(from, to);
}
- return new int[]
- { from, to };
+ return new int[] { from, to };
}
/**
{
for (int m = 0; m < mpr.length; m += 2)
{
- toRange.addElement(new int[]
- { mpr[m], mpr[m + 1] });
+ toRange.addElement(new int[] { mpr[m], mpr[m + 1] });
int[] xpos = locateRange(mpr[m], mpr[m + 1]);
for (int x = 0; x < xpos.length; x += 2)
{
- fromRange.addElement(new int[]
- { xpos[x], xpos[x + 1] });
+ fromRange.addElement(new int[] { xpos[x], xpos[x + 1] });
}
}
}
return copy;
}
- public static void main(String[] args)
- {
- /**
- * trite test of the intersectVisContigs method for a simple DNA -> Protein
- * exon map and a range of visContigs
- */
- MapList fk = new MapList(new int[]
- { 1, 6, 8, 13, 15, 23 }, new int[]
- { 1, 7 }, 3, 1);
- Mapping m = new Mapping(fk);
- Mapping m_1 = m.intersectVisContigs(new int[]
- { fk.getFromLowest(), fk.getFromHighest() });
- Mapping m_2 = m.intersectVisContigs(new int[]
- { 1, 7, 11, 20 });
- System.out.println("" + m_1.map.getFromRanges());
-
- }
-
/**
* get the sequence being mapped to - if any
*
*
* @see java.lang.Object#finalize()
*/
+ @Override
protected void finalize() throws Throwable
{
map = null;
public Iterator<AlignedCodon> 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());
}
}