43 #ifndef VARIANTKEY_VARIANTKEY_H 44 #define VARIANTKEY_VARIANTKEY_H 51 #define VKMASK_CHROM 0xF800000000000000 52 #define VKMASK_POS 0x07FFFFFF80000000 53 #define VKMASK_CHROMPOS 0xFFFFFFFF80000000 54 #define VKMASK_REFALT 0x000000007FFFFFFF 55 #define VKSHIFT_CHROM 59 56 #define VKSHIFT_POS 31 57 #define MAXUINT32 0xFFFFFFFF 89 static const uint8_t onecharmap[] =
91 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
92 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
94 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,23,24, 0, 0, 0, 0, 0, 0,
96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,23,24, 0, 0, 0, 0, 0, 0,
97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
98 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
99 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
100 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104 && ((chrom[0] ==
'c') || (chrom[0] ==
'C'))
105 && ((chrom[1] ==
'h') || (chrom[1] ==
'H'))
106 && ((chrom[2] ==
'r') || (chrom[2] ==
'R')))
115 if ((chrom[0] <=
'9') && (chrom[0] >=
'0'))
118 uint8_t v = (chrom[0] -
'0');
119 for (i = 1; i < size; i++)
121 if ((chrom[i] >
'9') || (chrom[i] <
'0'))
125 v = ((v * 10) + (chrom[i] -
'0'));
129 if ((size == 1) || ((size == 2) && ((chrom[1] ==
'T') || (chrom[1] ==
't'))))
131 return onecharmap[((uint8_t)chrom[0])];
147 if ((code < 1) || (code > 25))
149 return sprintf(chrom,
"NA");
153 return sprintf(chrom,
"%" PRIu8, code);
155 static const char *map[] = {
"X",
"Y",
"MT"};
156 return sprintf(chrom,
"%s", map[(code - 23)]);
168 static const uint32_t map[] =
170 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
171 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
173 4,0,4,1,4,4,4,2,4,4,4,4,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4,
175 4,0,4,1,4,4,4,2,4,4,4,4,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4,
176 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
177 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
178 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
179 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
184 static inline int encode_allele(uint32_t *h, uint8_t *bitpos,
const char *str,
size_t size)
195 *h |= (v << *bitpos);
200 static inline uint32_t
encode_refalt_rev(
const char *ref,
size_t sizeref,
const char *alt,
size_t sizealt)
204 h |= ((uint32_t)(sizeref) << 27);
205 h |= ((uint32_t)(sizealt) << 23);
215 static inline uint32_t
muxhash(uint32_t k, uint32_t h)
218 k = (k >> 17) | (k << 15);
221 h = (h >> 19) | (h << 13);
222 return ((h * 5) + 0xe6546b64);
233 return (uint32_t)(c -
'a' + 1);
235 return (uint32_t)(c -
'A' + 1);
242 const char *
pos = (str + size - 1);
265 const char *
pos = (str + 5);
275 static inline uint32_t
hash32(
const char *str,
size_t size)
292 static inline uint32_t
encode_refalt_hash(
const char *ref,
size_t sizeref,
const char *alt,
size_t sizealt)
302 return ((h >> 1) | 0x1);
317 static inline uint32_t
encode_refalt(
const char *ref,
size_t sizeref,
const char *alt,
size_t sizealt)
319 if ((sizeref + sizealt) <= 11)
332 static const char base[4] = {
'A',
'C',
'G',
'T'};
333 return base[((code >> bitpos) & 0x3)];
336 static inline size_t decode_refalt_rev(uint32_t code,
char *ref,
size_t *sizeref,
char *alt,
size_t *sizealt)
338 *sizeref = (size_t)((code & 0x78000000) >> 27);
339 *sizealt = (size_t)((code & 0x07800000) >> 23);
373 uint8_t bitpos = (23 - ((*sizeref) << 1));
407 return (*sizeref + *sizealt);
423 static inline size_t decode_refalt(uint32_t code,
char *ref,
size_t *sizeref,
char *alt,
size_t *sizealt)
507 static inline uint64_t
variantkey(
const char *
chrom,
size_t sizechrom, uint32_t
pos,
const char *ref,
size_t sizeref,
const char *alt,
size_t sizealt)
528 return (a < b) ? -1 : (a > b);
586 #endif // VARIANTKEY_VARIANTKEY_H static uint64_t parse_variantkey_hex(const char *vs)
Parses a VariantKey hexadecimal string and returns the code.
Definition: variantkey.h:581
static uint8_t extract_variantkey_chrom(uint64_t vk)
Extract the CHROM code from VariantKey.
Definition: variantkey.h:451
uint8_t chrom
Chromosome encoded number (only the LSB 5 bit are used)
Definition: variantkey.h:65
static uint32_t extract_variantkey_pos(uint64_t vk)
Extract the POS code from VariantKey.
Definition: variantkey.h:462
static uint64_t variantkey(const char *chrom, size_t sizechrom, uint32_t pos, const char *ref, size_t sizeref, const char *alt, size_t sizealt)
Definition: variantkey.h:507
struct variantkey_t variantkey_t
static uint32_t hash32(const char *str, size_t size)
Definition: variantkey.h:275
static uint64_t encode_variantkey(uint8_t chrom, uint32_t pos, uint32_t refalt)
Returns a 64 bit variant key based on the pre-encoded CHROM, POS (0-based) and REF+ALT.
Definition: variantkey.h:440
static char decode_base(uint32_t code, int bitpos)
Definition: variantkey.h:330
struct vkrange_t vkrange_t
static size_t decode_chrom(uint8_t code, char *chrom)
Decode the chromosome numerical code.
Definition: variantkey.h:145
static size_t decode_refalt(uint32_t code, char *ref, size_t *sizeref, char *alt, size_t *sizealt)
Decode the 32 bit REF+ALT code if reversible (if it has 11 or less bases in total and only contains A...
Definition: variantkey.h:423
static int8_t compare_variantkey_chrom_pos(uint64_t vka, uint64_t vkb)
Compares two VariantKeys by chromosome and position.
Definition: variantkey.h:550
static int encode_allele(uint32_t *h, uint8_t *bitpos, const char *str, size_t size)
Definition: variantkey.h:184
static uint32_t pack_chars(const char *str)
Definition: variantkey.h:263
#define VKMASK_REFALT
VariantKey binary mask for REF+ALT [ 00000000 00000000 00000000 00000000 01111111 11111111 11111111 1...
Definition: variantkey.h:54
uint64_t min
Minimum VariantKey value for any given REF+ALT encoding.
Definition: variantkey.h:75
uint32_t pos
Reference position, with the first base having position 0 (only the LSB 28 bit are used) ...
Definition: variantkey.h:66
Utility functions to manipulate strings.
#define MAXUINT32
Maximum value for uint32_t.
Definition: variantkey.h:57
static uint32_t extract_variantkey_refalt(uint64_t vk)
Extract the REF+ALT code from VariantKey.
Definition: variantkey.h:473
uint32_t refalt
Code for Reference and Alternate allele (only the LSB 31 bits are used)
Definition: variantkey.h:67
static size_t variantkey_hex(uint64_t vk, char *str)
Returns VariantKey hexadecimal string (16 characters).
Definition: variantkey.h:570
uint64_t max
Maximum VariantKey value for any given REF+ALT encoding.
Definition: variantkey.h:76
static void decode_variantkey(uint64_t code, variantkey_t *vk)
Decode a VariantKey code and returns the components as variantkey_t structure.
Definition: variantkey.h:483
static uint8_t encode_chrom(const char *chrom, size_t size)
Returns chromosome numerical encoding.
Definition: variantkey.h:86
static size_t decode_refalt_rev(uint32_t code, char *ref, size_t *sizeref, char *alt, size_t *sizealt)
Definition: variantkey.h:336
Definition: variantkey.h:73
#define VKSHIFT_POS
POS LSB position from the VariantKey LSB.
Definition: variantkey.h:56
static uint32_t muxhash(uint32_t k, uint32_t h)
Definition: variantkey.h:215
static int8_t compare_variantkey_chrom(uint64_t vka, uint64_t vkb)
Compares two VariantKeys by chromosome only.
Definition: variantkey.h:538
static uint32_t encode_refalt_rev(const char *ref, size_t sizeref, const char *alt, size_t sizealt)
Definition: variantkey.h:200
#define VKMASK_POS
VariantKey binary mask for POS [ 00000111 11111111 11111111 11111111 10000000 00000000 00000000 00000...
Definition: variantkey.h:52
static uint32_t encode_refalt(const char *ref, size_t sizeref, const char *alt, size_t sizealt)
Returns reference+alternate numerical encoding.
Definition: variantkey.h:317
#define VKSHIFT_CHROM
CHROM LSB position from the VariantKey LSB.
Definition: variantkey.h:55
static uint32_t pack_chars_tail(const char *str, size_t size)
Definition: variantkey.h:239
static uint64_t parse_hex_uint64_t(const char *s)
Parses a 16 chars hexadecimal string and returns the code.
Definition: hex.h:67
static uint32_t encode_refalt_hash(const char *ref, size_t sizeref, const char *alt, size_t sizealt)
Definition: variantkey.h:292
static void variantkey_range(uint8_t chrom, uint32_t pos_min, uint32_t pos_max, vkrange_t *range)
Returns minimum and maximum VariantKeys for range searches.
Definition: variantkey.h:519
Definition: variantkey.h:63
static uint32_t encode_base(const uint8_t c)
Definition: variantkey.h:159
#define VKMASK_CHROM
VariantKey binary mask for CHROM [ 11111000 00000000 00000000 00000000 00000000 00000000 00000000 000...
Definition: variantkey.h:51
static uint32_t encode_packchar(int c)
Definition: variantkey.h:225
static int8_t compare_uint64_t(uint64_t a, uint64_t b)
Definition: variantkey.h:526
static size_t hex_uint64_t(uint64_t n, char *str)
Returns uint64_t hexadecimal string (16 characters).
Definition: hex.h:56