r369: bugfix - segfault caused by the last change
Sigh... Even the simplest change can lead to new bugs.
This commit is contained in:
parent
1e3cadbfc2
commit
8437cd4edd
51
bwamem.c
51
bwamem.c
|
|
@ -759,37 +759,38 @@ int mem_approx_mapq_se(const mem_opt_t *opt, const mem_alnreg_t *a)
|
||||||
void mem_reg2sam_se(const mem_opt_t *opt, const bntseq_t *bns, const uint8_t *pac, bseq1_t *s, mem_alnreg_v *a, int extra_flag, const mem_aln_t *m)
|
void mem_reg2sam_se(const mem_opt_t *opt, const bntseq_t *bns, const uint8_t *pac, bseq1_t *s, mem_alnreg_v *a, int extra_flag, const mem_aln_t *m)
|
||||||
{
|
{
|
||||||
kstring_t str;
|
kstring_t str;
|
||||||
|
kvec_t(mem_aln_t) aa;
|
||||||
|
int k;
|
||||||
|
|
||||||
|
kv_init(aa);
|
||||||
str.l = str.m = 0; str.s = 0;
|
str.l = str.m = 0; str.s = 0;
|
||||||
if (a->n > 0 && a->a[0].score >= opt->T) {
|
for (k = 0; k < a->n; ++k) {
|
||||||
int k;
|
mem_alnreg_t *p = &a->a[k];
|
||||||
kvec_t(mem_aln_t) aa;
|
mem_aln_t *q;
|
||||||
kv_init(aa);
|
if (p->score < opt->T) continue;
|
||||||
for (k = 0; k < a->n; ++k) {
|
if (p->secondary >= 0 && !(opt->flag&MEM_F_ALL)) continue;
|
||||||
mem_alnreg_t *p = &a->a[k];
|
if (p->secondary >= 0 && p->score < a->a[p->secondary].score * .5) continue;
|
||||||
mem_aln_t *q;
|
q = kv_pushp(mem_aln_t, aa);
|
||||||
if (p->score < opt->T) continue;
|
*q = mem_reg2aln(opt, bns, pac, s->l_seq, s->seq, p);
|
||||||
if (p->secondary >= 0 && !(opt->flag&MEM_F_ALL)) continue;
|
if (q->rid < 0) { // unfixable cross-reference alignment
|
||||||
if (p->secondary >= 0 && p->score < a->a[p->secondary].score * .5) continue;
|
--aa.n;
|
||||||
q = kv_pushp(mem_aln_t, aa);
|
continue;
|
||||||
*q = mem_reg2aln(opt, bns, pac, s->l_seq, s->seq, p);
|
|
||||||
if (q->rid < 0) { // unfixable cross-reference alignment
|
|
||||||
--aa.n;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
q->flag |= extra_flag | (p->secondary >= 0? 0x100 : 0); // flag secondary
|
|
||||||
if (p->secondary >= 0) q->sub = -1; // don't output sub-optimal score
|
|
||||||
if ((opt->flag&MEM_F_NO_MULTI) && k && p->secondary < 0) q->flag |= 0x10000;
|
|
||||||
if (k && q->mapq > aa.a[0].mapq) q->mapq = aa.a[0].mapq;
|
|
||||||
}
|
}
|
||||||
for (k = 0; k < aa.n; ++k)
|
q->flag |= extra_flag | (p->secondary >= 0? 0x100 : 0); // flag secondary
|
||||||
mem_aln2sam(bns, &str, s, aa.n, aa.a, k, m);
|
if (p->secondary >= 0) q->sub = -1; // don't output sub-optimal score
|
||||||
for (k = 0; k < aa.n; ++k) free(aa.a[k].cigar);
|
if ((opt->flag&MEM_F_NO_MULTI) && k && p->secondary < 0) q->flag |= 0x10000;
|
||||||
free(aa.a);
|
if (k && q->mapq > aa.a[0].mapq) q->mapq = aa.a[0].mapq;
|
||||||
} else {
|
}
|
||||||
|
if (aa.n == 0) { // no alignments good enough; then write an unaligned record
|
||||||
mem_aln_t t;
|
mem_aln_t t;
|
||||||
t = mem_reg2aln(opt, bns, pac, s->l_seq, s->seq, 0);
|
t = mem_reg2aln(opt, bns, pac, s->l_seq, s->seq, 0);
|
||||||
t.flag |= extra_flag;
|
t.flag |= extra_flag;
|
||||||
mem_aln2sam(bns, &str, s, 1, &t, 0, m);
|
mem_aln2sam(bns, &str, s, 1, &t, 0, m);
|
||||||
|
} else {
|
||||||
|
for (k = 0; k < aa.n; ++k)
|
||||||
|
mem_aln2sam(bns, &str, s, aa.n, aa.a, k, m);
|
||||||
|
for (k = 0; k < aa.n; ++k) free(aa.a[k].cigar);
|
||||||
|
free(aa.a);
|
||||||
}
|
}
|
||||||
s->sam = str.s;
|
s->sam = str.s;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue