CIGAR is wrong, but the rest is okay
This commit is contained in:
parent
1fd51fc3f7
commit
49f2bcc015
58
bwamem.c
58
bwamem.c
|
|
@ -427,25 +427,37 @@ ret_gen_cigar:
|
||||||
|
|
||||||
void mem_sam_se(const mem_opt_t *opt, const bntseq_t *bns, const uint8_t *pac, bseq1_t *s, mem_alnreg_v *a)
|
void mem_sam_se(const mem_opt_t *opt, const bntseq_t *bns, const uint8_t *pac, bseq1_t *s, mem_alnreg_v *a)
|
||||||
{
|
{
|
||||||
int k, n_cigar = 0, score, is_rev, nn, rid, i;
|
int k, m;
|
||||||
uint32_t *cigar = 0;
|
|
||||||
int64_t pos;
|
|
||||||
kstring_t str;
|
kstring_t str;
|
||||||
mem_alnreg_t *p;
|
|
||||||
|
|
||||||
str.l = str.m = 0; str.s = 0;
|
str.l = str.m = 0; str.s = 0;
|
||||||
k = mem_choose_alnreg_se(opt, a->n, a->a);
|
m = mem_choose_alnreg_se(opt, a->n, a->a);
|
||||||
p = &a->a[k];
|
for (k = 0; k < m; ++k) {
|
||||||
cigar = mem_gen_cigar(opt, bns->l_pac, pac, p->qe - p->qb, (uint8_t*)&s->seq[p->qb], p->rb, p->re, &score, &n_cigar);
|
uint32_t *cigar = 0;
|
||||||
pos = bns_depos(bns, p->rb, &is_rev);
|
int score, is_rev, nn, rid, i, flag = 0, n_cigar = 0;
|
||||||
nn = bns_cnt_ambi(bns, pos, p->re - p->rb, &rid);
|
int64_t pos, end;
|
||||||
kputs(s->name, &str); kputc('\t', &str); kputw(is_rev? 16 : 0, &str); kputc('\t', &str);
|
mem_alnreg_t *p = &a->a[k];
|
||||||
kputs(bns->anns[rid].name, &str); kputc('\t', &str); kputuw(pos - bns->anns[rid].offset, &str); kputc('\t', &str);
|
cigar = mem_gen_cigar(opt, bns->l_pac, pac, p->qe - p->qb, (uint8_t*)&s->seq[p->qb], p->rb, p->re, &score, &n_cigar);
|
||||||
kputw(0, &str); kputc('\t', &str);
|
pos = bns_depos(bns, p->rb < bns->l_pac? p->rb : p->re - 1, &is_rev);
|
||||||
for (i = 0; i < s->l_seq; ++i) s->seq[i] = "ACGTN"[(int)s->seq[i]];
|
nn = bns_cnt_ambi(bns, pos, p->re - p->rb, &rid);
|
||||||
kputsn(s->seq, s->l_seq, &str); kputc('\t', &str);
|
flag |= is_rev? 16 : 0;
|
||||||
if (s->qual) kputsn(s->qual, s->l_seq, &str);
|
kputs(s->name, &str); kputc('\t', &str); kputw(flag, &str); kputc('\t', &str);
|
||||||
free(cigar);
|
kputs(bns->anns[rid].name, &str); kputc('\t', &str); kputuw(pos - bns->anns[rid].offset + 1, &str); kputc('\t', &str);
|
||||||
|
kputw(0, &str); kputc('\t', &str);
|
||||||
|
if (n_cigar) {
|
||||||
|
for (i = 0; i < n_cigar; ++i) {
|
||||||
|
kputw(cigar[i]>>4, &str); kputc("MIDSH"[cigar[i]&0xf], &str);
|
||||||
|
}
|
||||||
|
} else kputc('*', &str);
|
||||||
|
kputsn("\t*\t0\t0\t", 7, &str);
|
||||||
|
for (i = 0; i < s->l_seq; ++i) s->seq[i] = "ACGTN"[(int)s->seq[i]];
|
||||||
|
kputsn(s->seq, s->l_seq, &str); kputc('\t', &str);
|
||||||
|
if (s->qual) kputsn(s->qual, s->l_seq, &str);
|
||||||
|
kputsn("\tAS:i:", 6, &str); kputw(score, &str);
|
||||||
|
kputsn("\tss:i:", 6, &str); kputw(p->sub, &str);
|
||||||
|
kputc('\n', &str);
|
||||||
|
free(cigar);
|
||||||
|
}
|
||||||
s->sam = str.s;
|
s->sam = str.s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -508,12 +520,14 @@ int mem_process_seqs(const mem_opt_t *opt, const bwt_t *bwt, const bntseq_t *bns
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
worker_t *w;
|
worker_t *w;
|
||||||
|
mem_alnreg_v *regs;
|
||||||
w = calloc(opt->n_threads, sizeof(worker_t));
|
w = calloc(opt->n_threads, sizeof(worker_t));
|
||||||
|
regs = malloc(n * sizeof(mem_alnreg_v));
|
||||||
for (i = 0; i < opt->n_threads; ++i) {
|
for (i = 0; i < opt->n_threads; ++i) {
|
||||||
worker_t *w = &w[i];
|
worker_t *p = &w[i];
|
||||||
w->start = i; w->step = opt->n_threads; w->n = n;
|
p->start = i; p->step = opt->n_threads; p->n = n;
|
||||||
w->opt = opt; w->bwt = bwt; w->bns = bns; w->pac = pac;
|
p->opt = opt; p->bwt = bwt; p->bns = bns; p->pac = pac;
|
||||||
w->seqs = seqs;
|
p->seqs = seqs; p->regs = regs;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_PTHREAD
|
#ifdef HAVE_PTHREAD
|
||||||
if (opt->n_threads == 1) {
|
if (opt->n_threads == 1) {
|
||||||
|
|
@ -531,9 +545,9 @@ int mem_process_seqs(const mem_opt_t *opt, const bwt_t *bwt, const bntseq_t *bns
|
||||||
worker1(w); worker2(w);
|
worker1(w); worker2(w);
|
||||||
#endif
|
#endif
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i) {
|
||||||
puts(seqs[i].sam);
|
fputs(seqs[i].sam, stdout);
|
||||||
free(seqs[i].name); free(seqs[i].comment); free(seqs[i].seq); free(seqs[i].qual); free(seqs[i].sam);
|
free(seqs[i].name); free(seqs[i].comment); free(seqs[i].seq); free(seqs[i].qual); free(seqs[i].sam);
|
||||||
}
|
}
|
||||||
free(w);
|
free(regs); free(w);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue