]> git.donarmstrong.com Git - samtools.git/commitdiff
fixed a bug in realignment
authorHeng Li <lh3@live.co.uk>
Wed, 15 Sep 2010 02:05:32 +0000 (02:05 +0000)
committerHeng Li <lh3@live.co.uk>
Wed, 15 Sep 2010 02:05:32 +0000 (02:05 +0000)
bam_md.c
bam_plcmd.c

index a4f4e01ce2672556746c399af379a325b61273af..fb4673263044cd80831288a1b7a286ec62486d14 100644 (file)
--- a/bam_md.c
+++ b/bam_md.c
@@ -150,8 +150,10 @@ int bam_realn(bam1_t *b, const char *ref)
                kroundup32(b->m_data);
                b->data = realloc(b->data, b->m_data);
        }
                kroundup32(b->m_data);
                b->data = realloc(b->data, b->m_data);
        }
-       if (n_cigar != (int)c->n_cigar) // move data
-               memmove(b->data + c->l_qname + 4 * n_cigar, bam1_seq(b), b->data_len - c->l_qseq - 4 * c->n_cigar);
+       if (n_cigar != (int)c->n_cigar) { // move data
+               memmove(b->data + c->l_qname + 4 * n_cigar, bam1_seq(b), b->data_len - c->l_qname - 4 * c->n_cigar);
+               b->data_len += 4 * (n_cigar - (int)c->n_cigar);
+       }
        memcpy(bam1_cigar(b), cigar, n_cigar * 4);
        c->n_cigar = n_cigar;
        free(s_ref); free(s_read); free(cigar);
        memcpy(bam1_cigar(b), cigar, n_cigar * 4);
        c->n_cigar = n_cigar;
        free(s_ref); free(s_read); free(cigar);
index 1205e10b845288f25dbd240b3b612ae79d2f8b8a..cdbf67d861cf5e90418422057901dfab0bf0ee6b 100644 (file)
@@ -490,7 +490,8 @@ static int mplp_func(void *data, bam1_t *b)
                cond = 0;
                ret = ma->iter? bam_iter_read(ma->fp, ma->iter, b) : bam_read1(ma->fp, b);
                if (ret < 0) break;
                cond = 0;
                ret = ma->iter? bam_iter_read(ma->fp, ma->iter, b) : bam_read1(ma->fp, b);
                if (ret < 0) break;
-               if (b->core.qual < ma->min_mq) cond = 1; 
+               if (b->core.flag&BAM_FUNMAP) cond = 1;
+               else if (b->core.qual < ma->min_mq) cond = 1; 
                else if ((ma->flag&MPLP_NO_ORPHAN) && (b->core.flag&1) && !(b->core.flag&2)) cond = 1;
                if (ma->ref && !cond && (ma->flag&MPLP_REALN)) bam_realn(b, ma->ref);
        } while (cond);
                else if ((ma->flag&MPLP_NO_ORPHAN) && (b->core.flag&1) && !(b->core.flag&2)) cond = 1;
                if (ma->ref && !cond && (ma->flag&MPLP_REALN)) bam_realn(b, ma->ref);
        } while (cond);