+
+ /**
+ * createAlignment
+ *
+ * @param alseqs SeqCigar[]
+ * @param gapCharacter char
+ * @return SequenceI[]
+ */
+ public static SequenceI[] createAlignmentSequences(SeqCigar[] alseqs,
+ char gapCharacter, ColumnSelection colsel, int[] segments)
+ {
+ SequenceI[] seqs = new SequenceI[alseqs.length];
+ StringBuffer[] g_seqs = new StringBuffer[alseqs.length];
+ String[] alseqs_string = new String[alseqs.length];
+ Object[] gs_regions = new Object[alseqs.length];
+ for (int i = 0; i < alseqs.length; i++)
+ {
+ alseqs_string[i] = alseqs[i].getRefSeq().
+ getSequenceAsString(alseqs[i].start, alseqs[i].end);
+ gs_regions[i] = alseqs[i].getSequenceAndDeletions(alseqs_string[i],
+ gapCharacter); // gapped sequence, {start, start col, end. endcol}, hidden regions {{start, end, col}})
+ if (gs_regions[i] == null)
+ {
+ throw new Error("Implementation error: " + i +
+ "'th sequence Cigar has no operations.");
+ }
+ g_seqs[i] = new StringBuffer( (String) ( (Object[]) gs_regions[i])[0]); // the visible gapped sequence
+ }
+ // Now account for insertions. (well - deletions)
+ // this is complicated because we must keep track of shifted positions in each sequence
+ ShiftList shifts = new ShiftList();
+ for (int i = 0; i < alseqs.length; i++)
+ {
+ Object[] gs_region = ( (Object[]) ( (Object[]) gs_regions[i])[2]);
+ if (gs_region != null)
+
+ {
+ for (int hr = 0; hr < gs_region.length; hr++)
+ {
+ int[] region = (int[]) gs_region[hr];
+ char[] insert = new char[region[1] - region[0] + 1];
+ for (int s = 0; s < insert.length; s++)
+ {
+ insert[s] = gapCharacter;
+ }
+ int inspos = shifts.shift(region[2]); // resolve insertion position in current alignment frame of reference
+ for (int s = 0; s < alseqs.length; s++)
+ {
+ if (s != i)
+ {
+ if (g_seqs[s].length() <= inspos)
+ {
+ // prefix insertion with more gaps.
+ for (int l = inspos - g_seqs[s].length(); l > 0; l--)
+ {
+ g_seqs[s].append(gapCharacter); // to debug - use a diffferent gap character here
+ }
+ }
+ g_seqs[s].insert(inspos, insert);
+ }
+ else
+ {
+ g_seqs[s].insert(inspos,
+ alseqs_string[i].substring(region[0],
+ region[1] + 1));
+ }
+ }
+ shifts.addShift(region[2], insert.length); // update shift in alignment frame of reference
+ if (segments == null)
+ {
+ // add a hidden column for this deletion
+ colsel.hideColumns(inspos, inspos + insert.length - 1);
+ }
+ }
+ }
+ }
+ for (int i = 0; i < alseqs.length; i++)
+ {
+ int[] bounds = ( (int[]) ( (Object[]) gs_regions[i])[1]);
+ SequenceI ref = alseqs[i].getRefSeq();
+ seqs[i] = new Sequence(ref.getName(), g_seqs[i].toString(),
+ ref.getStart() + alseqs[i].start + bounds[0],
+ ref.getStart() + alseqs[i].start +
+ (bounds[2] == 0 ? -1 : bounds[2]));
+ seqs[i].setDatasetSequence(ref);
+ seqs[i].setDescription(ref.getDescription());
+ }
+ if (segments != null)
+ {
+ for (int i = 0; i < segments.length; i += 3)
+ {
+ //int start=shifts.shift(segments[i]-1)+1;
+ //int end=shifts.shift(segments[i]+segments[i+1]-1)-1;
+ colsel.hideColumns(segments[i + 1],
+ segments[i + 1] + segments[i + 2] - 1);
+ }
+ }
+ return seqs;
+ }
+