void bigBedSummary(char *fileName, char *chrom, int start, int end, int dataPoints) /* bigBedSummary - Extract summary information from a bigBed file.. */ { /* Make up values array initialized to not-a-number. */ double nan0 = strtod("NaN", NULL); double summaryValues[dataPoints]; int i; for (i=0; i<dataPoints; ++i) summaryValues[i] = nan0; struct bbiFile *bbi = bigBedFileOpen(fileName); if (bigBedSummaryArray(bbi, chrom, start, end, bbiSummaryTypeFromString(summaryType), dataPoints, summaryValues)) { for (i=0; i<dataPoints; ++i) { double val = summaryValues[i]; if (i != 0) printf("\t"); if (isnan(val)) printf("n/a"); else printf("%g", val); } printf("\n"); } else { errAbort("no data in region %s:%d-%d in %s\n", chrom, start, end, fileName); } bbiFileClose(&bbi); }
/* --- .Call ENTRY POINT --- */ SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); enum bbiSummaryType type = bbiSummaryTypeFromString((char *)CHAR(asChar(r_type))); double default_value = asReal(r_default_value); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); SEXP ans; PROTECT(ans = allocVector(VECSXP, length(r_chrom))); for (int i = 0; i < length(r_chrom); i++) { int size = INTEGER(r_size)[i]; char *chrom = (char *)CHAR(STRING_ELT(r_chrom, i)); SEXP r_values = allocVector(REALSXP, size); double *values = REAL(r_values); for (int j = 0; j < size; j++) values[j] = default_value; SET_VECTOR_ELT(ans, i, r_values); bool success = bigWigSummaryArray(file, chrom, start[i] - 1, start[i] - 1 + width[i], type, size, values); if (!success) warning("Failed to summarize range %d (%s:%d-%d)", i, chrom, start[i], start[i] - 1 + width[i]); } bbiFileClose(&file); popRHandlers(); UNPROTECT(1); return ans; }
enum bbiSummaryType I_bbiSummaryTypeFromString(const char *string) { char c_string[256]; strcpy(c_string, string); return bbiSummaryTypeFromString(c_string); }