bool gth_backtrace_path_is_valid(const GthBacktracePath *bp) { bool is_valid; gt_assert(bp); gt_assert(bp->alphatype == DNA_ALPHA || bp->alphatype == PROTEIN_ALPHA); gt_assert(bp->ref_dp_length != GT_UNDEF_ULONG); is_valid = gt_eops_equal_referencelength((Editoperation*) gt_array_get_space(bp->editoperations) + bp->cutoffs.end.eopcutoff, gt_safe_cast2long(gt_array_size(bp ->editoperations)) - bp->cutoffs.start.eopcutoff - bp->cutoffs.end.eopcutoff, gt_safe_cast2long(bp->ref_dp_length) - bp->cutoffs.start.referencecutoff - bp->cutoffs.end.referencecutoff, bp->alphatype == PROTEIN_ALPHA); return is_valid; }
/* XXX: change this function: add more sophisticated extension strategy */ void gth_chain_extend_borders(GthChain *chain, const GtRange *gen_seq_bounds, const GtRange *gen_seq_bounds_rc, GT_UNUSED unsigned long gen_total_length, GT_UNUSED unsigned long gen_offset) { long tmpborder; /* at least one range in chain */ gt_assert(gt_array_size(chain->forwardranges)); /* forward range borders are in considered genomic region */ gt_assert(gt_ranges_borders_are_in_region(chain->forwardranges, gen_seq_bounds)); /* reverse range borders are in considered genomic region */ gt_assert(gt_ranges_borders_are_in_region(chain->reverseranges, gen_seq_bounds_rc)); /* chain->forwardranges is forward and consecutive */ gt_assert(gt_ranges_are_consecutive(chain->forwardranges)); /* valid sequence bounds */ gt_assert(gen_seq_bounds->start <= gen_seq_bounds->end); gt_assert(gen_seq_bounds_rc->start <= gen_seq_bounds_rc->end); /* set start border, forward strand */ tmpborder = gt_safe_cast2long(((GtRange*) gt_array_get_first(chain->forwardranges)) ->start); tmpborder -= DPEXTENSION; if (tmpborder < gt_safe_cast2long(gen_seq_bounds->start)) tmpborder = gen_seq_bounds->start; ((GtRange*) gt_array_get_first(chain->forwardranges))->start = gt_safe_cast2ulong(tmpborder); /* set start border, reverse complement strand */ tmpborder = gt_safe_cast2long(((GtRange*) gt_array_get_first(chain->reverseranges)) ->start); tmpborder -= DPEXTENSION; if (tmpborder < gt_safe_cast2long(gen_seq_bounds_rc->start)) tmpborder = gen_seq_bounds_rc->start; ((GtRange*) gt_array_get_first(chain->reverseranges))->start = gt_safe_cast2ulong(tmpborder); /* set end border, forward strand */ tmpborder = gt_safe_cast2long(((GtRange*) gt_array_get_last(chain->forwardranges)) ->end); tmpborder += DPEXTENSION; if (tmpborder > gt_safe_cast2long(gen_seq_bounds->end)) tmpborder = gen_seq_bounds->end; ((GtRange*) gt_array_get_last(chain->forwardranges))->end = gt_safe_cast2ulong(tmpborder); /* set end border, reverse complement strand */ tmpborder = gt_safe_cast2long(((GtRange*) gt_array_get_last(chain->reverseranges)) ->end); tmpborder += DPEXTENSION; if (tmpborder > gt_safe_cast2long(gen_seq_bounds_rc->end)) tmpborder = gen_seq_bounds_rc->end; ((GtRange*) gt_array_get_last(chain->reverseranges))->end = gt_safe_cast2ulong(tmpborder); gt_assert(chain_is_filled_and_consistent(chain, gen_total_length, gen_offset)); }
void gth_sa_calc_polyAtailpos(GthSA *sa, const unsigned char *ref_seq_tran, GtAlphabet *ref_alphabet) { GtUword ppa, mma, rightreferenceborder, referencelength; GtWord i, leftreferenceborder; sa->polyAtailpos.start = 0; sa->polyAtailpos.end = 0; ppa = mma = 0; rightreferenceborder = ((Exoninfo*) gt_array_get_last(sa->exons)) ->rightreferenceexonborder; leftreferenceborder = ((Exoninfo*) gt_array_get_first(sa->exons)) ->leftreferenceexonborder; /* setting i */ referencelength = gth_sa_ref_total_length(sa); if ((rightreferenceborder + 1) >= (referencelength - 1 - CALCPOLYATAILWINDOW)) { i = gt_safe_cast2long(rightreferenceborder + 1); } else { if (referencelength < 1 + CALCPOLYATAILWINDOW) i = 0; else i = referencelength - 1 - CALCPOLYATAILWINDOW; } for (/* i already set */; i < gt_safe_cast2long(referencelength); i++) { if (ref_seq_tran[i] == gt_alphabet_encode(ref_alphabet, 'A')) ppa++; else { if (ppa > 0 && mma < 1) { mma++; continue; } else { if (ppa >= MINIMUMPOLYATAILLENGTH) break; else { ppa = mma = 0; continue; } } } } if (ppa >= MINIMUMPOLYATAILLENGTH) { sa->polyAtailpos.start = gt_safe_cast2ulong(i - ppa - mma); sa->polyAtailpos.end = i - 1; } else { ppa = mma = 0; /* setting i */ if ((leftreferenceborder - 1) <= CALCPOLYATAILWINDOW) i = leftreferenceborder - 1; else i = CALCPOLYATAILWINDOW - 1; for (/* i already set */; i >= 0; i--) { if (ref_seq_tran[i] == gt_alphabet_encode(ref_alphabet, 'T')) ppa++; else { if (ppa > 0 && mma < 1) { mma++; continue; } else { if (ppa >= MINIMUMPOLYATAILLENGTH) break; else { ppa = mma = 0; continue; } } } } if (ppa >= MINIMUMPOLYATAILLENGTH) { sa->polyAtailpos.start = gt_safe_cast2ulong(i + ppa + mma); sa->polyAtailpos.end = i + 1; } } }