GtSeqid2SeqnumMapping* gt_seqid2seqnum_mapping_new_seqcol(GtSeqCol *seqcol, GtError *err) { GtSeqid2SeqnumMapping *mapping; gt_error_check(err); gt_assert(seqcol); mapping = gt_malloc(sizeof *mapping); mapping->filename = NULL; mapping->map = gt_hashmap_new(GT_HASH_STRING, gt_free_func, (GtFree) seqid_info_delete); if (fill_mapping(mapping, NULL, seqcol, err)) { gt_seqid2seqnum_mapping_delete(mapping); return NULL; } mapping->cached_seqid = NULL; return mapping; }
void gt_region_mapping_delete(GtRegionMapping *rm) { if (!rm) return; if (rm->reference_count) { rm->reference_count--; return; } gt_str_array_delete(rm->sequence_filenames); gt_str_delete(rm->sequence_file); gt_str_delete(rm->sequence_name); gt_mapping_delete(rm->mapping); gt_bioseq_delete(rm->bioseq); gt_encseq_delete(rm->encseq); gt_seq_col_delete(rm->seq_col); gt_seqid2seqnum_mapping_delete(rm->seqid2seqnum_mapping); gt_free(rm); }
GtSeqid2SeqnumMapping* gt_seqid2seqnum_mapping_new_bioseq(GtBioseq *bioseq, GtError *err) { GtSeqid2SeqnumMapping *mapping; gt_error_check(err); gt_assert(bioseq); mapping = gt_malloc(sizeof *mapping); mapping->filename = gt_cstr_dup(gt_bioseq_filename(bioseq)); mapping->map = gt_hashmap_new(GT_HASH_STRING, gt_free_func, (GtFree) seqid_info_delete); if (fill_mapping(mapping, bioseq, NULL, err)) { gt_seqid2seqnum_mapping_delete(mapping); return NULL; } mapping->cached_seqid = NULL; return mapping; }
static int update_seq_col_if_necessary(GtRegionMapping *rm, GtStr *seqid, GtError *err) { int had_err = 0; gt_error_check(err); gt_assert(rm && seqid); /* for mappings, we need to load the changed sequence, if needed... */ if (rm->mapping) { if (!rm->sequence_file || (gt_str_cmp(rm->sequence_name, seqid))) { gt_str_delete(rm->sequence_file); /* ignore MD5 hashes when using region mappings */ if (gt_md5_seqid_has_prefix(gt_str_get(seqid))) { rm->sequence_file = region_mapping_map(rm, gt_str_get(seqid) +GT_MD5_SEQID_TOTAL_LEN, err); } else rm->sequence_file = region_mapping_map(rm, gt_str_get(seqid), err); if (!rm->sequence_file) had_err = -1; else { /* load new seqcol */ if (!rm->sequence_filenames) rm->sequence_filenames = gt_str_array_new(); else gt_str_array_reset(rm->sequence_filenames); gt_str_array_add(rm->sequence_filenames, rm->sequence_file); if (!rm->sequence_name) rm->sequence_name = gt_str_new(); else gt_str_reset(rm->sequence_name); gt_str_append_str(rm->sequence_name, seqid); gt_seq_col_delete(rm->seq_col); rm->seq_col = gt_bioseq_col_new(rm->sequence_filenames, err); if (!rm->seq_col) had_err = -1; } } } else { /* ...otherwise, just make sure the seqcol is loaded */ if (!rm->seq_col) { if (rm->encseq) { if (!(rm->seq_col = gt_encseq_col_new(rm->encseq, err))) had_err = -1; } else { gt_assert(rm->sequence_filenames); if (!(rm->seq_col = gt_bioseq_col_new(rm->sequence_filenames, err))) had_err = -1; } } if (!had_err && rm->usedesc) { if (rm->seqid2seqnum_mapping) gt_seqid2seqnum_mapping_delete(rm->seqid2seqnum_mapping); rm->seqid2seqnum_mapping = gt_seqid2seqnum_mapping_new_seqcol(rm->seq_col, err); if (!rm->seqid2seqnum_mapping) { had_err = -1; } } } return had_err; }