modified: nfig1.py
[GalaxyCodeBases.git] / BGI / SOAPdenovo2 / standardPregraph / inc / newhash.h
blob8b5d17bdb8bf976721bd1d433cd365968a69bba9
1 /*
2 * inc/newhash.h
4 * Copyright (c) 2008-2012 BGI-Shenzhen <soap at genomics dot org dot cn>.
6 * This file is part of SOAPdenovo.
8 * SOAPdenovo is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
13 * SOAPdenovo is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with SOAPdenovo. If not, see <http://www.gnu.org/licenses/>.
23 #ifndef __NEW_HASH_RJ
24 #define __NEW_HASH_RJ
26 #ifndef K_LOAD_FACTOR
27 #define K_LOAD_FACTOR 0.75
28 #endif
30 #define MAX_KMER_COV 63
31 #define EDGE_BIT_SIZE 6 //6 bit for each edge
32 #define EDGE_XOR_MASK 0x3FU
33 #define LINKS_BITS 0x00FFFFFFU
35 #define get_kmer_seq(mer) ((mer).seq)
36 #define set_kmer_seq(mer, val) ((mer).seq = val)
38 #define get_kmer_left_cov(mer, idx) (((mer).l_links>>((idx)*EDGE_BIT_SIZE))&EDGE_XOR_MASK)
39 #define set_kmer_left_cov(mer, idx, val) ((mer).l_links = ((mer).l_links&(~(EDGE_XOR_MASK<<((idx)*EDGE_BIT_SIZE)))) | (((val)&EDGE_XOR_MASK)<<((idx)*EDGE_BIT_SIZE)) )
40 #define get_kmer_left_covs(mer) (get_kmer_left_cov(mer, 0) + get_kmer_left_cov(mer, 1) + get_kmer_left_cov(mer, 2) + get_kmer_left_cov(mer, 3))
42 #define get_kmer_right_cov(mer, idx) (((mer).r_links>>((idx)*EDGE_BIT_SIZE))&EDGE_XOR_MASK)
43 #define set_kmer_right_cov(mer, idx, val) ((mer).r_links = ((mer).r_links&(~(EDGE_XOR_MASK<<((idx)*EDGE_BIT_SIZE)))) | (((val)&EDGE_XOR_MASK)<<((idx)*EDGE_BIT_SIZE)) )
44 #define get_kmer_right_covs(mer) (get_kmer_right_cov(mer, 0) + get_kmer_right_cov(mer, 1) + get_kmer_right_cov(mer, 2) + get_kmer_right_cov(mer, 3))
47 #define is_kmer_entity_null(flags, idx) ((flags)[(idx)>>4]>>(((idx)&0x0f)<<1)&0x01)
48 #define is_kmer_entity_del(flags, idx) ((flags)[(idx)>>4]>>(((idx)&0x0f)<<1)&0x02)
49 #define set_kmer_entity_null(flags, idx) ((flags)[(idx)>>4] |= (0x01u<<(((idx)&0x0f)<<1)))
50 #define set_kmer_entity_del(flags, idx) ((flags)[(idx)>>4] |= (0x02u<<(((idx)&0x0f)<<1)))
51 #define clear_kmer_entity_null(flags, idx) ((flags)[(idx)>>4] &= ~(0x01u<<(((idx)&0x0f)<<1)))
52 #define clear_kmer_entity_del(flags, idx) ((flags)[(idx)>>4] &= ~(0x02u<<(((idx)&0x0f)<<1)))
53 #define exists_kmer_entity(flags, idx) (!((flags)[(idx)>>4]>>(((idx)&0x0f)<<1)&0x03))
55 #ifdef MER127
56 typedef __uint128_t u128b;
58 typedef struct u256b
60 u128b low;
61 u128b high;
62 } U256b;
63 #else
64 #endif
66 typedef struct kmer_st
68 Kmer seq; //kmer set
69 ubyte4 l_links; // sever as edgeID since make_edge
70 ubyte4 r_links: 4 * EDGE_BIT_SIZE;
71 ubyte4 linear: 1;
72 ubyte4 deleted: 1;
73 ubyte4 checked: 1;
74 ubyte4 single: 1;
75 ubyte4 twin: 2;
76 ubyte4 inEdge: 2;
77 } kmer_t;
79 typedef struct kmerSet_st
81 kmer_t * array; //kmer set
82 ubyte4 * flags; //mark the element pos that exist in array
83 ubyte8 size;
84 ubyte8 count;
85 ubyte8 max;
86 float load_factor;
87 ubyte8 iter_ptr; //iter in set
88 } KmerSet;
90 typedef struct kmer_pt
92 kmer_t * node;
93 Kmer kmer;
94 boolean isSmaller;
95 struct kmer_pt * next;
96 } KMER_PT;
98 extern KmerSet * init_kmerset ( ubyte8 init_size, float load_factor );
99 extern int search_kmerset ( KmerSet * set, Kmer seq, kmer_t ** rs );
100 extern int put_kmerset ( KmerSet * set, Kmer seq, ubyte left, ubyte right, kmer_t ** kmer_p );
101 extern byte8 count_kmerset ( KmerSet * set );
102 extern void free_Sets ( KmerSet ** KmerSets, int num );
103 extern void free_kmerset ( KmerSet * set );
104 extern void dislink2nextUncertain ( kmer_t * node, char ch, boolean smaller );
105 extern void dislink2prevUncertain ( kmer_t * node, char ch, boolean smaller );
107 extern int count_branch2prev ( kmer_t * node );
108 extern int count_branch2next ( kmer_t * node );
109 extern char firstCharInKmer ( Kmer kmer );
111 #endif