#ifndef BINDINGS_CPP_WFALIGNER_HPP_
#define BINDINGS_CPP_WFALIGNER_HPP_
#include <string>
#include <cstdint>
#include "../../wavefront/wfa.hpp"
namespace wfa {
class WFAligner {
public:
enum MemoryModel {
MemoryHigh,
MemoryMed,
MemoryLow,
MemoryUltralow,
};
enum AlignmentScope {
Score,
Alignment,
};
enum AlignmentStatus {
StatusAlgCompleted = WF_STATUS_ALG_COMPLETED,
StatusAlgPartial = WF_STATUS_ALG_PARTIAL,
StatusMaxStepsReached = WF_STATUS_MAX_STEPS_REACHED,
StatusOOM = WF_STATUS_OOM,
};
AlignmentStatus alignEnd2End( const char* const pattern,
const int patternLength,
const char* const text,
const int textLength);
AlignmentStatus alignEnd2End( const std::string& pattern,
const std::string& text);
AlignmentStatus alignEnd2End( const uint8_t* const pattern,
const int patternLength,
const uint8_t* const text,
const int textLength);
AlignmentStatus alignEnd2End( int (*matchFunct)(int,int,void*),
void* matchFunctArguments,
const int patternLength,
const int textLength);
AlignmentStatus 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);
AlignmentStatus alignEndsFree( const std::string& pattern,
const int patternBeginFree,
const int patternEndFree,
const std::string& text,
const int textBeginFree,
const int textEndFree);
AlignmentStatus 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);
AlignmentStatus 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);
AlignmentStatus alignExtension( const char* const pattern,
const int patternLength,
const char* const text,
const int textLength);
AlignmentStatus alignExtension( std::string& pattern,
std::string& text);
AlignmentStatus alignExtension( const uint8_t* const pattern,
const int patternLength,
const uint8_t* const text,
const int textLength);
AlignmentStatus alignExtension( int (*matchFunct)(int,int,void*),
void* matchFunctArguments,
const int patternLength,
const int textLength);
void setHeuristicNone();
void setHeuristicBandedStatic(
const int band_min_k,
const int band_max_k);
void setHeuristicBandedAdaptive(
const int band_min_k,
const int band_max_k,
const int steps_between_cutoffs = 1);
void setHeuristicWFadaptive(
const int min_wavefront_length,
const int max_distance_threshold,
const int steps_between_cutoffs = 1);
void setHeuristicWFmash(
const int min_wavefront_length,
const int max_distance_threshold,
const int steps_between_cutoffs = 1);
void setHeuristicXDrop(
const int xdrop,
const int steps_between_cutoffs = 1);
void setHeuristicZDrop(
const int zdrop,
const int steps_between_cutoffs = 1);
void setMaxAlignmentSteps(
const int maxAlignmentSteps);
void setMaxMemory(
const uint64_t maxMemoryResident,
const uint64_t maxMemoryAbort);
void setMaxNumThreads(
const int maxNumThreads);
int getAlignmentStatus();
int getAlignmentScore();
void getAlignment(
char** const cigarOperations,
int* cigarLength);
std::string getAlignment();
void getCIGAR(
const bool showMismatches,
uint32_t** const cigarOperations,
int* const numCigarOperations);
std::string getCIGAR(
const bool showMismatches);
void printPretty(
FILE* const stream,
const char* const pattern,
const int patternLength,
const char* const text,
const int textLength);
char* strStatus(
const AlignmentStatus status);
void debugTag(
char* const debugTag);
protected:
wavefront_aligner_attr_t attributes;
wavefront_aligner_t* wfAligner;
WFAligner(
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
~WFAligner();
private:
WFAligner(const WFAligner&);
};
class WFAlignerIndel : public WFAligner {
public:
WFAlignerIndel(
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
};
class WFAlignerEdit : public WFAligner {
public:
WFAlignerEdit(
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
};
class WFAlignerGapLinear : public WFAligner {
public:
WFAlignerGapLinear(
const int mismatch,
const int indel,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
WFAlignerGapLinear(
const int match,
const int mismatch,
const int indel,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
};
class WFAlignerGapAffine : public WFAligner {
public:
WFAlignerGapAffine(
const int mismatch,
const int gapOpening,
const int gapExtension,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
WFAlignerGapAffine(
const int match,
const int mismatch,
const int gapOpening,
const int gapExtension,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
};
class WFAlignerGapAffine2Pieces : public WFAligner {
public:
WFAlignerGapAffine2Pieces(
const int mismatch,
const int gapOpening1,
const int gapExtension1,
const int gapOpening2,
const int gapExtension2,
const AlignmentScope alignmentScope,
const MemoryModel memoryModel = MemoryHigh);
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 = MemoryHigh);
};
}
#endif