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; }
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; }