keep track of a subsequences parent
[mussa.git] / alg / sequence.cpp
index 0be66593c303e6191a7eea87ddd6272472a11445..92a7edca08fd7d45ed36905b86def2121b330f23 100644 (file)
@@ -83,7 +83,8 @@ const std::string Sequence::nucleic_iupac_alphabet("AaCcGgTtUuRrYyMmKkSsWwBbDdHh
 const std::string Sequence::protein_alphabet("AaCcDdEeFfGgHhIiKkLlMmNnPpQqRrSsTtVvWwYy\012\015");
 
 Sequence::Sequence()
-  : seq_start(0),
+  : parent(0),
+    seq_start(0),
     seq_count(0),
     strand(UnknownStrand)
 {
@@ -94,7 +95,8 @@ Sequence::~Sequence()
 }
 
 Sequence::Sequence(const char *seq)
-  : seq_start(0),
+  : parent(0),
+    seq_start(0),
     seq_count(0),
     strand(UnknownStrand),
     header(""),
@@ -104,7 +106,8 @@ Sequence::Sequence(const char *seq)
 }
 
 Sequence::Sequence(const std::string& seq) 
-  : seq_start(0),
+  : parent(0),
+    seq_start(0),
     seq_count(0),
     strand(UnknownStrand),
     header(""),
@@ -114,7 +117,8 @@ Sequence::Sequence(const std::string& seq)
 }
 
 Sequence::Sequence(const Sequence& o)
-  : seq(o.seq),
+  : parent(o.parent),
+    seq(o.seq),
     seq_start(o.seq_start),
     seq_count(o.seq_count),
     strand(o.strand),
@@ -128,6 +132,7 @@ Sequence::Sequence(const Sequence& o)
 Sequence &Sequence::operator=(const Sequence& s)
 {
   if (this != &s) {
+    parent = s.parent;
     seq = s.seq;
     seq_start = s.seq_start;
     seq_count = s.seq_count;
@@ -284,6 +289,7 @@ void Sequence::set_filtered_sequence(const std::string &old_seq,
   {
     new_seq->append(1, conversionTable[ (int)old_seq[seq_index+start]]);
   }
+  parent = 0;
   seq = new_seq;
   seq_start = 0;
   seq_count = count;
@@ -468,7 +474,7 @@ const std::list<annot>& Sequence::annotations() const
 }
 
 Sequence
-Sequence::subseq(int start, int count) const
+Sequence::subseq(int start, int count)
 {
   if (!seq) {
     Sequence new_seq;
@@ -480,7 +486,8 @@ Sequence::subseq(int start, int count) const
     count = size()-start;
   }
   Sequence new_seq(*this);
-  new_seq.seq_start = start;
+  new_seq.parent = this;
+  new_seq.seq_start = seq_start+start;
   new_seq.seq_count = count;
 
   new_seq.motif_list = motif_list;
@@ -613,6 +620,7 @@ Sequence::const_reference Sequence::at(Sequence::size_type i) const
 void
 Sequence::clear()
 {
+  parent = 0;
   seq.reset();
   seq_start = 0;
   seq_count = 0;
@@ -655,12 +663,15 @@ bool Sequence::empty() const
 
 Sequence::size_type Sequence::start() const
 {
-  return seq_start;
+  if (parent)
+    return seq_start - parent->start();
+  else
+    return seq_start;
 }
 
 Sequence::size_type Sequence::stop() const
 {
-  return seq_start + seq_count;
+  return start() + seq_count;
 }
 
 Sequence::size_type Sequence::size() const