Skip to content
Snippets Groups Projects
Commit 0c43e678 authored by Philipp Spohr's avatar Philipp Spohr
Browse files

Implemented meta-graph

parent 7197c736
Branches
Tags
No related merge requests found
...@@ -12,9 +12,11 @@ import org.cytoscape.model.events.ColumnCreatedListener; ...@@ -12,9 +12,11 @@ import org.cytoscape.model.events.ColumnCreatedListener;
import org.cytoscape.model.events.ColumnDeletedListener; import org.cytoscape.model.events.ColumnDeletedListener;
import org.cytoscape.model.events.NetworkAddedListener; import org.cytoscape.model.events.NetworkAddedListener;
import org.cytoscape.model.events.RemovedEdgesListener; import org.cytoscape.model.events.RemovedEdgesListener;
import org.cytoscape.model.subnetwork.CyRootNetworkManager;
import org.cytoscape.service.util.AbstractCyActivator; import org.cytoscape.service.util.AbstractCyActivator;
import org.cytoscape.service.util.CyServiceRegistrar; import org.cytoscape.service.util.CyServiceRegistrar;
import org.cytoscape.session.events.SessionLoadedListener; import org.cytoscape.session.events.SessionLoadedListener;
import org.cytoscape.task.visualize.ApplyVisualStyleTaskFactory;
import org.cytoscape.view.model.CyNetworkViewFactory; import org.cytoscape.view.model.CyNetworkViewFactory;
import org.cytoscape.view.layout.CyLayoutAlgorithmManager; import org.cytoscape.view.layout.CyLayoutAlgorithmManager;
import org.cytoscape.view.model.CyNetworkViewManager; import org.cytoscape.view.model.CyNetworkViewManager;
...@@ -59,6 +61,9 @@ public class CyActivator extends AbstractCyActivator { ...@@ -59,6 +61,9 @@ public class CyActivator extends AbstractCyActivator {
CyCore.visualMappingManager = getService(context,VisualMappingManager.class); CyCore.visualMappingManager = getService(context,VisualMappingManager.class);
CyCore.visualStyleFactory = getService(context,VisualStyleFactory.class); CyCore.visualStyleFactory = getService(context,VisualStyleFactory.class);
CyCore.continuousMappingFactory = getService(context,VisualMappingFunctionFactory.class, "(mapping.type=continuous)"); CyCore.continuousMappingFactory = getService(context,VisualMappingFunctionFactory.class, "(mapping.type=continuous)");
CyCore.rootNetworkManager = getService(context,CyRootNetworkManager.class);
CyCore.applyVisualStyleTaskFactory = getService(context,ApplyVisualStyleTaskFactory.class);
//Set language according to settings //Set language according to settings
LocalizationManager.switchLanguage(cm.getProperties().getProperty("locale", "enUS")); LocalizationManager.switchLanguage(cm.getProperties().getProperty("locale", "enUS"));
......
...@@ -149,7 +149,9 @@ public class AlgorithmTask extends AbstractTask { ...@@ -149,7 +149,9 @@ public class AlgorithmTask extends AbstractTask {
//Loop over cluster //Loop over cluster
for (long k=0;k<numberOfClusters;k++) { for (long k=0;k<numberOfClusters;k++) {
//Create java instance //Create java instance
YoshikoCluster cluster = new YoshikoCluster(k); YoshikoCluster cluster = new YoshikoCluster(k,net);
taskMonitor.setStatusMessage("Processing cluster "+(k+1)+" of "+numberOfClusters); taskMonitor.setStatusMessage("Processing cluster "+(k+1)+" of "+numberOfClusters);
SWIGTYPE_p_std__vectorT_int_t clusterVector = LibraryInterface.ClusterEditingSolutions_getCluster(result, i, k); SWIGTYPE_p_std__vectorT_int_t clusterVector = LibraryInterface.ClusterEditingSolutions_getCluster(result, i, k);
......
...@@ -4,7 +4,9 @@ import org.cytoscape.application.CyApplicationManager; ...@@ -4,7 +4,9 @@ import org.cytoscape.application.CyApplicationManager;
import org.cytoscape.application.swing.CySwingApplication; import org.cytoscape.application.swing.CySwingApplication;
import org.cytoscape.model.CyNetworkFactory; import org.cytoscape.model.CyNetworkFactory;
import org.cytoscape.model.CyNetworkManager; import org.cytoscape.model.CyNetworkManager;
import org.cytoscape.model.subnetwork.CyRootNetworkManager;
import org.cytoscape.service.util.CyServiceRegistrar; import org.cytoscape.service.util.CyServiceRegistrar;
import org.cytoscape.task.visualize.ApplyVisualStyleTaskFactory;
import org.cytoscape.view.layout.CyLayoutAlgorithmManager; import org.cytoscape.view.layout.CyLayoutAlgorithmManager;
import org.cytoscape.view.model.CyNetworkViewFactory; import org.cytoscape.view.model.CyNetworkViewFactory;
import org.cytoscape.view.model.CyNetworkViewManager; import org.cytoscape.view.model.CyNetworkViewManager;
...@@ -34,6 +36,8 @@ public class CyCore { ...@@ -34,6 +36,8 @@ public class CyCore {
public static VisualMappingManager visualMappingManager; public static VisualMappingManager visualMappingManager;
public static VisualStyleFactory visualStyleFactory; public static VisualStyleFactory visualStyleFactory;
public static VisualMappingFunctionFactory continuousMappingFactory; public static VisualMappingFunctionFactory continuousMappingFactory;
public static CyRootNetworkManager rootNetworkManager;
public static ApplyVisualStyleTaskFactory applyVisualStyleTaskFactory;
// //
} }
...@@ -2,14 +2,22 @@ package de.hhu.ba.yoshikoWrapper.graphModel; ...@@ -2,14 +2,22 @@ package de.hhu.ba.yoshikoWrapper.graphModel;
import java.util.ArrayList; import java.util.ArrayList;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode; import org.cytoscape.model.CyNode;
public class YoshikoCluster { public class YoshikoCluster {
public long id;
public final long id;
public final CyNetwork originalGraph;
public ArrayList<CyNode> nodes; public ArrayList<CyNode> nodes;
public YoshikoCluster(long id) { public YoshikoCluster(long id, CyNetwork originalGraph) {
this.id = id; this.id = id;
this.originalGraph = originalGraph;
this.nodes = new ArrayList<CyNode>(); this.nodes = new ArrayList<CyNode>();
} }
} }
...@@ -2,17 +2,25 @@ package de.hhu.ba.yoshikoWrapper.graphModel; ...@@ -2,17 +2,25 @@ package de.hhu.ba.yoshikoWrapper.graphModel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import org.cytoscape.model.CyEdge; import org.cytoscape.model.CyEdge;
import org.cytoscape.model.CyNetwork; import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode; import org.cytoscape.model.CyNode;
import org.cytoscape.model.subnetwork.CyRootNetwork;
import org.cytoscape.model.subnetwork.CySubNetwork;
import org.cytoscape.view.layout.CyLayoutAlgorithm;
import org.cytoscape.view.model.CyNetworkView;
import org.cytoscape.view.presentation.property.BasicVisualLexicon;
import org.cytoscape.view.vizmap.VisualStyle;
import org.cytoscape.view.vizmap.mappings.ContinuousMapping;
import de.hhu.ba.yoshikoWrapper.core.CyCore; import de.hhu.ba.yoshikoWrapper.core.CyCore;
import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
public class YoshikoSolution { public class YoshikoSolution {
private CyNetwork originalGraph; private CyNetwork originalGraph;
public ArrayList<YoshikoCluster> cluster; public ArrayList<YoshikoCluster> cluster;
public int id; public int id;
...@@ -23,9 +31,9 @@ public class YoshikoSolution { ...@@ -23,9 +31,9 @@ public class YoshikoSolution {
/** /**
* Transforms this solution in a meta-graph where each cluster is represented by one node * Transforms this solution in a meta-graph where each cluster is represented by one node
* @return The meta-graph as CyNetwork * The nodes are linked to subgraphs representing the cluster and also their size is scaled relative to cluster size
*/ */
public CyNetwork toMetaGraph() { public void exportMetaGraph() {
CyNetwork metaGraph = CyCore.networkFactory.createNetwork(); CyNetwork metaGraph = CyCore.networkFactory.createNetwork();
...@@ -33,12 +41,48 @@ public class YoshikoSolution { ...@@ -33,12 +41,48 @@ public class YoshikoSolution {
metaGraph.getDefaultNodeTable().createColumn("clusterSize", Integer.class, false); metaGraph.getDefaultNodeTable().createColumn("clusterSize", Integer.class, false);
CyLayoutAlgorithm layout = CyCore.layoutAlgorithmManager.getDefaultLayout();
//Map Cluster to Nodes for further reference //Map Cluster to Nodes for further reference
HashMap<YoshikoCluster,CyNode> map = new HashMap<YoshikoCluster,CyNode>(); HashMap<YoshikoCluster,CyNode> map = new HashMap<YoshikoCluster,CyNode>();
//Convert original graph to root graph to allow embedding of nodes
CyRootNetwork originalGraphAsRoot = CyCore.rootNetworkManager.getRootNetwork(originalGraph);
//Add nodes //Add nodes
for (YoshikoCluster c: cluster) { for (YoshikoCluster c: cluster) {
CyNode clusterNode = metaGraph.addNode(); CyNode clusterNode = metaGraph.addNode();
//Create nested graph and cluster subnet
ArrayList<CyEdge> inducedEdges = new ArrayList<CyEdge>();
for (CyNode n: c.nodes) {
//Sadly Cytoscape doesnt provide a comfort function here
List<CyEdge> adjacentEdges = originalGraph.getAdjacentEdgeList(n, CyEdge.Type.ANY);
for (CyEdge e: adjacentEdges) {
if (c.nodes.contains(e.getSource()) && c.nodes.contains(e.getTarget())) {
inducedEdges.add(e);
}
}
}
CySubNetwork subnet = originalGraphAsRoot.addSubNetwork(c.nodes ,inducedEdges);
subnet.getRow(subnet).set(CyNetwork.NAME, LocalizationManager.get("cluster")+" "+(c.id+1));
CyCore.networkManager.addNetwork(subnet);
//Create network view and register it
CyNetworkView subnetView = CyCore.networkViewFactory.createNetworkView(subnet);
CyCore.networkViewManager.addNetworkView(subnetView);
//layout cluster
CyCore.dialogTaskManager.execute(
layout.createTaskIterator(
subnetView,
layout.getDefaultLayoutContext(),
CyLayoutAlgorithm.ALL_NODE_VIEWS,
null
)
);
clusterNode.setNetworkPointer(subnet);
//Set node attributes
metaGraph.getRow(clusterNode).set("name", LocalizationManager.get("cluster")+" "+c.id); metaGraph.getRow(clusterNode).set("name", LocalizationManager.get("cluster")+" "+c.id);
metaGraph.getRow(clusterNode).set("clusterSize",c.nodes.size()); metaGraph.getRow(clusterNode).set("clusterSize",c.nodes.size());
map.put(c, clusterNode); map.put(c, clusterNode);
...@@ -64,7 +108,38 @@ public class YoshikoSolution { ...@@ -64,7 +108,38 @@ public class YoshikoSolution {
} }
} }
} }
return metaGraph;
CyNetworkView view = CyCore.networkViewFactory.createNetworkView(metaGraph);
//layout solution
CyCore.dialogTaskManager.execute(
layout.createTaskIterator(
view,
layout.getDefaultLayoutContext(),
CyLayoutAlgorithm.ALL_NODE_VIEWS,
null
)
);
CyCore.networkManager.addNetwork(metaGraph);
CyCore.networkViewManager.addNetworkView(
view
);
//define style for solution
ContinuousMapping<Integer, Double> contMap = (ContinuousMapping<Integer, Double>)CyCore.continuousMappingFactory.createVisualMappingFunction(
"clusterSize",
Integer.class,
BasicVisualLexicon.NODE_SIZE
);
VisualStyle vs= CyCore.visualStyleFactory.createVisualStyle("Meta-Graph Style");
vs.addVisualMappingFunction(contMap);
CyCore.visualMappingManager.addVisualStyle(vs);
CyCore.cy.setCurrentNetworkView(view);
//Apply visual style
CyCore.visualMappingManager.setVisualStyle(vs, view);
vs.apply(view);
view.updateView();
} }
} }
...@@ -11,12 +11,9 @@ import javax.swing.BoxLayout; ...@@ -11,12 +11,9 @@ import javax.swing.BoxLayout;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.border.Border; import javax.swing.border.Border;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode; import org.cytoscape.model.CyNode;
import org.cytoscape.model.CyRow; import org.cytoscape.model.CyRow;
import org.cytoscape.view.model.CyNetworkView;
import de.hhu.ba.yoshikoWrapper.core.CyCore;
import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster; import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
...@@ -26,10 +23,6 @@ public class ClusterView extends ComfortPanel { ...@@ -26,10 +23,6 @@ public class ClusterView extends ComfortPanel {
private final JLabel title; private final JLabel title;
private final JLabel clusterSize; private final JLabel clusterSize;
private final CyNetworkView clusterView;
private CyNetwork clusterSubNet;
private final Border regularBorder = BorderFactory.createLineBorder(Color.GRAY); private final Border regularBorder = BorderFactory.createLineBorder(Color.GRAY);
private final Border highlightBorder = BorderFactory.createLineBorder(Color.RED); private final Border highlightBorder = BorderFactory.createLineBorder(Color.RED);
...@@ -43,15 +36,13 @@ public class ClusterView extends ComfortPanel { ...@@ -43,15 +36,13 @@ public class ClusterView extends ComfortPanel {
public ClusterView(YoshikoCluster c) { public ClusterView(YoshikoCluster c) {
this.cluster = c; this.cluster = c;
//Swing init //Swing init
this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
title = new JLabel(LocalizationManager.get("cluster")+" "+(c.id+1)); title = new JLabel(LocalizationManager.get("cluster")+" "+(c.id+1));
clusterSize = new JLabel(LocalizationManager.get("clusterSize")+" "+c.nodes.size()); clusterSize = new JLabel(LocalizationManager.get("clusterSize")+" "+c.nodes.size());
this.clusterSubNet = CyCore.networkFactory.createNetwork();
this.clusterView = CyCore.networkViewFactory.createNetworkView(this.clusterSubNet);
this.addAll(title,clusterSize); this.addAll(title,clusterSize);
this.add(Box.createVerticalStrut(4)); this.add(Box.createVerticalStrut(4));
...@@ -59,7 +50,7 @@ public class ClusterView extends ComfortPanel { ...@@ -59,7 +50,7 @@ public class ClusterView extends ComfortPanel {
for (CyNode n : c.nodes) { for (CyNode n : c.nodes) {
this.add( this.add(
new JLabel( new JLabel(
CyCore.cy.getCurrentNetwork().getRow(n).get("name", String.class) c.originalGraph.getRow(n).get("name", String.class)
) )
); );
} }
...@@ -79,13 +70,13 @@ public class ClusterView extends ComfortPanel { ...@@ -79,13 +70,13 @@ public class ClusterView extends ComfortPanel {
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
//Undo previous selection //Undo previous selection
List<CyRow> allRows = CyCore.cy.getCurrentNetwork().getDefaultNodeTable().getAllRows(); List<CyRow> allRows = cluster.originalGraph.getDefaultNodeTable().getAllRows();
for (CyRow r: allRows) { for (CyRow r: allRows) {
r.set("selected", false); r.set("selected", false);
} }
//Select nodes corresponding to the cluster //Select nodes corresponding to the cluster
for (CyNode n : cluster.nodes) { for (CyNode n : cluster.nodes) {
CyCore.cy.getCurrentNetwork().getRow(n).set("selected", true); cluster.originalGraph.getRow(n).set("selected", true);
} }
} }
......
...@@ -10,14 +10,6 @@ import javax.swing.JButton; ...@@ -10,14 +10,6 @@ import javax.swing.JButton;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.view.layout.CyLayoutAlgorithm;
import org.cytoscape.view.model.CyNetworkView;
import org.cytoscape.view.presentation.property.BasicVisualLexicon;
import org.cytoscape.view.vizmap.VisualStyle;
import org.cytoscape.view.vizmap.mappings.ContinuousMapping;
import de.hhu.ba.yoshikoWrapper.core.CyCore;
import de.hhu.ba.yoshikoWrapper.core.LocalizationManager; import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster; import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoSolution; import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoSolution;
...@@ -56,37 +48,7 @@ public class SolutionTab extends ComfortPanel { ...@@ -56,37 +48,7 @@ public class SolutionTab extends ComfortPanel {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
CyNetwork metaGraph = solution.toMetaGraph(); solution.exportMetaGraph();
CyNetworkView view = CyCore.networkViewFactory.createNetworkView(metaGraph);
//layout solution
CyLayoutAlgorithm layout = CyCore.layoutAlgorithmManager.getDefaultLayout();
CyCore.dialogTaskManager.execute(
layout.createTaskIterator(
view,
layout.getDefaultLayoutContext(),
CyLayoutAlgorithm.ALL_NODE_VIEWS,
null
)
);
//define style for solution
ContinuousMapping<Integer, Double> contMap = (ContinuousMapping<Integer, Double>)CyCore.continuousMappingFactory.createVisualMappingFunction(
"clusterSize",
Integer.class,
BasicVisualLexicon.NODE_SIZE
);
VisualStyle vs= CyCore.visualStyleFactory.createVisualStyle("Meta-Graph Style");
vs.addVisualMappingFunction(contMap);
CyCore.visualMappingManager.addVisualStyle(vs);
CyCore.networkManager.addNetwork(metaGraph);
CyCore.networkViewManager.addNetworkView(
view
);
CyCore.cy.setCurrentNetworkView(view);
vs.apply(CyCore.cy.getCurrentNetworkView());
CyCore.cy.getCurrentNetworkView().updateView();
} }
}); });
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment