/* global alignment with linear gapcosts in linear space */ GtUword gt_computelinearspace_generic(LinspaceManagement *spacemanager, GtScoreHandler *scorehandler, GtAlignment *align, const GtUchar *useq, GtUword ustart, GtUword ulen, const GtUchar *vseq, GtUword vstart, GtUword vlen) { GtUword distance; gt_assert(spacemanager && scorehandler && align); gt_alignment_set_seqs(align, useq+ustart, ulen, vseq+vstart, vlen); distance = gt_calc_linearalign(spacemanager, scorehandler, align, useq, ustart, ulen, vseq, vstart, vlen); return distance; }
void gt_checklinearspace(GT_UNUSED bool forward, const GtUchar *useq, GtUword ulen, const GtUchar *vseq, GtUword vlen) { GtAlignment *align; GtUword edist1, edist2, edist3, edist4, matchcost = 0, mismatchcost = 1, gapcost = 1; LinspaceManagement *spacemanager; GtScoreHandler *scorehandler; GtUchar *low_useq, *low_vseq; if (memchr(useq, LINEAR_EDIST_GAP,ulen) != NULL) { fprintf(stderr,"%s: sequence u contains gap symbol\n",__func__); exit(GT_EXIT_PROGRAMMING_ERROR); } if (memchr(vseq, LINEAR_EDIST_GAP,vlen) != NULL) { fprintf(stderr,"%s: sequence v contains gap symbol\n",__func__); exit(GT_EXIT_PROGRAMMING_ERROR); } scorehandler = gt_scorehandler_new_DNA(matchcost, mismatchcost, 0, gapcost); GtAlphabet *alphabet = gt_scorehandler_get_alphabet(scorehandler); low_useq = check_dna_sequence(useq, ulen, alphabet); low_vseq = check_dna_sequence(vseq, vlen, alphabet); if (low_useq == NULL || low_vseq == NULL) { low_useq? gt_free(low_useq):0; low_vseq? gt_free(low_vseq):0; gt_scorehandler_delete(scorehandler); return; } spacemanager = gt_linspaceManagement_new(); align = gt_alignment_new_with_seqs(low_useq, ulen, low_vseq, vlen); edist1 = gt_calc_linearalign(spacemanager, scorehandler, align, low_useq, 0, ulen, low_vseq, 0, vlen); edist2 = distance_only_global_alignment(useq, 0, ulen, vseq, 0, vlen, scorehandler); if (edist1 != edist2) { fprintf(stderr,"gt_calc_linearalign = "GT_WU" != "GT_WU " = distance_only_global_alignment\n", edist1,edist2); exit(GT_EXIT_PROGRAMMING_ERROR); } edist3 = gt_alignment_eval_with_score(align, matchcost, mismatchcost, gapcost); if (edist2 != edist3) { fprintf(stderr,"distance_only_global_alignment = "GT_WU" != "GT_WU " = gt_alignment_eval_with_score\n", edist2,edist3); exit(GT_EXIT_PROGRAMMING_ERROR); } edist4 = gt_calc_linearedist(low_useq, ulen, low_vseq, vlen); if (edist3 != edist4) { fprintf(stderr,"gt_alignment_eval_with_score = "GT_WU" != "GT_WU " = gt_calc_linearedist\n", edist3, edist4); exit(GT_EXIT_PROGRAMMING_ERROR); } gt_free(low_useq); gt_free(low_vseq); gt_linspaceManagement_delete(spacemanager); gt_scorehandler_delete(scorehandler); gt_alignment_delete(align); }
/* determining start and end of local alignment and call global function */ GtWord gt_computelinearspace_local_generic(LinspaceManagement *spacemanager, GtScoreHandler *scorehandler, GtAlignment *align, const GtUchar *useq, GtUword ustart, GtUword ulen, const GtUchar *vseq, GtUword vstart, GtUword vlen) { GtWord *Ltabcolumn, GT_UNUSED score = GT_WORD_MAX; GtUwordPair *Starttabcolumn; GtUword ulen_part, ustart_part, vlen_part, vstart_part; Gtmaxcoordvalue *max; gt_assert(spacemanager && scorehandler && align); gt_linspaceManagement_set_ulen(spacemanager,ulen); if (ulen == 0UL || vlen == 0UL) { /* empty alignment */ return 0; } else if (vlen == 1UL) { gt_linspaceManagement_check_local(spacemanager, (ulen+1)*(vlen+1)-1, ulen, sizeof (GtWord), sizeof (GtWord *)); return alignment_in_square_space_local_generic(spacemanager, align, useq, ustart, ulen, vseq, vstart, vlen, scorehandler); } else if (gt_linspaceManagement_checksquare_local(spacemanager, ulen, vlen, sizeof (*Ltabcolumn), sizeof (*Starttabcolumn))) { /* call 2dim */ return alignment_in_square_space_local_generic(spacemanager, align, useq, ustart, ulen, vseq, vstart, vlen, scorehandler); } gt_linspaceManagement_check_local(spacemanager, ulen, vlen, sizeof (*Ltabcolumn), sizeof (*Starttabcolumn)); max = evaluateallLScolumns(spacemanager, scorehandler, useq, ustart, ulen, vseq, vstart, vlen); if (gt_max_get_length_safe(max)) { ustart_part = ustart+(gt_max_get_start(max)).a; vstart_part = vstart+(gt_max_get_start(max)).b; ulen_part = gt_max_get_row_length(max); vlen_part = gt_max_get_col_length(max); score = gt_max_get_value(max); gt_scorehandler_change_score_to_cost(scorehandler); gt_alignment_set_seqs(align, &useq[ustart_part], ulen_part, &vseq[vstart_part], vlen_part); /* call global function */ gt_calc_linearalign(spacemanager, gt_scorehandler_get_costhandler(scorehandler), align, useq, ustart_part, ulen_part, vseq, vstart_part, vlen_part); } else { /*empty alignment */ return 0; } return score; }
void gt_linearalign_check(GT_UNUSED bool forward, const GtUchar *useq, GtUword ulen, const GtUchar *vseq, GtUword vlen) { GtAlignment *align; GtUword edist1, edist2, edist3, edist4, matchcost = 0, mismatchcost = 1, gapcost = 1; GtLinspaceManagement *spacemanager; GtScoreHandler *scorehandler; const bool downcase = true; if (memchr(useq, LINEAR_EDIST_GAP,ulen) != NULL) { fprintf(stderr,"%s: sequence u contains gap symbol\n",__func__); exit(GT_EXIT_PROGRAMMING_ERROR); } if (memchr(vseq, LINEAR_EDIST_GAP,vlen) != NULL) { fprintf(stderr,"%s: sequence v contains gap symbol\n",__func__); exit(GT_EXIT_PROGRAMMING_ERROR); } scorehandler = gt_scorehandler_new(matchcost, mismatchcost, 0, gapcost); gt_scorehandler_plain(scorehandler); gt_scorehandler_downcase(scorehandler); spacemanager = gt_linspace_management_new(); align = gt_alignment_new_with_seqs(useq, ulen, vseq, vlen); edist1 = gt_calc_linearalign(spacemanager, scorehandler, align, useq, 0, ulen, vseq, 0, vlen); edist2 = gt_squarealign_global_distance_only(useq, 0, ulen, vseq, 0, vlen, scorehandler); if (edist1 != edist2) { fprintf(stderr,"gt_calc_linearalign = "GT_WU" != "GT_WU " = gt_squarealign_global_distance_only\n", edist1,edist2); exit(GT_EXIT_PROGRAMMING_ERROR); } edist3 = gt_alignment_eval_with_score(align, true, matchcost, mismatchcost, gapcost); if (edist2 != edist3) { fprintf(stderr,"gt_squarealign_global_distance_only = "GT_WU" != "GT_WU " = gt_alignment_eval_with_score\n", edist2,edist3); exit(GT_EXIT_PROGRAMMING_ERROR); } edist4 = gt_calc_linearedist(downcase,useq, ulen, vseq, vlen); if (edist3 != edist4) { fprintf(stderr,"gt_alignment_eval_with_score = "GT_WU" != "GT_WU " = gt_calc_linearedist\n", edist3, edist4); exit(GT_EXIT_PROGRAMMING_ERROR); } gt_linspace_management_delete(spacemanager); gt_scorehandler_delete(scorehandler); gt_alignment_delete(align); }