X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FColumnSelection.java;h=3b46c47b86706f4bb913200a952ffaa5b2e5dc82;hb=9c04f4ce6bb3a8851b1abf3bb9999ca097d37685;hp=a36faf792433713b39515c900f68c73f55191abe;hpb=8a6fa9ea9900d0f106529c3f6283e7f9d76dd2cb;p=jalview.git diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index a36faf7..3b46c47 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -1112,4 +1112,134 @@ 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)); + if (diff>=sb.length()) { + sq+=sb.toString(); + } else { + char[] buf = new char[diff]; + sb.getChars(0, diff, buf, 0); + sq+=buf.toString(); + } + } + } + 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)); + if (diff>=sb.length()) { + sq+=sb.toString(); + } else { + char[] buf = new char[diff]; + sb.getChars(0, diff, buf, 0); + sq+=buf.toString(); + } + diff = origseq.getLength() - sq.length(); + } + } + } + } }