Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
/* 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;
}