#include "WFAligner.hpp"
extern "C" {
#include "../../wavefront/wavefront_align.h"
}
namespace wfa {
WFAligner::WFAligner(
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) {
this->attributes = wavefront_aligner_attr_default;
switch (memoryModel) {
case MemoryHigh: this->attributes.memory_mode = wavefront_memory_high; break;
case MemoryMed: this->attributes.memory_mode = wavefront_memory_med; break;
case MemoryLow: this->attributes.memory_mode = wavefront_memory_low; break;
case MemoryUltralow: this->attributes.memory_mode = wavefront_memory_ultralow; break;
default: this->attributes.memory_mode = wavefront_memory_high; break;
}
this->attributes.alignment_scope = (alignmentScope==Score) ? compute_score : compute_alignment;
this->wfAligner = nullptr;
}
WFAligner::~WFAligner() {
wavefront_aligner_delete(wfAligner);
}
WFAligner::AlignmentStatus WFAligner::alignEnd2End(
const char* const pattern,
const int patternLength,
const char* const text,
const int textLength) {
wavefront_aligner_set_alignment_end_to_end(wfAligner);
return (WFAligner::AlignmentStatus) wavefront_align(
wfAligner,pattern,patternLength,text,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignEnd2End(
const std::string& pattern,
const std::string& text) {
return alignEnd2End(pattern.c_str(),pattern.length(),text.c_str(),text.length());
}
WFAligner::AlignmentStatus WFAligner::alignEnd2End(
const uint8_t* const pattern,
const int patternLength,
const uint8_t* const text,
const int textLength) {
wavefront_aligner_set_alignment_end_to_end(wfAligner);
return (WFAligner::AlignmentStatus) wavefront_align_packed2bits(
wfAligner,pattern,patternLength,text,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignEnd2End(
int (*matchFunct)(int,int,void*),
void* matchFunctArguments,
const int patternLength,
const int textLength) {
wavefront_aligner_set_alignment_end_to_end(wfAligner);
return (WFAligner::AlignmentStatus) wavefront_align_lambda(
wfAligner,matchFunct,matchFunctArguments,patternLength,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignEndsFree(
const char* const pattern,
const int patternLength,
const int patternBeginFree,
const int patternEndFree,
const char* const text,
const int textLength,
const int textBeginFree,
const int textEndFree) {
wavefront_aligner_set_alignment_free_ends(wfAligner,
patternBeginFree,patternEndFree,
textBeginFree,textEndFree);
return (WFAligner::AlignmentStatus) wavefront_align(
wfAligner,pattern,patternLength,text,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignEndsFree(
const std::string& pattern,
const int patternBeginFree,
const int patternEndFree,
const std::string& text,
const int textBeginFree,
const int textEndFree) {
return alignEndsFree(
pattern.c_str(),pattern.length(),patternBeginFree,patternEndFree,
text.c_str(),text.length(),textBeginFree,textEndFree);
}
WFAligner::AlignmentStatus WFAligner::alignEndsFree(
const uint8_t* const pattern,
const int patternLength,
const int patternBeginFree,
const int patternEndFree,
const uint8_t* const text,
const int textLength,
const int textBeginFree,
const int textEndFree) {
wavefront_aligner_set_alignment_free_ends(wfAligner,
patternBeginFree,patternEndFree,
textBeginFree,textEndFree);
return (WFAligner::AlignmentStatus) wavefront_align_packed2bits(
wfAligner,pattern,patternLength,text,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignEndsFree(
int (*matchFunct)(int,int,void*),
void* matchFunctArguments,
const int patternLength,
const int patternBeginFree,
const int patternEndFree,
const int textLength,
const int textBeginFree,
const int textEndFree) {
wavefront_aligner_set_alignment_free_ends(wfAligner,
patternBeginFree,patternEndFree,
textBeginFree,textEndFree);
return (WFAligner::AlignmentStatus) wavefront_align_lambda(
wfAligner,matchFunct,matchFunctArguments,patternLength,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignExtension(
const char* const pattern,
const int patternLength,
const char* const text,
const int textLength) {
wavefront_aligner_set_alignment_extension(wfAligner);
return (WFAligner::AlignmentStatus) wavefront_align(
wfAligner,pattern,patternLength,text,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignExtension(
std::string& pattern,
std::string& text) {
return alignExtension(pattern.c_str(),pattern.length(),text.c_str(),text.length());
}
WFAligner::AlignmentStatus WFAligner::alignExtension(
const uint8_t* const pattern,
const int patternLength,
const uint8_t* const text,
const int textLength) {
wavefront_aligner_set_alignment_extension(wfAligner);
return (WFAligner::AlignmentStatus) wavefront_align_packed2bits(
wfAligner,pattern,patternLength,text,textLength);
}
WFAligner::AlignmentStatus WFAligner::alignExtension(
int (*matchFunct)(int,int,void*),
void* matchFunctArguments,
const int patternLength,
const int textLength) {
wavefront_aligner_set_alignment_extension(wfAligner);
return (WFAligner::AlignmentStatus) wavefront_align_lambda(
wfAligner,matchFunct,matchFunctArguments,patternLength,textLength);
}
void WFAligner::setHeuristicNone() {
wavefront_aligner_set_heuristic_none(wfAligner);
}
void WFAligner::setHeuristicBandedStatic(
const int band_min_k,
const int band_max_k) {
wavefront_aligner_set_heuristic_banded_static(
wfAligner,band_min_k,band_max_k);
}
void WFAligner::setHeuristicBandedAdaptive(
const int band_min_k,
const int band_max_k,
const int steps_between_cutoffs) {
wavefront_aligner_set_heuristic_banded_adaptive(
wfAligner,band_min_k,band_max_k,steps_between_cutoffs);
}
void WFAligner::setHeuristicWFadaptive(
const int min_wavefront_length,
const int max_distance_threshold,
const int steps_between_cutoffs) {
wavefront_aligner_set_heuristic_wfadaptive(
wfAligner,min_wavefront_length,
max_distance_threshold,steps_between_cutoffs);
}
void WFAligner::setHeuristicWFmash(
const int min_wavefront_length,
const int max_distance_threshold,
const int steps_between_cutoffs) {
wavefront_aligner_set_heuristic_wfmash(
wfAligner,min_wavefront_length,
max_distance_threshold,steps_between_cutoffs);
}
void WFAligner::setHeuristicXDrop(
const int xdrop,
const int steps_between_cutoffs) {
wavefront_aligner_set_heuristic_xdrop(
wfAligner,xdrop,steps_between_cutoffs);
}
void WFAligner::setHeuristicZDrop(
const int zdrop,
const int steps_between_cutoffs) {
wavefront_aligner_set_heuristic_zdrop(
wfAligner,zdrop,steps_between_cutoffs);
}
void WFAligner::setMaxAlignmentSteps(
const int maxAlignmentSteps) {
wavefront_aligner_set_max_alignment_steps(wfAligner,maxAlignmentSteps);
}
void WFAligner::setMaxMemory(
const uint64_t maxMemoryResident,
const uint64_t maxMemoryAbort) {
wavefront_aligner_set_max_memory(wfAligner,maxMemoryResident,maxMemoryAbort);
}
void WFAligner::setMaxNumThreads(
const int maxNumThreads) {
wavefront_aligner_set_max_num_threads(wfAligner, maxNumThreads);
}
int WFAligner::getAlignmentStatus() {
return wfAligner->align_status.status;
}
int WFAligner::getAlignmentScore() {
return wfAligner->cigar->score;
}
void WFAligner::getAlignment(
char** const cigarOperations,
int* cigarLength) {
*cigarOperations = wfAligner->cigar->operations + wfAligner->cigar->begin_offset;
*cigarLength = wfAligner->cigar->end_offset - wfAligner->cigar->begin_offset;
}
std::string WFAligner::getAlignment() {
char* const buffer = wfAligner->cigar->operations + wfAligner->cigar->begin_offset;
const int length = wfAligner->cigar->end_offset - wfAligner->cigar->begin_offset;
return std::string(buffer,length);
}
void WFAligner::getCIGAR(
const bool showMismatches,
uint32_t** const cigarOperations,
int* const numCigarOperations) {
cigar_get_CIGAR(wfAligner->cigar,showMismatches,cigarOperations,numCigarOperations);
}
std::string WFAligner::getCIGAR(
const bool showMismatches) {
const int alignmentLength = wfAligner->cigar->end_offset - wfAligner->cigar->begin_offset;
if (alignmentLength <= 0) return std::string();
char* const buffer = new char[2*alignmentLength];
const int bufferLength = cigar_sprint_SAM_CIGAR(buffer,wfAligner->cigar,showMismatches);
std::string cigarString = std::string(buffer,bufferLength);
delete[] buffer;
return cigarString;
}
void WFAligner::printPretty(
FILE* const stream,
const char* const pattern,
const int patternLength,
const char* const text,
const int textLength) {
cigar_print_pretty(stream,wfAligner->cigar,pattern,patternLength,text,textLength);
}
char* WFAligner::strStatus(
const WFAligner::AlignmentStatus status) {
return wavefront_align_strerror((int)status);
}
void WFAligner::debugTag(
char* const debugTag) {
wfAligner->align_mode_tag = debugTag;
if (wfAligner->bialigner != NULL) {
wfAligner->bialigner->wf_forward->align_mode_tag = debugTag;
wfAligner->bialigner->wf_reverse->align_mode_tag = debugTag;
wfAligner->bialigner->wf_base->align_mode_tag = debugTag;
}
}
WFAlignerIndel::WFAlignerIndel(
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = indel;
wfAligner = wavefront_aligner_new(&attributes);
}
WFAlignerEdit::WFAlignerEdit(
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = edit;
wfAligner = wavefront_aligner_new(&attributes);
}
WFAlignerGapLinear::WFAlignerGapLinear(
const int mismatch,
const int indel,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = gap_linear;
attributes.linear_penalties.match = 0;
attributes.linear_penalties.mismatch = mismatch;
attributes.linear_penalties.indel = indel;
wfAligner = wavefront_aligner_new(&attributes);
}
WFAlignerGapLinear::WFAlignerGapLinear(
const int match,
const int mismatch,
const int indel,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = gap_linear;
attributes.linear_penalties.match = match;
attributes.linear_penalties.mismatch = mismatch;
attributes.linear_penalties.indel = indel;
wfAligner = wavefront_aligner_new(&attributes);
}
WFAlignerGapAffine::WFAlignerGapAffine(
const int mismatch,
const int gapOpening,
const int gapExtension,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = gap_affine;
attributes.affine_penalties.match = 0;
attributes.affine_penalties.mismatch = mismatch;
attributes.affine_penalties.gap_opening = gapOpening;
attributes.affine_penalties.gap_extension = gapExtension;
wfAligner = wavefront_aligner_new(&attributes);
}
WFAlignerGapAffine::WFAlignerGapAffine(
const int match,
const int mismatch,
const int gapOpening,
const int gapExtension,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = gap_affine;
attributes.affine_penalties.match = match;
attributes.affine_penalties.mismatch = mismatch;
attributes.affine_penalties.gap_opening = gapOpening;
attributes.affine_penalties.gap_extension = gapExtension;
wfAligner = wavefront_aligner_new(&attributes);
}
WFAlignerGapAffine2Pieces::WFAlignerGapAffine2Pieces(
const int mismatch,
const int gapOpening1,
const int gapExtension1,
const int gapOpening2,
const int gapExtension2,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = gap_affine_2p;
attributes.affine2p_penalties.match = 0;
attributes.affine2p_penalties.mismatch = mismatch;
attributes.affine2p_penalties.gap_opening1 = gapOpening1;
attributes.affine2p_penalties.gap_extension1 = gapExtension1;
attributes.affine2p_penalties.gap_opening2 = gapOpening2;
attributes.affine2p_penalties.gap_extension2 = gapExtension2;
wfAligner = wavefront_aligner_new(&attributes);
}
WFAlignerGapAffine2Pieces::WFAlignerGapAffine2Pieces(
const int match,
const int mismatch,
const int gapOpening1,
const int gapExtension1,
const int gapOpening2,
const int gapExtension2,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel) :
WFAligner(alignmentScope,memoryModel) {
attributes.distance_metric = gap_affine_2p;
attributes.affine2p_penalties.match = match;
attributes.affine2p_penalties.mismatch = mismatch;
attributes.affine2p_penalties.gap_opening1 = gapOpening1;
attributes.affine2p_penalties.gap_extension1 = gapExtension1;
attributes.affine2p_penalties.gap_opening2 = gapOpening2;
attributes.affine2p_penalties.gap_extension2 = gapExtension2;
wfAligner = wavefront_aligner_new(&attributes);
}
}