Please review the Java-Docs at http://db.systemsbiology.net/cytoscape/grouping/doc/ and comment.
To give you a better idea of how the interfaces work together, here is an example:
Example 1. Algorithm calculated groups:
{{{CyNetwork [] groups = someAlgorithm.calculateGroups(someArgs); groupManager.addGroupsToNetwork(myNetwork); GroupingStrategy collapsingStrategy =
GroupingStrategyFactory.createGroupingStrategy(GroupingStrategyFactory.COLLAPSING_STRATEGY);
GroupingStrategy stackingStrategy =
GroupingStrategyFactory.createGroupingStrategy(GroupingStrategyFactory.STACKING_STRATEGY);
for(int i = 0; i < groups.length; i++){
if(groups[i].nodeCount() > SOME_LIMIT){
- collapsingStrategy.group(myNetwork,groups[i]); // this collapses the groups
- stackingStrategy.group(myNetwork,groups[i]); // this aligns the nodes in a stack
}
}}}
Notes:
I decided to name the interfaces in this API using the group word instead of the MetaNode word. A MetaNode is a way of grouping nodes/edges in a graph. The more general concept is grouping.
The GroupingManager is an interface to the data structure that stores groups for Cytoscape networks. We have not decided what data structure will do this. Alternatives that have been mentioned in the past are:
CyAttributes
CyNodes (as it is done currently)
- A new data structure
Here is my opinion on each:
CyAttributes Requires that a node (if we use node CyAttributes) or an edge (if we use edge CyAttributes be created per group. Only in one case (COLLAPSING_STRATEGY) is a node per group needed. The other grouping strategies do not need new nodes or edges. Additionally, there is no safe way of storing to which network a group belongs, since the node that functions as a key in CyAttributes can be manipulated very easily by users (removing it, adding it to a new network, etc).
CyNode Also requires a node per group. This was originally done because when we were designing the GINY API, we were not thinking of the more general grouping problem. We were thinking of MetaNodes only.
A new data structure. This could be a data-structure that resembles CyAttributes (some sort of map structure) but that does not require the creation of a node per group. Also, this data structure would be hidden, so that the only way of interacting with it is GroupingManager. I vote for this.