r327: choose up to 3 high-freq minimizers

This commit is contained in:
Heng Li
2020-11-01 10:44:02 -05:00
parent f02eb66e6a
commit 6fa4d44426
2 changed files with 18 additions and 8 deletions

View File

@@ -3,7 +3,7 @@
#include <pthread.h>
#define HA_VERSION "0.13-r326-dirty"
#define HA_VERSION "0.13-r327-dirty"
#define VERBOSE 0

View File

@@ -44,14 +44,24 @@ static void select_mz(ha_mz1_v *p, int len)
int32_t ps = last0 < 0? 0 : p->a[last0].pos;
int32_t pe = i == n? len : p->a[i].pos;
int32_t j, st = last0 + 1, en = i;
ha_mz1_t min1 = dummy, min2 = dummy;
int32_t min1_i = -1, min2_i = -1;
for (j = st; j < en; ++j) { // choose up to two minimum k-mers
if (mzcmp(&p->a[j], &min1) < 0) min2 = min1, min2_i = min1_i, min1 = p->a[j], min1_i = j;
else if (mzcmp(&p->a[j], &min2) < 0) min2 = p->a[j], min2_i = j;
ha_mz1_t min1 = dummy, min2 = dummy, min3 = dummy;
int32_t min1_i = -1, min2_i = -1, min3_i = -1;
for (j = st; j < en; ++j) { // choose up to three minimum k-mers
if (mzcmp(&p->a[j], &min1) < 0)
min3 = min2, min3_i = min2_i, min2 = min1, min2_i = min1_i, min1 = p->a[j], min1_i = j;
else if (mzcmp(&p->a[j], &min2) < 0)
min3 = min2, min3_i = min2_i, min2 = p->a[j], min2_i = j;
else if (mzcmp(&p->a[j], &min3) < 0)
min3 = p->a[j], min3_i = j;
}
if (min1_i >= 0 && p->a[min1_i].rid < pe - ps) {
p->a[min1_i].rid = 0;
if (min2_i >= 0 && p->a[min2_i].rid < pe - ps) {
p->a[min2_i].rid = 0;
if (min3_i >= 0 && p->a[min3_i].rid < pe - ps)
p->a[min3_i].rid = 0;
}
}
if (min1_i >= 0 && p->a[min1_i].rid < pe - ps) p->a[min1_i].rid = 0;
if (min2_i >= 0 && p->a[min2_i].rid < pe - ps) p->a[min2_i].rid = 0;
}
last0 = i;
}