static void determine_cutoffs(GthBacktracePath *bp, GthCutoffmode leadcutoffsmode, GthCutoffmode termcutoffsmode, unsigned long cutoffsminexonlen) { Traversealignmentfunctions travfunctions; Traversealignmentstate travstate; Relaxedcutoffsdata relaxedcutoffsdata; Strictcutoffsdata strictcutoffsdata; Minimalcutoffsdata minimalcutoffsdata; bool proteineop = bp->alphatype == PROTEIN_ALPHA; /* sum of edit operations equals referencelength (before cutoffs)", */ gt_assert(gth_backtrace_path_is_valid(bp)); /* setting the traverse alignment state */ travstate.proteineop = proteineop; travstate.processing_intron_with_1_base_left = false; travstate.processing_intron_with_2_bases_left = false; travstate.alignment = gth_backtrace_path_get(bp); travstate.alignmentlength = gth_backtrace_path_length(bp); travstate.eopptr = travstate.alignment + travstate.alignmentlength - 1; travstate.genomicptr = 0; travstate.referenceptr = 0; /* cutting of leading indels in the sequences */ switch (leadcutoffsmode) { case RELAXED: gt_initRelaxedcutoffsTravfunctions(&travfunctions); gt_initRelaxedcutoffsdata(&relaxedcutoffsdata, &bp->cutoffs.start); gthtraversealignment(true, &travstate, proteineop, &relaxedcutoffsdata, &travfunctions); break; case STRICT: gt_initStrictcutoffsTravfunctions(&travfunctions); gt_initStrictcutoffsdata(&strictcutoffsdata, &bp->cutoffs.start, cutoffsminexonlen); gthtraversealignment(true , &travstate , proteineop, &strictcutoffsdata, &travfunctions); break; case MINIMAL: gt_initMinimalcutoffsTravfunctions(&travfunctions); gt_initMinimalcutoffsdata(&minimalcutoffsdata, &bp->cutoffs.start); gthtraversealignment(true, &travstate, proteineop, &minimalcutoffsdata, &travfunctions); break; default: gt_assert(0); } /* resetting the traverse alignment state */ travstate.processing_intron_with_1_base_left = false; travstate.processing_intron_with_2_bases_left = false; travstate.eopptr = gth_backtrace_path_get(bp); travstate.genomicptr = 0; travstate.referenceptr = 0; /* cutting of terminal indels in the sequences */ switch (termcutoffsmode) { case RELAXED: gt_initRelaxedcutoffsTravfunctions(&travfunctions); gt_initRelaxedcutoffsdata(&relaxedcutoffsdata, &bp->cutoffs.end); gthtraversealignment(false, &travstate, proteineop, &relaxedcutoffsdata, &travfunctions); break; case STRICT: gt_initStrictcutoffsTravfunctions(&travfunctions); gt_initStrictcutoffsdata(&strictcutoffsdata, &bp->cutoffs.end, cutoffsminexonlen); gthtraversealignment(false, &travstate, proteineop, &strictcutoffsdata, &travfunctions); break; case MINIMAL: gt_initMinimalcutoffsTravfunctions(&travfunctions); gt_initMinimalcutoffsdata(&minimalcutoffsdata, &bp->cutoffs.end); gthtraversealignment(false, &travstate, proteineop, &minimalcutoffsdata, &travfunctions); break; default: gt_assert(0); } /* sum of edit operations equals referencelength (after cutoffs) */ gt_assert(gth_backtrace_path_is_valid(bp)); }
bool gth_sa_is_valid(const GthSA *sa) { gt_assert(sa); return gth_backtrace_path_is_valid(sa->backtrace_path); }