/* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2) * Copyright (C) 2014 The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ 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 && newSeq.getDatasetSequence().getStart()-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