From b4e92f73b6b4aafaaa7ac58f028cda980f8bd8ce Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Thu, 15 Jul 2010 14:07:25 +0000
Subject: [PATCH] seq::alg::MergePairwiseAlignments, fix gap at first position

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2567 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 .../seq/alg/src/merge_pairwise_alignments.cc  | 40 +++++++++++++------
 .../tests/test_merge_pairwise_alignments.cc   | 29 +++++++++++++-
 2 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/modules/seq/alg/src/merge_pairwise_alignments.cc b/modules/seq/alg/src/merge_pairwise_alignments.cc
index f7a7c000e..664f6ccc6 100644
--- a/modules/seq/alg/src/merge_pairwise_alignments.cc
+++ b/modules/seq/alg/src/merge_pairwise_alignments.cc
@@ -50,8 +50,13 @@ void update_shifts(const AlignmentHandle& aln,
       j++;
     }
     if (shift>0) {
-      assert(i>0);
-      int res_index=s1.GetResidueIndex(i-1);
+      int res_index=0;
+      if (i == 0){
+        res_index=-1;
+      }
+      else if (i > 0) {
+        res_index=s1.GetResidueIndex(i-1);
+      }
       ShiftMap::iterator p=shifts.find(res_index);
       if (p!=shifts.end()) {
         p->second=std::max(p->second, shift);
@@ -70,13 +75,18 @@ SequenceHandle shift_reference(const SequenceHandle& ref_seq,
   String ref_str=ref_seq.GetString();
   int last=0;
   for (ShiftMap::const_iterator i=shifts.begin(),e=shifts.end();i!=e; ++i) {
-    new_sequence << ref_str.substr(last, i->first-last+1) 
+    if(i->first == -1){
+      new_sequence << String(i->second,'-');
+    }
+    else{
+      new_sequence << ref_str.substr(last, i->first-last+1)
                  << String(i->second, '-');
-    last=i->first+1;
+      last=i->first+1;
+    }
   }
   new_sequence << ref_str.substr(last);
   SequenceHandle s=CreateSequence(ref_seq.GetName(), 
-                                            new_sequence.str());                                               
+                                            new_sequence.str());
   if (ref_seq.HasAttachedView())
     s.AttachView(ref_seq.GetAttachedView());
   s.SetSequenceOffset(s.GetSequenceOffset());
@@ -96,15 +106,19 @@ SequenceHandle realign_sequence(const AlignmentHandle& aln,
       shift++;
       ++j;
     }
-    if (i>0 && s1.GetOneLetterCode(i-1)!='-') {
-      ShiftMap::const_iterator p=shifts.find(s1.GetResidueIndex(i-1));
-      if (p!=shifts.end()) {
-        int d=p->second-shift;
-        assert(d>=0);
-        new_sequence << String(d, '-');
-      }      
+    ShiftMap::const_iterator p=shifts.end();
+    if (i == 0){
+      p=shifts.find(-1);
+    }
+    else if (i>0 && s1.GetOneLetterCode(i-1)!='-') {
+      p=shifts.find(s1.GetResidueIndex(i-1));
+    }
+    if (p!=shifts.end()) {
+      int d=p->second-shift;
+      assert(d>=0);
+      new_sequence << String(d, '-');
     }
-    new_sequence << s2.GetOneLetterCode(i);    
+    new_sequence << s2.GetOneLetterCode(i);
   }
   SequenceHandle s=CreateSequence(s2.GetName(), new_sequence.str());
   if (s2.HasAttachedView())
diff --git a/modules/seq/alg/tests/test_merge_pairwise_alignments.cc b/modules/seq/alg/tests/test_merge_pairwise_alignments.cc
index 37d58e707..4e0e4d67a 100644
--- a/modules/seq/alg/tests/test_merge_pairwise_alignments.cc
+++ b/modules/seq/alg/tests/test_merge_pairwise_alignments.cc
@@ -60,8 +60,8 @@ BOOST_AUTO_TEST_CASE(merge_pairwise_alignments_one)
 BOOST_AUTO_TEST_CASE(merge_pairwise_alignments_two) 
 {
   SequenceHandle ref=CreateSequence("REF", "abcdefghijklmn");
-  SequenceHandle s1=CreateSequence("S1", "abcd---efghijklmn");
-  SequenceHandle s2=CreateSequence("S2", "abcdxyzefghijklmn");
+  SequenceHandle s1=CreateSequence("S1",   "abcd---efghijklmn");
+  SequenceHandle s2=CreateSequence("S2",   "abcdxyzefghijklmn");
   AlignmentHandle aln1=CreateAlignment();
   aln1.AddSequence(s1);
   aln1.AddSequence(s2);
@@ -82,4 +82,29 @@ BOOST_AUTO_TEST_CASE(merge_pairwise_alignments_two)
   BOOST_CHECK_EQUAL(seqs[2].GetString(), "abcd--yefghijklmn");
 }
 
+
+BOOST_AUTO_TEST_CASE(merge_pairwise_alignments_three)
+{
+  SequenceHandle ref=CreateSequence("REF", "abcdefghijk");
+  SequenceHandle s1=CreateSequence("S1",   "--abcdefghijk");
+  SequenceHandle s2=CreateSequence("S2",   "xyabcdefghijk");
+  AlignmentHandle aln1=CreateAlignment();
+  aln1.AddSequence(s1);
+  aln1.AddSequence(s2);
+
+  SequenceHandle s3=CreateSequence("S1", "-abcdefghijk");
+  SequenceHandle s4=CreateSequence("S2", "zabcdefghijk");
+
+  AlignmentHandle aln2=CreateAlignment();
+  aln2.AddSequence(s3);
+  aln2.AddSequence(s4);
+  AlignmentList l;
+  l.push_back(aln1);
+  l.push_back(aln2);
+  AlignmentHandle m=alg::MergePairwiseAlignments(l, ref);
+  ConstSequenceList seqs=m.GetSequences();
+  BOOST_CHECK_EQUAL(seqs[0].GetString(), "--abcdefghijk");
+  BOOST_CHECK_EQUAL(seqs[1].GetString(), "xyabcdefghijk");
+  BOOST_CHECK_EQUAL(seqs[2].GetString(), "-zabcdefghijk");
+}
 BOOST_AUTO_TEST_SUITE_END()
-- 
GitLab