#ifndef BWA_ERT_H #define BWA_ERT_H #include #include "kvec.h" #include "bwa.h" #define ERT_MAX_READ_LEN 301 #define kmerSize 15 #define numKmers 1073741824 #define xmerSize 4 #define numXmers 256 #define TILE_SIZE 64 // #define PRINT_SMEM #define PREFIX_LENGTH 3 #define LEP_MASK 0x3FFF #define KMER_DATA_BITWIDTH 24 #define KMER_DATA_MASK 0xFFFF #define METADATA_BITWIDTH 2 #define METADATA_MASK 0x3 #define INVALID 0 #define SINGLE_HIT_LEAF 1 #define INFREQUENT 2 #define FREQUENT 3 #define HIT_THRESHOLD 256 #define DRAM_PAGE_SIZE 24576 #define LEAF_TBL_BASE_PTR_WIDTH 3 #define LEAF_TBL_HIT_COUNT_WIDTH 3 #define MAX_HITS_PER_READ 2000000 typedef enum { EMPTY, LEAF, UNIFORM, DIVERGE } note_type_t; typedef struct _node_t { note_type_t type; int pos; int num_bp; int l_seq; int numChildren; uint64_t numHits; uint64_t start_addr; uint64_t *hits; uint8_t seq[ERT_MAX_READ_LEN + 1]; struct _node_t *parent_node; struct _node_t *child_nodes[4]; } node_t; typedef kvec_t(node_t) node_v; typedef node_t *node_ptr_t; typedef struct { int tid; int step; int readLength; uint64_t *kmer_table; uint64_t startKmer; uint64_t endKmer; bwaidx_t *bid; uint64_t *numHits; char *filePrefix; uint64_t *byte_offsets; uint64_t end_offset; } thread_data_t; // FIXME : Add to options later extern const uint8_t char_count_size_in_bits; extern const uint8_t hits_count_size_in_bits; extern const uint8_t ref_ptr_size_in_bits; extern const uint8_t leaf_offset_ptr_size_in_bits; extern const uint8_t other_offset_ptr_size_in_bits; typedef enum { CODE, EMPTY_NODE, LEAF_COUNT, LEAF_HITS, UNIFORM_COUNT, UNIFORM_BP, LEAF_PTR, OTHER_PTR } byte_type_t; void ert_build_kmertree(const bwaidx_t *bid, bwtintv_t ik, bwtintv_t ok[4], int curDepth, node_t *parent_node, int step, int max_depth); void handleDivergence(const bwaidx_t *bid, bwtintv_t ok[4], int depth, node_t *parent_node, int step, int max_depth); void handleLeaf(const bwaidx_t *bid, bwtintv_t ik, node_t *n, int step); void ert_build_table(const bwaidx_t *bid, bwtintv_t ik, bwtintv_t ok[4], uint8_t *mlt_data, uint8_t *mh_data, uint64_t *size, uint64_t *mh_size, uint8_t *aq, uint64_t *numHits, uint64_t *max_next_ptr, uint64_t next_ptr_width, int step, int max_depth); void ert_traverse_kmertree(node_t *n, uint8_t *mlt_data, uint8_t *mh_data, uint64_t *byte_idx, uint64_t *mh_byte_idx, int depth, uint64_t *numHits, uint64_t *max_ptr, uint64_t next_ptr_width, int step); void ert_destroy_kmertree(node_t *n); void buildERTKmerTrees(char *kmer_tbl_file_name, bwaidx_t *bid, char *prefix, int num_threads, int readLength); #endif