예제 #1
0
 int has_error(const char* seq, const char *qual, int n) {
   //std::cout << "seq::" << seq << "\n";
   //std::cout << "qul::" << qual << "\n";
   int k = qual_mer_dna::k();
   int filled_ = 0;
   int i=0;
   while (seq[i]) {
     int code = _mer.code(seq[i]);
     if(code < 0) {
       return 1;
     }
     char q = qual[i];
     _mer.shift_left(code, q);
     _rev_mer.shift_right(_rev_mer.complement(code), q);
     //std::cout << "mer:" << _mer.to_str() << ", qual:" << _mer.qual_str() << "\n";
     //std::cout << "rev:" << _rev_mer.to_str() << ", qual:" << _rev_mer.qual_str() << "\n";
     i++; filled_++;
     if (filled_>=k || seq[i] == 0) {
       //std::cout << "using mer:" << _mer.to_str() << "\n";
       qual_mer_dna &mer = (_mer < _rev_mer) ? _mer : _rev_mer;
       if(!(*filter_)(mer)) {
         return 1;
       }
       filled_-= k/2; //1; //k/8;
     }
   }
   return 0;
 }
예제 #2
0
  mer_qual_iterator& operator++() {
    while(true) {
      while(cseq_ == eseq_) {
        ++index_;
        while(index_ >= (*job_)->nb_filled) {
          index_ = 0;
          job_->next();
          if(job_->is_empty()) {
            delete job_;
            job_  = 0;
            return *this;
          }
        }
        init_from_job();
        filled_ = 0;
        }

      do {
        const int  code = m_.code(*cseq_++);
         const char qual = cqual_ < equal_ ? *cqual_++ : std::numeric_limits<char>::max();
        if(code >= 0 && qual >= min_qual_) {
          m_.shift_left(code);
          if(canonical_)
            rcm_.shift_right(rcm_.complement(code));
          filled_ = std::min(filled_ + 1, mer_dna::k());
        } else
          filled_ = 0;
      } while(filled_ < m_.k() && cseq_ < eseq_);
      if(filled_ >= m_.k())
        break;
    }
    return *this;
  }