void bam_header_destroy(bam_header_t *header) { int32_t i; extern void bam_destroy_header_hash(bam_header_t *header); if (header == 0) return; if (header->target_name) { for (i = 0; i < header->n_targets; ++i) free(header->target_name[i]); free(header->target_name); free(header->target_len); } free(header->text); if (header->dict) sam_header_free(header->dict); if (header->rg2lib) sam_tbl_destroy(header->rg2lib); bam_destroy_header_hash(header); free(header); }
void bam_header_destroy(bam_header_t *header) { int32_t i; extern void bam_destroy_header_hash(bam_header_t *header); if (header == 0) return; if (header->target_name) { for (i = 0; i < header->n_targets; ++i) free(header->target_name[i]); free(header->target_name); free(header->target_len); } free(header->text); #ifndef BAM_NO_HASH bam_destroy_header_hash(header); #endif free(header); }
/* will return non-0 on error. parsed error prof will be written to * alnerrprof. values are allocated here and should be freed with * free_alnerrprof */ int parse_alnerrprof_statsfile(alnerrprof_t *alnerrprof, const char *path, bam_header_t *bam_header) { char line[BUF_SIZE]; int i; int *max_obs_pos; const int default_read_len = 250; int free_bam_header_hash = 0; int rc; FILE *in = fopen(path, "r"); /* needed for finding tid from tname */ if (bam_header->hash == 0) { bam_init_header_hash(bam_header); free_bam_header_hash = 1; } max_obs_pos = calloc(bam_header->n_targets, sizeof(int)); alnerrprof->num_targets = bam_header->n_targets; alnerrprof->prop_len = calloc(alnerrprof->num_targets, sizeof(int)); alnerrprof->props = calloc(alnerrprof->num_targets, sizeof(double *)); for (i=0; i<alnerrprof->num_targets; i++) { alnerrprof->prop_len[i] = default_read_len;/* default alloc here and realloc later */ alnerrprof->props[i] = calloc(alnerrprof->prop_len[i], sizeof(double)); } i=-1; /* make sure value is not reused by accident; triggers clang warning though */ while (NULL != fgets(line, BUF_SIZE, in)) { int pos = -1; char tname[BUF_SIZE]; double prop = -1; unsigned long int count = -1; int tid = -1; if (line[0]=='#') { continue; } if (4 != sscanf(line, "%s\t%d\t%lg\t%lu\n", tname, &pos, &prop, &count)) { LOG_ERROR("Couldn't parse line %s\n", line); rc = 1; goto free_and_exit; } assert(prop>=0.0 && prop<=1.0); pos = pos - 1; assert(pos<MAX_READ_LEN); tid = bam_get_tid(bam_header, tname); if (-1 == tid) { LOG_ERROR("Target name '%s' found in error profile doesn't match any of the sequences in BAM header. Skipping and trying to continue...\n", tname); continue; } assert(tid<alnerrprof->num_targets); /* for later downsizing */ if (pos+1 > max_obs_pos[tid]) { max_obs_pos[tid] = pos+1; } /* upsize if necessary */ while (pos >= alnerrprof->prop_len[tid]) { LOG_DEBUG("upsizing pos+1=%d alnerrprof->prop_len[tid=%d]=%d\n\n", pos+1, tid, alnerrprof->prop_len[tid]); alnerrprof->prop_len[tid] *= 2; alnerrprof->props[tid] = realloc(alnerrprof->props[tid], alnerrprof->prop_len[tid] * sizeof(double)); } alnerrprof->props[tid][pos] = prop; } /* downsize */ for (i=0; i<alnerrprof->num_targets; i++) { if (max_obs_pos[i]) { LOG_DEBUG("downsizing alnerrprof->prop_len[tid=%d] to max %d\n", i, max_obs_pos[i]); alnerrprof->props[i] = realloc(alnerrprof->props[i], max_obs_pos[i] * sizeof(double)); } else { free(alnerrprof->props[i]);/* no data for this tid: free */ } alnerrprof->prop_len[i] = max_obs_pos[i]; } #if 0 {/* fixme report */ for (i=0; i<alnerrprof->num_targets; i++) { int j; fprintf(stderr, "tid=%d len=%d: ", i, alnerrprof->prop_len[i]); for (j=0; j<alnerrprof->prop_len[i]; j++) { fprintf(stderr, " %d:%g ", j, alnerrprof->props[i][j]); } fprintf(stderr, "\n"); fprintf(stderr, "median for tid %d: %g for size %d\n", i, dbl_median(alnerrprof->props[i], alnerrprof->prop_len[i]), alnerrprof->prop_len[i]); } } #endif rc = 0; free_and_exit: free(max_obs_pos); free_bam_header_hash = 0; /* FIXME segfaults often for unknown reason */ if (free_bam_header_hash) { bam_destroy_header_hash(bam_header); } fclose(in); return rc; }