static uint64_t _tbl_mask[] = {0xffffUL, 0xffffffUL, 0xffffffffUL, 0xffffffffffUL, 0xffffffffffffUL, 0xffffffffffffUL, 0xffffffffffffffffUL};
static uint8_t _tbl_shift[] = { 48, 40, 32, 24, 16, 8, 0};
static uint8_t _tbl_nbyte[] = { 2, 3, 4, 5, 6, 7, 8};
static uint32_t _tbl_seed[] = {0x9040a6, 0x10bea992, 0x50edd67d, 0xb05a4f09, 0xf07046c5, 0x9c9445ab, 0xb2500f29};
/* i1[] and i2[] (i.e. elements above to be used on first and second 64bits, respectively */
static uint8_t _idx_mode[][2][7] = { // contains list of elements from _tbl above to be used, from 1st and 2nd 64bit blocks
{ {2,6,0,0,0,0,0}, {0,0,0,0,0,0,0} },
{ {2,6,0,0,0,0,0}, {2,6,0,0,0,0,0} },
{ {0,2,4,6,0,0,0}, {2,6,0,0,0,0,0} },
{ {0,1,2,4,6,0,0}, {0,2,6,0,0,0,0} },
{ {0,1,2,3,4,5,6}, {0,0,0,0,0,0,0} },
{ {0,1,2,3,4,5,6}, {0,1,2,6,0,0,0} }
};
static uint8_t _n_idx[][2] = { {2,0}, {2,2}, {4,2}, {5,3}, {7,0}, {7,4} }; // how many elems from _idx_mode[] are used
kmer_params
new_kmer_params (int mode)
{
uint8_t i, j, row, bases_per_byte, _ba_pe_by[] = {2,4,8}; // bases_per_byte is 4 if dense
kmer_params p = (kmer_params) biomcmc_malloc (sizeof (struct kmer_params_struct));
p->ref_counter = 1;
p->hashfunction = &biomcmc_xxh64;
if (dna_in_4_bits[0][0] == 0xff) initialize_dna_to_bit_tables (); // run once per program
p->kmer_class_mode = mode;
switch (mode) { // map each choice to a set of kmers and bitstring encoding (row relates to _idx_mode[] above)
case 0: row = 0; p->dense = 1; break;
case 1: row = 2; p->dense = 1; break;
case 2: row = 3; p->dense = 0; break;
case 3:
default: row = 4; p->dense = 1; break;
case 4: row = 5; p->dense = 0; break;
case 5: row = 1; p->dense = 2; break;
};
bases_per_byte = _ba_pe_by[p->dense];
p->n1 = (uint8_t) _n_idx[row][0]; p->n2 = (uint8_t) _n_idx[row][1];
for (j=0; j < p->n1; j++) {
i = _idx_mode[row][0][j];
p->mask1[j] = _tbl_mask[i];
p->shift1[j] = _tbl_shift[i];
p->seed[j] = _tbl_seed[i];
p->nbytes[j] = _tbl_nbyte[i];
p->size[j] = _tbl_nbyte[i] * bases_per_byte;
}
for (j=0; j < p->n2; j++) {
i = _idx_mode[row][1][j];
p->mask2[j] = _tbl_mask[i];
p->shift2[j] = _tbl_shift[i];
p->seed[j] = (_tbl_seed[i] >> 2) + 0x420314a1d; // very noise, much random
p->nbytes[j+p->n1] = _tbl_nbyte[i] + 8;
p->size[j+p->n1] = (_tbl_nbyte[i] + 8) * bases_per_byte;
}
return p;
}