1 package jalview.analysis;
3 import java.util.ArrayList;
6 import jalview.datamodel.SequenceI;
7 import jalview.datamodel.AlignmentI;
10 * grab bag of useful alignment manipulation operations
11 * Expect these to be refactored elsewhere at some point.
15 public class AlignmentUtils
19 * given an existing alignment, create a new alignment including all, or up to flankSize additional symbols from each sequence's dataset sequence
24 public static AlignmentI expandContext(AlignmentI core, int flankSize)
26 List<SequenceI> sq = new ArrayList<SequenceI>();
28 for (SequenceI s:core.getSequences())
30 SequenceI newSeq = s.deriveSequence();
31 if (newSeq.getStart()>maxoffset && newSeq.getDatasetSequence().getStart()<s.getStart())
33 maxoffset = newSeq.getStart();
38 maxoffset = flankSize;
40 // now add offset to create a new expanded alignment
44 while (ds.getDatasetSequence()!=null) {
45 ds=ds.getDatasetSequence();
47 int s_end = s.findPosition(s.getStart()+s.getLength());
48 // find available flanking residues for sequence
49 int ustream_ds=s.getStart()-ds.getStart(),dstream_ds=ds.getEnd()-s_end;
51 // build new flanked sequence
53 // compute gap padding to start of flanking sequence
54 int offset=maxoffset - ustream_ds;
56 // padding is gapChar x ( maxoffset - min(ustream_ds, flank)
58 if (flankSize<ustream_ds)
60 // take up to flankSize residues
61 offset = maxoffset-flankSize;
62 ustream_ds = flankSize;
64 if (flankSize<dstream_ds)
69 char[] upstream = new String(ds.getSequence(s.getStart()-1-ustream_ds, s.getStart()-1)).toLowerCase().toCharArray();
70 char[] downstream = new String(ds.getSequence(s_end-1,s_end+1+dstream_ds)).toLowerCase().toCharArray();
71 char[] coreseq=s.getSequence();
72 char[] nseq = new char[offset+upstream.length+downstream.length+coreseq.length];
73 char c = core.getGapCharacter();
74 // TODO could lowercase the flanking regions
80 // s.setSequence(new String(upstream).toLowerCase()+new String(coreseq) + new String(downstream).toLowerCase());
81 System.arraycopy(upstream, 0, nseq, p, upstream.length);
82 System.arraycopy(coreseq, 0, nseq, p+upstream.length, coreseq.length);
83 System.arraycopy(downstream, 0, nseq, p+coreseq.length+upstream.length, downstream.length);
84 s.setSequence(new String(nseq));
85 s.setStart(s.getStart()-ustream_ds);
86 s.setEnd(s_end+downstream.length);
88 AlignmentI newAl = new jalview.datamodel.Alignment(sq.toArray(new SequenceI[0]));
89 newAl.setDataset(core.getDataset());