PyObject *pysplicing_from_strvector(const splicing_strvector_t *v) { int i, n=splicing_strvector_size(v); PyObject *o=PyTuple_New(n); for (i=0; i<n; i++) { PyObject *it=PyString_FromString(splicing_strvector_get(v, i)); PyTuple_SetItem(o, i, it); } return o; }
int splicing_exonset_append(splicing_exonset_t *ex, const char *seqid, int start, int end) { size_t idx; int seen=splicing_strvector_search(&ex->seqids, seqid, &idx); if (seen) { SPLICING_CHECK(splicing_vector_int_push_back(&ex->seqid, idx)); } else { size_t size=splicing_strvector_size(&ex->seqids); SPLICING_CHECK(splicing_strvector_append(&ex->seqids, seqid)); SPLICING_CHECK(splicing_vector_int_push_back(&ex->seqid, size)); } SPLICING_CHECK(splicing_vector_int_push_back(&ex->start, start)); SPLICING_CHECK(splicing_vector_int_push_back(&ex->end, end)); return 0; }
int splicing_gff_append(splicing_gff_t *gff, const char *seqid, const char *source, splicing_type_t type, int start, int end, double score, splicing_strand_t strand, int phase, const char *ID, const char *parent) { if (type == SPLICING_TYPE_GENE) { gff->nogenes++; SPLICING_CHECK(splicing_vector_int_push_back(&gff->genes, gff->n)); SPLICING_CHECK(splicing_vector_int_push_back(&gff->strand, strand)); } else if (type == SPLICING_TYPE_MRNA) { gff->notranscripts++; SPLICING_CHECK(splicing_vector_int_push_back(&gff->transcripts, gff->n)); } if (type == SPLICING_TYPE_GENE) { /* Seqid */ if (!strcmp(seqid, gff->last_seqid)) { int last=splicing_vector_int_tail(&gff->seqid); SPLICING_CHECK(splicing_vector_int_push_back(&gff->seqid, last)); } else { size_t idx; int seen=splicing_strvector_search(&gff->seqids, seqid, &idx); if (seen) { SPLICING_CHECK(splicing_vector_int_push_back(&gff->seqid, idx)); gff->last_seqid=splicing_strvector_get(&gff->seqids, idx); } else { size_t size=splicing_strvector_size(&gff->seqids); SPLICING_CHECK(splicing_strvector_append(&gff->seqids, seqid)); SPLICING_CHECK(splicing_vector_int_push_back(&gff->seqid, size)); gff->last_source=splicing_strvector_get(&gff->seqids, size); } } /* Source */ if (!strcmp(source, gff->last_source)) { int last=splicing_vector_int_tail(&gff->source); SPLICING_CHECK(splicing_vector_int_push_back(&gff->source, last)); } else { size_t idx; int seen=splicing_strvector_search(&gff->sources, source, &idx); if (seen) { SPLICING_CHECK(splicing_vector_int_push_back(&gff->source, idx)); gff->last_source=splicing_strvector_get(&gff->sources, idx); } else { size_t size=splicing_strvector_size(&gff->sources); SPLICING_CHECK(splicing_strvector_append(&gff->sources, source)); SPLICING_CHECK(splicing_vector_int_push_back(&gff->source, size)); gff->last_source=splicing_strvector_get(&gff->sources, size); } } } /* Parent */ if (!parent || !parent[0]) { SPLICING_CHECK(splicing_vector_int_push_back(&gff->parent, -1)); } else if (!strcmp(parent, gff->last_gene_id)) { SPLICING_CHECK(splicing_vector_int_push_back(&gff->parent, gff->last_gene_no)); } else if (!strcmp(parent, gff->last_mrna_id)) { SPLICING_CHECK(splicing_vector_int_push_back(&gff->parent, gff->last_mrna_no)); } else { size_t idx; int seen=splicing_strvector_search(&gff->ID, parent, &idx); if (!seen) { SPLICING_WARNING("Unknown parent ID, invalid GFF file"); SPLICING_CHECK(splicing_vector_int_push_back(&gff->parent, -1)); } else { SPLICING_CHECK(splicing_vector_int_push_back(&gff->parent, idx)); } } SPLICING_CHECK(splicing_vector_int_push_back(&gff->type, type)); SPLICING_CHECK(splicing_vector_int_push_back(&gff->start, start)); SPLICING_CHECK(splicing_vector_int_push_back(&gff->end, end)); SPLICING_CHECK(splicing_vector_push_back(&gff->score, score)); SPLICING_CHECK(splicing_vector_int_push_back(&gff->phase, phase)); SPLICING_CHECK(splicing_strvector_append(&gff->ID, ID)); /* Update last gene/mrna */ if (type == SPLICING_TYPE_GENE) { gff->last_gene_id = splicing_strvector_get(&gff->ID, gff->n); gff->last_gene_no = gff->n; } else if (type == SPLICING_TYPE_MRNA) { gff->last_mrna_id = splicing_strvector_get(&gff->ID, gff->n); gff->last_mrna_no = gff->n; } gff->n += 1; return 0; }