Author: scooter
Date: 2011-05-18 20:43:24 -0700 (Wed, 18 May 2011)
New Revision: 25475
Modified:
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
Log:
Fix deep nesting of metanodes
Modified:
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
===================================================================
---
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
2011-05-18 23:34:12 UTC (rev 25474)
+++
csplugins/trunk/ucsf/scooter/metaNodePlugin2/src/metaNodePlugin2/model/MetaNode.java
2011-05-19 03:43:24 UTC (rev 25475)
@@ -103,6 +103,8 @@
metaGroup = group;
logger = CyLogger.getLogger(MetaNode.class);
+ logger.debug("Creating new metanode: "+group.getGroupNode());
+
// This method does most of the work.
updateMetaEdges();
@@ -221,6 +223,7 @@
CyEdge edge = (CyEdge)e;
// Add any new edges.
if (!metaEdges.containsKey(edge)) {
+ // logger.debug(" found new edge:
"+edge.getIdentifier());
metaEdges.put(edge, edge);
metaGroup.addOuterEdge(edge);
}
@@ -270,11 +273,17 @@
* @return the created metaEdge
*/
public CyEdge createMetaEdge(String edgeName, CyNode source, CyNode
target) {
+ logger.debug("Creating metaedge: meta-"+edgeName+" between
"+source+" and "+target);
CyEdge newEdge = createEdge("meta-", edgeName, source, target);
metaEdges.put(newEdge,newEdge);
return newEdge;
}
+ public boolean haveMetaEdge(String edgeName, CyNode source, CyNode
target) {
+ CyEdge newEdge = createEdge("meta-", edgeName, source, target);
+ return metaEdges.containsKey(newEdge);
+ }
+
/**
* Determine if this metanode is collapsed in this view
*
@@ -416,19 +425,58 @@
}
/**
+ * Add edges to our outer edge map and recurse (if needed).
+ *
+ * @param partnerGroup the group that's calling us
+ * @param partnerEdges the list of outer edges our partner has
+ */
+ protected void addPartnerOuterEdges(CyGroup partnerGroup, List<CyEdge>
partnerEdges) {
+ MetaNode partnerMeta =
MetaNodeManager.getMetaNode(partnerGroup);
+ CyNode partnerNode = partnerGroup.getGroupNode();
+ CyNode myNode = metaGroup.getGroupNode();
+
+ //
logger.debug(myNode.toString()+".addPartnerOuterEdges("+partnerNode+")");
+
+ for (CyEdge pEdge: partnerEdges) {
+ // logger.debug(" edge: "+pEdge.getIdentifier());
+ // Start by adding the relevant edges to our outer edge
map
+ CyNode pNode = getLocalNode(pEdge);
+ if (pNode == null)
+ continue;
+
+ CyEdge metaEdge = createEdge("meta-",
pEdge.getIdentifier(), pNode, partnerNode);
+ metaGroup.addOuterEdge(metaEdge);
+ }
+
+ /* DEBUG
+ logger.debug("addPrtnerOuterEdges: outer edges for:"+metaGroup);
+ for (CyEdge edge: metaGroup.getOuterEdges()) {
+ logger.debug(" "+edge.getIdentifier());
+ }
+ */
+
+ // OK, check all of our nodes and if any of them are metanodes,
recurse down
+ for (CyNode child: metaGroup.getNodes()) {
+ MetaNode childMeta = MetaNodeManager.getMetaNode(child);
+ if (childMeta == null)
+ continue;
+
+ childMeta.addPartnerOuterEdges(partnerGroup,
partnerEdges);
+ }
+ }
+
+ /**
* This method is the central method for the creation and maintenance
of a
* meta-node. Essentially, it is responsible for creating all of the
meta-edges
* that connect this meta-node to external nodes.
*
* Basic approach:
- * for each external edge:
- * if edge.partner is in a group AND group is in our network:
- * add a meta-edge to the parter group node
- * add a meta-edge to the parter
- *
- * We also handle the following special cases:
- * Partner node is itself a group
- * Partner node is a member of a group
+ * for each external edge:
+ * add a meta-edge to the parter
+ * if the partner is a group and the group is in our
network:
+ * add ourselves to the group's outer edges list
(recursively)
+ * if the partner is in a group:
+ * add ourselves to the group's meta edge list
*/
private void updateMetaEdges() {
// Initialize our meta-edge map
@@ -440,24 +488,71 @@
while(iterator.hasNext()) {
CyEdge edge = iterator.next();
CyNode node = getPartner(edge);
+ // logger.debug("Outer edge = "+edge.getIdentifier());
// Create the meta-edge to the external node
CyEdge metaEdge = createMetaEdge(edge.getIdentifier(),
metaGroup.getGroupNode(), node);
- // Special case for the situation where our partner is
a group. In this
- // case, some of our outer edges might be missing
because they were hidden
- // so we need to add it to our outerEdges list and to
our iterator so that
- // we'll revisit it.
- if (MetaNodeManager.getMetaNode(node) != null) {
- addPartnerEdges(iterator, node);
+ MetaNode metaPartner =
MetaNodeManager.getMetaNode(node);
+ if (metaPartner != null) {
+ // Recursively add links to the appropriate
children
+ addPartnerEdges(metaPartner);
+ metaPartner.addMetaEdge(metaEdge);
}
+
// Now, handle the case where the partner is a member
of one or more groups
if (node.getGroups() != null && node.getGroups().size()
> 0) {
+ // Add ourselves to the outer edges list of the
partner
addPartnerMetaEdges(edge, node, metaEdge);
}
}
+
+ /* DEBUGGING
+ logger.debug("Outer edges for:"+metaGroup);
+ for (CyEdge edge: metaGroup.getOuterEdges()) {
+ logger.debug(" "+edge.getIdentifier());
+ }
+ */
}
+ // Find the edge in our partner that links to us
+ protected void addPartnerEdges(MetaNode metaPartner) {
+ List<CyEdge> partnerEdges =
metaPartner.getCyGroup().getOuterEdges();
+ List<CyEdge> newEdges = new ArrayList<CyEdge>();
+ for (CyEdge edge: partnerEdges) {
+ // logger.debug("Looking at partner edge:
"+edge.getIdentifier());
+ CyNode source = (CyNode)edge.getSource();
+ CyNode target = (CyNode)edge.getTarget();
+ if (metaGroup.getNodes().contains(target) ||
metaGroup.getNodes().contains(source)) {
+ CyNode partner;
+ if (metaGroup.getNodes().contains(source)) {
+ // We're the source
+ source = metaGroup.getGroupNode();
+ partner = target;
+ } else {
+ // We're the target
+ target = metaGroup.getGroupNode();
+ partner = source;
+ }
+
+ // Create a new edge
+ CyEdge newEdge = createEdge("meta-",
edge.getIdentifier(), source, target);
+ newEdges.add(newEdge);
+
+ // logger.debug(" ... it points us -- created
new edge: "+newEdge.getIdentifier());
+
+ metaGroup.addOuterEdge(edge);
+
+ MetaNode partnerMeta =
MetaNodeManager.getMetaNode(partner);
+ if (partnerMeta != null)
+ addPartnerEdges(partnerMeta);
+
+ createMetaEdge(edge.getIdentifier(), source,
target);
+ }
+ }
+ for (CyEdge edge: newEdges) {
metaPartner.getCyGroup().addOuterEdge(edge); }
+ }
+
/**
* Expand the our parent, if it is collapsed
*
@@ -491,6 +586,7 @@
}
private void addPartnerMetaEdges(CyEdge connectingEdge, CyNode
partnerNode, CyEdge metaEdge) {
+ // logger.debug("addPartnerMetaEdges to "+partnerNode);
for (CyGroup partnerGroup: partnerNode.getGroups()) {
if (partnerGroup.getNetwork() ==
metaGroup.getNetwork()) {
MetaNode partner =
MetaNodeManager.getMetaNode(partnerGroup.getGroupNode());
@@ -506,28 +602,6 @@
}
}
- private void addPartnerEdges(ListIterator<CyEdge> iterator, CyNode
partnerNode) {
- CyGroup partnerGroup = CyGroupManager.getCyGroup(partnerNode);
- MetaNode partnerMeta =
MetaNodeManager.getMetaNode(partnerGroup);
- if (partnerMeta.isCollapsed()) {
- // Get the outer edges of the partner node, and if they
point to us,
- // add the edge to our outer edge list
- CyNetwork myGraph = metaGroup.getGraphPerspective();
- List<CyEdge> partnerEdges =
partnerGroup.getOuterEdges();
- for (CyEdge partnerEdge: partnerEdges) {
- // We are only interested in edges that connect
to one of our nodes
- if (isConnectingEdge(partnerEdge)) {
- // Actually add it to the list
- metaGroup.addOuterEdge(partnerEdge);
- // Now, add it to our iterator so that
we can re-examine it
- iterator.add(partnerEdge);
- // We actually want to examine this
edge again, so we need to back up
- iterator.previous();
- }
- }
- }
- }
-
private void updateMembershipEdges(CyNode node) {
// for each group node is in:
// if !ourGroup:
--
You received this message because you are subscribed to the Google Groups
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/cytoscape-cvs?hl=en.