//This function recursively labels all nodes as drawn that are within a //certain distance of this node. Whichever node called this will //definitely be drawn, so that one is excluded from the recursive call. void DeBruijnNode::labelNeighbouringNodesAsDrawn(int nodeDistance, DeBruijnNode * callingNode) { if (m_highestDistanceInNeighbourSearch > nodeDistance) return; m_highestDistanceInNeighbourSearch = nodeDistance; if (nodeDistance == 0) return; DeBruijnNode * otherNode; for (size_t i = 0; i < m_edges.size(); ++i) { otherNode = m_edges[i]->getOtherNode(this); if (otherNode == callingNode) continue; if (g_settings->doubleMode) otherNode->m_drawn = true; else //single mode { if (otherNode->isPositiveNode()) otherNode->m_drawn = true; else otherNode->getReverseComplement()->m_drawn = true; } otherNode->labelNeighbouringNodesAsDrawn(nodeDistance-1, this); } }
//The startingNodes and nodeDistance parameters are only used if the graph scope //is not WHOLE_GRAPH. void AssemblyGraph::buildOgdfGraphFromNodesAndEdges(std::vector<DeBruijnNode *> startingNodes, int nodeDistance) { if (g_settings->graphScope == WHOLE_GRAPH) { QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes); while (i.hasNext()) { i.next(); //If double mode is off, only positive nodes are drawn. If it's //on, all nodes are drawn. if (i.value()->isPositiveNode() || g_settings->doubleMode) i.value()->setAsDrawn(); } } else //The scope is either around specified nodes or around nodes with BLAST hits { for (size_t i = 0; i < startingNodes.size(); ++i) { DeBruijnNode * node = startingNodes[i]; //If we are in single mode, make sure that each node is positive. if (!g_settings->doubleMode && node->isNegativeNode()) node = node->getReverseComplement(); node->setAsDrawn(); node->setAsSpecial(); node->labelNeighbouringNodesAsDrawn(nodeDistance, 0); } } //First loop through each node, adding it to OGDF if it is drawn. QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes); while (i.hasNext()) { i.next(); if (i.value()->isDrawn()) i.value()->addToOgdfGraph(m_ogdfGraph); } //Then loop through each determining its drawn status and adding it //to OGDF if it is drawn. for (size_t i = 0; i < m_deBruijnGraphEdges.size(); ++i) { m_deBruijnGraphEdges[i]->determineIfDrawn(); if (m_deBruijnGraphEdges[i]->isDrawn()) m_deBruijnGraphEdges[i]->addToOgdfGraph(m_ogdfGraph); } }