// // Integrity checks // // Check an array of nodes denote a contigous path bool db_node_check_nodes(const dBNode *nodes, size_t num, const dBGraph *db_graph) { if(num == 0) return true; const size_t kmer_size = db_graph->kmer_size; BinaryKmer bkmer0, bkmer1, tmp; Nucleotide nuc; size_t i; bkmer0 = db_node_oriented_bkmer(db_graph, nodes[0]); for(i = 0; i+1 < num; i++) { bkmer1 = db_node_oriented_bkmer(db_graph, nodes[i+1]); nuc = binary_kmer_last_nuc(bkmer1); tmp = binary_kmer_left_shift_add(bkmer0, kmer_size, nuc); ctx_assert_ret(binary_kmers_are_equal(tmp, bkmer1)); bkmer0 = bkmer1; } return true; }
// Print: // 0: AAACCCAAATGCAAACCCAAATGCAAACCCA:1 TGGGTTTGCATTTGGGTTTGCATTTGGGTTT // 1: CAAACCCAAATGCAAACCCAAATGCAAACCC:1 GGGTTTGCATTTGGGTTTGCATTTGGGTTTG // ... void db_nodes_print_verbose(const dBNode *nodes, size_t num, const dBGraph *db_graph, FILE *out) { if(num == 0) return; const size_t kmer_size = db_graph->kmer_size; size_t i; BinaryKmer bkmer, bkey; char kmerstr[MAX_KMER_SIZE+1], keystr[MAX_KMER_SIZE+1]; bkmer = db_node_get_bkmer(db_graph, nodes[0].key); bkey = db_node_oriented_bkmer(db_graph, nodes[0]); binary_kmer_to_str(bkmer, kmer_size, kmerstr); binary_kmer_to_str(bkey, kmer_size, keystr); fprintf(out, "%3zu: %s:%i %s\n", (size_t)0, kmerstr, (int)nodes[0].orient, keystr); for(i = 1; i < num; i++) { bkmer = db_node_get_bkmer(db_graph, nodes[i].key); bkey = db_node_oriented_bkmer(db_graph, nodes[i]); binary_kmer_to_str(bkmer, kmer_size, kmerstr); binary_kmer_to_str(bkey, kmer_size, keystr); fprintf(out, "%3zu: %s:%i %s\n", i, kmerstr, (int)nodes[i].orient, keystr); } }
void db_nodes_gzprint(const dBNode *nodes, size_t num, const dBGraph *db_graph, gzFile out) { size_t i, kmer_size = db_graph->kmer_size; Nucleotide nuc; BinaryKmer bkmer; char tmp[MAX_KMER_SIZE+1]; bkmer = db_node_oriented_bkmer(db_graph, nodes[0]); binary_kmer_to_str(bkmer, kmer_size, tmp); gzputs(out, tmp); for(i = 1; i < num; i++) { nuc = db_node_get_last_nuc(nodes[i], db_graph); gzputc(out, dna_nuc_to_char(nuc)); } }
void db_nodes_print(const dBNode *nodes, size_t num, const dBGraph *db_graph, FILE *out) { const size_t kmer_size = db_graph->kmer_size; size_t i; Nucleotide nuc; BinaryKmer bkmer; char tmp[MAX_KMER_SIZE+1]; bkmer = db_node_oriented_bkmer(db_graph, nodes[0]); binary_kmer_to_str(bkmer, kmer_size, tmp); fputs(tmp, out); for(i = 1; i < num; i++) { nuc = db_node_get_last_nuc(nodes[i], db_graph); fputc(dna_nuc_to_char(nuc), out); } }
// Extend a supernode, nlist[offset] must already be set // Walk along nodes starting from node/or, storing the supernode in nlist // Returns the number of nodes added, adds no more than `limit` // return false if out of space and limit > 0 bool supernode_extend(dBNodeBuffer *nbuf, size_t limit, const dBGraph *db_graph) { ctx_assert(nbuf->len > 0); const size_t kmer_size = db_graph->kmer_size; dBNode node0 = nbuf->data[0], node1 = nbuf->data[nbuf->len-1], node = node1; BinaryKmer bkmer = db_node_oriented_bkmer(db_graph, node); Edges edges = db_node_get_edges_union(db_graph, node.key); Nucleotide nuc; while(edges_has_precisely_one_edge(edges, node.orient, &nuc)) { bkmer = binary_kmer_left_shift_add(bkmer, kmer_size, nuc); node = db_graph_find(db_graph, bkmer); edges = db_node_get_edges_union(db_graph, node.key); ctx_assert(node.key != HASH_NOT_FOUND); if(edges_has_precisely_one_edge(edges, rev_orient(node.orient), &nuc)) { if(node.key == node0.key || node.key == nbuf->data[nbuf->len-1].key) { // don't create a loop A->B->A or a->b->B->A break; } if(limit && nbuf->len >= limit) return false; db_node_buf_add(nbuf, node); } else break; } return true; }
static void branch_to_str(const dBNode *nodes, size_t len, bool print_first_kmer, StrBuf *sbuf, const dBGraph *db_graph) { size_t i = print_first_kmer, kmer_size = db_graph->kmer_size; Nucleotide nuc; BinaryKmer bkmer; if(print_first_kmer) { strbuf_ensure_capacity(sbuf, sbuf->end + kmer_size); bkmer = db_node_oriented_bkmer(db_graph, nodes[0]); binary_kmer_to_str(bkmer, kmer_size, sbuf->b+sbuf->end); sbuf->end += kmer_size; } // i == 1 if print_first_kmer, otherwise 0 strbuf_ensure_capacity(sbuf, sbuf->end + len + 1); // +1 for '\n' for(; i < len; i++) { nuc = db_node_get_last_nuc(nodes[i], db_graph); sbuf->b[sbuf->end++] = dna_nuc_to_char(nuc); } sbuf->b[sbuf->end++] = '\n'; sbuf->b[sbuf->end] = '\0'; }