int splicing_i_gff_exon_start_end_sort(const splicing_vector_int_t *start, const splicing_vector_int_t *end, const splicing_vector_int_t *idx, int iso, splicing_vector_int_t *tmp, splicing_vector_int_t *tmp2) { int i, j, from=VECTOR(*idx)[iso], to=VECTOR(*idx)[iso+1], len=to-from; SPLICING_CHECK(splicing_vector_int_resize(tmp, len)); SPLICING_CHECK(splicing_vector_int_resize(tmp2, len)); for (i=0; i<len; i++) { VECTOR(*tmp)[i]=i; } splicing_qsort_r(VECTOR(*tmp), len, sizeof(int), (void*) (VECTOR(*start)+from), splicing_i_gff_exon_start_end_sort_cmp); /* Store the order */ for (i=0, j=from; i<len; i++, j++) { VECTOR(*tmp2)[i]=VECTOR(*start)[j]; } for (i=0, j=from; i<len; i++, j++) { VECTOR(*start)[j] = VECTOR(*tmp2)[ VECTOR(*tmp)[i] ]; } for (i=0, j=from; i<len; i++, j++) { VECTOR(*tmp2)[i]=VECTOR(*end)[j]; } for (i=0, j=from; i<len; i++, j++) { VECTOR(*end)[j] = VECTOR(*tmp2)[ VECTOR(*tmp)[i] ]; } return 0; }
int splicing_gff_reindex(splicing_gff_t *gff) { splicing_vector_int_t index; splicing_vector_int_t index2; splicing_vector_int_t gindex; int i, j, k, n=gff->n; SPLICING_CHECK(splicing_vector_int_init(&index, n)); SPLICING_FINALLY(splicing_vector_int_destroy, &index); for (i=0; i<n; i++) { VECTOR(index)[i] = i; } splicing_qsort_r(VECTOR(index), n, sizeof(int), (void*) gff, splicing_i_gff_reindex_cmp); SPLICING_CHECK(splicing_vector_int_init(&gindex, gff->nogenes)); SPLICING_FINALLY(splicing_vector_int_destroy, &gindex); SPLICING_CHECK(splicing_vector_int_init(&index2, n)); SPLICING_FINALLY(splicing_vector_int_destroy, &index2); for (i=0; i<gff->nogenes; i++) { VECTOR(index2)[ VECTOR(gff->genes)[i] ] = i; } for (i=0, j=0; i<n; i++) { if (VECTOR(gff->type)[ VECTOR(index)[i] ] == SPLICING_TYPE_GENE) { VECTOR(gindex)[j++] = VECTOR(index2)[ VECTOR(index)[i] ]; } } splicing_vector_int_destroy(&index2); SPLICING_FINALLY_CLEAN(1); splicing_vector_int_intiindex(&gff->seqid, &gindex); splicing_vector_int_intiindex(&gff->source, &gindex); splicing_vector_int_intiindex(&gff->strand, &gindex); splicing_vector_int_destroy(&gindex); SPLICING_FINALLY_CLEAN(1); splicing_vector_int_intiindex(&gff->type, &index); splicing_vector_int_intiindex(&gff->start, &index); splicing_vector_int_intiindex(&gff->end, &index); splicing_vector_intiindex(&gff->score, &index); splicing_vector_int_intiindex(&gff->phase, &index); splicing_strvector_ipermute(&gff->ID, &index); splicing_vector_int_intiindex(&gff->parent, &index); SPLICING_CHECK(splicing_vector_int_init(&index2, n)); SPLICING_FINALLY(splicing_vector_int_destroy, &index2); for (i=0; i<n; i++) { VECTOR(index2)[ VECTOR(index)[i] ] = i; } for (i=0; i<n; i++) { int p=VECTOR(gff->parent)[i]; if (p != -1) { VECTOR(gff->parent)[i] = VECTOR(index2)[p]; } } splicing_vector_int_destroy(&index2); SPLICING_FINALLY_CLEAN(1); for (i=j=k=0; i<n; i++) { if (VECTOR(gff->type)[i] == SPLICING_TYPE_GENE) { VECTOR(gff->genes)[j++] = i; } else if (VECTOR(gff->type)[i] == SPLICING_TYPE_MRNA) { VECTOR(gff->transcripts)[k++] = i; } } splicing_vector_int_destroy(&index); SPLICING_FINALLY_CLEAN(1); return 0; }