mirror of
https://github.com/chhylp123/hifiasm.git
synced 2026-10-08 02:08:12 +08:00
more cutting methods
This commit is contained in:
+25
-16
@@ -1180,6 +1180,7 @@ void push_overlaps(ma_hit_t_alloc* paf, overlap_region_alloc* overlap_list, int
|
|||||||
|
|
||||||
tmp.bl = R_INF.read_length[overlap_list->list[i].y_id];
|
tmp.bl = R_INF.read_length[overlap_list->list[i].y_id];
|
||||||
tmp.ml = overlap_list->list[i].strong;
|
tmp.ml = overlap_list->list[i].strong;
|
||||||
|
tmp.no_l_indel = overlap_list->list[i].without_large_indel;
|
||||||
|
|
||||||
add_ma_hit_t_alloc(paf, &tmp);
|
add_ma_hit_t_alloc(paf, &tmp);
|
||||||
}
|
}
|
||||||
@@ -1281,7 +1282,7 @@ overlap_region_alloc* overlap_list, UC_Read* x_read, UC_Read* y_read)
|
|||||||
|
|
||||||
tmp.bl = R_INF.read_length[overlap_list->list[i].y_id];
|
tmp.bl = R_INF.read_length[overlap_list->list[i].y_id];
|
||||||
tmp.ml = overlap_list->list[i].strong;
|
tmp.ml = overlap_list->list[i].strong;
|
||||||
|
tmp.no_l_indel = overlap_list->list[i].without_large_indel;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1842,7 +1843,7 @@ void* Overlap_calculate_heap_merge(void* arg)
|
|||||||
long long num_correct_base = 0;
|
long long num_correct_base = 0;
|
||||||
long long num_second_correct_base = 0;
|
long long num_second_correct_base = 0;
|
||||||
long long j;
|
long long j;
|
||||||
int fully_cov;
|
int fully_cov, abnormal;
|
||||||
|
|
||||||
int thr_ID = *((int*)arg);
|
int thr_ID = *((int*)arg);
|
||||||
uint64_t POA_i;
|
uint64_t POA_i;
|
||||||
@@ -1919,7 +1920,7 @@ void* Overlap_calculate_heap_merge(void* arg)
|
|||||||
|
|
||||||
correct_overlap(&overlap_list, &R_INF, &g_read, &correct, &overlap_read, &POA_Graph, &DAGCon,
|
correct_overlap(&overlap_list, &R_INF, &g_read, &correct, &overlap_read, &POA_Graph, &DAGCon,
|
||||||
&matched_overlap_0, &matched_overlap_1, &potiental_matched_overlap_0, &potiental_matched_overlap_1,
|
&matched_overlap_0, &matched_overlap_1, &potiental_matched_overlap_0, &potiental_matched_overlap_1,
|
||||||
¤t_cigar, &hap, &second_round, 0, 1, &fully_cov);
|
¤t_cigar, &hap, &second_round, 0, 1, &fully_cov, &abnormal);
|
||||||
|
|
||||||
num_read_base = num_read_base + g_read.length;
|
num_read_base = num_read_base + g_read.length;
|
||||||
num_correct_base = num_correct_base + correct.corrected_base;
|
num_correct_base = num_correct_base + correct.corrected_base;
|
||||||
@@ -1933,18 +1934,6 @@ void* Overlap_calculate_heap_merge(void* arg)
|
|||||||
R_INF.paf[i].is_fully_corrected = 0;
|
R_INF.paf[i].is_fully_corrected = 0;
|
||||||
if(fully_cov)
|
if(fully_cov)
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
if(current_cigar.length == 1 && second_round.cigar.length == 1)
|
|
||||||
{
|
|
||||||
if(Get_Cigar_Type(current_cigar.record[0]) == 0 &&
|
|
||||||
Get_Cigar_Length(current_cigar.record[0]) == g_read.length &&
|
|
||||||
Get_Cigar_Type(second_round.cigar.record[0]) == 0 &&
|
|
||||||
Get_Cigar_Length(second_round.cigar.record[0]) == g_read.length)
|
|
||||||
{
|
|
||||||
R_INF.paf[i].is_fully_corrected = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
**/
|
|
||||||
if(
|
if(
|
||||||
get_cigar_errors(¤t_cigar) == 0
|
get_cigar_errors(¤t_cigar) == 0
|
||||||
&&
|
&&
|
||||||
@@ -1953,6 +1942,10 @@ void* Overlap_calculate_heap_merge(void* arg)
|
|||||||
R_INF.paf[i].is_fully_corrected = 1;
|
R_INF.paf[i].is_fully_corrected = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
R_INF.paf[i].is_abnormal = abnormal;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
push_overlaps(&(R_INF.paf[i]), &overlap_list, 1);
|
push_overlaps(&(R_INF.paf[i]), &overlap_list, 1);
|
||||||
@@ -2828,8 +2821,8 @@ void* Final_overlap_calculate_heap_merge(void* arg)
|
|||||||
long long matched_overlap_1 = 0;
|
long long matched_overlap_1 = 0;
|
||||||
long long potiental_matched_overlap_0 = 0;
|
long long potiental_matched_overlap_0 = 0;
|
||||||
long long potiental_matched_overlap_1 = 0;
|
long long potiental_matched_overlap_1 = 0;
|
||||||
long long num_read_base = 0;
|
|
||||||
long long num_correct_base = 0;
|
long long num_correct_base = 0;
|
||||||
|
long long num_read_base = 0;
|
||||||
long long num_second_correct_base = 0;
|
long long num_second_correct_base = 0;
|
||||||
long long j, inner_j;
|
long long j, inner_j;
|
||||||
|
|
||||||
@@ -2937,6 +2930,7 @@ void* Final_overlap_calculate_heap_merge(void* arg)
|
|||||||
|
|
||||||
overlap_list.list[j].is_match = 1;
|
overlap_list.list[j].is_match = 1;
|
||||||
overlap_list.list[j].strong = R_INF.paf[i].buffer[inner_j].ml;
|
overlap_list.list[j].strong = R_INF.paf[i].buffer[inner_j].ml;
|
||||||
|
overlap_list.list[j].without_large_indel = R_INF.paf[i].buffer[inner_j].no_l_indel;
|
||||||
overlap_list.mapped_overlaps_length++;
|
overlap_list.mapped_overlaps_length++;
|
||||||
|
|
||||||
if(overlap_list.list[j].strong == 1)
|
if(overlap_list.list[j].strong == 1)
|
||||||
@@ -2951,6 +2945,15 @@ void* Final_overlap_calculate_heap_merge(void* arg)
|
|||||||
{
|
{
|
||||||
fprintf(stderr, "error\n");
|
fprintf(stderr, "error\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(overlap_list.list[j].without_large_indel == 0)
|
||||||
|
{
|
||||||
|
num_second_correct_base++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
inner_j++;
|
inner_j++;
|
||||||
@@ -2958,6 +2961,7 @@ void* Final_overlap_calculate_heap_merge(void* arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///recover missing exact overlaps
|
||||||
reverse_complement(g_read.seq, g_read.length);
|
reverse_complement(g_read.seq, g_read.length);
|
||||||
for (j = 0; j < overlap_list.length; j++)
|
for (j = 0; j < overlap_list.length; j++)
|
||||||
{
|
{
|
||||||
@@ -2978,6 +2982,7 @@ void* Final_overlap_calculate_heap_merge(void* arg)
|
|||||||
{
|
{
|
||||||
overlap_list.list[j].is_match = 1;
|
overlap_list.list[j].is_match = 1;
|
||||||
overlap_list.list[j].strong = 0;
|
overlap_list.list[j].strong = 0;
|
||||||
|
overlap_list.list[j].without_large_indel = 1;
|
||||||
overlap_list.mapped_overlaps_length++;
|
overlap_list.mapped_overlaps_length++;
|
||||||
potiental_matched_overlap_0++;
|
potiental_matched_overlap_0++;
|
||||||
}
|
}
|
||||||
@@ -3024,11 +3029,15 @@ void* Final_overlap_calculate_heap_merge(void* arg)
|
|||||||
total_potiental_matched_overlap_0 += potiental_matched_overlap_0;
|
total_potiental_matched_overlap_0 += potiental_matched_overlap_0;
|
||||||
total_potiental_matched_overlap_1 += potiental_matched_overlap_1;
|
total_potiental_matched_overlap_1 += potiental_matched_overlap_1;
|
||||||
total_num_correct_base += num_correct_base;
|
total_num_correct_base += num_correct_base;
|
||||||
|
total_second_num_correct_base += num_second_correct_base;
|
||||||
|
|
||||||
|
|
||||||
complete_threads++;
|
complete_threads++;
|
||||||
if(complete_threads == thread_num)
|
if(complete_threads == thread_num)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
fprintf(stderr, "overlaps with large indels: %llu\n", total_second_num_correct_base);
|
||||||
fprintf(stderr, "weak overlaps: %llu\n", total_matched_overlap_0);
|
fprintf(stderr, "weak overlaps: %llu\n", total_matched_overlap_0);
|
||||||
fprintf(stderr, "strong overlaps: %llu\n", total_matched_overlap_1);
|
fprintf(stderr, "strong overlaps: %llu\n", total_matched_overlap_1);
|
||||||
fprintf(stderr, "recover weak overlaps: %llu\n", total_potiental_matched_overlap_0);
|
fprintf(stderr, "recover weak overlaps: %llu\n", total_potiental_matched_overlap_0);
|
||||||
|
|||||||
+160
-12
@@ -6695,7 +6695,7 @@ void generate_consensus(overlap_region_alloc* overlap_list, All_reads* R_INF,
|
|||||||
|
|
||||||
|
|
||||||
inline int get_available_fully_covered_interval(long long window_start, long long window_end,
|
inline int get_available_fully_covered_interval(long long window_start, long long window_end,
|
||||||
overlap_region_alloc* overlap_list, Correct_dumy* dumy, long long* real_length)
|
overlap_region_alloc* overlap_list, Correct_dumy* dumy, long long* real_length, long long* real_length_100)
|
||||||
{
|
{
|
||||||
long long i;
|
long long i;
|
||||||
int flag = 0;
|
int flag = 0;
|
||||||
@@ -6745,9 +6745,13 @@ overlap_region_alloc* overlap_list, Correct_dumy* dumy, long long* real_length)
|
|||||||
|
|
||||||
if (overlap_length == Len && overlap_list->list[i].is_match == 1)
|
if (overlap_length == Len && overlap_list->list[i].is_match == 1)
|
||||||
{
|
{
|
||||||
//dumy->length++;
|
|
||||||
(*real_length)++;
|
(*real_length)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (overlap_length == Len && overlap_list->list[i].is_match == 100)
|
||||||
|
{
|
||||||
|
(*real_length_100)++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(overlap_list->list[i].x_pos_s > window_end)
|
if(overlap_list->list[i].x_pos_s > window_end)
|
||||||
@@ -6768,17 +6772,19 @@ overlap_region_alloc* overlap_list, Correct_dumy* dumy, long long* real_length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int check_if_fully_covered(overlap_region_alloc* overlap_list,
|
int check_if_fully_covered(overlap_region_alloc* overlap_list,
|
||||||
All_reads* R_INF, UC_Read* g_read, Correct_dumy* dumy, Graph* g)
|
All_reads* R_INF, UC_Read* g_read, Correct_dumy* dumy, Graph* g, int* abnormal)
|
||||||
{
|
{
|
||||||
|
|
||||||
long long overlap_length;
|
long long overlap_length;
|
||||||
long long window_start, window_end;
|
long long window_start, window_end;
|
||||||
|
int return_flag = 1;
|
||||||
|
(*abnormal) = 0;
|
||||||
|
|
||||||
Window_Pool w_inf;
|
Window_Pool w_inf;
|
||||||
init_Window_Pool(&w_inf, g_read->length, WINDOW, TAIL_LENGTH);
|
init_Window_Pool(&w_inf, g_read->length, WINDOW, TAIL_LENGTH);
|
||||||
|
|
||||||
int flag = 0;
|
int flag = 0;
|
||||||
long long realLen;
|
long long realLen, tmpLen;
|
||||||
while(get_Window(&w_inf, &window_start, &window_end) && flag != -2)
|
while(get_Window(&w_inf, &window_start, &window_end) && flag != -2)
|
||||||
{
|
{
|
||||||
dumy->length = 0;
|
dumy->length = 0;
|
||||||
@@ -6788,7 +6794,7 @@ All_reads* R_INF, UC_Read* g_read, Correct_dumy* dumy, Graph* g)
|
|||||||
///dumy->lengthNT返回的是有效不完全重叠的数量
|
///dumy->lengthNT返回的是有效不完全重叠的数量
|
||||||
///return overlaps that is overlaped with [window_start, window_end]
|
///return overlaps that is overlaped with [window_start, window_end]
|
||||||
flag = get_available_fully_covered_interval(window_start, window_end,
|
flag = get_available_fully_covered_interval(window_start, window_end,
|
||||||
overlap_list, dumy, &realLen);
|
overlap_list, dumy, &realLen, &tmpLen);
|
||||||
|
|
||||||
|
|
||||||
switch (flag)
|
switch (flag)
|
||||||
@@ -6803,12 +6809,26 @@ All_reads* R_INF, UC_Read* g_read, Correct_dumy* dumy, Graph* g)
|
|||||||
|
|
||||||
if(realLen < MIN_COVERAGE_THRESHOLD * 2)
|
if(realLen < MIN_COVERAGE_THRESHOLD * 2)
|
||||||
{
|
{
|
||||||
return 0;
|
return_flag = 0;
|
||||||
|
//return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(realLen == 0)
|
||||||
|
{
|
||||||
|
///that means this window is a middle window
|
||||||
|
if(window_start != 0 && window_end != g_read->length - 1)
|
||||||
|
{
|
||||||
|
(*abnormal) = 1;
|
||||||
|
}
|
||||||
|
else if((*abnormal)==0)
|
||||||
|
{
|
||||||
|
(*abnormal) = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return return_flag;
|
||||||
return 1;
|
//return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -9430,6 +9450,132 @@ int force_repeat)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void lable_large_indels(overlap_region_alloc* overlap_list, All_reads* R_INF, long long read_length,
|
||||||
|
Correct_dumy* dumy)
|
||||||
|
{
|
||||||
|
long long i, j;
|
||||||
|
long long cigar_i, operation, operationLen;
|
||||||
|
int is_delete = 0;
|
||||||
|
CIGAR* cigar;
|
||||||
|
for (i = 0; i < overlap_list->length; i++)
|
||||||
|
{
|
||||||
|
///should has at least 3 windows for this overlap
|
||||||
|
if (overlap_list->list[i].is_match == 1 && overlap_list->list[i].w_list_length >= 3)
|
||||||
|
{
|
||||||
|
///here w_list_length >= 3
|
||||||
|
///skip the first and last window
|
||||||
|
for (j = 1; j < overlap_list->list[i].w_list_length - 1; j++)
|
||||||
|
{
|
||||||
|
///this window is not matched, it seems to have large difference
|
||||||
|
if(overlap_list->list[i].w_list[j].y_end == -1)
|
||||||
|
{
|
||||||
|
overlap_list->list[i].is_match = 100;
|
||||||
|
is_delete = 1;
|
||||||
|
goto end_rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
cigar = &(overlap_list->list[i].w_list[j].cigar);
|
||||||
|
///if there are <=2 cigar elements, skip it
|
||||||
|
if(cigar->length < 3)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
///skip the first and last cigar elements
|
||||||
|
for (cigar_i = 1; cigar_i < cigar->length - 1; cigar_i++)
|
||||||
|
{
|
||||||
|
operation = cigar->C_C[cigar_i];
|
||||||
|
operationLen = cigar->C_L[cigar_i];
|
||||||
|
|
||||||
|
if(operationLen <= 5)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
///>=6 bp deletion or insertion
|
||||||
|
if(operation == 2 || operation == 3)
|
||||||
|
{
|
||||||
|
overlap_list->list[i].is_match = 100;
|
||||||
|
is_delete = 1;
|
||||||
|
goto end_rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end_rem:
|
||||||
|
overlap_list->list[i].w_list_length >= 3;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(is_delete == 1)
|
||||||
|
{
|
||||||
|
long long overlap_length;
|
||||||
|
long long window_start, window_end;
|
||||||
|
Window_Pool w_inf;
|
||||||
|
init_Window_Pool(&w_inf, read_length, WINDOW, TAIL_LENGTH);
|
||||||
|
int flag = 0;
|
||||||
|
long long realLen, realLen_100;
|
||||||
|
int to_recover = 0;
|
||||||
|
while(get_Window(&w_inf, &window_start, &window_end) && flag != -2)
|
||||||
|
{
|
||||||
|
dumy->length = 0;
|
||||||
|
dumy->lengthNT = 0;
|
||||||
|
///flag返回的是重叠数量
|
||||||
|
///dumy->length返回的是有效完全重叠的数量
|
||||||
|
///dumy->lengthNT返回的是有效不完全重叠的数量
|
||||||
|
///return overlaps that is overlaped with [window_start, window_end]
|
||||||
|
flag = get_available_fully_covered_interval(window_start, window_end,
|
||||||
|
overlap_list, dumy, &realLen, &realLen_100);
|
||||||
|
|
||||||
|
|
||||||
|
switch (flag)
|
||||||
|
{
|
||||||
|
case 1: ///找到匹配
|
||||||
|
break;
|
||||||
|
case 0: ///没找到匹配
|
||||||
|
break;
|
||||||
|
case -2: ///下一个window也不会存在匹配, 直接跳出
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
///it seems there is a long indel at the reference read itself
|
||||||
|
if(realLen == 0 && realLen_100 > 0)
|
||||||
|
{
|
||||||
|
to_recover = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(to_recover == 1)
|
||||||
|
{
|
||||||
|
for (i = 0; i < overlap_list->length; i++)
|
||||||
|
{
|
||||||
|
if (overlap_list->list[i].is_match == 100)
|
||||||
|
{
|
||||||
|
overlap_list->list[i].is_match = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < overlap_list->length; i++)
|
||||||
|
{
|
||||||
|
if (overlap_list->list[i].is_match == 1)
|
||||||
|
{
|
||||||
|
overlap_list->list[i].without_large_indel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (overlap_list->list[i].is_match == 100)
|
||||||
|
{
|
||||||
|
overlap_list->list[i].is_match = 1;
|
||||||
|
overlap_list->list[i].without_large_indel = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -10285,6 +10431,8 @@ void partition_overlaps(overlap_region_alloc* overlap_list, All_reads* R_INF,
|
|||||||
generate_haplotypes_DP(hap, overlap_list, R_INF, g_read->length, force_repeat);
|
generate_haplotypes_DP(hap, overlap_list, R_INF, g_read->length, force_repeat);
|
||||||
///generate_haplotypes_naive(hap, overlap_list, R_INF, g_read->length, force_repeat);
|
///generate_haplotypes_naive(hap, overlap_list, R_INF, g_read->length, force_repeat);
|
||||||
|
|
||||||
|
lable_large_indels(overlap_list, R_INF, g_read->length, dumy);
|
||||||
|
|
||||||
|
|
||||||
///debug_snp_matrix(hap);
|
///debug_snp_matrix(hap);
|
||||||
}
|
}
|
||||||
@@ -10542,7 +10690,7 @@ void correct_overlap(overlap_region_alloc* overlap_list, All_reads* R_INF,
|
|||||||
long long* potiental_matched_overlap_0, long long* potiental_matched_overlap_1,
|
long long* potiental_matched_overlap_0, long long* potiental_matched_overlap_1,
|
||||||
Cigar_record* current_cigar, haplotype_evdience_alloc* hap,
|
Cigar_record* current_cigar, haplotype_evdience_alloc* hap,
|
||||||
Round2_alignment* second_round, int force_repeat, int is_consensus,
|
Round2_alignment* second_round, int force_repeat, int is_consensus,
|
||||||
int* fully_cov)
|
int* fully_cov, int* abnormal)
|
||||||
{
|
{
|
||||||
reverse_complement(g_read->seq, g_read->length);
|
reverse_complement(g_read->seq, g_read->length);
|
||||||
|
|
||||||
@@ -10594,8 +10742,8 @@ void correct_overlap(overlap_region_alloc* overlap_list, All_reads* R_INF,
|
|||||||
partition_overlaps(overlap_list, R_INF, g_read, dumy, hap, force_repeat);
|
partition_overlaps(overlap_list, R_INF, g_read, dumy, hap, force_repeat);
|
||||||
|
|
||||||
|
|
||||||
print_overlap("m64016_190918_162737/53545052/ccs",
|
// print_overlap("m64016_190918_162737/53545052/ccs",
|
||||||
overlap_list->list[0].x_id, overlap_list, R_INF, 1);
|
// overlap_list->list[0].x_id, overlap_list, R_INF, 1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -10606,7 +10754,7 @@ void correct_overlap(overlap_region_alloc* overlap_list, All_reads* R_INF,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
(*fully_cov) = check_if_fully_covered(overlap_list, R_INF, g_read, dumy, g);
|
(*fully_cov) = check_if_fully_covered(overlap_list, R_INF, g_read, dumy, g, abnormal);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1230,7 +1230,7 @@ void correct_overlap(overlap_region_alloc* overlap_list, All_reads* R_INF,
|
|||||||
long long* potiental_matched_overlap_0, long long* potiental_matched_overlap_1,
|
long long* potiental_matched_overlap_0, long long* potiental_matched_overlap_1,
|
||||||
Cigar_record* current_cigar, haplotype_evdience_alloc* hap,
|
Cigar_record* current_cigar, haplotype_evdience_alloc* hap,
|
||||||
Round2_alignment* second_round, int force_repeat, int is_consensus,
|
Round2_alignment* second_round, int force_repeat, int is_consensus,
|
||||||
int* fully_cov);
|
int* fully_cov, int* abnormal);
|
||||||
void init_Correct_dumy(Correct_dumy* list);
|
void init_Correct_dumy(Correct_dumy* list);
|
||||||
void destory_Correct_dumy(Correct_dumy* list);
|
void destory_Correct_dumy(Correct_dumy* list);
|
||||||
void clear_Correct_dumy(Correct_dumy* list, overlap_region_alloc* overlap_list);
|
void clear_Correct_dumy(Correct_dumy* list, overlap_region_alloc* overlap_list);
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ typedef struct
|
|||||||
uint64_t align_length;
|
uint64_t align_length;
|
||||||
///uint64_t total_errors;
|
///uint64_t total_errors;
|
||||||
uint8_t is_match;
|
uint8_t is_match;
|
||||||
|
uint8_t without_large_indel;
|
||||||
uint64_t non_homopolymer_errors;
|
uint64_t non_homopolymer_errors;
|
||||||
|
|
||||||
window_list* w_list;
|
window_list* w_list;
|
||||||
|
|||||||
+468
-89
@@ -354,6 +354,17 @@ inline void set_reverse_overlap(ma_hit_t* dest, ma_hit_t* source)
|
|||||||
{
|
{
|
||||||
dest->ml = source->ml = 1;
|
dest->ml = source->ml = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(dest->no_l_indel == 0 || source->no_l_indel == 0)
|
||||||
|
{
|
||||||
|
dest->no_l_indel = source->no_l_indel = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest->no_l_indel = source->no_l_indel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
dest->bl = Get_qe(*dest) - Get_qs(*dest);
|
dest->bl = Get_qe(*dest) - Get_qs(*dest);
|
||||||
}
|
}
|
||||||
@@ -405,6 +416,7 @@ void normalize_ma_hit_t(ma_hit_t_alloc* sources, long long num_sources)
|
|||||||
{
|
{
|
||||||
///must have this line
|
///must have this line
|
||||||
new_element.ml = 1;
|
new_element.ml = 1;
|
||||||
|
new_element.no_l_indel = 1;
|
||||||
set_reverse_overlap(&new_element, &(sources[i].buffer[j]));
|
set_reverse_overlap(&new_element, &(sources[i].buffer[j]));
|
||||||
add_ma_hit_t_alloc(&(sources[tn]), &new_element);
|
add_ma_hit_t_alloc(&(sources[tn]), &new_element);
|
||||||
si_overlaps++;
|
si_overlaps++;
|
||||||
@@ -2966,6 +2978,8 @@ uint32_t startNode, uint32_t endNode, int max_dist, buf_t* bub)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int find_single_link(asg_t *g, uint32_t link_beg, int linkLen, uint32_t* link_end)
|
int find_single_link(asg_t *g, uint32_t link_beg, int linkLen, uint32_t* link_end)
|
||||||
{
|
{
|
||||||
uint32_t v, w;
|
uint32_t v, w;
|
||||||
@@ -3595,6 +3609,47 @@ int asg_arc_del_triangular_advance(asg_t *g, long long max_dist)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int asg_arc_del_triangular_directly(asg_t *g, long long max_dist)
|
||||||
|
{
|
||||||
|
double startTime = Get_T();
|
||||||
|
///the reason is that each read has two direction (query->target, target->query)
|
||||||
|
uint32_t v, w, n_vtx = g->n_seq * 2, n_reduced = 0;
|
||||||
|
|
||||||
|
|
||||||
|
int flag0, flag1, node;
|
||||||
|
for (v = 0; v < n_vtx; ++v)
|
||||||
|
{
|
||||||
|
uint32_t nv = asg_arc_n(g, v);
|
||||||
|
asg_arc_t *av = asg_arc_a(g, v);
|
||||||
|
if (g->seq[v>>1].del)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(nv < 2)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//test_triangular_directly();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (n_reduced) {
|
||||||
|
asg_cleanup(g);
|
||||||
|
asg_symm(g);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "[M::%s] removed %d triangular overlaps\n",
|
||||||
|
__func__, n_reduced);
|
||||||
|
fprintf(stderr, "[M::%s] takes %0.2f s\n\n", __func__, Get_T()-startTime);
|
||||||
|
|
||||||
|
return n_reduced;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int asg_arc_del_triangular_advance_debug(asg_t *g, long long max_dist)
|
int asg_arc_del_triangular_advance_debug(asg_t *g, long long max_dist)
|
||||||
{
|
{
|
||||||
double startTime = Get_T();
|
double startTime = Get_T();
|
||||||
@@ -4288,7 +4343,7 @@ uint32_t startNode, uint32_t endNode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int test_single_node_bubble_directly(asg_t *g, uint32_t v, long long longLen_thres)
|
int test_single_node_bubble_directly(asg_t *g, uint32_t v, long long longLen_thres, ma_hit_t_alloc* sources)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint32_t w, vEnd;
|
uint32_t w, vEnd;
|
||||||
@@ -4323,7 +4378,8 @@ int test_single_node_bubble_directly(asg_t *g, uint32_t v, long long longLen_thr
|
|||||||
longLen = Len[1];
|
longLen = Len[1];
|
||||||
|
|
||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
///if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
||||||
|
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0 || sources[w>>1].is_abnormal == 1)
|
||||||
{
|
{
|
||||||
asg_seq_del(g, w>>1);
|
asg_seq_del(g, w>>1);
|
||||||
n_reduced++;
|
n_reduced++;
|
||||||
@@ -4348,7 +4404,8 @@ int test_single_node_bubble_directly(asg_t *g, uint32_t v, long long longLen_thr
|
|||||||
longLen = Len[0];
|
longLen = Len[0];
|
||||||
|
|
||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
///if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
||||||
|
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0 || sources[w>>1].is_abnormal == 1)
|
||||||
{
|
{
|
||||||
asg_seq_del(g, w>>1);
|
asg_seq_del(g, w>>1);
|
||||||
n_reduced++;
|
n_reduced++;
|
||||||
@@ -4367,41 +4424,54 @@ int test_single_node_bubble_directly(asg_t *g, uint32_t v, long long longLen_thr
|
|||||||
}
|
}
|
||||||
else if(Len[0] == 1 && Len[1] == 1)
|
else if(Len[0] == 1 && Len[1] == 1)
|
||||||
{
|
{
|
||||||
w = av[0].v;
|
flag0 = sources[av[0].v>>1].is_abnormal;
|
||||||
flag0 = asg_arc_a(g, w)[0].el + asg_arc_a(g, w^1)[0].el;
|
flag1 = sources[av[1].v>>1].is_abnormal;
|
||||||
w = av[1].v;
|
|
||||||
flag1 = asg_arc_a(g, w)[0].el + asg_arc_a(g, w^1)[0].el;
|
if(flag0 == 1 && flag1 == 0)
|
||||||
///>=2 means this is an exact overlap
|
{
|
||||||
if(flag0 < 2 && flag1 >= 2)
|
asg_seq_del(g, av[0].v>>1);
|
||||||
|
n_reduced++;
|
||||||
|
}
|
||||||
|
else if(flag0 == 0 && flag1 == 1)
|
||||||
|
{
|
||||||
|
asg_seq_del(g, av[1].v>>1);
|
||||||
|
n_reduced++;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
w = av[0].v;
|
w = av[0].v;
|
||||||
|
flag0 = asg_arc_a(g, w)[0].el + asg_arc_a(g, w^1)[0].el;
|
||||||
/****************************may have bugs********************************/
|
|
||||||
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
|
||||||
{
|
|
||||||
asg_seq_del(g, w>>1);
|
|
||||||
n_reduced++;
|
|
||||||
}
|
|
||||||
/****************************may have bugs********************************/
|
|
||||||
}
|
|
||||||
|
|
||||||
if(flag0 >= 2 && flag1 < 2)
|
|
||||||
{
|
|
||||||
w = av[1].v;
|
w = av[1].v;
|
||||||
|
flag1 = asg_arc_a(g, w)[0].el + asg_arc_a(g, w^1)[0].el;
|
||||||
/****************************may have bugs********************************/
|
///>=2 means this is an exact overlap
|
||||||
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
if(flag0 < 2 && flag1 >= 2)
|
||||||
{
|
{
|
||||||
asg_seq_del(g, w>>1);
|
w = av[0].v;
|
||||||
n_reduced++;
|
|
||||||
|
/****************************may have bugs********************************/
|
||||||
|
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
||||||
|
{
|
||||||
|
asg_seq_del(g, w>>1);
|
||||||
|
n_reduced++;
|
||||||
|
}
|
||||||
|
/****************************may have bugs********************************/
|
||||||
|
}
|
||||||
|
|
||||||
|
if(flag0 >= 2 && flag1 < 2)
|
||||||
|
{
|
||||||
|
w = av[1].v;
|
||||||
|
|
||||||
|
/****************************may have bugs********************************/
|
||||||
|
if(asg_arc_a(g, w)[0].el == 0 || asg_arc_a(g, w^1)[0].el == 0)
|
||||||
|
{
|
||||||
|
asg_seq_del(g, w>>1);
|
||||||
|
n_reduced++;
|
||||||
|
}
|
||||||
|
/****************************may have bugs********************************/
|
||||||
}
|
}
|
||||||
/****************************may have bugs********************************/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return n_reduced;
|
return n_reduced;
|
||||||
}
|
}
|
||||||
@@ -4451,7 +4521,7 @@ int asg_arc_del_single_node_bubble(asg_t *g, long long max_dist)
|
|||||||
return n_reduced;
|
return n_reduced;
|
||||||
}
|
}
|
||||||
|
|
||||||
int asg_arc_del_single_node_directly(asg_t *g, long long longLen_thres)
|
int asg_arc_del_single_node_directly(asg_t *g, long long longLen_thres, ma_hit_t_alloc* sources)
|
||||||
{
|
{
|
||||||
double startTime = Get_T();
|
double startTime = Get_T();
|
||||||
///the reason is that each read has two direction (query->target, target->query)
|
///the reason is that each read has two direction (query->target, target->query)
|
||||||
@@ -4470,7 +4540,7 @@ int asg_arc_del_single_node_directly(asg_t *g, long long longLen_thres)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
n_reduced += test_single_node_bubble_directly(g, v, longLen_thres);
|
n_reduced += test_single_node_bubble_directly(g, v, longLen_thres, sources);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -5056,18 +5126,19 @@ long long weakID, uint32_t w_qs, uint32_t w_qe)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline int check_weak_ma_hit_reverse(ma_hit_t_alloc* aim_paf, ma_hit_t_alloc* reverse_paf_list,
|
inline int check_weak_ma_hit_reverse(ma_hit_t_alloc* r_paf, ma_hit_t_alloc* r_paf_source,
|
||||||
long long weakID)
|
long long weakID)
|
||||||
{
|
{
|
||||||
long long i = 0;
|
long long i = 0;
|
||||||
long long strongID, index;
|
long long strongID, index;
|
||||||
///all overlaps coming from another haplotye are strong
|
///all overlaps coming from another haplotye are strong
|
||||||
for (i = 0; i < aim_paf->length; i++)
|
for (i = 0; i < r_paf->length; i++)
|
||||||
{
|
{
|
||||||
strongID = Get_tn(aim_paf->buffer[i]);
|
strongID = Get_tn(r_paf->buffer[i]);
|
||||||
index = get_specific_overlap
|
index = get_specific_overlap
|
||||||
(&(reverse_paf_list[strongID]), strongID, weakID);
|
(&(r_paf_source[strongID]), strongID, weakID);
|
||||||
if(index != -1)
|
///must be a strong overlap
|
||||||
|
if(index != -1 && r_paf_source[strongID].buffer[index].ml == 1)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -5253,6 +5324,41 @@ int asg_arc_del_short_diploid_unclean(asg_t *g, float drop_ratio, ma_hit_t_alloc
|
|||||||
return n_short;
|
return n_short;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int asg_arc_del_too_short_overlaps(asg_t *g, long long dropLen)
|
||||||
|
{
|
||||||
|
double startTime = Get_T();
|
||||||
|
|
||||||
|
uint32_t v, n_vtx = g->n_seq * 2, n_short = 0;
|
||||||
|
for (v = 0; v < n_vtx; ++v)
|
||||||
|
{
|
||||||
|
if (g->seq[v>>1].del) continue;
|
||||||
|
if (g->seq_vis[v] != 0) continue;
|
||||||
|
|
||||||
|
asg_arc_t *av = asg_arc_a(g, v);
|
||||||
|
uint32_t i, thres, nv = asg_arc_n(g, v);
|
||||||
|
///if there is just one overlap, do nothing
|
||||||
|
if (nv < 2) continue;
|
||||||
|
//av[0] has the most overlap length
|
||||||
|
///remove short overlaps
|
||||||
|
if(av[0].ol < dropLen) continue;
|
||||||
|
|
||||||
|
for (i = nv - 1; i >= 1 && av[i].ol < dropLen; --i);
|
||||||
|
|
||||||
|
for (i = i + 1; i < nv; ++i)
|
||||||
|
av[i].del = 1, ++n_short;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
asg_cleanup(g);
|
||||||
|
asg_symm(g);
|
||||||
|
|
||||||
|
fprintf(stderr, "[M::%s] removed %d short overlaps\n", __func__, n_short);
|
||||||
|
fprintf(stderr, "[M::%s] takes %0.2f s\n\n", __func__, Get_T()-startTime);
|
||||||
|
|
||||||
|
return n_short;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int asg_arc_del_short_diploid_unclean_exact(asg_t *g, float drop_ratio, ma_hit_t_alloc* sources)
|
int asg_arc_del_short_diploid_unclean_exact(asg_t *g, float drop_ratio, ma_hit_t_alloc* sources)
|
||||||
{
|
{
|
||||||
@@ -6460,7 +6566,10 @@ int asg_arc_del_short_diploid_by_exact(asg_t *g, int max_ext, ma_hit_t_alloc* so
|
|||||||
sources[v>>1].is_fully_corrected == 1 &&
|
sources[v>>1].is_fully_corrected == 1 &&
|
||||||
sources[w>>1].is_fully_corrected == 0)
|
sources[w>>1].is_fully_corrected == 0)
|
||||||
{
|
{
|
||||||
if(av[ov_max_i].el == 1 && sources[av[ov_max_i].v>>1].is_fully_corrected)
|
/****************************may have bugs********************************/
|
||||||
|
///if(av[ov_max_i].el == 1 && sources[av[ov_max_i].v>>1].is_fully_corrected)
|
||||||
|
/****************************may have bugs********************************/
|
||||||
|
if(av[ov_max_i].el == 1 && sources[av[ov_max_i].v>>1].is_fully_corrected == 1)
|
||||||
{
|
{
|
||||||
if (kv > 1 && kw > 1) {
|
if (kv > 1 && kw > 1) {
|
||||||
to_del = 1;
|
to_del = 1;
|
||||||
@@ -6491,6 +6600,104 @@ int asg_arc_del_short_diploid_by_exact(asg_t *g, int max_ext, ma_hit_t_alloc* so
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int asg_arc_del_short_diploi_by_suspect_edge(asg_t *g, int max_ext, ma_hit_t_alloc* sources)
|
||||||
|
{
|
||||||
|
double startTime = Get_T();
|
||||||
|
kvec_t(uint64_t) b;
|
||||||
|
memset(&b, 0, sizeof(b));
|
||||||
|
|
||||||
|
uint32_t v, n_vtx = g->n_seq * 2;
|
||||||
|
long long n_cut = 0;
|
||||||
|
|
||||||
|
for (v = 0; v < n_vtx; ++v)
|
||||||
|
{
|
||||||
|
///if(g->seq_vis[v] == 0)
|
||||||
|
{
|
||||||
|
asg_arc_t *av = asg_arc_a(g, v);
|
||||||
|
uint32_t nv = asg_arc_n(g, v);
|
||||||
|
if (nv < 2) continue;
|
||||||
|
|
||||||
|
long long i;
|
||||||
|
for (i = 0; i < nv; ++i)
|
||||||
|
{
|
||||||
|
///means there is a large indel at this edge
|
||||||
|
if(av[i].no_l_indel == 0)
|
||||||
|
{
|
||||||
|
kv_push(uint64_t, b, (uint64_t)(av[i].ol << 32 | (av - g->arc + i)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "[M::%s] %lld unsorted pending overlaps\n", __func__, b.n);
|
||||||
|
|
||||||
|
radix_sort_arch64(b.a, b.a + b.n);
|
||||||
|
|
||||||
|
fprintf(stderr, "[M::%s] %lld sorted pending overlaps\n", __func__, b.n);
|
||||||
|
|
||||||
|
long long k;
|
||||||
|
for (k = 0; k < b.n; k++)
|
||||||
|
{
|
||||||
|
|
||||||
|
asg_arc_t *a = &g->arc[(uint32_t)b.a[k]];
|
||||||
|
///v is self id, w is the id of another end
|
||||||
|
uint32_t i, iv, iw, v = (a->ul)>>32, w = a->v^1, to_del = 0;
|
||||||
|
uint32_t nv = asg_arc_n(g, v), nw = asg_arc_n(g, w), kv, kw;
|
||||||
|
asg_arc_t *av, *aw;
|
||||||
|
///nv must be >= 2
|
||||||
|
if (nv == 1 && nw == 1) continue;
|
||||||
|
av = asg_arc_a(g, v);
|
||||||
|
aw = asg_arc_a(g, w);
|
||||||
|
|
||||||
|
///calculate the longest edge for v and w
|
||||||
|
for (i = 0, kv = 0; i < nv; ++i)
|
||||||
|
{
|
||||||
|
if (av[i].del) continue;
|
||||||
|
++kv;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0, kw = 0; i < nw; ++i)
|
||||||
|
{
|
||||||
|
if (aw[i].del) continue;
|
||||||
|
++kw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kv == 1 && kw == 1) continue;
|
||||||
|
|
||||||
|
///to see which one is the current edge (from v and w)
|
||||||
|
for (iv = 0; iv < nv; ++iv)
|
||||||
|
if (av[iv].v == (w^1)) break;
|
||||||
|
for (iw = 0; iw < nw; ++iw)
|
||||||
|
if (aw[iw].v == (v^1)) break;
|
||||||
|
|
||||||
|
///if one edge has been deleted, it should be deleted in both direction
|
||||||
|
if (av[iv].del && aw[iw].del) continue;
|
||||||
|
|
||||||
|
|
||||||
|
if (kv > 1 && kw > 1) {
|
||||||
|
to_del = 1;
|
||||||
|
} else if (kw == 1) {
|
||||||
|
if (asg_topocut_aux(g, w^1, max_ext) < max_ext) to_del = 1;
|
||||||
|
} else if (kv == 1) {
|
||||||
|
if (asg_topocut_aux(g, v^1, max_ext) < max_ext) to_del = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (to_del)
|
||||||
|
av[iv].del = aw[iw].del = 1, ++n_cut;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(b.a);
|
||||||
|
if (n_cut)
|
||||||
|
{
|
||||||
|
asg_cleanup(g);
|
||||||
|
asg_symm(g);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "[M::%s] removed %d suspect overlaps\n", __func__, n_cut);
|
||||||
|
fprintf(stderr, "[M::%s] takes %0.2f s\n\n", __func__, Get_T()-startTime);
|
||||||
|
return n_cut;
|
||||||
|
}
|
||||||
|
|
||||||
int asg_arc_del_false_node(asg_t *g, int max_ext)
|
int asg_arc_del_false_node(asg_t *g, int max_ext)
|
||||||
{
|
{
|
||||||
double startTime = Get_T();
|
double startTime = Get_T();
|
||||||
@@ -7296,6 +7503,7 @@ void read_ma(ma_hit_t* x, FILE* fp)
|
|||||||
fread(&(x->ts), sizeof(x->ts), 1, fp);
|
fread(&(x->ts), sizeof(x->ts), 1, fp);
|
||||||
fread(&(x->te), sizeof(x->te), 1, fp);
|
fread(&(x->te), sizeof(x->te), 1, fp);
|
||||||
fread(&(x->el), sizeof(x->el), 1, fp);
|
fread(&(x->el), sizeof(x->el), 1, fp);
|
||||||
|
fread(&(x->no_l_indel), sizeof(x->no_l_indel), 1, fp);
|
||||||
|
|
||||||
uint32_t t;
|
uint32_t t;
|
||||||
fread(&(t), sizeof(t), 1, fp);
|
fread(&(t), sizeof(t), 1, fp);
|
||||||
@@ -7333,6 +7541,7 @@ int load_ma_hit_ts(ma_hit_t_alloc** x, char* read_file_name)
|
|||||||
for (i = 0; i < n_read; i++)
|
for (i = 0; i < n_read; i++)
|
||||||
{
|
{
|
||||||
fread(&((*x)[i].is_fully_corrected), sizeof((*x)[i].is_fully_corrected), 1, fp);
|
fread(&((*x)[i].is_fully_corrected), sizeof((*x)[i].is_fully_corrected), 1, fp);
|
||||||
|
fread(&((*x)[i].is_abnormal), sizeof((*x)[i].is_abnormal), 1, fp);
|
||||||
fread(&((*x)[i].length), sizeof((*x)[i].length), 1, fp);
|
fread(&((*x)[i].length), sizeof((*x)[i].length), 1, fp);
|
||||||
|
|
||||||
(*x)[i].buffer = (ma_hit_t*)malloc(sizeof(ma_hit_t)*(*x)[i].length);
|
(*x)[i].buffer = (ma_hit_t*)malloc(sizeof(ma_hit_t)*(*x)[i].length);
|
||||||
@@ -7357,6 +7566,7 @@ void write_ma(ma_hit_t* x, FILE* fp)
|
|||||||
fwrite(&(x->ts), sizeof(x->ts), 1, fp);
|
fwrite(&(x->ts), sizeof(x->ts), 1, fp);
|
||||||
fwrite(&(x->te), sizeof(x->te), 1, fp);
|
fwrite(&(x->te), sizeof(x->te), 1, fp);
|
||||||
fwrite(&(x->el), sizeof(x->el), 1, fp);
|
fwrite(&(x->el), sizeof(x->el), 1, fp);
|
||||||
|
fwrite(&(x->no_l_indel), sizeof(x->no_l_indel), 1, fp);
|
||||||
|
|
||||||
uint32_t t = x->ml;
|
uint32_t t = x->ml;
|
||||||
fwrite(&(t), sizeof(t), 1, fp);
|
fwrite(&(t), sizeof(t), 1, fp);
|
||||||
@@ -7383,6 +7593,7 @@ void write_ma_hit_ts(ma_hit_t_alloc* x, long long n_read, char* read_file_name)
|
|||||||
for (i = 0; i < n_read; i++)
|
for (i = 0; i < n_read; i++)
|
||||||
{
|
{
|
||||||
fwrite(&(x[i].is_fully_corrected), sizeof(x[i].is_fully_corrected), 1, fp);
|
fwrite(&(x[i].is_fully_corrected), sizeof(x[i].is_fully_corrected), 1, fp);
|
||||||
|
fwrite(&(x[i].is_abnormal), sizeof(x[i].is_abnormal), 1, fp);
|
||||||
fwrite(&(x[i].length), sizeof(x[i].length), 1, fp);
|
fwrite(&(x[i].length), sizeof(x[i].length), 1, fp);
|
||||||
for (k = 0; k < x[i].length; k++)
|
for (k = 0; k < x[i].length; k++)
|
||||||
{
|
{
|
||||||
@@ -7440,6 +7651,192 @@ char* output_file_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// in a resolved bubble, mark unused vertices and arcs as "reduced"
|
||||||
|
static void asg_bub_backtrack(asg_t *g, uint32_t v0, buf_t *b)
|
||||||
|
{
|
||||||
|
uint32_t i, v;
|
||||||
|
///assert(b->S.n == 1);
|
||||||
|
///first remove all nodes in this bubble
|
||||||
|
for (i = 0; i < b->b.n; ++i)
|
||||||
|
g->seq[b->b.a[i]>>1].del = 1;
|
||||||
|
|
||||||
|
///second remove all edges (self/reverse for each edge) in this bubble
|
||||||
|
for (i = 0; i < b->e.n; ++i) {
|
||||||
|
asg_arc_t *a = &g->arc[b->e.a[i]];
|
||||||
|
///remove this edge self
|
||||||
|
a->del = 1;
|
||||||
|
///remove the reverse direction
|
||||||
|
asg_arc_del(g, a->v^1, a->ul>>32^1, 1);
|
||||||
|
}
|
||||||
|
///v is the sink of this bubble
|
||||||
|
v = b->S.a[0];
|
||||||
|
///recover node
|
||||||
|
do {
|
||||||
|
uint32_t u = b->a[v].p; // u->v
|
||||||
|
g->seq[v>>1].del = 0;
|
||||||
|
asg_arc_del(g, u, v, 0);
|
||||||
|
asg_arc_del(g, v^1, u^1, 0);
|
||||||
|
v = u;
|
||||||
|
} while (v != v0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// count the number of outgoing arcs, excluding reduced arcs
|
||||||
|
static inline int count_out(const asg_t *g, uint32_t v)
|
||||||
|
{
|
||||||
|
uint32_t i, n, nv = asg_arc_n(g, v);
|
||||||
|
const asg_arc_t *av = asg_arc_a(g, v);
|
||||||
|
for (i = n = 0; i < nv; ++i)
|
||||||
|
if (!av[i].del) ++n;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pop bubbles from vertex v0; the graph MJUST BE symmetric: if u->v present, v'->u' must be present as well
|
||||||
|
static uint64_t asg_bub_pop1(asg_t *g, uint32_t v0, int max_dist, buf_t *b)
|
||||||
|
{
|
||||||
|
uint32_t i, n_pending = 0;
|
||||||
|
uint64_t n_pop = 0;
|
||||||
|
///if this node has been deleted
|
||||||
|
if (g->seq[v0>>1].del) return 0; // already deleted
|
||||||
|
///asg_arc_n(n0)
|
||||||
|
if ((uint32_t)g->idx[v0] < 2) return 0; // no bubbles
|
||||||
|
///S saves nodes with all incoming edges visited
|
||||||
|
b->S.n = b->T.n = b->b.n = b->e.n = 0;
|
||||||
|
///for each node, b->a saves all related information
|
||||||
|
b->a[v0].c = b->a[v0].d = 0;
|
||||||
|
///b->S is the nodes with all incoming edges visited
|
||||||
|
kv_push(uint32_t, b->S, v0);
|
||||||
|
|
||||||
|
do {
|
||||||
|
///v is a node that all incoming edges have been visited
|
||||||
|
///d is the distance from v0 to v
|
||||||
|
uint32_t v = kv_pop(b->S), d = b->a[v].d, c = b->a[v].c;
|
||||||
|
uint32_t nv = asg_arc_n(g, v);
|
||||||
|
asg_arc_t *av = asg_arc_a(g, v);
|
||||||
|
///why we have this assert?
|
||||||
|
///assert(nv > 0);
|
||||||
|
|
||||||
|
///all out-edges of v
|
||||||
|
for (i = 0; i < nv; ++i) { // loop through v's neighbors
|
||||||
|
/**
|
||||||
|
p->ul: |____________31__________|__________1___________|______________32_____________|
|
||||||
|
qn direction of overlap length of this node (not overlap length)
|
||||||
|
(in the view of query)
|
||||||
|
p->v : |___________31___________|__________1___________|
|
||||||
|
tn reverse direction of overlap
|
||||||
|
(in the view of target)
|
||||||
|
p->ol: overlap length
|
||||||
|
**/
|
||||||
|
uint32_t w = av[i].v, l = (uint32_t)av[i].ul; // v->w with length l
|
||||||
|
binfo_t *t = &b->a[w];
|
||||||
|
///that means there is a circle, directly terminate the whole bubble poping
|
||||||
|
if (w == v0) goto pop_reset;
|
||||||
|
///if this edge has been deleted
|
||||||
|
if (av[i].del) continue;
|
||||||
|
|
||||||
|
///push the edge
|
||||||
|
kv_push(uint32_t, b->e, (g->idx[v]>>32) + i);
|
||||||
|
|
||||||
|
///find a too far path? directly terminate the whole bubble poping
|
||||||
|
if (d + l > max_dist) break; // too far
|
||||||
|
|
||||||
|
|
||||||
|
if (t->s == 0) { // this vertex has never been visited
|
||||||
|
kv_push(uint32_t, b->b, w); // save it for revert
|
||||||
|
///t->p means the in-node of w is v
|
||||||
|
///t->s = 1 means w has been visited
|
||||||
|
///d is len(v0->v), l is len(v->w), so t->d is len(v0->w)
|
||||||
|
t->p = v, t->s = 1, t->d = d + l;
|
||||||
|
///incoming edges of w
|
||||||
|
t->r = count_out(g, w^1);
|
||||||
|
++n_pending;
|
||||||
|
} else { // visited before
|
||||||
|
///c seems the max weight of node
|
||||||
|
if (c + 1 > t->c || (c + 1 == t->c && d + l > t->d)) t->p = v;
|
||||||
|
if (c + 1 > t->c) t->c = c + 1;
|
||||||
|
///update len(v0->w)
|
||||||
|
if (d + l < t->d) t->d = d + l; // update dist
|
||||||
|
}
|
||||||
|
///assert(t->r > 0);
|
||||||
|
//if all incoming edges of w have visited
|
||||||
|
//push it to b->S
|
||||||
|
if (--(t->r) == 0) {
|
||||||
|
uint32_t x = asg_arc_n(g, w);
|
||||||
|
if (x) kv_push(uint32_t, b->S, w);
|
||||||
|
else kv_push(uint32_t, b->T, w); // a tip
|
||||||
|
--n_pending;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
///if i < nv, that means (d + l > max_dist)
|
||||||
|
if (i < nv || b->S.n == 0) goto pop_reset;
|
||||||
|
} while (b->S.n > 1 || n_pending);
|
||||||
|
asg_bub_backtrack(g, v0, b);
|
||||||
|
n_pop = 1 | (uint64_t)b->T.n<<32;
|
||||||
|
pop_reset:
|
||||||
|
for (i = 0; i < b->b.n; ++i) { // clear the states of visited vertices
|
||||||
|
binfo_t *t = &b->a[b->b.a[i]];
|
||||||
|
t->s = t->c = t->d = 0;
|
||||||
|
}
|
||||||
|
return n_pop;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pop bubbles
|
||||||
|
int asg_pop_bubble(asg_t *g, int max_dist)
|
||||||
|
{
|
||||||
|
uint32_t v, n_vtx = g->n_seq * 2;
|
||||||
|
uint64_t n_pop = 0;
|
||||||
|
buf_t b;
|
||||||
|
if (!g->is_symm) asg_symm(g);
|
||||||
|
memset(&b, 0, sizeof(buf_t));
|
||||||
|
///set information for each node
|
||||||
|
b.a = (binfo_t*)calloc(n_vtx, sizeof(binfo_t));
|
||||||
|
//traverse all node with two directions
|
||||||
|
for (v = 0; v < n_vtx; ++v) {
|
||||||
|
uint32_t i, n_arc = 0, nv = asg_arc_n(g, v);
|
||||||
|
asg_arc_t *av = asg_arc_a(g, v);
|
||||||
|
///some node could be deleted
|
||||||
|
if (nv < 2 || g->seq[v>>1].del) continue;
|
||||||
|
///some edges could be deleted
|
||||||
|
for (i = 0; i < nv; ++i) // asg_bub_pop1() may delete some edges/arcs
|
||||||
|
if (!av[i].del) ++n_arc;
|
||||||
|
if (n_arc > 1)
|
||||||
|
n_pop += asg_bub_pop1(g, v, max_dist, &b);
|
||||||
|
}
|
||||||
|
free(b.a); free(b.S.a); free(b.T.a); free(b.b.a); free(b.e.a);
|
||||||
|
if (n_pop) asg_cleanup(g);
|
||||||
|
fprintf(stderr, "[M::%s] popped %d bubbles and trimmed %d tips\n", __func__, (uint32_t)n_pop, (uint32_t)(n_pop>>32));
|
||||||
|
return n_pop;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void output_contig_graph(asg_t *sg, ma_sub_t* coverage_cut, char* output_file_name, long long n_read, long long bubble_dist)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
asg_pop_bubble(sg, bubble_dist);
|
||||||
|
ma_ug_t *ug = NULL;
|
||||||
|
ug = ma_ug_gen(sg);
|
||||||
|
ma_ug_seq(ug, &R_INF, coverage_cut, n_read);
|
||||||
|
|
||||||
|
fprintf(stdout, "Writing unitig GFA to disk ...... \n");
|
||||||
|
char* gfa_name = (char*)malloc(strlen(output_file_name)+35);
|
||||||
|
sprintf(gfa_name, "%s.contig.gfa", output_file_name);
|
||||||
|
FILE* output_file = fopen(gfa_name, "w");
|
||||||
|
ma_ug_print(ug, &R_INF, coverage_cut, output_file);
|
||||||
|
fclose(output_file);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sprintf(gfa_name, "%s.simple.contig.gfa", output_file_name);
|
||||||
|
output_file = fopen(gfa_name, "w");
|
||||||
|
ma_ug_print_simple(ug, &R_INF, coverage_cut, output_file);
|
||||||
|
fclose(output_file);
|
||||||
|
|
||||||
|
free(gfa_name);
|
||||||
|
ma_ug_destroy(ug);
|
||||||
|
}
|
||||||
|
|
||||||
void build_string_graph_without_clean(
|
void build_string_graph_without_clean(
|
||||||
int min_dp, ma_hit_t_alloc* sources, ma_hit_t_alloc* reverse_sources,
|
int min_dp, ma_hit_t_alloc* sources, ma_hit_t_alloc* reverse_sources,
|
||||||
@@ -7459,8 +7856,8 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
// debug_info_of_specfic_read("m64016_190918_162737/92668450/ccs",
|
// debug_info_of_specfic_read("m64016_190918_162737/92668450/ccs",
|
||||||
// sources, reverse_sources, -1, "init");
|
// sources, reverse_sources, -1, "init");
|
||||||
|
|
||||||
debug_info_of_specfic_read("m64016_190918_162737/53545052/ccs",
|
// debug_info_of_specfic_read("m64016_190918_162737/53545052/ccs",
|
||||||
sources, reverse_sources, -1, "init");
|
// sources, reverse_sources, -1, "init");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -7472,8 +7869,8 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
// debug_info_of_specfic_read("m64016_190918_162737/92668450/ccs",
|
// debug_info_of_specfic_read("m64016_190918_162737/92668450/ccs",
|
||||||
// sources, reverse_sources, -1, "normalize");
|
// sources, reverse_sources, -1, "normalize");
|
||||||
|
|
||||||
debug_info_of_specfic_read("m64016_190918_162737/53545052/ccs",
|
// debug_info_of_specfic_read("m64016_190918_162737/53545052/ccs",
|
||||||
sources, reverse_sources, -1, "normalize");
|
// sources, reverse_sources, -1, "normalize");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -7513,9 +7910,6 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
asg_t *sg = NULL;
|
asg_t *sg = NULL;
|
||||||
sg = ma_sg_gen(sources, n_read, coverage_cut, max_hang_length, mini_overlap_length);
|
sg = ma_sg_gen(sources, n_read, coverage_cut, max_hang_length, mini_overlap_length);
|
||||||
|
|
||||||
@@ -7523,11 +7917,6 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
// debug_info_of_specfic_node("m64016_190918_162737/72220752/ccs", sg, "sg_gen");
|
// debug_info_of_specfic_node("m64016_190918_162737/72220752/ccs", sg, "sg_gen");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
asg_arc_del_trans(sg, GAP_FUZZ);
|
asg_arc_del_trans(sg, GAP_FUZZ);
|
||||||
|
|
||||||
// debug_info_of_specfic_node("m64016_190918_162737/72220752/ccs", sg, "del_trans");
|
// debug_info_of_specfic_node("m64016_190918_162737/72220752/ccs", sg, "del_trans");
|
||||||
@@ -7543,7 +7932,7 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
asg_arc_del_short_diploid_unclean(sg, corase_ovlp_drop_ratio, sources, reverse_sources);
|
///asg_arc_del_short_diploid_unclean(sg, corase_ovlp_drop_ratio, sources, reverse_sources);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -7584,36 +7973,25 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
fprintf(stderr, "\n\n**********%d-th round drop: drop_ratio = %f**********\n",
|
fprintf(stderr, "\n\n**********%d-th round drop: drop_ratio = %f**********\n",
|
||||||
i, drop_ratio);
|
i, drop_ratio);
|
||||||
|
|
||||||
// debug_info_of_specfic_node("m64016_190918_162737/72220752/ccs", sg, "step");
|
|
||||||
|
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
int tri_flag = 0;
|
int tri_flag = 0;
|
||||||
|
|
||||||
|
|
||||||
tri_flag += asg_arc_del_self_circle_contig(sg);
|
tri_flag += asg_arc_del_self_circle_contig(sg);
|
||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
|
||||||
// fflush(stderr);
|
|
||||||
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
||||||
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS);
|
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS, sources);
|
||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
|
||||||
// fflush(stderr);
|
|
||||||
tri_flag += asg_arc_del_triangular_advance(sg, bubble_dist);
|
tri_flag += asg_arc_del_triangular_advance(sg, bubble_dist);
|
||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
|
||||||
// fflush(stderr);
|
|
||||||
tri_flag += asg_arc_del_cross_bubble(sg, bubble_dist);
|
tri_flag += asg_arc_del_cross_bubble(sg, bubble_dist);
|
||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
|
||||||
// fflush(stderr);
|
|
||||||
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
||||||
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS);
|
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS, sources);
|
||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
|
||||||
// fflush(stderr);
|
|
||||||
|
|
||||||
if(tri_flag == 0)
|
if(tri_flag == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
@@ -7624,37 +8002,21 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
|
|
||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
//asg_arc_identify_simple_bubbles(sg);
|
///asg_arc_identify_simple_bubbles_multi(sg, 1);
|
||||||
asg_arc_identify_simple_bubbles_multi(sg, 1);
|
asg_arc_identify_simple_bubbles_multi(sg, 0);
|
||||||
///asg_arc_del_short_diploid_unclean_exact(sg, drop_ratio, sources);
|
///asg_arc_del_short_diploid_unclean_exact(sg, drop_ratio, sources);
|
||||||
asg_arc_del_short_diploid_by_exact(sg, MAX_SHORT_TIPS, sources);
|
asg_arc_del_short_diploid_by_exact(sg, MAX_SHORT_TIPS, sources);
|
||||||
asg_cut_tip(sg, MAX_SHORT_TIPS);
|
asg_cut_tip(sg, MAX_SHORT_TIPS);
|
||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
|
|
||||||
|
|
||||||
// fprintf(stderr, "bugs\n");
|
|
||||||
// fflush(stderr);
|
|
||||||
|
|
||||||
//asg_arc_identify_simple_bubbles(sg);
|
//asg_arc_identify_simple_bubbles(sg);
|
||||||
asg_arc_identify_simple_bubbles_multi(sg, 1);
|
asg_arc_identify_simple_bubbles_multi(sg, 1);
|
||||||
|
|
||||||
// fprintf(stderr, "asg_arc_identify_simple_bubbles_multi\n");
|
|
||||||
// fflush(stderr);
|
|
||||||
|
|
||||||
|
|
||||||
asg_arc_del_short_diploid_by_length(sg, drop_ratio, MAX_SHORT_TIPS);
|
asg_arc_del_short_diploid_by_length(sg, drop_ratio, MAX_SHORT_TIPS);
|
||||||
asg_cut_tip(sg, MAX_SHORT_TIPS);
|
asg_cut_tip(sg, MAX_SHORT_TIPS);
|
||||||
|
|
||||||
|
|
||||||
// fprintf(stderr, "asg_arc_del_short_diploid_by_length\n");
|
|
||||||
// fflush(stderr);
|
|
||||||
|
|
||||||
|
|
||||||
// debug_info_of_specfic_node("m64016_190918_162737/141297762/ccs", sg);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
asg_arc_identify_simple_bubbles_multi(sg, 0);
|
asg_arc_identify_simple_bubbles_multi(sg, 0);
|
||||||
asg_arc_del_short_false_link(sg, 0.6, bubble_dist);
|
asg_arc_del_short_false_link(sg, 0.6, bubble_dist);
|
||||||
|
|
||||||
@@ -7677,7 +8039,7 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
||||||
// fflush(stderr);
|
// fflush(stderr);
|
||||||
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
||||||
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS);
|
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS, sources);
|
||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
||||||
// fflush(stderr);
|
// fflush(stderr);
|
||||||
tri_flag += asg_arc_del_triangular_advance(sg, bubble_dist);
|
tri_flag += asg_arc_del_triangular_advance(sg, bubble_dist);
|
||||||
@@ -7689,7 +8051,7 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
||||||
// fflush(stderr);
|
// fflush(stderr);
|
||||||
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
///asg_arc_del_single_node_bubble(sg, bubble_dist);
|
||||||
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS);
|
tri_flag += asg_arc_del_single_node_directly(sg, MAX_SHORT_TIPS, sources);
|
||||||
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
// fprintf(stderr, "tri_flag: %d\n", tri_flag);
|
||||||
// fflush(stderr);
|
// fflush(stderr);
|
||||||
|
|
||||||
@@ -7700,6 +8062,17 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
asg_arc_del_short_diploi_by_suspect_edge(sg, MAX_SHORT_TIPS, sources);
|
||||||
|
asg_cut_tip(sg, MAX_SHORT_TIPS);
|
||||||
|
|
||||||
|
|
||||||
|
// asg_arc_identify_simple_bubbles_multi(sg, 0);
|
||||||
|
// asg_arc_del_too_short_overlaps(sg, 1000);
|
||||||
|
// asg_cut_tip(sg, MAX_SHORT_TIPS);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///asg_arc_del_triangular_advance_debug(sg, bubble_dist);
|
///asg_arc_del_triangular_advance_debug(sg, bubble_dist);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -7740,14 +8113,20 @@ char* output_file_name, long long bubble_dist, int read_graph, int write)
|
|||||||
|
|
||||||
/****************************may have bugs********************************/
|
/****************************may have bugs********************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
memset(sg->seq_vis, 0, sg->n_seq*2*sizeof(uint8_t));
|
||||||
|
asg_arc_del_short_diploid_by_exact(sg, MAX_SHORT_TIPS, sources);
|
||||||
|
asg_cut_tip(sg, MAX_SHORT_TIPS);
|
||||||
|
**/
|
||||||
|
|
||||||
// debug_info_of_specfic_node("m64016_190918_162737/141297762/ccs", sg);
|
// debug_info_of_specfic_node("m64016_190918_162737/141297762/ccs", sg);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
output_unitig_graph(sg, coverage_cut, output_file_name, n_read);
|
output_unitig_graph(sg, coverage_cut, output_file_name, n_read);
|
||||||
output_read_graph(sg, coverage_cut, output_file_name, n_read);
|
output_read_graph(sg, coverage_cut, output_file_name, n_read);
|
||||||
|
|
||||||
|
output_contig_graph(sg, coverage_cut, output_file_name, n_read, 50000);
|
||||||
|
|
||||||
|
|
||||||
asg_destroy(sg);
|
asg_destroy(sg);
|
||||||
free(coverage_cut);
|
free(coverage_cut);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
///#define MIN_OVERLAP_LEN 2000
|
///#define MIN_OVERLAP_LEN 2000
|
||||||
///#define MIN_OVERLAP_LEN 500
|
///#define MIN_OVERLAP_LEN 500
|
||||||
|
///#define MIN_OVERLAP_LEN 50
|
||||||
#define MIN_OVERLAP_LEN 50
|
#define MIN_OVERLAP_LEN 50
|
||||||
#define MIN_OVERLAP_COVERAGE 1
|
#define MIN_OVERLAP_COVERAGE 1
|
||||||
#define MAX_HANG_LEN 1000
|
#define MAX_HANG_LEN 1000
|
||||||
@@ -42,6 +43,7 @@ typedef struct {
|
|||||||
uint32_t ml:31, rev:1;
|
uint32_t ml:31, rev:1;
|
||||||
uint32_t bl:31, del:1;
|
uint32_t bl:31, del:1;
|
||||||
uint8_t el;
|
uint8_t el;
|
||||||
|
uint8_t no_l_indel;
|
||||||
} ma_hit_t;
|
} ma_hit_t;
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +52,7 @@ typedef struct {
|
|||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
uint8_t is_fully_corrected;
|
uint8_t is_fully_corrected;
|
||||||
|
uint8_t is_abnormal;
|
||||||
} ma_hit_t_alloc;
|
} ma_hit_t_alloc;
|
||||||
|
|
||||||
|
|
||||||
@@ -96,6 +99,7 @@ typedef struct {
|
|||||||
uint32_t ol:31, del:1;
|
uint32_t ol:31, del:1;
|
||||||
uint8_t strong;
|
uint8_t strong;
|
||||||
uint8_t el;
|
uint8_t el;
|
||||||
|
uint8_t no_l_indel;
|
||||||
} asg_arc_t;
|
} asg_arc_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -194,6 +198,7 @@ static inline int ma_hit2arc(const ma_hit_t *h, int ql, int tl, int max_hang, fl
|
|||||||
|
|
||||||
p->strong = h->ml;
|
p->strong = h->ml;
|
||||||
p->el = h->el;
|
p->el = h->el;
|
||||||
|
p->no_l_indel = h->no_l_indel;
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user