// Detects sequences that could be simplified through concatentation // Iterates till graph cannot be more simplified // Useless nodes are freed from memory and remaining ones are renumbered void concatenateGraph(Graph * graph) { IDnum nodeIndex; Node *node, *twin; velvetLog("Concatenation...\n"); for (nodeIndex = 1; nodeIndex < nodeCount(graph); nodeIndex++) { node = getNodeInGraph(graph, nodeIndex); if (node == NULL) continue; twin = getTwinNode(node); while (simpleArcCount(node) == 1 && simpleArcCount(getTwinNode (getDestination(getArc(node)))) == 1) { if (getDestination(getArc(node)) == twin || getDestination(getArc(node)) == node) break; concatenateStringOfNodes(node, graph); } while (simpleArcCount(twin) == 1 && simpleArcCount(getTwinNode (getDestination(getArc(twin)))) == 1) { if (getDestination(getArc(twin)) == node || getDestination(getArc(twin)) == twin) break; concatenateStringOfNodes(twin, graph); } } renumberNodes(graph); sortGapMarkers(graph); velvetLog("Concatenation over!\n"); }
void exploitShortReadPairs(Graph * argGraph, ReadSet * reads, boolean * dubious, boolean * shadows, boolean force_jumps) { boolean modified = true; graph = argGraph; if (!readStartsAreActivated(graph)) return; velvetLog("Starting pebble resolution...\n"); resetNodeStatus(graph); // Prepare scaffold buildScaffold(graph, reads, dubious, shadows); // Prepare graph prepareGraphForLocalCorrections(graph); // Prepare local scaffold localScaffold = callocOrExit(2 * nodeCount(graph) + 1, MiniConnection); // Loop until convergence while (modified) modified = expandLongNodes(force_jumps); // Clean up memory cleanMemory(); deactivateLocalCorrectionSettings(); sortGapMarkers(graph); velvetLog("Pebble done.\n"); }