コード例 #1
0
ファイル: bwtsw2_aux.c プロジェクト: BioInfoTools/lobstr-code
/* 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], int is_rev, bsw2global_t *pool)
{
	extern void bsw2_chain_filter(const bsw2opt_t *opt, int len, bwtsw2_t *b[2]);
	bwtsw2_t *b[2], **bb[2];
	int k;
	for (k = 0; k < 2; ++k) {
		bwtl_t *query = bwtl_seq2bwtl(l, seq[k]);
		bb[k] = bsw2_core(opt, query, target, pool);
		bwtl_destroy(query);
	}
	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, is_rev, pool->aln_mem);
		merge_hits(bb[k], l, 0); // bb[k][1] is merged to bb[k][0] here
		bsw2_resolve_duphits(0, bb[k][0], 0);
		bsw2_extend_rght(opt, bb[k][0], seq[k], l, pac, bns->l_pac, is_rev, 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);
	return b[0];
}
コード例 #2
0
ファイル: bwtsw2_aux.c プロジェクト: RoelKluin/bwa
/* 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];
}