package jalview.analysis; import java.util.ArrayList; import java.util.List; import jalview.datamodel.SequenceI; import jalview.datamodel.AlignmentI; /** * grab bag of useful alignment manipulation operations * Expect these to be refactored elsewhere at some point. * @author jimp * */ public class AlignmentUtils { /** * given an existing alignment, create a new alignment including all, or up to flankSize additional symbols from each sequence's dataset sequence * @param core * @param flankSize * @return AlignmentI */ public static AlignmentI expandContext(AlignmentI core, int flankSize) { List sq = new ArrayList(); int maxoffset = 0; for (SequenceI s:core.getSequences()) { SequenceI newSeq = s.deriveSequence(); if (newSeq.getStart()>maxoffset) { maxoffset = newSeq.getStart(); } sq.add(newSeq); } if (flankSize>-1) { maxoffset = flankSize; } // now add offset to create a new expanded alignment for (SequenceI s:sq) { SequenceI ds = s; while (ds.getDatasetSequence()!=null) { ds=ds.getDatasetSequence(); } int s_end = s.findPosition(s.getStart()+s.getLength()); // find available flanking residues for sequence int ustream_ds=s.getStart()-ds.getStart(),dstream_ds=ds.getEnd()-s_end; // build new flanked sequence // compute gap padding to start of flanking sequence int offset=maxoffset - ustream_ds; // padding is gapChar x ( maxoffset - min(ustream_ds, flank) if (flankSize>=0) { if (flankSize