From c5b266dbd1a12ac4b5e0a070b10fa707a73cd889 Mon Sep 17 00:00:00 2001 From: jprocter Date: Fri, 17 Dec 2010 13:17:29 +0000 Subject: [PATCH] refactored gap insert/visible view modification code from JPredThread --- src/jalview/datamodel/ColumnSelection.java | 116 ++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index a36faf7..0bcbd5b 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -1112,4 +1112,120 @@ public class ColumnSelection } } } + + /** + * Add gaps into the sequences aligned to profileseq under the given + * AlignmentView + * + * @param profileseq + * @param al - alignment to have gaps inserted into it + * @param input - alignment view where sequence corresponding to profileseq is first entry + * @return new Column selection for new alignment view, with insertions into profileseq marked as hidden. + */ + public static ColumnSelection propagateInsertions(SequenceI profileseq, + Alignment al, AlignmentView input) + { + int profsqpos=0; + +// return propagateInsertions(profileseq, al, ) + char gc = al.getGapCharacter(); + Object[] alandcolsel = input.getAlignmentAndColumnSelection(gc); + ColumnSelection nview = (ColumnSelection) alandcolsel[1]; + SequenceI origseq = ((SequenceI[]) alandcolsel[0])[profsqpos]; + nview.propagateInsertions(profileseq, + al, origseq); + return nview; + } + /** + * + * @param profileseq - sequence in al which corresponds to origseq + * @param al - alignment which is to have gaps inserted into it + * @param origseq - sequence corresponding to profileseq which defines gap map for modifying al + */ + public void propagateInsertions(SequenceI profileseq, AlignmentI al, SequenceI origseq) + { + char gc = al.getGapCharacter(); + // recover mapping between sequence's non-gap positions and positions + // mapping to view. + pruneDeletions(ShiftList + .parseMap(origseq + .gapMap())); + int[] viscontigs = getVisibleContigs(0, profileseq.getLength()); + int spos = 0; + int offset = 0; + // input.pruneDeletions(ShiftList.parseMap(((SequenceI[]) + // alandcolsel[0])[0].gapMap())) + // add profile to visible contigs + for (int v = 0; v < viscontigs.length; v += 2) + { + if (viscontigs[v] > spos) + { + StringBuffer sb = new StringBuffer(); + for (int s = 0, ns = viscontigs[v] - spos; s < ns; s++) + { + sb.append(gc); + } + for (int s = 0, ns = al.getHeight(); s < ns; s++) + { + SequenceI sqobj = al.getSequenceAt(s); + if (sqobj != profileseq) + { + String sq = al.getSequenceAt(s).getSequenceAsString(); + if (sq.length() <= spos + offset) + { + // pad sequence + int diff = spos + offset - sq.length() - 1; + if (diff > 0) + { + // pad gaps + sq = sq + sb; + while ((diff = spos + offset - sq.length() - 1) > 0) + { + sq = sq + + ((diff >= sb.length()) ? sb.toString() : sb + .substring(0, diff)); + } + } + sq += sb.toString(); + } + else + { + al.getSequenceAt(s).setSequence( + sq.substring(0, spos + offset) + sb.toString() + + sq.substring(spos + offset)); + } + } + } + // offset+=sb.length(); + } + spos = viscontigs[v + 1] + 1; + } + if ((offset + spos) < profileseq.getLength()) + { + // pad the final region with gaps. + StringBuffer sb = new StringBuffer(); + for (int s = 0, ns = profileseq.getLength() - spos - offset; s < ns; s++) + { + sb.append(gc); + } + for (int s = 0, ns = al.getHeight(); s < ns; s++) + { + SequenceI sqobj = al.getSequenceAt(s); + if (sqobj==profileseq) + { + continue; + } + String sq = sqobj.getSequenceAsString(); + // pad sequence + int diff = origseq.getLength() - sq.length(); + while (diff > 0) + { + sq = sq + + ((diff >= sb.length()) ? sb.toString() : sb + .substring(0, diff)); + diff = origseq.getLength() - sq.length(); + } + } + } + } } -- 1.7.10.2