X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=samtools.git;a=blobdiff_plain;f=bam_index.c;h=a6278843583c605799360affb0b9c3c21fbd02c4;hp=72ef270f9c7afd143759e1f98d681ce69147bb13;hb=317f5e8dd22cc9e1e5e05fbcaeb3b9aca7447351;hpb=b27e00385f41769d03a8cca4dbd71275fc9fa906 diff --git a/bam_index.c b/bam_index.c index 72ef270..a627884 100644 --- a/bam_index.c +++ b/bam_index.c @@ -4,7 +4,9 @@ #include "khash.h" #include "ksort.h" #include "bam_endian.h" +#ifdef _USE_KNETFILE #include "knetfile.h" +#endif /*! @header @@ -328,7 +330,7 @@ bam_index_t *bam_index_load_local(const char *_fn) FILE *fp; char *fnidx, *fn; - if (strstr(_fn, "ftp://") == _fn) { + if (strstr(_fn, "ftp://") == _fn || strstr(_fn, "http://") == _fn) { const char *p; int l = strlen(_fn); for (p = _fn + l - 1; p >= _fn; --p) @@ -354,6 +356,7 @@ bam_index_t *bam_index_load_local(const char *_fn) } else return 0; } +#ifdef _USE_KNETFILE static void download_from_remote(const char *url) { const int buf_size = 1 * 1024 * 1024; @@ -362,7 +365,7 @@ static void download_from_remote(const char *url) uint8_t *buf; knetFile *fp_remote; int l; - if (strstr(url, "ftp://") != url) return; + if (strstr(url, "ftp://") != url && strstr(url, "http://") != url) return; l = strlen(url); for (fn = (char*)url + l - 1; fn >= url; --fn) if (*fn == '/') break; @@ -384,12 +387,18 @@ static void download_from_remote(const char *url) fclose(fp); knet_close(fp_remote); } +#else +static void download_from_remote(const char *url) +{ + return; +} +#endif bam_index_t *bam_index_load(const char *fn) { bam_index_t *idx; idx = bam_index_load_local(fn); - if (idx == 0 && strstr(fn, "ftp://") == fn) { + if (idx == 0 && (strstr(fn, "ftp://") == fn || strstr(fn, "http://") == fn)) { char *fnidx = calloc(strlen(fn) + 5, 1); strcat(strcpy(fnidx, fn), ".bai"); fprintf(stderr, "[bam_index_load] attempting to download the remote index file.\n"); @@ -467,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; @@ -498,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) @@ -524,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