static void * downloadBamFile(void * args) { BamReaderData * data = (BamReaderData *) args; int j, tid, cnt, pos, n_plp; const bam_pileup1_t *plp; while (bam_mplp_auto(data->iter, &tid, &pos, &n_plp, &plp) > 0) { // Count reads in pileup cnt = 0; const bam_pileup1_t *p = plp; for (j = 0; j < n_plp; ++j) { //if (bam1_qual(p->b)[p->qpos] >= data->conf->min_baseQ) cnt++; p++; } // Its a wrap: char * chrom = data->data->h->target_name[tid]; if (data->stop > 0 && (strcmp(chrom, data->chrom) == 0 && pos >= data->stop)) break; // +1 to account for 0-based indexing in BAMs: if (pushValuesToBuffer(data->bufferedReaderData, chrom, pos+1, pos+2, cnt)) break; } bam_iter_destroy(data->data->iter); endBufferedSignal(data->bufferedReaderData); return NULL; }
static void * downloadTabixFile(void * args) { BCFReaderData * data = (BCFReaderData *) args; char * line; char * last_chrom = ""; while ((line = nextLine(data))) { if (line[0] == '#') continue; char * chrom = strtok(line, "\t"); if (strcmp(chrom, last_chrom)) { last_chrom = calloc(strlen(chrom) + 1, sizeof(char)); strcpy(last_chrom, chrom); } int pos = atoi(strtok(NULL, "\t")); if (data->tabix_iterator) free(line); if (pushValuesToBuffer(data->bufferedReaderData, last_chrom, pos, pos+1, 1)) break; } if (data->tabix_iterator) ti_iter_destroy(data->tabix_iterator); endBufferedSignal(data->bufferedReaderData); return NULL; }
static int readIteratorEntries(bwOverlapIterator_t *iter, char * chrom, BigBedReaderData * data) { int index; for(index = 0; index < iter->entries->l; index++) { int start = iter->entries->start[index] + 1; int finish = iter->entries->end[index] + 1; if (data->stop > 0) { if (start >= data->stop) return 1; else if (finish > data->stop) finish = data->stop; } if (pushValuesToBuffer(data->bufferedReaderData, chrom, start, finish, 1)) return 1; } return 0; }