mirror of
https://github.com/chhylp123/hifiasm.git
synced 2026-09-23 00:18:11 +08:00
ul_refine_alignment
This commit is contained in:
-140
@@ -1535,146 +1535,6 @@ inline int32_t comput_sc_ff(const k_mer_hit *ai, const k_mer_hit *aj, double bw_
|
||||
}
|
||||
return sc;
|
||||
}
|
||||
///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)
|
||||
{
|
||||
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, dq, dr, dd, pdd, 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) && ((((int64_t)a[i].offset)-((int64_t)a[j].offset))<=max_dis); --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:
|
||||
clear_fake_cigar(&(res->f_cigar));
|
||||
///a[] has been sorted by offset
|
||||
i = msc_i;
|
||||
res->x_pos_e = a[i].self_offset;
|
||||
res->y_pos_e = a[i].offset;
|
||||
res->shared_seed = msc;
|
||||
// res->overlapLen = movl;
|
||||
|
||||
dq = res->x_pos_e - a[i].self_offset;
|
||||
dr = res->y_pos_e - a[i].offset;
|
||||
dd = dr - dq; pdd = dd;
|
||||
///record first site
|
||||
///the length of f_cigar should be at least 1
|
||||
///record the offset of reference
|
||||
add_fake_cigar(&(res->f_cigar), a[i].self_offset, dd, NULL);
|
||||
cL = 0;
|
||||
if(res->x_pos_strand == 1) {
|
||||
while (i >= 0) {
|
||||
dq = res->x_pos_e - a[i].self_offset;
|
||||
dr = res->y_pos_e - a[i].offset;
|
||||
dd = dr - dq;
|
||||
if(dd != pdd) {
|
||||
pdd = dd;
|
||||
///record this site
|
||||
add_fake_cigar(&(res->f_cigar), a[i].self_offset, pdd, NULL);
|
||||
}
|
||||
t[cL++] = i;
|
||||
res->x_pos_s = a[i].self_offset;
|
||||
res->y_pos_s = a[i].offset;
|
||||
msc_i = i; i = p[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
while (i >= 0) {
|
||||
dq = res->x_pos_e - a[i].self_offset;
|
||||
dr = res->y_pos_e - a[i].offset;
|
||||
dd = dr - dq;
|
||||
if(dd == pdd) {
|
||||
res->f_cigar.length--;
|
||||
add_fake_cigar(&(res->f_cigar), a[i].self_offset, pdd, NULL);
|
||||
} else {
|
||||
pdd = dd;
|
||||
add_fake_cigar(&(res->f_cigar), a[i].self_offset, pdd, NULL);
|
||||
}
|
||||
t[cL++] = i;
|
||||
res->x_pos_s = a[i].self_offset;
|
||||
res->y_pos_s = a[i].offset;
|
||||
msc_i = i; i = p[i];
|
||||
}
|
||||
}
|
||||
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;
|
||||
for (i = 0; i < hcl; i++) {
|
||||
j = cL-i-1; kp = des[i]; des[i] = des[j]; des[j] = kp;
|
||||
|
||||
des[i].self_offset = xl-des[i].self_offset-1;
|
||||
des[i].offset = yl-des[i].offset-1;
|
||||
|
||||
des[j].self_offset = xl-des[j].self_offset-1;
|
||||
des[j].offset = yl-des[j].offset-1;
|
||||
}
|
||||
if(cL&1) {
|
||||
des[i].self_offset = xl-des[i].self_offset-1;
|
||||
des[i].offset = yl-des[i].offset-1;
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user