/*
* 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