static void gt_pbs_add_hit(GtArray *hitlist, GtAlignment *ali, GtPBSOptions *o, unsigned long trna_seqlen, const char *desc, GtStrand strand, GtPBSResults *r) { unsigned long dist; GtPBSHit *hit; unsigned long offset; GtRange urange, vrange; gt_assert(hitlist && desc); if (!ali) return; gt_assert(ali); dist = gt_alignment_eval(ali); urange = gt_alignment_get_urange(ali); vrange = gt_alignment_get_vrange(ali); offset = abs(o->radius - urange.start); if (dist <= o->max_edist && abs(o->radius-urange.start) <= o->offsetlen.end && abs(o->radius-urange.start) >= o->offsetlen.start && abs(urange.end-urange.start+1) <= o->alilen.end && abs(urange.end-urange.start+1) >= o->alilen.start && vrange.start <= o->trnaoffsetlen.end && vrange.start >= o->trnaoffsetlen.start) { hit = gt_pbs_hit_new(abs(urange.end-urange.start+1), strand, desc, vrange.start, urange.start, urange.end, offset, dist, gt_pbs_score_func(dist, offset, urange.end-urange.start+1, trna_seqlen, vrange.start), r); gt_array_add(hitlist, hit); } }
static GtMatchIteratorStatus gt_match_iterator_sw_next(GtMatchIterator *mi, GT_UNUSED GtMatch **match, GT_UNUSED GtError *err) { GtMatchIteratorSW *mis; GtSeq *seq_a, *seq_b; char *a, *b; const char *adesc, *bdesc; GtAlignment *ali = NULL; unsigned long seqlen_a, seqlen_b, seqpos; GtRange arng, brng; gt_assert(mi && match); mis = gt_match_iterator_sw_cast(mi); while (true) { if (!mis->pvt->firstali) mis->pvt->seqno_es2++; if (mis->pvt->seqno_es2 == gt_encseq_num_of_sequences(mis->pvt->es2)) { mis->pvt->seqno_es1++; if (mis->pvt->seqno_es1 == gt_encseq_num_of_sequences(mis->pvt->es1)) return GT_MATCHER_STATUS_END; mis->pvt->seqno_es2 = 0; } seqlen_a = gt_encseq_seqlength(mis->pvt->es1, mis->pvt->seqno_es1); seqlen_b = gt_encseq_seqlength(mis->pvt->es2, mis->pvt->seqno_es2); /* XXX: reuse buffers for performance improvement */ a = gt_malloc(seqlen_a * sizeof (char)); seqpos = gt_encseq_seqstartpos(mis->pvt->es1, mis->pvt->seqno_es1); gt_encseq_extract_decoded(mis->pvt->es1, a, seqpos, seqpos + seqlen_a - 1); b = gt_malloc(seqlen_b * sizeof (char)); seqpos = gt_encseq_seqstartpos(mis->pvt->es2, mis->pvt->seqno_es2); gt_encseq_extract_decoded(mis->pvt->es1, b, seqpos, seqpos + seqlen_b - 1); seq_a = gt_seq_new(a, seqlen_a, gt_encseq_alphabet(mis->pvt->es1)); seq_b = gt_seq_new(b, seqlen_b, gt_encseq_alphabet(mis->pvt->es2)); ali = gt_swalign(seq_a, seq_b, mis->pvt->sf); mis->pvt->firstali = false; if (ali && gt_alignment_get_length(ali) >= mis->pvt->min_len && gt_alignment_eval(ali) <= mis->pvt->max_edist) { break; } gt_alignment_delete(ali); gt_seq_delete(seq_a); gt_seq_delete(seq_b); gt_free(a); gt_free(b); } arng = gt_alignment_get_urange(ali); brng = gt_alignment_get_vrange(ali); adesc = gt_encseq_description(mis->pvt->es1, &seqlen_a, mis->pvt->seqno_es1); bdesc = gt_encseq_description(mis->pvt->es2, &seqlen_b, mis->pvt->seqno_es2); *match = gt_match_sw_new("", "", mis->pvt->seqno_es1, mis->pvt->seqno_es2, gt_alignment_get_length(ali), gt_alignment_eval(ali), arng.start, brng.start, arng.end, brng.end, GT_MATCH_DIRECT); gt_match_set_seqid1_nt(*match, adesc, seqlen_a); gt_match_set_seqid2_nt(*match, bdesc, seqlen_b); gt_alignment_delete(ali); gt_seq_delete(seq_a); gt_seq_delete(seq_b); gt_free(a); gt_free(b); return GT_MATCHER_STATUS_OK; }