Index: modlib/modeller/alignment.py =================================================================== --- modlib/modeller/alignment.py (revision 7152) +++ modlib/modeller/alignment.py (revision 7153) @@ -426,15 +426,35 @@ raise modeller.FileFormatError("expecting SEQ2: line " + \ "in suboptimal alignment output file") seq2 = [int(x) for x in seq2] + if len(seq1) != len(seq2): + raise modeller.FileFormatError("SEQ1 and SEQ2 lines should " + "be the same length") _set_seq_gaps_subopt(self[0], seq1) _set_seq_gaps_subopt(self[1], seq2) - if seq1[0] > 1 and seq2[0] > 1: - raise NotImplementedError("Neither sequence starts at 1") - elif seq1[0] > 1: - self[1].residues[0].add_leading_gaps(seq1[0] - seq2[0]) - elif seq2[0] > 1: - self[0].residues[0].add_leading_gaps(seq2[0] - seq1[0]) + # If the first alignment position is not the first residue in + # either sequence, deliberately misalign the first stretch of + # residues + misalign = min(seq1[0], seq2[0]) - 1 + if misalign > 0: + seq1[0] -= misalign + 1 + seq2[0] -= misalign + 1 + self[0].residues[misalign+seq1[0] + -1].add_trailing_gaps(misalign+seq2[0]) + self[1].residues[0].add_leading_gaps(misalign+seq1[0]) + else: + self[0].residues[0].add_leading_gaps(seq2[0] - 1) + self[1].residues[0].add_leading_gaps(seq1[0] - 1) + # If both sequences extend past the end of the alignment, add + # the shortest number of gaps necessary to deliberately misalign + # these termini + extra1 = len(self[0].residues) - seq1[-1] + extra2 = len(self[1].residues) - seq2[-1] + if extra1 > 0 and extra2 > 0: + if extra1 > extra2: + self[0].residues[-extra1].add_leading_gaps(extra2) + else: + self[1].residues[-extra2].add_leading_gaps(extra1) yield self def __contains__(self, code): @@ -557,6 +577,6 @@ elif gaps_to_add < gaps: res.remove_leading_gaps(gaps - gaps_to_add) if subopt_pos[pos_n] != n + 1: - raise Modeller.FileFormatError("suboptimal alignment " + \ + raise modeller.FileFormatError("suboptimal alignment " + \ "file SEQ1 and SEQ2 indices should be sequential") pos_n += 1