static int compute_statistics(GtFeatureNode *fn, void *data, GtError *err) { GtStatVisitor *sv; GT_UNUSED int rval; gt_error_check(err); gt_assert(data); sv = (GtStatVisitor*) data; if (gt_feature_node_is_multi(fn) && gt_feature_node_get_multi_representative(fn) == fn) { sv->number_of_multi_features++; } if (sv->used_sources) compute_source_statistics(fn, sv->used_sources); compute_type_statistics(fn, sv); if (sv->exon_number_distribution || sv->cds_length_distribution) { sv->exon_number_for_distri = 0; sv->cds_length_for_distri = 0; rval = gt_feature_node_traverse_direct_children(fn, sv, add_exon_or_cds_number, err); gt_assert(!rval); /* add_exon_or_cds_number() is sane */ if (sv->exon_number_distribution && sv->exon_number_for_distri) { gt_disc_distri_add(sv->exon_number_distribution, sv->exon_number_for_distri); } if (sv->cds_length_distribution && sv->cds_length_for_distri) { gt_disc_distri_add(sv->cds_length_distribution, sv->cds_length_for_distri); } } return 0; }
static int visit_child(GtFeatureNode* fn, void *nti, GtError *err) { NodeTraverseInfo* gt_genome_node_info; int had_err = 0; gt_genome_node_info = (NodeTraverseInfo*) nti; gt_error_check(err); if (gt_feature_node_has_children(fn)) { GtFeatureNode *oldparent = gt_genome_node_info->parent; had_err = process_node(gt_genome_node_info->diagram, fn, gt_genome_node_info->parent, err); if (!had_err) { gt_genome_node_info->parent = fn; had_err = gt_feature_node_traverse_direct_children(fn, gt_genome_node_info, visit_child, err); } if (!had_err) { gt_genome_node_info->parent = oldparent; } } else { had_err = process_node(gt_genome_node_info->diagram, fn, gt_genome_node_info->parent, err); } return had_err; }
static int inter_feature_if_necessary(GtFeatureNode *fn, void *data, GtError *err) { GtInterFeatureVisitor *aiv = (GtInterFeatureVisitor*) data; gt_error_check(err); gt_assert(fn); aiv->parent_feature = fn; aiv->previous_feature = NULL; return gt_feature_node_traverse_direct_children(fn, aiv, inter_feature_in_children, err); }
static int gtf_show_transcript(GtFeatureNode *feature_node, GtGTFVisitor *gtf_visitor, GtError *err) { GtFeatureNode *fn; GtUword i; int had_err; gt_error_check(err); gt_assert(feature_node && gtf_visitor); gt_array_reset(gtf_visitor->exon_features); gt_array_reset(gtf_visitor->CDS_features); had_err = gt_feature_node_traverse_direct_children(feature_node, gtf_visitor, save_exon_node, err); if (gt_array_size(gtf_visitor->exon_features)) { /* sort exon features */ qsort(gt_array_get_space(gtf_visitor->exon_features), gt_array_size(gtf_visitor->exon_features), sizeof (GtGenomeNode*), (GtCompare) gt_genome_node_compare); /* show exon features */ gtf_visitor->transcript_id++; for (i = 0; i < gt_array_size(gtf_visitor->exon_features); i++) { fn = *(GtFeatureNode**) gt_array_get(gtf_visitor->exon_features, i); gt_gff3_output_leading(fn, gtf_visitor->outfp); gt_file_xprintf(gtf_visitor->outfp, "gene_id \""GT_WU"\"; transcript_id " "\""GT_WU"."GT_WU"\";\n", gtf_visitor->gene_id, gtf_visitor->gene_id, gtf_visitor->transcript_id); } } if (gt_array_size(gtf_visitor->CDS_features)) { /* sort CDS features */ qsort(gt_array_get_space(gtf_visitor->CDS_features), gt_array_size(gtf_visitor->CDS_features), sizeof (GtGenomeNode*), (GtCompare) gt_genome_node_compare); /* show start_codon feature */ /* fn = *(GtFeatureNode**) */ (void) gt_array_get(gtf_visitor->CDS_features, 0); /* XXX: to be done */ /* show CDS features */ for (i = 0; i < gt_array_size(gtf_visitor->CDS_features); i++) { fn = *(GtFeatureNode**) gt_array_get(gtf_visitor->CDS_features, i); gt_gff3_output_leading(fn, gtf_visitor->outfp); gt_file_xprintf(gtf_visitor->outfp, "gene_id \""GT_WU"\"; transcript_id " "\""GT_WU"."GT_WU"\";\n", gtf_visitor->gene_id, gtf_visitor->gene_id, gtf_visitor->transcript_id); } /* XXX: show stop_codon feature and shorten last CDS feature */ } return had_err; }
static int store_ids(GtFeatureNode *fn, void *data, GtError *err) { GtGFF3Visitor *gff3_visitor = (GtGFF3Visitor*) data; AddIDInfo add_id_info; int had_err = 0; GtStr *id; gt_error_check(err); gt_assert(fn && gff3_visitor); if (gt_feature_node_has_children(fn) || gt_feature_node_is_multi(fn) || (gff3_visitor->retain_ids && gt_feature_node_get_attribute(fn, "ID"))) { if (gt_feature_node_is_multi(fn)) { id = gt_hashmap_get(gff3_visitor->feature_node_to_unique_id_str, gt_feature_node_get_multi_representative(fn)); if (!id) { /* the representative does not have its own id yet -> create it */ if (gff3_visitor->retain_ids) { id = make_id_unique(gff3_visitor, gt_feature_node_get_multi_representative(fn)); } else { id = create_unique_id(gff3_visitor, gt_feature_node_get_multi_representative(fn)); } } /* store id for feature, if the feature was not the representative */ if (gt_feature_node_get_multi_representative(fn) != fn) { gt_hashmap_add(gff3_visitor->feature_node_to_unique_id_str, fn, gt_str_ref(id)); } } else { if (gff3_visitor->retain_ids) id = make_id_unique(gff3_visitor, fn); else id = create_unique_id(gff3_visitor, fn); } /* for each child -> store the parent feature in the hash map */ add_id_info.gt_feature_node_to_id_array = gff3_visitor->feature_node_to_id_array, add_id_info.id = gt_str_get(id); had_err = gt_feature_node_traverse_direct_children(fn, &add_id_info, add_id, err); } return had_err; }
/* Traverse a genome node graph with depth first search. */ static int traverse_genome_nodes(GtFeatureNode *fn, void *nti) { NodeTraverseInfo* gt_genome_node_info; int had_err = 0; gt_assert(nti); gt_genome_node_info = (NodeTraverseInfo*) nti; gt_genome_node_info->parent = fn; /* handle root nodes */ had_err = process_node(gt_genome_node_info->diagram, fn, NULL, gt_genome_node_info->err); if (!had_err && gt_feature_node_has_children(fn)) { had_err = gt_feature_node_traverse_direct_children(fn, gt_genome_node_info, visit_child, gt_genome_node_info ->err); } return had_err; }