fast-bwa/ertindex.h

106 lines
2.7 KiB
C
Raw Permalink Normal View History

#ifndef BWA_ERT_H
#define BWA_ERT_H
#include <stdint.h>
#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