fixed a few simple bugs and leaks
This commit is contained in:
parent
be171aa2dc
commit
f4c844b143
33
index.c
33
index.c
|
|
@ -31,6 +31,16 @@ typedef struct mm_idx_bucket_s {
|
|||
void *h; // hash table indexing _p_ and minimizers appearing once
|
||||
} mm_idx_bucket_t;
|
||||
|
||||
typedef struct {
|
||||
int32_t st, en, max; // max is not used for now
|
||||
int32_t score:30, strand:2;
|
||||
} mm_idx_intv1_t;
|
||||
|
||||
typedef struct mm_idx_intv_s {
|
||||
int32_t n, m;
|
||||
mm_idx_intv1_t *a;
|
||||
} mm_idx_intv_t;
|
||||
|
||||
mm_idx_t *mm_idx_init(int w, int k, int b, int flag)
|
||||
{
|
||||
mm_idx_t *mi;
|
||||
|
|
@ -55,6 +65,11 @@ void mm_idx_destroy(mm_idx_t *mi)
|
|||
kh_destroy(idx, (idxhash_t*)mi->B[i].h);
|
||||
}
|
||||
}
|
||||
if (mi->I) {
|
||||
for (i = 0; i < mi->n_seq; ++i)
|
||||
free(mi->I[i].a);
|
||||
free(mi->I);
|
||||
}
|
||||
if (!mi->km) {
|
||||
for (i = 0; i < mi->n_seq; ++i)
|
||||
free(mi->seq[i].name);
|
||||
|
|
@ -592,16 +607,6 @@ int mm_idx_reader_eof(const mm_idx_reader_t *r) // TODO: in extremely rare cases
|
|||
#include "kseq.h"
|
||||
KSTREAM_DECLARE(gzFile, gzread)
|
||||
|
||||
typedef struct {
|
||||
int32_t st, en, max; // max is not used for now
|
||||
int32_t score:30, strand:2;
|
||||
} mm_idx_intv1_t;
|
||||
|
||||
typedef struct mm_idx_intv_s {
|
||||
int32_t n, m;
|
||||
mm_idx_intv1_t *a;
|
||||
} mm_idx_intv_t;
|
||||
|
||||
#define sort_key_bed(a) ((a).st)
|
||||
KRADIX_SORT_INIT(bed, mm_idx_intv1_t, sort_key_bed, 4)
|
||||
|
||||
|
|
@ -648,10 +653,11 @@ mm_idx_intv_t *mm_idx_read_bed(const mm_idx_t *mi, const char *fn)
|
|||
r = &I[id];
|
||||
if (r->n == r->m) {
|
||||
r->m = r->m? r->m + (r->m>>1) : 16;
|
||||
r->a = (mm_idx_intv1_t*)realloc(r->a, sizeof(*r->a));
|
||||
r->a = (mm_idx_intv1_t*)realloc(r->a, sizeof(*r->a) * r->m);
|
||||
}
|
||||
r->a[r->n++] = t;
|
||||
}
|
||||
free(str.s);
|
||||
ks_destroy(ks);
|
||||
gzclose(fp);
|
||||
return I;
|
||||
|
|
@ -663,9 +669,9 @@ int mm_idx_bed_read(mm_idx_t *mi, const char *fn)
|
|||
if (mi->h == 0) mm_idx_index_name(mi);
|
||||
mi->I = mm_idx_read_bed(mi, fn);
|
||||
if (mi->I == 0) return -1;
|
||||
for (i = 0; i < mi->n_seq; ++i)
|
||||
for (i = 0; i < mi->n_seq; ++i) // TODO: eliminate redundant intervals
|
||||
radix_sort_bed(mi->I[i].a, mi->I[i].a + mi->I[i].n);
|
||||
return mi->I? 0 : -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mm_idx_bed_junc(const mm_idx_t *mi, int32_t ctg, int32_t st, int32_t en, uint8_t *s)
|
||||
|
|
@ -683,6 +689,7 @@ int mm_idx_bed_junc(const mm_idx_t *mi, int32_t ctg, int32_t st, int32_t en, uin
|
|||
}
|
||||
for (i = left; i < r->n; ++i) {
|
||||
if (st <= r->a[i].st && en >= r->a[i].en && r->a[i].strand != 0) {
|
||||
//fprintf(stderr, "[2] %d\t%d\t%c\n", r->a[i].st, r->a[i].en, r->a[i].strand > 0? '+' : r->a[i].strand < 0? '-' : '.');
|
||||
if (r->a[i].strand > 0) {
|
||||
s[r->a[i].st] |= 1, s[r->a[i].en - 1] |= 2;
|
||||
} else {
|
||||
|
|
|
|||
4
main.c
4
main.c
|
|
@ -206,7 +206,7 @@ int main(int argc, char *argv[])
|
|||
else if (c == 336) opt.flag |= MM_F_HARD_MLEVEL; // --hard-mask-level
|
||||
else if (c == 337) opt.max_sw_mat = mm_parse_num(o.arg); // --cap-sw-mat
|
||||
else if (c == 338) opt.max_qlen = mm_parse_num(o.arg); // --max-qlen
|
||||
else if (c == 339) junc_bed = o.arg; // --junc-bed
|
||||
else if (c == 340) junc_bed = o.arg; // --junc-bed
|
||||
else if (c == 314) { // --frag
|
||||
yes_or_no(&opt, MM_F_FRAG_MODE, o.longidx, o.arg, 1);
|
||||
} else if (c == 315) { // --secondary
|
||||
|
|
@ -346,7 +346,6 @@ int main(int argc, char *argv[])
|
|||
if (opt.best_n == 0 && (opt.flag&MM_F_CIGAR) && mm_verbose >= 2)
|
||||
fprintf(stderr, "[WARNING]\033[1;31m `-N 0' reduces alignment accuracy. Please use --secondary=no to suppress secondary alignments.\033[0m\n");
|
||||
while ((mi = mm_idx_reader_read(idx_rdr, n_threads)) != 0) {
|
||||
if (junc_bed) mm_idx_bed_read(mi, junc_bed);
|
||||
if ((opt.flag & MM_F_CIGAR) && (mi->flag & MM_I_NO_SEQ)) {
|
||||
fprintf(stderr, "[ERROR] the prebuilt index doesn't contain sequences.\n");
|
||||
mm_idx_destroy(mi);
|
||||
|
|
@ -367,6 +366,7 @@ int main(int argc, char *argv[])
|
|||
__func__, realtime() - mm_realtime0, cputime() / (realtime() - mm_realtime0), mi->n_seq);
|
||||
if (argc != o.ind + 1) mm_mapopt_update(&opt, mi);
|
||||
if (mm_verbose >= 3) mm_idx_stat(mi);
|
||||
if (junc_bed) mm_idx_bed_read(mi, junc_bed);
|
||||
if (!(opt.flag & MM_F_FRAG_MODE)) {
|
||||
for (i = o.ind + 1; i < argc; ++i)
|
||||
mm_map_file(mi, argv[i], &opt, n_threads);
|
||||
|
|
|
|||
Loading…
Reference in New Issue