void bsw2_extend_rght(const bsw2opt_t *opt, bwtsw2_t *b, uint8_t *query, int lq, uint8_t *pac, bwtint_t l_pac, uint8_t *_mem) { int i, matrix[25]; bwtint_t k; uint8_t *target; AlnParam par; par.matrix = matrix; __gen_ap(par, opt); target = calloc(((lq + 1) / 2 * opt->a + opt->r) / opt->r + lq, 1); for (i = 0; i < b->n; ++i) { bsw2hit_t *p = b->hits + i; int lt = ((lq - p->beg + 1) / 2 * opt->a + opt->r) / opt->r + lq; int j, score; path_t path; if (p->l) continue; for (k = p->k, j = 0; k < p->k + lt && k < l_pac; ++k) target[j++] = pac[k>>2] >> (~k&3)*2 & 0x3; lt = j; score = aln_extend_core(target, lt, query + p->beg, lq - p->beg, &par, &path, 0, 1, _mem); // if (score < p->G) fprintf(stderr, "[bsw2_extend_hits] %d < %d\n", score, p->G); if (score >= p->G) { p->G = score; p->len = path.i; p->end = path.j + p->beg; } } free(target); }
void bsw2_extend_left(const bsw2opt_t *opt, bwtsw2_t *b, uint8_t *_query, int lq, uint8_t *pac, uint32_t l_pac, int is_rev, uint8_t *_mem) { int i, matrix[25]; bwtint_t k; uint8_t *target = 0, *query; AlnParam par; par.matrix = matrix; __gen_ap(par, opt); query = calloc(lq, 1); // sort according to the descending order of query end ks_introsort(hit, b->n, b->hits); target = calloc(((lq + 1) / 2 * opt->a + opt->r) / opt->r + lq, 1); // reverse _query for (i = 0; i < lq; ++i) query[lq - i - 1] = _query[i]; // core loop for (i = 0; i < b->n; ++i) { bsw2hit_t *p = b->hits + i; int lt = ((p->beg + 1) / 2 * opt->a + opt->r) / opt->r + lq; int score, j; path_t path; p->n_seeds = 1; if (p->l || p->k == 0) continue; for (j = score = 0; j < i; ++j) { bsw2hit_t *q = b->hits + j; if (q->beg <= p->beg && q->k <= p->k && q->k + q->len >= p->k + p->len) { if (q->n_seeds < (1<<14) - 2) ++q->n_seeds; ++score; } } if (score) continue; if (lt > p->k) lt = p->k; if (is_rev) { for (k = p->k - 1, j = 0; k > 0 && j < lt; --k) // FIXME: k=0 not considered! target[j++] = __rpac(pac, l_pac, k); } else { for (k = p->k - 1, j = 0; k > 0 && j < lt; --k) // FIXME: k=0 not considered! target[j++] = pac[k>>2] >> (~k&3)*2 & 0x3; } lt = j; score = aln_extend_core(target, lt, query + lq - p->beg, p->beg, &par, &path, 0, p->G, _mem); if (score > p->G) { // extensible p->G = score; p->len += path.i; p->beg -= path.j; p->k -= path.i; } } free(query); free(target); }
/* generate CIGAR array(s) in b->cigar[] */ static void gen_cigar(const bsw2opt_t *opt, int lq, uint8_t *seq[2], uint8_t *pac, bwtsw2_t *b) { uint8_t *target; int i, matrix[25]; AlnParam par; path_t *path; par.matrix = matrix; __gen_ap(par, opt); i = ((lq + 1) / 2 * opt->a + opt->r) / opt->r + lq; // maximum possible target length target = calloc(i, 1); path = calloc(i + lq, sizeof(path_t)); // memory clean up for b if (b->n < b->max) { b->max = b->n; b->hits = realloc(b->hits, b->n * sizeof(bsw2hit_t)); } if (b->cigar) free(b->cigar); if (b->n_cigar) free(b->n_cigar); b->cigar = (uint32_t**)calloc(b->max, sizeof(void*)); b->n_cigar = (int*)calloc(b->max, sizeof(int)); // generate CIGAR for (i = 0; i < b->n; ++i) { bsw2hit_t *p = b->hits + i; uint8_t *query; uint32_t k; int score, path_len, beg, end; if (p->l) continue; beg = (p->flag & 0x10)? lq - p->end : p->beg; end = (p->flag & 0x10)? lq - p->beg : p->end; query = seq[(p->flag & 0x10)? 1 : 0] + beg; for (k = p->k; k < p->k + p->len; ++k) // in principle, no out-of-boundary here target[k - p->k] = pac[k>>2] >> (~k&3)*2 & 0x3; score = aln_global_core(target, p->len, query, end - beg, &par, path, &path_len); b->cigar[i] = aln_path2cigar32(path, path_len, &b->n_cigar[i]); if (beg != 0 || end < lq) { // write soft clipping b->cigar[i] = realloc(b->cigar[i], 4 * (b->n_cigar[i] + 2)); if (beg != 0) { memmove(b->cigar[i] + 1, b->cigar[i], b->n_cigar[i] * 4); b->cigar[i][0] = beg<<4 | 4; ++b->n_cigar[i]; } if (end < lq) { b->cigar[i][b->n_cigar[i]] = (lq - end)<<4 | 4; ++b->n_cigar[i]; } } } free(target); free(path); }
/* generate CIGAR array(s) in b->cigar[] */ static void gen_cigar(const bsw2opt_t *opt, int lq, uint8_t *seq[2], const uint8_t *pac, bwtsw2_t *b, const char *name) { uint8_t *target; int i, matrix[25]; AlnParam par; path_t *path; par.matrix = matrix; __gen_ap(par, opt); i = ((lq + 1) / 2 * opt->a + opt->r) / opt->r + lq; // maximum possible target length target = calloc(i, 1); path = calloc(i + lq, sizeof(path_t)); // generate CIGAR for (i = 0; i < b->n; ++i) { bsw2hit_t *p = b->hits + i; bsw2aux_t *q = b->aux + i; uint8_t *query; bwtint_t k; int path_len, beg, end; if (p->l) continue; beg = (p->flag & 0x10)? lq - p->end : p->beg; end = (p->flag & 0x10)? lq - p->beg : p->end; query = seq[(p->flag & 0x10)? 1 : 0] + beg; for (k = p->k; k < p->k + p->len; ++k) // in principle, no out-of-boundary here target[k - p->k] = pac[k>>2] >> (~k&3)*2 & 0x3; aln_global_core(target, p->len, query, end - beg, &par, path, &path_len); q->cigar = aln_path2cigar32(path, path_len, &q->n_cigar); #if 0 if (name && score != p->G) { // debugging only int j, glen = 0; for (j = 0; j < q->n_cigar; ++j) if ((q->cigar[j]&0xf) == 1 || (q->cigar[j]&0xf) == 2) glen += q->cigar[j]>>4; fprintf(stderr, "[E::%s] %s - unequal score: %d != %d; (qlen, aqlen, arlen, glen, bw) = (%d, %d, %d, %d, %d)\n", __func__, name, score, p->G, lq, end - beg, p->len, glen, opt->bw); } #endif if (beg != 0 || end < lq) { // write soft clipping q->cigar = realloc(q->cigar, 4 * (q->n_cigar + 2)); if (beg != 0) { memmove(q->cigar + 1, q->cigar, q->n_cigar * 4); q->cigar[0] = beg<<4 | 4; ++q->n_cigar; } if (end < lq) { q->cigar[q->n_cigar] = (lq - end)<<4 | 4; ++q->n_cigar; } } }
/* generate CIGAR array(s) in b->cigar[] */ static void gen_cigar(const bsw2opt_t *opt, int lq, uint8_t *seq[2], const uint8_t *pac, bwtsw2_t *b) { uint8_t *target; int i, matrix[25]; AlnParam par; path_t *path; par.matrix = matrix; __gen_ap(par, opt); i = ((lq + 1) / 2 * opt->a + opt->r) / opt->r + lq; // maximum possible target length target = calloc(i, 1); path = calloc(i + lq, sizeof(path_t)); // generate CIGAR for (i = 0; i < b->n; ++i) { bsw2hit_t *p = b->hits + i; bsw2aux_t *q = b->aux + i; uint8_t *query; bwtint_t k; int score, path_len, beg, end; if (p->l) continue; beg = (p->flag & 0x10)? lq - p->end : p->beg; end = (p->flag & 0x10)? lq - p->beg : p->end; query = seq[(p->flag & 0x10)? 1 : 0] + beg; for (k = p->k; k < p->k + p->len; ++k) // in principle, no out-of-boundary here target[k - p->k] = pac[k>>2] >> (~k&3)*2 & 0x3; score = aln_global_core(target, p->len, query, end - beg, &par, path, &path_len); q->cigar = aln_path2cigar32(path, path_len, &q->n_cigar); if (beg != 0 || end < lq) { // write soft clipping q->cigar = realloc(q->cigar, 4 * (q->n_cigar + 2)); if (beg != 0) { memmove(q->cigar + 1, q->cigar, q->n_cigar * 4); q->cigar[0] = beg<<4 | 4; ++q->n_cigar; } if (end < lq) { q->cigar[q->n_cigar] = (lq - end)<<4 | 4; ++q->n_cigar; } } } free(target); free(path); }