2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.analysis;
23 import java.util.ArrayList;
24 import java.util.List;
26 import jalview.datamodel.SequenceI;
27 import jalview.datamodel.AlignmentI;
30 * grab bag of useful alignment manipulation operations Expect these to be
31 * refactored elsewhere at some point.
36 public class AlignmentUtils
40 * given an existing alignment, create a new alignment including all, or up to
41 * flankSize additional symbols from each sequence's dataset sequence
47 public static AlignmentI expandContext(AlignmentI core, int flankSize)
49 List<SequenceI> sq = new ArrayList<SequenceI>();
51 for (SequenceI s : core.getSequences())
53 SequenceI newSeq = s.deriveSequence();
54 if (newSeq.getStart() > maxoffset
55 && newSeq.getDatasetSequence().getStart() < s.getStart())
57 maxoffset = newSeq.getStart();
63 maxoffset = flankSize;
65 // now add offset to create a new expanded alignment
66 for (SequenceI s : sq)
69 while (ds.getDatasetSequence() != null)
71 ds = ds.getDatasetSequence();
73 int s_end = s.findPosition(s.getStart() + s.getLength());
74 // find available flanking residues for sequence
75 int ustream_ds = s.getStart() - ds.getStart(), dstream_ds = ds
78 // build new flanked sequence
80 // compute gap padding to start of flanking sequence
81 int offset = maxoffset - ustream_ds;
83 // padding is gapChar x ( maxoffset - min(ustream_ds, flank)
86 if (flankSize < ustream_ds)
88 // take up to flankSize residues
89 offset = maxoffset - flankSize;
90 ustream_ds = flankSize;
92 if (flankSize < dstream_ds)
94 dstream_ds = flankSize;
97 char[] upstream = new String(ds.getSequence(s.getStart() - 1
98 - ustream_ds, s.getStart() - 1)).toLowerCase().toCharArray();
99 char[] downstream = new String(ds.getSequence(s_end - 1, s_end + 1
100 + dstream_ds)).toLowerCase().toCharArray();
101 char[] coreseq = s.getSequence();
102 char[] nseq = new char[offset + upstream.length + downstream.length
104 char c = core.getGapCharacter();
105 // TODO could lowercase the flanking regions
107 for (; p < offset; p++)
111 // s.setSequence(new String(upstream).toLowerCase()+new String(coreseq) +
112 // new String(downstream).toLowerCase());
113 System.arraycopy(upstream, 0, nseq, p, upstream.length);
114 System.arraycopy(coreseq, 0, nseq, p + upstream.length,
116 System.arraycopy(downstream, 0, nseq, p + coreseq.length
117 + upstream.length, downstream.length);
118 s.setSequence(new String(nseq));
119 s.setStart(s.getStart() - ustream_ds);
120 s.setEnd(s_end + downstream.length);
122 AlignmentI newAl = new jalview.datamodel.Alignment(
123 sq.toArray(new SequenceI[0]));
124 newAl.setDataset(core.getDataset());