X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=samtools.git;a=blobdiff_plain;f=bam_index.c;h=a6278843583c605799360affb0b9c3c21fbd02c4;hp=4ff6bd482505172741c5a48ab413f141342e93bc;hb=317f5e8dd22cc9e1e5e05fbcaeb3b9aca7447351;hpb=4a17fa7e1f91b2fe04ad334a63fc2b0d5e859d8a diff --git a/bam_index.c b/bam_index.c index 4ff6bd4..a627884 100644 --- a/bam_index.c +++ b/bam_index.c @@ -476,7 +476,8 @@ static inline int is_overlap(uint32_t beg, uint32_t end, const bam1_t *b) return (rend > beg && rbeg < end); } -int bam_fetch(bamFile fp, const bam_index_t *idx, int tid, int beg, int end, void *data, bam_fetch_f func) +// bam_fetch helper function retrieves +pair64_t * get_chunk_coordinates(const bam_index_t *idx, int tid, int beg, int end, int* cnt_off) { uint16_t *bins; int i, n_bins, n_off; @@ -507,10 +508,8 @@ int bam_fetch(bamFile fp, const bam_index_t *idx, int tid, int beg, int end, voi } free(bins); { - bam1_t *b; - int l, ret, n_seeks; - uint64_t curr_off; - b = (bam1_t*)calloc(1, sizeof(bam1_t)); + bam1_t *b = (bam1_t*)calloc(1, sizeof(bam1_t)); + int l; ks_introsort(off, n_off, off); // resolve completely contained adjacent blocks for (i = 1, l = 0; i < n_off; ++i) @@ -533,8 +532,23 @@ int bam_fetch(bamFile fp, const bam_index_t *idx, int tid, int beg, int end, voi n_off = l + 1; #endif } + bam_destroy1(b); + } + *cnt_off = n_off; + return off; +} + +int bam_fetch(bamFile fp, const bam_index_t *idx, int tid, int beg, int end, void *data, bam_fetch_f func) +{ + int n_off; + pair64_t *off = get_chunk_coordinates(idx, tid, beg, end, &n_off); + if (off == 0) return 0; + { // retrive alignments + uint64_t curr_off; + int i, ret, n_seeks; n_seeks = 0; i = -1; curr_off = 0; + bam1_t *b = (bam1_t*)calloc(1, sizeof(bam1_t)); for (;;) { if (curr_off == 0 || curr_off >= off[i].v) { // then jump to the next chunk if (i == n_off - 1) break; // no more chunks