diff --git a/index.c b/index.c index 4b92fe6..533394c 100644 --- a/index.c +++ b/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 { diff --git a/main.c b/main.c index f7b529b..e2e7837 100644 --- a/main.c +++ b/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);