/** * 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); }
/** * 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); }
/** * 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; }