static int feature_visitor_region_node(GtNodeVisitor *gv, GtRegionNode *rn, GtError *err) { GtFeatureVisitor *v = feature_visitor_cast(gv); gt_error_check(err); return gt_feature_index_add_region_node(v->feature_index, rn, err); }
static GtFeatureIndex *in_stream_test_data(GtError *error) { GtFeatureIndex *fi; GtFeatureNode *fn; GtGenomeNode *gn; GtRegionNode *rn; GtStr *seqid; fi = gt_feature_index_memory_new(); seqid = gt_str_new_cstr("chr1"); gn = gt_region_node_new(seqid, 1, 100000); rn = gt_region_node_cast(gn); gt_feature_index_add_region_node(fi, rn, error); gt_genome_node_delete(gn); gn = gt_feature_node_new(seqid, "region", 500, 5000, GT_STRAND_BOTH); fn = gt_feature_node_cast(gn); gt_feature_index_add_feature_node(fi, fn, error); gt_genome_node_delete(gn); gn = gt_feature_node_new(seqid, "region", 50000, 75000, GT_STRAND_BOTH); fn = gt_feature_node_cast(gn); gt_feature_index_add_feature_node(fi, fn, error); gt_genome_node_delete(gn); gt_str_delete(seqid); seqid = gt_str_new_cstr("scf0001"); gn = gt_region_node_new(seqid, 1, 10000); rn = gt_region_node_cast(gn); gt_feature_index_add_region_node(fi, rn, error); gt_genome_node_delete(gn); gn = gt_feature_node_new(seqid, "mRNA", 4000, 6000, GT_STRAND_REVERSE); fn = gt_feature_node_cast(gn); gt_feature_index_add_feature_node(fi, fn, error); gt_genome_node_delete(gn); gn = gt_feature_node_new(seqid, "mRNA", 7000, 9500, GT_STRAND_FORWARD); fn = gt_feature_node_cast(gn); gt_feature_index_add_feature_node(fi, fn, error); gt_genome_node_delete(gn); gt_str_delete(seqid); return fi; }
static int feature_index_lua_add_region_node(lua_State *L) { GtFeatureIndex **fi; GtGenomeNode **gn; GtRegionNode *rn; gt_assert(L); fi = check_feature_index(L, 1); gn = check_genome_node(L, 2); rn = gt_region_node_try_cast(*gn); luaL_argcheck(L, rn, 2, "not a region node"); gt_feature_index_add_region_node(*fi, rn); return 0; }
static int feature_index_lua_add_region_node(lua_State *L) { GtFeatureIndex **fi; GtGenomeNode **gn; GtRegionNode *rn; GtError *err; gt_assert(L); fi = check_feature_index(L, 1); gn = check_genome_node(L, 2); rn = gt_region_node_try_cast(*gn); luaL_argcheck(L, rn, 2, "not a region node"); err = gt_error_new(); if (gt_feature_index_add_region_node(*fi, rn, err)) return gt_lua_error(L, err); gt_error_delete(err); return 0; }
/* to be called from implementing class! */ int gt_feature_index_unit_test(GtFeatureIndex *fi, GtError *err) { int had_err = 0, i, rval; GtFeatureIndexTestShared sh; GtStrArray *seqids; GtStr *seqid; GtRange check_range; GtRegionNode *rn; bool has_seqid; gt_error_check(err); sh.mutex = gt_mutex_new(); sh.nodes = gt_array_new(sizeof (GtFeatureNode*)); sh.error_count = 0; sh.next_node_idx = 0; sh.fi = fi; sh.err = gt_error_new(); /* create region */ seqid = gt_str_new_cstr(GT_FI_TEST_SEQID); rn = (GtRegionNode*) gt_region_node_new(seqid, GT_FI_TEST_START, GT_FI_TEST_END); /* test seqid is not supposed to exist */ gt_ensure(gt_feature_index_has_seqid(sh.fi, &has_seqid, GT_FI_TEST_SEQID, err) == 0); gt_ensure(!has_seqid); /* add a sequence region directly and check if it has been added */ rval = gt_feature_index_add_region_node(sh.fi, rn, err); gt_ensure(rval == 0); gt_genome_node_delete((GtGenomeNode*) rn); gt_ensure(gt_feature_index_has_seqid(sh.fi, &has_seqid, GT_FI_TEST_SEQID, err) == 0); gt_ensure(has_seqid); gt_feature_index_get_range_for_seqid(sh.fi, &check_range, GT_FI_TEST_SEQID, err); gt_ensure(check_range.start == GT_FI_TEST_START && check_range.end == GT_FI_TEST_END); /* set up nodes to store */ for (i=0;i<GT_FI_TEST_FEATURES_PER_THREAD*gt_jobs;i++) { GtUword start, end; GtFeatureNode *fn; start = random() % (GT_FI_TEST_END - GT_FI_TEST_FEATURE_WIDTH); end = start + random() % (GT_FI_TEST_FEATURE_WIDTH); fn = gt_feature_node_cast(gt_feature_node_new(seqid, "gene", start, end, GT_STRAND_FORWARD)); gt_array_add(sh.nodes, fn); } /* test parallel addition */ gt_multithread(gt_feature_index_unit_test_add, &sh, err); seqids = gt_feature_index_get_seqids(fi, err); gt_ensure(seqids); gt_ensure(gt_feature_index_has_seqid(fi, &has_seqid,GT_FI_TEST_SEQID, err) == 0); gt_ensure(has_seqid); gt_ensure(gt_str_array_size(seqids) == 1); /* test parallel query */ if (!had_err) gt_multithread(gt_feature_index_unit_test_query, &sh, err); gt_ensure(sh.error_count == 0); gt_mutex_delete(sh.mutex); gt_error_delete(sh.err); gt_str_array_delete(seqids); gt_array_delete(sh.nodes); gt_str_delete(seqid); return had_err; }