+ 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(MessageManager.formatMessage(
+ "error.implementation_error_cigar_seq_no_operations",
+ new String[] { Integer.valueOf(i).toString() }));
+ }
+ 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;
+ }
+