int splicing_genomic_to_iso(const splicing_gff_t *gff, size_t gene, const splicing_vector_int_t *position, splicing_matrix_int_t *isopos) { size_t r, i, noiso, noreads=splicing_vector_int_size(position); splicing_vector_int_t exstart, exend, exidx, shift; splicing_gff_noiso_one(gff, gene, &noiso); SPLICING_CHECK(splicing_vector_int_init(&exstart, 0)); SPLICING_FINALLY(splicing_vector_int_destroy, &exstart); SPLICING_CHECK(splicing_vector_int_init(&exend, 0)); SPLICING_FINALLY(splicing_vector_int_destroy, &exend); SPLICING_CHECK(splicing_vector_int_init(&exidx, 0)); SPLICING_FINALLY(splicing_vector_int_destroy, &exidx); SPLICING_CHECK(splicing_gff_exon_start_end(gff, &exstart, &exend, &exidx, gene)); SPLICING_CHECK(splicing_vector_int_init(&shift, 0)); SPLICING_FINALLY(splicing_vector_int_destroy, &shift); for (i=0; i<noiso; i++) { size_t cs=0, ce=0, ex=0; int pos=VECTOR(exidx)[i], pos2=VECTOR(exidx)[i+1]; while (pos < pos2) { cs += VECTOR(exstart)[pos]; SPLICING_CHECK(splicing_vector_int_push_back(&shift, cs-ce-ex-1)); ex++; ce += VECTOR(exend)[pos]; pos++; } } SPLICING_CHECK(splicing_matrix_int_resize(isopos, noiso, noreads)); for (r=0; r<noreads; r++) { for (i=0; i<noiso; i++) { size_t pos=VECTOR(*position)[r]; size_t startpos=VECTOR(exidx)[i]; size_t endpos=VECTOR(exidx)[i+1]; int ex; for (ex=startpos; ex < endpos && VECTOR(exend)[ex] < pos; ex++) ; if (VECTOR(exstart)[ex] <= pos && pos <= VECTOR(exend)[ex]) { MATRIX(*isopos, i, r) = VECTOR(*position)[r] - VECTOR(shift)[ex]; } else { MATRIX(*isopos, i, r) = -1; } } } splicing_vector_int_destroy(&shift); splicing_vector_int_destroy(&exidx); splicing_vector_int_destroy(&exend); splicing_vector_int_destroy(&exstart); SPLICING_FINALLY_CLEAN(4); return 0; }
int splicing_genomic_to_iso(const splicing_gff_t *gff, size_t gene, const splicing_vector_int_t *position, const splicing_gff_converter_t *converter, splicing_matrix_int_t *isopos) { size_t r, i, noreads=splicing_vector_int_size(position); splicing_gff_converter_t vconverter, *myconverter = (splicing_gff_converter_t*) converter; if (!converter) { myconverter=&vconverter; SPLICING_CHECK(splicing_gff_converter_init(gff, gene, myconverter)); SPLICING_FINALLY(splicing_gff_converter_destroy, myconverter); } SPLICING_CHECK(splicing_matrix_int_resize(isopos, myconverter->noiso, noreads)); for (r=0; r<noreads; r++) { for (i=0; i<myconverter->noiso; i++) { size_t pos=VECTOR(*position)[r]; size_t startpos=VECTOR(myconverter->exidx)[i]; size_t endpos=VECTOR(myconverter->exidx)[i+1]; int ex; for (ex=startpos; ex < endpos && VECTOR(myconverter->exend)[ex] < pos; ex++) ; if (ex < endpos && VECTOR(myconverter->exstart)[ex] <= pos && pos <= VECTOR(myconverter->exend)[ex]) { MATRIX(*isopos, i, r) = VECTOR(*position)[r] - VECTOR(myconverter->shift)[ex]; } else { MATRIX(*isopos, i, r) = -1; } } } if (!converter) { splicing_gff_converter_destroy(myconverter); SPLICING_FINALLY_CLEAN(1); } return 0; }