Пример #1
0
/* seq[0] is the forward sequence and seq[1] is the reverse complement. */
static bwtsw2_t *bsw2_aln1_core(const bsw2opt_t *opt, const bntseq_t *bns, uint8_t *pac, const bwt_t *target,
								int l, uint8_t *seq[2], bsw2global_t *pool)
{
	extern void bsw2_chain_filter(const bsw2opt_t *opt, int len, bwtsw2_t *b[2]);
	bwtsw2_t *b[2], **bb[2], **_b, *p;
	int k, j;
	bwtl_t *query;
	query = bwtl_seq2bwtl(l, seq[0]);
	_b = bsw2_core(bns, opt, query, target, pool);
	bwtl_destroy(query);
	for (k = 0; k < 2; ++k) {
		bb[k] = calloc(2, sizeof(void*));
		bb[k][0] = calloc(1, sizeof(bwtsw2_t));
		bb[k][1] = calloc(1, sizeof(bwtsw2_t));
	}
	for (k = 0; k < 2; ++k) { // separate _b into bb[2] based on the strand
		for (j = 0; j < _b[k]->n; ++j) {
			bsw2hit_t *q;
			p = bb[_b[k]->hits[j].is_rev][k];
			if (p->n == p->max) {
				p->max = p->max? p->max<<1 : 8;
				p->hits = realloc(p->hits, p->max * sizeof(bsw2hit_t));
			}
			q = &p->hits[p->n++];
			*q = _b[k]->hits[j];
			if (_b[k]->hits[j].is_rev) {
				int x = q->beg;
				q->beg = l - q->end;
				q->end = l - x;
			}
		}
	}
	b[0] = bb[0][1]; b[1] = bb[1][1]; // bb[*][1] are "narrow SA hits"
	bsw2_chain_filter(opt, l, b);
	for (k = 0; k < 2; ++k) {
		bsw2_extend_left(opt, bb[k][1], seq[k], l, pac, bns->l_pac, pool->aln_mem);
		merge_hits(bb[k], l, 0); // bb[k][1] is merged to bb[k][0] here
		bsw2_resolve_duphits(0, 0, bb[k][0], 0);
		bsw2_extend_rght(opt, bb[k][0], seq[k], l, pac, bns->l_pac, pool->aln_mem);
		b[k] = bb[k][0];
		free(bb[k]);		
	}
	merge_hits(b, l, 1); // again, b[1] is merged to b[0]
	bsw2_resolve_query_overlaps(b[0], opt->mask_level);
	bsw2_destroy(_b[0]); bsw2_destroy(_b[1]); free(_b);
	return b[0];
}
Пример #2
0
static void merge_hits(bwtsw2_t *b[2], int l, int is_reverse)
{
	int i;
	if (b[0]->n + b[1]->n > b[0]->max) {
		b[0]->max = b[0]->n + b[1]->n;
		b[0]->hits = realloc(b[0]->hits, b[0]->max * sizeof(bsw2hit_t));
	}
	for (i = 0; i < b[1]->n; ++i) {
		bsw2hit_t *p = b[0]->hits + b[0]->n + i;
		*p = b[1]->hits[i];
		if (is_reverse) {
			int x = p->beg;
			p->beg = l - p->end;
			p->end = l - x;
			p->flag |= 0x10;
		}
	}
	b[0]->n += b[1]->n;
	bsw2_destroy(b[1]);
	b[1] = 0;
}