void gt_kmercodeiterator_delete(GtKmercodeiterator *kmercodeiterator) { if (kmercodeiterator != NULL) { gt_encseq_reader_delete(kmercodeiterator->esr); kmerstream_delete(kmercodeiterator->spwp); gt_sequence_buffer_delete(kmercodeiterator->fb); gt_free(kmercodeiterator); } }
void getencseqkmers(const GtEncseq *encseq, GtReadmode readmode, unsigned int kmersize, void(*processkmercode)(void *, unsigned long, const GtKmercode *), void *processkmercodeinfo) { unsigned long currentposition = 0, totallength; Kmerstream *spwp; GtUchar charcode; GtEncseqReader *esr; unsigned int numofchars, overshoot; totallength = gt_encseq_total_length(encseq); if (totallength < (unsigned long) kmersize) { return; } numofchars = gt_alphabet_num_of_chars(gt_encseq_alphabet(encseq)); spwp = kmerstream_new(numofchars,kmersize); esr = gt_encseq_create_reader_with_readmode(encseq,readmode,0); for (currentposition = 0; currentposition < (unsigned long) kmersize; currentposition++) { charcode = gt_encseq_reader_next_encoded_char(esr); GT_CHECKENCCHAR(charcode,encseq,currentposition,readmode); spwp->windowwidth++; updatespecialpositions(spwp,charcode,false,0); spwp->cyclicwindow[spwp->windowwidth-1] = charcode; } kmerstream_newcode(&spwp->currentkmercode,spwp); processkmercode(processkmercodeinfo,0,&spwp->currentkmercode); for (currentposition = (unsigned long) kmersize; currentposition<totallength; currentposition++) { charcode = gt_encseq_reader_next_encoded_char(esr); GT_CHECKENCCHAR(charcode,encseq,currentposition,readmode); shiftrightwithchar(spwp,charcode); kmerstream_newcode(&spwp->currentkmercode,spwp); processkmercode(processkmercodeinfo,currentposition + 1 - spwp->kmersize, &spwp->currentkmercode); } gt_encseq_reader_delete(esr); for (overshoot=0; overshoot<kmersize; overshoot++) { shiftrightwithchar(spwp,(GtUchar) WILDCARD); kmerstream_newcode(&spwp->currentkmercode,spwp); processkmercode(processkmercodeinfo, overshoot + currentposition + 1 - spwp->kmersize, &spwp->currentkmercode); } kmerstream_delete(spwp); }
void gt_kmercodeiterator_reset(GtKmercodeiterator *kmercodeiterator, GtReadmode readmode, GtUword startpos) { GtUchar charcode; const GtEncseq *encseq = kmercodeiterator->encseq; GtUword kmersize = (GtUword) kmercodeiterator->spwp->kmersize; gt_assert(!GT_ISDIRREVERSE(readmode) || startpos == 0); kmercodeiterator->totallength = gt_encseq_total_length(encseq); kmercodeiterator->startpos = startpos; gt_assert(startpos < kmercodeiterator->totallength); kmercodeiterator->fb = NULL; if (kmercodeiterator->totallength - startpos < kmersize) { kmercodeiterator->inputexhausted = true; gt_encseq_reader_delete(kmercodeiterator->esr); kmercodeiterator->esr = NULL; kmerstream_delete(kmercodeiterator->spwp); kmercodeiterator->spwp = NULL; } else { kmercodeiterator->inputexhausted = false; kmercodeiterator->readmode = readmode; gt_encseq_reader_reinit_with_readmode(kmercodeiterator->esr, encseq, readmode, startpos); kmerstream_reset(kmercodeiterator->spwp); kmercodeiterator->hasprocessedfirst = false; for (kmercodeiterator->currentposition = startpos; kmercodeiterator->currentposition < startpos+(GtUword) kmersize; kmercodeiterator->currentposition++) { charcode = gt_encseq_reader_next_encoded_char(kmercodeiterator->esr); kmercodeiterator->spwp->windowwidth++; kmerstream_updatespecialpositions(kmercodeiterator->spwp,charcode, false,0); kmercodeiterator->spwp->cyclicwindow[kmercodeiterator-> spwp->windowwidth-1] = charcode; } } }