mirror of
https://github.com/chhylp123/hifiasm.git
synced 2026-09-25 05:18:11 +08:00
seperate alignment
This commit is contained in:
+160
-13
@@ -78,7 +78,7 @@ int get_fake_gap_shift(Fake_Cigar* x, int index)
|
||||
return result;
|
||||
}
|
||||
|
||||
void gen_fake_cigar(Fake_Cigar* z, overlap_region *o, int64_t apend_be, k_mer_hit* hit, int64_t n_hit, int64_t print)
|
||||
void gen_fake_cigar(Fake_Cigar* z, overlap_region *o, int64_t apend_be, k_mer_hit* hit, int64_t n_hit)
|
||||
{
|
||||
int64_t k, dq, dr, dd, pdd; z->length = 0;
|
||||
if(apend_be == 1) add_fake_cigar(z, o->x_pos_s, 0, NULL);
|
||||
@@ -86,10 +86,10 @@ void gen_fake_cigar(Fake_Cigar* z, overlap_region *o, int64_t apend_be, k_mer_hi
|
||||
dq = hit[k].self_offset - o->x_pos_s;
|
||||
dr = hit[k].offset - o->y_pos_s;
|
||||
dd = dr - dq;
|
||||
if(print) {
|
||||
fprintf(stderr, "[M::k->%lu] x::%u, y::%u, cnt::%u, dd::%ld, pdd::%ld, z->n::%u\n",
|
||||
k, hit[k].self_offset, hit[k].offset, hit[k].cnt&(0xffu), dd, pdd, z->length);
|
||||
}
|
||||
// if(print) {
|
||||
// fprintf(stderr, "[M::k->%lu] x::%u, y::%u, cnt::%u, dd::%ld, pdd::%ld, z->n::%u\n",
|
||||
// k, hit[k].self_offset, hit[k].offset, hit[k].cnt&(0xffu), dd, pdd, z->length);
|
||||
// }
|
||||
if(dd != pdd) {
|
||||
pdd = dd;
|
||||
add_fake_cigar(z, hit[k].self_offset, pdd, NULL);
|
||||
@@ -103,7 +103,7 @@ void gen_fake_cigar(Fake_Cigar* z, overlap_region *o, int64_t apend_be, k_mer_hi
|
||||
|
||||
void debug_cigar(Fake_Cigar* z, overlap_region *o, int64_t apend_be, k_mer_hit* hit, uint64_t n_hit)
|
||||
{
|
||||
gen_fake_cigar(z, o, apend_be, hit, n_hit, 0);
|
||||
gen_fake_cigar(z, o, apend_be, hit, n_hit);
|
||||
if(!((z->length==o->f_cigar.length) &&
|
||||
(!memcmp(z->buffer, o->f_cigar.buffer, sizeof((*(o->f_cigar.buffer)))*o->f_cigar.length)))) {
|
||||
uint64_t k;
|
||||
@@ -116,7 +116,7 @@ void debug_cigar(Fake_Cigar* z, overlap_region *o, int64_t apend_be, k_mer_hit*
|
||||
fprintf(stderr, "[o::k->%lu] pos::%d, off::%d\n", k,
|
||||
get_fake_gap_pos(&(o->f_cigar), k), get_fake_gap_shift(&(o->f_cigar), k));
|
||||
}
|
||||
gen_fake_cigar(z, o, apend_be, hit, n_hit, 1);
|
||||
// gen_fake_cigar(z, o, apend_be, hit, n_hit, 1);
|
||||
// for (k = 0; k < o->f_cigar.length; k++) {
|
||||
// fprintf(stderr, "[M::k->%lu] x::%u, y::%u, cnt::%u\n",
|
||||
// k, hit[k].self_offset, hit[k].offset, hit[k].cnt&(0xffu));
|
||||
@@ -125,6 +125,7 @@ void debug_cigar(Fake_Cigar* z, overlap_region *o, int64_t apend_be, k_mer_hit*
|
||||
}
|
||||
}
|
||||
|
||||
///for backup
|
||||
int ovlp_chain_gen(overlap_region_alloc* ol, overlap_region* t, int64_t xl, int64_t yl, int64_t apend_be, k_mer_hit* hit, int64_t n_hit)
|
||||
{
|
||||
if (ol->length + 1 > ol->size) {
|
||||
@@ -146,6 +147,65 @@ int ovlp_chain_gen(overlap_region_alloc* ol, overlap_region* t, int64_t xl, int6
|
||||
}
|
||||
}
|
||||
|
||||
int64_t xr, yr;
|
||||
if(t->x_pos_s <= t->y_pos_s) {
|
||||
t->y_pos_s -= t->x_pos_s; t->x_pos_s = 0;
|
||||
} else {
|
||||
t->x_pos_s -= t->y_pos_s; t->y_pos_s = 0;
|
||||
}
|
||||
|
||||
xr = xl-t->x_pos_e-1; yr = yl-t->y_pos_e-1;
|
||||
if(xr <= yr) {
|
||||
t->x_pos_e = xl-1; t->y_pos_e += xr;
|
||||
} else {
|
||||
t->y_pos_e = yl-1; t->x_pos_e += yr;
|
||||
}
|
||||
|
||||
overlap_region *o = &(ol->list[ol->length++]);
|
||||
o->shared_seed = t->shared_seed;
|
||||
o->align_length = 0;
|
||||
o->is_match = 0;
|
||||
o->non_homopolymer_errors = 0;
|
||||
o->strong = 0;
|
||||
o->x_id = t->x_id;
|
||||
o->y_id = t->y_id;
|
||||
o->x_pos_strand = 0;///always 0
|
||||
o->y_pos_strand = t->x_pos_strand;
|
||||
|
||||
if (t->x_pos_strand == 1) {
|
||||
o->x_pos_e = xl-t->x_pos_s-1; o->x_pos_s = xl-t->x_pos_e-1;
|
||||
o->y_pos_e = yl-t->y_pos_s-1; o->y_pos_s = yl-t->y_pos_e-1;
|
||||
} else {
|
||||
o->x_pos_e = t->x_pos_e; o->x_pos_s = t->x_pos_s;
|
||||
o->y_pos_e = t->y_pos_e; o->y_pos_s = t->y_pos_s;
|
||||
}
|
||||
///debug
|
||||
// debug_cigar(&(t->f_cigar), o, apend_be, hit, n_hit);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ovlp_chain_gen_fcigar(overlap_region_alloc* ol, overlap_region* t, int64_t xl, int64_t yl, int64_t apend_be, k_mer_hit* hit, int64_t n_hit)
|
||||
{
|
||||
if (ol->length + 1 > ol->size) {
|
||||
uint64_t sl = ol->size;
|
||||
ol->size = ol->length + 1;
|
||||
kroundup64(ol->size);
|
||||
REALLOC(ol->list, ol->size);
|
||||
/// need to set new space to be 0
|
||||
memset(ol->list + sl, 0, sizeof(overlap_region)*(ol->size - sl));
|
||||
}
|
||||
|
||||
if ((ol->length!=0) && (ol->list[ol->length-1].y_id==t->y_id)) {
|
||||
if((ol->list[ol->length-1].shared_seed > t->shared_seed) ||
|
||||
((ol->list[ol->length-1].shared_seed == t->shared_seed) &&
|
||||
(ol->list[ol->length-1].overlapLen <= t->overlapLen))) {
|
||||
return 0;
|
||||
} else {
|
||||
ol->length--;
|
||||
}
|
||||
}
|
||||
|
||||
int64_t xr, yr, dd, pdd, dq, dr, id, i, fn;
|
||||
if(t->x_pos_s <= t->y_pos_s) {
|
||||
t->y_pos_s -= t->x_pos_s; t->x_pos_s = 0;
|
||||
@@ -1259,7 +1319,7 @@ int32_t lchain_check(k_mer_hit *a, int32_t n_a, Chain_Data *dp, double bw_thres)
|
||||
dr = (int32_t)a[n_a-1].offset - (int32_t)a[0].offset;
|
||||
dd = ((dq>=dr)? (dq-dr): (dr-dq));//gap
|
||||
dg = ((dq>=dr)? (dr): (dq));///len
|
||||
if (dd > (dg*bw_thres)) return -1;
|
||||
if (dg == 0 || dd > (dg*bw_thres)) return -1;
|
||||
}
|
||||
|
||||
for (i = 1; i < n_a; ++i) {///a[] is sorted by offset, instead of self_offset; but offset might be equal
|
||||
@@ -1275,6 +1335,7 @@ int32_t lchain_check(k_mer_hit *a, int32_t n_a, Chain_Data *dp, double bw_thres)
|
||||
dr = (int32_t)a[i].offset - (int32_t)a[i-1].offset;
|
||||
dd = ((dq>=dr)? (dq-dr): (dr-dq));//gap
|
||||
dg = ((dq>=dr)? (dr): (dq));///len
|
||||
if(dg == 0) break;
|
||||
|
||||
tot_g += dd;
|
||||
if (dd > THRESHOLD_MAX_SIZE && dd > (dg*bw_thres)) break;
|
||||
@@ -1318,9 +1379,9 @@ inline int32_t comput_sc_ch(const k_mer_hit *ai, const k_mer_hit *aj, double bw_
|
||||
///ai is the suffix of aj
|
||||
int32_t dq, dr, dd, dg, q_span, sc;
|
||||
dq = (int64_t)(ai->self_offset) - (int64_t)(aj->self_offset);
|
||||
if(dq < 0) return INT32_MIN;
|
||||
if(dq <= 0) return INT32_MIN;
|
||||
dr = (int64_t)(ai->offset) - (int64_t)(aj->offset);
|
||||
if(dr < 0) return INT32_MIN;
|
||||
if(dr <= 0) return INT32_MIN;
|
||||
dd = dr > dq? dr - dq : dq - dr;//gap
|
||||
if((dd > 16) && (dd > cal_bw(ai, aj, bw_rate, sl, ol))) return INT32_MIN;
|
||||
dg = dr < dq? dr : dq;//len
|
||||
@@ -1337,8 +1398,8 @@ inline int32_t comput_sc_ch(const k_mer_hit *ai, const k_mer_hit *aj, double bw_
|
||||
}
|
||||
return sc;
|
||||
}
|
||||
|
||||
uint64_t lchain_dp(k_mer_hit* a, int64_t a_n, k_mer_hit* des, Chain_Data* dp, overlap_region* res,
|
||||
///for backuo
|
||||
uint64_t lchain_dp_fciagr(k_mer_hit* a, int64_t a_n, k_mer_hit* des, Chain_Data* dp, overlap_region* res,
|
||||
int64_t max_skip, int64_t max_iter, int64_t max_dis, double chn_pen_gap, double chn_pen_skip, double bw_rate,
|
||||
int64_t xl, int64_t yl, int64_t quick_check)
|
||||
{
|
||||
@@ -1455,7 +1516,7 @@ uint64_t lchain_dp(k_mer_hit* a, int64_t a_n, k_mer_hit* des, Chain_Data* dp, ov
|
||||
msc_i = i; i = p[i];
|
||||
}
|
||||
}
|
||||
res->overlapLen = get_chainLen(a[msc_i].self_offset, a[i].self_offset, xl, a[msc_i].offset, a[i].offset, yl);
|
||||
res->overlapLen = get_chainLen(res->x_pos_s, res->x_pos_e, xl, res->y_pos_s, res->y_pos_e, yl);
|
||||
for (i = 0; i < cL; i++) des[i] = a[t[cL-i-1]];
|
||||
if(res->x_pos_strand) {
|
||||
int64_t hcl = cL>>1; k_mer_hit kp;
|
||||
@@ -1474,5 +1535,91 @@ uint64_t lchain_dp(k_mer_hit* a, int64_t a_n, k_mer_hit* des, Chain_Data* dp, ov
|
||||
}
|
||||
}
|
||||
|
||||
return cL;
|
||||
}
|
||||
|
||||
|
||||
uint64_t lchain_dp(k_mer_hit* a, int64_t a_n, k_mer_hit* des, Chain_Data* dp, overlap_region* res,
|
||||
int64_t max_skip, int64_t max_iter, int64_t max_dis, double chn_pen_gap, double chn_pen_skip, double bw_rate,
|
||||
int64_t xl, int64_t yl, int64_t quick_check)
|
||||
{
|
||||
int64_t *p, *t, max_f, n_skip, st, max_j, end_j, sc, msc, msc_i, bw, max_ii, ovl, movl;
|
||||
int32_t *f, max, tmp; int64_t i, j, ret, cL = 0;
|
||||
resize_Chain_Data(dp, a_n, NULL);
|
||||
t = dp->tmp; f = dp->score; p = dp->pre;
|
||||
bw = ((xl < yl)?xl:yl); bw *= bw_rate;
|
||||
msc = msc_i = -1; movl = INT32_MAX;
|
||||
|
||||
if(quick_check) {
|
||||
ret = lchain_check(a, a_n, dp, bw_rate);
|
||||
if (ret > 0) {
|
||||
a_n = ret; msc_i = a_n-1; msc = f[msc_i];
|
||||
goto skip_ldp;
|
||||
}
|
||||
}
|
||||
|
||||
memset(t, 0, (a_n*sizeof((*t))));
|
||||
for (i = st = 0, max_ii = -1; i < a_n; ++i) {
|
||||
max_f = a[i].cnt&(0xffu);
|
||||
n_skip = 0; max_j = end_j = -1;
|
||||
if ((i-st) > max_iter) st = i-max_iter;
|
||||
|
||||
for (j = i - 1; j >= st; --j) {
|
||||
sc = comput_sc_ch(&a[i], &a[j], bw_rate, chn_pen_gap, chn_pen_skip, xl, yl);
|
||||
if (sc == INT32_MIN) continue;
|
||||
sc += f[j];
|
||||
if (sc > max_f) {
|
||||
max_f = sc, max_j = j;
|
||||
if (n_skip > 0) --n_skip;
|
||||
} else if (t[j] == (int32_t)i) {
|
||||
if (++n_skip > max_skip)
|
||||
break;
|
||||
}
|
||||
if (p[j] >= 0) t[p[j]] = i;
|
||||
}
|
||||
end_j = j;
|
||||
|
||||
if (max_ii < 0 || ((int64_t)a[i].offset) - ((int64_t)a[max_ii].offset) > max_dis) {
|
||||
max = INT32_MIN; max_ii = -1;
|
||||
for (j = i - 1; j >= st; --j) {
|
||||
if (max < f[j]) {
|
||||
max = f[j], max_ii = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (max_ii >= 0 && max_ii < end_j) {///just have a try with a[i]<->a[max_ii]
|
||||
tmp = comput_sc_ch(&a[i], &a[max_ii], bw_rate, chn_pen_gap, chn_pen_skip, xl, yl);
|
||||
if (tmp != INT32_MIN && max_f < tmp + f[max_ii])
|
||||
max_f = tmp + f[max_ii], max_j = max_ii;
|
||||
}
|
||||
f[i] = max_f; p[i] = max_j;
|
||||
if ((max_ii < 0) || (((((int64_t)a[i].offset)-((int64_t)a[max_ii].offset))<=max_dis) && (f[max_ii]<f[i]))) {
|
||||
max_ii = i;
|
||||
}
|
||||
if(f[i] >= msc) {
|
||||
ovl = get_chainLen(a[i].self_offset, a[i].self_offset, xl, a[i].offset, a[i].offset, yl);
|
||||
if(f[i] > msc || ovl < movl) {
|
||||
msc = f[i]; msc_i = i; movl = ovl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
skip_ldp:
|
||||
///a[] has been sorted by offset
|
||||
i = msc_i;
|
||||
res->x_pos_s = res->x_pos_e = a[i].self_offset;
|
||||
res->y_pos_s = res->y_pos_e = a[i].offset;
|
||||
res->shared_seed = msc;
|
||||
|
||||
cL = 0;
|
||||
while (i >= 0) {
|
||||
t[cL++] = i; msc_i = i; i = p[i];
|
||||
}
|
||||
|
||||
res->x_pos_s = a[t[cL-1]].self_offset;
|
||||
res->y_pos_s = a[t[cL-1]].offset;
|
||||
res->overlapLen = get_chainLen(res->x_pos_s, res->x_pos_e, xl, res->y_pos_s, res->y_pos_e, yl);
|
||||
for (i = 0; i < cL; i++) des[i] = a[t[cL-i-1]];
|
||||
return cL;
|
||||
}
|
||||
Reference in New Issue
Block a user