#include "benchmark/benchmark_utils.h"
#include "alignment/score_matrix.h"
#include "edit/edit_dp.h"
#include "gap_linear/nw.h"
#include "gap_affine/affine_matrix.h"
#include "gap_affine/swg.h"
void benchmark_align_input_clear(
align_input_t* const align_input) {
align_input->pattern_begin_free = 0;
align_input->text_begin_free = 0;
align_input->pattern_end_free = 0;
align_input->text_end_free = 0;
align_input->wfa_match_funct = NULL;
align_input->wfa_match_funct_arguments = NULL;
align_input->output_file = NULL;
align_input->output_full = false;
counter_reset(&(align_input->align));
counter_reset(&(align_input->align_correct));
counter_reset(&(align_input->align_score));
counter_reset(&(align_input->align_score_total));
counter_reset(&(align_input->align_score_diff));
counter_reset(&(align_input->align_cigar));
counter_reset(&(align_input->align_bases));
counter_reset(&(align_input->align_matches));
counter_reset(&(align_input->align_mismatches));
counter_reset(&(align_input->align_del));
counter_reset(&(align_input->align_ins));
}
void benchmark_print_alignment(
FILE* const stream,
align_input_t* const align_input,
const int score_computed,
cigar_t* const cigar_computed,
const int score_correct,
cigar_t* const cigar_correct) {
fprintf(stream,"ALIGNMENT (#%d)\n",align_input->sequence_id);
fprintf(stream," PATTERN %s\n",align_input->pattern);
fprintf(stream," TEXT %s\n",align_input->text);
if (cigar_computed != NULL && score_computed != -1) {
fprintf(stream," COMPUTED\tscore=%d\t",score_computed);
cigar_print(stream,cigar_computed,true);
fprintf(stream,"\n");
}
if (cigar_computed != NULL) {
cigar_print_pretty(stream,cigar_computed,
align_input->pattern,align_input->pattern_length,
align_input->text,align_input->text_length);
}
if (cigar_correct != NULL && score_correct != -1) {
fprintf(stream," CORRECT \tscore=%d\t",score_correct);
cigar_print(stream,cigar_correct,true);
fprintf(stream,"\n");
}
if (cigar_correct != NULL) {
cigar_print_pretty(stream,cigar_correct,
align_input->pattern,align_input->pattern_length,
align_input->text,align_input->text_length);
}
}
void benchmark_print_output_lite(
FILE* const stream,
align_input_t* const align_input,
const int score,
cigar_t* const cigar) {
const bool cigar_null = (cigar->begin_offset >= cigar->end_offset);
char* cigar_str = NULL;
if (!cigar_null) {
cigar_str = malloc(2*(cigar->end_offset-cigar->begin_offset)+10);
cigar_sprint(cigar_str,cigar,true);
}
fprintf(stream,"%d\t%s\n",score,(cigar_null) ? "-" : cigar_str);
if (!cigar_null) free(cigar_str);
}
void benchmark_print_output_full(
FILE* const stream,
align_input_t* const align_input,
const int score,
cigar_t* const cigar) {
const bool cigar_null = (cigar->begin_offset >= cigar->end_offset);
char* cigar_str = NULL;
if (!cigar_null) {
cigar_str = malloc(2*(cigar->end_offset-cigar->begin_offset));
cigar_sprint(cigar_str,cigar,true);
}
fprintf(stream,"%d\t%d\t%d\t%s\t%s\t%s\n",
align_input->pattern_length, align_input->text_length, score, align_input->pattern, align_input->text, (cigar_null) ? "-" : cigar_str); if (!cigar_null) free(cigar_str);
}
void benchmark_print_output(
align_input_t* const align_input,
const distance_metric_t distance_metric,
const bool score_only,
cigar_t* const cigar) {
if (align_input->output_file) {
int score = -1;
if (score_only) {
score = cigar->score;
} else if (cigar->begin_offset < cigar->end_offset) {
switch (distance_metric) {
case indel:
case edit:
score = cigar_score_edit(cigar);
break;
case gap_linear:
score = cigar_score_gap_linear(cigar,&align_input->linear_penalties);
break;
case gap_affine:
score = cigar_score_gap_affine(cigar,&align_input->affine_penalties);
break;
case gap_affine_2p:
score = cigar_score_gap_affine2p(cigar,&align_input->affine2p_penalties);
break;
default:
break;
}
}
if (align_input->output_full) {
benchmark_print_output_full(align_input->output_file,align_input,score,cigar);
} else {
benchmark_print_output_lite(align_input->output_file,align_input,score,cigar);
}
}
}
void benchmark_print_stats(
FILE* const stream,
align_input_t* const align_input,
const bool print_wf_stats) {
fprintf(stream,"[Accuracy]\n");
fprintf(stream," => Alignments.Correct ");
counter_print(stream,&align_input->align_correct,&align_input->align,"alg ",true);
if (align_input->debug_flags & ALIGN_DEBUG_CHECK_SCORE) {
fprintf(stream," => Score.Correct ");
counter_print(stream,&align_input->align_score,&align_input->align,"alg ",true);
fprintf(stream," => Score.Total ");
counter_print(stream,&align_input->align_score_total,NULL,"score uds.",true);
fprintf(stream," => Score.Diff ");
counter_print(stream,&align_input->align_score_diff,&align_input->align_score_total,"score uds.",true);
}
if (align_input->debug_flags & ALIGN_DEBUG_CHECK_ALIGNMENT) {
fprintf(stream," => CIGAR.Correct ");
counter_print(stream,&align_input->align_cigar,&align_input->align,"alg ",true);
}
fprintf(stream," => CIGAR.Breakdown \n");
fprintf(stream," => CIGAR.Matches ");
counter_print(stream,&align_input->align_matches,&align_input->align_bases,"bases ",true);
fprintf(stream," => CIGAR.Mismatches ");
counter_print(stream,&align_input->align_mismatches,&align_input->align_bases,"bases ",true);
fprintf(stream," => CIGAR.Insertions ");
counter_print(stream,&align_input->align_ins,&align_input->align_bases,"bases ",true);
fprintf(stream," => CIGAR.Deletions ");
counter_print(stream,&align_input->align_del,&align_input->align_bases,"bases ",true);
}