static boolean continue_traversing(pathStep * current_step, pathStep * next_step, pathStep * reverse_step, Path * temp_path, dBGraph * db_graph) { pathStep first; boolean cont; cont = current_step->label != Undefined; //cont = cont && db_node_has_precisely_one_edge_all_colours(current_step->node, current_step->orientation, &n); path_get_step_at_index(0, &first, temp_path); int n_fwd, n_rev; /* We don't do these checks for the first node - in case it's a Y node */ if(temp_path->length > 1) { if (db_node_check_for_any_flag(next_step->node, next_step->orientation == forward? VISITED_FORWARD:VISITED_REVERSE)) { cont = false; } /* Check for a cycle - as this is a perfect path, we only need to check the first node. If we come back in at one of the other nodes, then it will result in two edges in one orientation */ if (path_step_equals_without_label(&first, current_step)) { path_add_stop_reason(LAST, PATH_FLAG_IS_CYCLE, temp_path); cont = false; } /* Now check for more than one edge in either direction */ n_fwd = db_node_edges_count_all_colours(current_step->node, current_step->orientation); n_rev = db_node_edges_count_all_colours(current_step->node, opposite_orientation(current_step->orientation)); if (n_fwd == 0) { path_add_stop_reason(LAST, PATH_FLAG_STOP_BLUNT_END, temp_path); cont = false; } if (n_fwd > 1) { path_add_stop_reason(LAST, PATH_FLAG_DIVERGING_PATHS, temp_path); cont = false; } if (n_rev > 1) { path_add_stop_reason(LAST, PATH_FLAG_CONVERGING_PATHS, temp_path); cont = false; } if (!path_has_space(temp_path)) { path_add_stop_reason(LAST, PATH_FLAG_LONGER_THAN_BUFFER, temp_path); cont = false; } } return cont; }
/*----------------------------------------------------------------------* * Function: * * Purpose: * * Params: * * Returns: * *----------------------------------------------------------------------*/ static boolean coverage_walk_continue_traversing(pathStep * current_step, pathStep * next_step, pathStep * reverse_step, Path * temp_path, dBGraph * db_graph) { pathStep first; boolean cont; cont = current_step->label != Undefined; /* We don't do these checks for the first node - in case it's a Y node */ if(temp_path->length > 1) { /* Check for a cycle - as this is a perfect path, we only need to check the first node. If we come back in at one of the other nodes, then it will result in two edges in one orientation */ path_get_step_at_index(0, &first, temp_path); if (path_step_equals_without_label(&first, current_step)) { //char seq[1024]; //binary_kmer_to_seq(&(current_step->node->kmer), db_graph->kmer_size, seq); //log_printf(" Stopped for cycle at %s\n", seq); path_add_stop_reason(LAST, PATH_FLAG_IS_CYCLE, temp_path); cont = false; } /* Check for visited flag */ if (db_node_check_for_any_flag(next_step->node, next_step->orientation == forward? VISITED_FORWARD:VISITED_REVERSE)) { cont = false; } /* Now check for one or more edges moving forward */ if (db_node_edges_count_all_colours(current_step->node, current_step->orientation) == 0) { //char seq[1024]; //binary_kmer_to_seq(&(current_step->node->kmer), db_graph->kmer_size, seq); //log_printf(" Stopped for blunt end at %s\n", seq); path_add_stop_reason(LAST, PATH_FLAG_STOP_BLUNT_END, temp_path); cont = false; } /* Check path has space */ if (!path_has_space(temp_path)) { //char seq[1024]; //binary_kmer_to_seq(&(current_step->node->kmer), db_graph->kmer_size, seq); //log_printf(" Stopped for longer than buffer at %s\n", seq); path_add_stop_reason(LAST, PATH_FLAG_LONGER_THAN_BUFFER, temp_path); cont = false; } } return cont; }