void align(char* seq_a, char* seq_b) { // Variables to store alignment result sw_aligner_t *sw = smith_waterman_new(); alignment_t *result = alignment_create(256); // Decide on scoring int match = 1; int mismatch = -2; int gap_open = -4; int gap_extend = -1; // Don't penalise gaps at the start // ACGATTT // ----TTT would score +3 (when match=+1) char no_start_gap_penalty = 1; // ..or gaps at the end e.g. // ACGATTT // ACGA--- would score +4 (when match=+1) char no_end_gap_penalty = 1; char no_gaps_in_a = 0, no_gaps_in_b = 0; char no_mismatches = 0; // Compare character case-sensitively (usually set to 0 for DNA etc) char case_sensitive = 0; scoring_t scoring; scoring_init(&scoring, match, mismatch, gap_open, gap_extend, no_start_gap_penalty, no_end_gap_penalty, no_gaps_in_a, no_gaps_in_b, no_mismatches, case_sensitive); // Add some special cases // x -> y means x in seq1 changing to y in seq2 scoring_add_mutation(&scoring, 'a', 'c', -2); // a -> c give substitution score -2 scoring_add_mutation(&scoring, 'c', 'a', -1); // c -> a give substitution score -1 // We could also prohibit the aligning of characters not given as special cases // scoring.use_match_mismatch = 0; smith_waterman_align(seq_a, seq_b, &scoring, sw); while(smith_waterman_fetch(sw, result)) { printf("seqA: %s [start:%zu]\n", result->result_a, result->pos_a); printf("seqB: %s [start:%zu]\n", result->result_b, result->pos_b); printf("alignment score: %i\n\n", result->score); } // Free memory for storing alignment results smith_waterman_free(sw); alignment_free(result); }
int main(int argc, char* argv[]) { #ifdef SEQ_ALIGN_VERBOSE printf("VERBOSE: on\n"); #endif sw_set_default_scoring(); cmd = cmdline_new(argc, argv, &scoring, SEQ_ALIGN_SW_CMD); // Align! sw = smith_waterman_new(); result = alignment_create(256); if(cmd->seq1 != NULL) { // Align seq1 and seq2 align(cmd->seq1, cmd->seq2, NULL, NULL); } // Align from files size_t i, num_of_file_pairs = cmdline_get_num_of_file_pairs(cmd); for(i = 0; i < num_of_file_pairs; i++) { const char *file1 = cmdline_get_file1(cmd, i); const char *file2 = cmdline_get_file2(cmd, i); if(file1 != NULL && *file1 == '\0' && file2 == NULL) { wait_on_keystroke = 1; file1 = "-"; } align_from_file(file1, file2, &align_pair_from_file, !cmd->interactive); } // Free memory for storing alignment results smith_waterman_free(sw); alignment_free(result); cmdline_free(cmd); return EXIT_SUCCESS; }
int main(int argc, char **argv) { if(argc != 2) print_usage(argv); char *seq = argv[1]; size_t seqlen = strlen(seq); // Go int match = 1, mismatch = -1, gap_open = -4, gap_extend = -1; bool no_start_gap_penalty = false, no_end_gap_penalty = false; bool no_gaps_in_a = true, no_gaps_in_b = true; bool no_mismatches = true, case_sensitive = true; scoring_t scoring; scoring_init(&scoring, match, mismatch, gap_open, gap_extend, no_start_gap_penalty, no_end_gap_penalty, no_gaps_in_a, no_gaps_in_b, no_mismatches, case_sensitive); // Alignment results stored here sw_aligner_t *sw = smith_waterman_new(); alignment_t *aln = alignment_create(seqlen+1); smith_waterman_align(seq, seq, &scoring, sw); // Loop over results while(smith_waterman_fetch(sw, aln)) { if(aln->pos_a < aln->pos_b) { fputs(aln->result_a, stdout); printf(" [%zu,%zu]\n", aln->pos_a, aln->pos_b); } } smith_waterman_free(sw); alignment_free(aln); return EXIT_SUCCESS; }
void sw_test_no_gaps_smith_waterman() { sw_aligner_t *sw = smith_waterman_new(); alignment_t *result = alignment_create(256); const char* seq_a = "gacag"; const char* seq_b = "tgaagt"; int match = 1; int mismatch = -2; int gap_open = -4; int gap_extend = -1; bool no_start_gap_penalty = false, no_end_gap_penalty = false; bool no_gaps_in_a = true, no_gaps_in_b = true; bool no_mismatches = false, case_sensitive = true; scoring_t scoring; scoring_init(&scoring, match, mismatch, gap_open, gap_extend, no_start_gap_penalty, no_end_gap_penalty, no_gaps_in_a, no_gaps_in_b, no_mismatches, case_sensitive); smith_waterman_align(seq_a, seq_b, &scoring, sw); smith_waterman_fetch(sw, result); ASSERT(strcmp(result->result_a, "ga") == 0 && strcmp(result->result_b, "ga") == 0); smith_waterman_fetch(sw, result); ASSERT(strcmp(result->result_a, "ag") == 0 && strcmp(result->result_b, "ag") == 0); alignment_free(result); smith_waterman_free(sw); }