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 jalview.datamodel.AlignmentAnnotation;
24 import jalview.datamodel.AlignmentI;
25 import jalview.datamodel.SequenceI;
27 import java.util.ArrayList;
28 import java.util.List;
31 * grab bag of useful alignment manipulation operations Expect these to be
32 * refactored elsewhere at some point.
37 public class AlignmentUtils
41 * given an existing alignment, create a new alignment including all, or up to
42 * flankSize additional symbols from each sequence's dataset sequence
48 public static AlignmentI expandContext(AlignmentI core, int flankSize)
50 List<SequenceI> sq = new ArrayList<SequenceI>();
52 for (SequenceI s : core.getSequences())
54 SequenceI newSeq = s.deriveSequence();
55 if (newSeq.getStart() > maxoffset
56 && newSeq.getDatasetSequence().getStart() < s.getStart())
58 maxoffset = newSeq.getStart();
64 maxoffset = flankSize;
66 // now add offset to create a new expanded alignment
67 for (SequenceI s : sq)
70 while (ds.getDatasetSequence() != null)
72 ds = ds.getDatasetSequence();
74 int s_end = s.findPosition(s.getStart() + s.getLength());
75 // find available flanking residues for sequence
76 int ustream_ds = s.getStart() - ds.getStart(), dstream_ds = ds
79 // build new flanked sequence
81 // compute gap padding to start of flanking sequence
82 int offset = maxoffset - ustream_ds;
84 // padding is gapChar x ( maxoffset - min(ustream_ds, flank)
87 if (flankSize < ustream_ds)
89 // take up to flankSize residues
90 offset = maxoffset - flankSize;
91 ustream_ds = flankSize;
93 if (flankSize < dstream_ds)
95 dstream_ds = flankSize;
98 char[] upstream = new String(ds.getSequence(s.getStart() - 1
99 - ustream_ds, s.getStart() - 1)).toLowerCase().toCharArray();
100 char[] downstream = new String(ds.getSequence(s_end - 1, s_end + 1
101 + dstream_ds)).toLowerCase().toCharArray();
102 char[] coreseq = s.getSequence();
103 char[] nseq = new char[offset + upstream.length + downstream.length
105 char c = core.getGapCharacter();
106 // TODO could lowercase the flanking regions
108 for (; p < offset; p++)
112 // s.setSequence(new String(upstream).toLowerCase()+new String(coreseq) +
113 // new String(downstream).toLowerCase());
114 System.arraycopy(upstream, 0, nseq, p, upstream.length);
115 System.arraycopy(coreseq, 0, nseq, p + upstream.length,
117 System.arraycopy(downstream, 0, nseq, p + coreseq.length
118 + upstream.length, downstream.length);
119 s.setSequence(new String(nseq));
120 s.setStart(s.getStart() - ustream_ds);
121 s.setEnd(s_end + downstream.length);
123 AlignmentI newAl = new jalview.datamodel.Alignment(
124 sq.toArray(new SequenceI[0]));
125 for (SequenceI s : sq)
127 if (s.getAnnotation() != null)
129 for (AlignmentAnnotation aa : s.getAnnotation())
131 newAl.addAnnotation(aa);
135 newAl.setDataset(core.getDataset());
140 * Returns the index (zero-based position) of a sequence in an alignment, or
147 public static int getSequenceIndex(AlignmentI al, SequenceI seq)
151 for (SequenceI alSeq : al.getSequences())