Example #1
0
/**
 * Frees a singly-linked list of SeqFeature structures
 * and frees the list itself.
 */
void seqfeat_slist_free(GSList *segments) {
  GSList *cur;
  SeqFeature *feat;

  cur = segments;
  while(cur != NULL) {
    feat = (SeqFeature *)cur->data;
    g_free(feat->c.seqname);
    if(feat->name != NULL) {
      g_free(feat->name);
    }
    if(feat->c.seqname != NULL) {
      g_free(feat->c.seqname);
    }

    seqfeat_attrib_free(feat);

    if(feat->n_sub_feat != 0) {
      seqfeat_array_free(feat->sub_feats, feat->n_sub_feat);
    }

    g_free(feat);

    cur = g_slist_next(cur);
  }
 
  g_slist_free(segments);
}
Example #2
0
/**
 * Frees an entire array of allocated SeqFeatures.
 */
void seqfeat_array_free(SeqFeature *feats, const long n) {
  long i;

  if(n == 0) {
    return;
  }

  for(i = 0; i < n; i++) {
    if(feats[i].name != NULL) {
      g_free(feats[i].name);
    }
    if(feats[i].c.seqname != NULL) {
      g_free(feats[i].c.seqname);
    }
    if(feats[i].n_sub_feat != 0) {
      seqfeat_array_free(feats[i].sub_feats, feats[i].n_sub_feat);
    }

    seqfeat_attrib_free(&feats[i]);
  }

  g_free(feats);
}
Example #3
0
/**
 * Reads recombination rates from a feature-style file where the
 * feature score is the rate in 10-8M and the coordinates the region.
 *
 * The returned rate array should be freed when it is no longer
 * needed.
 */
float *dist_read_recomb_rate_feats(char *filename, long seq_len) {
  long i,j, cur_pos, n_regions;
  SeqFeature *rec_regions;
  float *rates;

  rates = g_new(float, seq_len);
  
  /* read recombination rates from file */
  rec_regions = seqfeat_read_flatfile(filename, &n_regions);

  /** assume that regions in file are ordered */
  cur_pos = 1;
  
  for(i = 0; i < n_regions; i++) {
    /* fill in gaps between regions with undefined recombination rates */
    for(j = cur_pos; j < rec_regions[i].c.start; j++) {
      rates[j-1] = DIST_NA;
    }

    /* fill in recombination rate of region */
    for(j = rec_regions[i].c.start; j < rec_regions[i].c.end; j++) {
      rates[j-1] = rec_regions[i].score;
    }

    cur_pos = rec_regions[i].c.end+1;
  }

  /* set remaining region at chr end to undefined rec rates */
  for(j = cur_pos; j < seq_len; j++) {
    rates[j-1] = DIST_NA;
  }

  seqfeat_array_free(rec_regions, n_regions);

  return rates;
}