diff --git a/Correct.cpp b/Correct.cpp index 6cbf30c..375773c 100644 --- a/Correct.cpp +++ b/Correct.cpp @@ -1804,10 +1804,13 @@ inline int move_gap_greedy(char* path, int path_i, int path_length, char* x, int inline void generate_cigar(char* path, int path_length, window_list *idx, window_list_alloc *res, int* start, int* end, unsigned int* old_error, char* x, int x_len, char* y) { + // uint8_t debug_c; uint32_t debug_c_len; idx->cidx = res->c.n; if ((*old_error) == 0) { push_cigar_cell(res, 0, idx->x_end + 1 - idx->x_start); idx->clen = res->c.n - idx->cidx; + // get_cigar_cell(idx, res, idx->clen-1, &debug_c, &debug_c_len); + // assert(debug_c==0 && debug_c_len==(idx->x_end + 1 - idx->x_start)); return; } @@ -1887,7 +1890,11 @@ inline void generate_cigar(char* path, int path_length, window_list *idx, window pre_c = 5; pre_cl = 0; for (i = path_length - 1; i >= 0; i--) { if (pre_c != path[i]) { - if (pre_cl != 0) push_cigar_cell(res, pre_c, pre_cl); + if (pre_cl != 0) { + push_cigar_cell(res, pre_c, pre_cl); + // get_cigar_cell(idx, res, res->c.n - idx->cidx - 1, &debug_c, &debug_c_len); + // assert(debug_c==pre_c && debug_c_len==pre_cl); + } pre_c = path[i]; pre_cl = 1; } else { @@ -1895,7 +1902,12 @@ inline void generate_cigar(char* path, int path_length, window_list *idx, window } } - if (pre_cl != 0) push_cigar_cell(res, pre_c, pre_cl); + if (pre_cl != 0) { + push_cigar_cell(res, pre_c, pre_cl); + // get_cigar_cell(idx, res, res->c.n - idx->cidx -1, &debug_c, &debug_c_len); + // assert(debug_c==pre_c && debug_c_len==pre_cl); + } + idx->clen = res->c.n - idx->cidx; // if(verify_cigar(x, x_len, y, (*end) - (*start) + 1, &(result->cigar), *old_error)) // { diff --git a/Correct.h b/Correct.h index a3852c8..df6de7a 100644 --- a/Correct.h +++ b/Correct.h @@ -1251,14 +1251,14 @@ inline int if_exact_match(char* x, long long xLen, char* y, long long yLen, long inline void get_cigar_cell(window_list *idx, window_list_alloc *cc, uint32_t i, uint8_t *c, uint32_t *len) { - uint32_t p = cc->c.a[idx->cidx+i]; - (*c) = (uint8_t)(p>>30); (*len) = (p<<2)>>2; + uint16_t p = cc->c.a[idx->cidx+i]; + (*c) = (uint8_t)(p>>14); (*len) = (p&((uint16_t)0x3fff)); } inline void push_cigar_cell(window_list_alloc *res, uint8_t c, uint32_t len) { - uint32_t p = c; p <<= 30; p += len; - kv_push(uint32_t, res->c, p); + uint16_t p = c; p <<= 14; p += (uint16_t)len; + kv_push(uint16_t, res->c, p); } #define FORWARD_KSW 0 diff --git a/Hash_Table.h b/Hash_Table.h index 7677e3c..14c7409 100644 --- a/Hash_Table.h +++ b/Hash_Table.h @@ -44,29 +44,21 @@ typedef struct uint64_t end_pos; } k_mer_pos_list; -// typedef struct -// { -// int C_L[CIGAR_MAX_LENGTH]; -// char C_C[CIGAR_MAX_LENGTH]; -// int length; -// } CIGAR; - typedef struct { ///the begining and end of a window, instead of the whole overlap int32_t x_start, x_end; int32_t y_start, y_end; - int32_t extra_begin, extra_end; - int32_t error, error_threshold; + int16_t extra_begin, extra_end; + int16_t error, error_threshold; uint32_t cidx, clen; - //CIGAR cigar; } window_list; typedef struct { size_t n, m; window_list *a; - kvec_t(uint32_t) c; + kvec_t(uint16_t) c; } window_list_alloc; typedef struct