Skip to content

Commit 03d358e

Browse files
committed
GeneMANIA/String: Add support for leading edge, and call from context
menu
1 parent 9e0f602 commit 03d358e

14 files changed

+491
-281
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/CyActivator.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.baderlab.csplugins.enrichmentmap.style.ChartFactoryManager;
2828
import org.baderlab.csplugins.enrichmentmap.style.EMStyleBuilder;
2929
import org.baderlab.csplugins.enrichmentmap.style.charts.radialheatmap.RadialHeatMapChartFactory;
30+
import org.baderlab.csplugins.enrichmentmap.task.genemania.QueryGeneManiaNodeViewTaskFactory;
31+
import org.baderlab.csplugins.enrichmentmap.task.string.QueryStringNodeViewTaskFactory;
3032
import org.baderlab.csplugins.enrichmentmap.task.tunables.GeneListGUITunableHandler;
3133
import org.baderlab.csplugins.enrichmentmap.task.tunables.GeneListTunable;
3234
import org.baderlab.csplugins.enrichmentmap.view.EMColumnPresentation;
@@ -95,11 +97,9 @@ public void start(BundleContext bc) {
9597
registerAllServices(bc, injector.getInstance(OpenEnrichmentMapAction.class));
9698

9799
// context menu actions in network view
98-
Properties pathwayCommonsProps = new Properties();
99-
pathwayCommonsProps.setProperty(IN_MENU_BAR, "false");
100-
pathwayCommonsProps.setProperty(PREFERRED_MENU, APPS_MENU);
101-
pathwayCommonsProps.setProperty(TITLE, "EnrichmentMap - Open Pathway Commons");
102-
registerAllServices(bc, injector.getInstance(OpenPathwayCommonsTaskFactory.class), pathwayCommonsProps);
100+
registerNodeViewMenu(bc, "Pathway Commons", OpenPathwayCommonsTaskFactory.class);
101+
registerNodeViewMenu(bc, "GeneMANIA", QueryGeneManiaNodeViewTaskFactory.class);
102+
registerNodeViewMenu(bc, "STRING", QueryStringNodeViewTaskFactory.class);
103103

104104
// chart listener
105105
ChartFactoryManager chartFactoryManager = injector.getInstance(ChartFactoryManager.class);
@@ -134,6 +134,13 @@ public void start(BundleContext bc) {
134134
Em21Handler.removeVersion21(bc, injector.getInstance(CyApplicationConfiguration.class));
135135
}
136136

137+
private void registerNodeViewMenu(BundleContext bc, String text, Class<?> klass) {
138+
Properties props = new Properties();
139+
props.setProperty(IN_MENU_BAR, "false");
140+
props.setProperty(PREFERRED_MENU, APPS_MENU);
141+
props.setProperty(TITLE, "EnrichmentMap - Show in " + text);
142+
registerAllServices(bc, injector.getInstance(klass), props);
143+
}
137144

138145
private void initializeCommands(BundleContext bc) {
139146
registerCommand(bc, "build", injector.getInstance(Key.get(TaskFactory.class, BuildCommand.class)));
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package org.baderlab.csplugins.enrichmentmap.task.genemania;
2+
3+
import static org.baderlab.csplugins.enrichmentmap.task.genemania.QueryGeneManiaTask.GENEMANIA_NAMESPACE;
4+
import static org.baderlab.csplugins.enrichmentmap.task.genemania.QueryGeneManiaTask.GENEMANIA_ORGANISMS_COMMAND;
5+
import static org.baderlab.csplugins.enrichmentmap.task.genemania.QueryGeneManiaTask.GENEMANIA_SEARCH_COMMAND;
6+
import static org.baderlab.csplugins.enrichmentmap.view.util.SwingUtil.invokeOnEDT;
7+
8+
import java.lang.reflect.Type;
9+
import java.util.Collections;
10+
import java.util.List;
11+
import java.util.Set;
12+
13+
import javax.swing.JFrame;
14+
import javax.swing.JOptionPane;
15+
16+
import org.baderlab.csplugins.enrichmentmap.model.AssociatedApp;
17+
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMap;
18+
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMapManager;
19+
import org.baderlab.csplugins.enrichmentmap.view.util.OpenBrowser;
20+
import org.cytoscape.command.AvailableCommands;
21+
import org.cytoscape.command.CommandExecutorTaskFactory;
22+
import org.cytoscape.model.CyNetwork;
23+
import org.cytoscape.model.CyNetworkManager;
24+
import org.cytoscape.work.AbstractTask;
25+
import org.cytoscape.work.FinishStatus;
26+
import org.cytoscape.work.ObservableTask;
27+
import org.cytoscape.work.TaskIterator;
28+
import org.cytoscape.work.TaskMonitor;
29+
import org.cytoscape.work.TaskObserver;
30+
import org.cytoscape.work.json.JSONResult;
31+
import org.cytoscape.work.swing.DialogTaskManager;
32+
33+
import com.google.common.reflect.TypeToken;
34+
import com.google.gson.Gson;
35+
import com.google.inject.Inject;
36+
import com.google.inject.Provider;
37+
import com.google.inject.Singleton;
38+
39+
@Singleton
40+
public class GeneManiaMediator {
41+
42+
@Inject private QueryGeneManiaTask.Factory queryGeneManiaTaskFactory;
43+
44+
@Inject private CyNetworkManager networkManager;
45+
@Inject private EnrichmentMapManager emManager;
46+
@Inject private CommandExecutorTaskFactory commandExecutorTaskFactory;
47+
@Inject private AvailableCommands availableCommands;
48+
@Inject private Provider<JFrame> jFrameProvider;
49+
@Inject private OpenBrowser openBrowser;
50+
@Inject private DialogTaskManager taskManager;
51+
52+
53+
public void runGeneMANIA(EnrichmentMap map, List<String> genes, Set<String> leadingEdgeGenes) {
54+
TaskIterator ti = createTaskIterator(map, genes, leadingEdgeGenes);
55+
taskManager.execute(ti);
56+
}
57+
58+
59+
public TaskIterator createTaskIterator(EnrichmentMap map, List<String> genes, Set<String> leadingEdgeGenes) {
60+
// Show message to user if genemania not installed
61+
List<String> commands = availableCommands.getCommands(GENEMANIA_NAMESPACE);
62+
63+
if (commands == null || !commands.contains(GENEMANIA_SEARCH_COMMAND)) {
64+
if (JOptionPane.showConfirmDialog(
65+
jFrameProvider.get(),
66+
"This action requires a version of the GeneMANIA app that is not installed.\n" +
67+
"Would you like to install or update the GeneMANIA app now?",
68+
"Cannot Find GeneMANIA App",
69+
JOptionPane.YES_NO_OPTION
70+
) == JOptionPane.YES_OPTION) {
71+
openBrowser.openURL("http://apps.cytoscape.org/apps/genemania");
72+
}
73+
74+
return null;
75+
}
76+
77+
QueryGeneManiaTask queryTask = queryGeneManiaTaskFactory.create(genes, leadingEdgeGenes);
78+
79+
// Get list of organisms from GeneMANIA
80+
TaskIterator ti = commandExecutorTaskFactory.createTaskIterator(
81+
GENEMANIA_NAMESPACE, GENEMANIA_ORGANISMS_COMMAND, Collections.emptyMap(), new TaskObserver() {
82+
83+
@Override
84+
@SuppressWarnings("serial")
85+
public void taskFinished(ObservableTask task) {
86+
if (task instanceof ObservableTask) {
87+
if (((ObservableTask) task).getResultClasses().contains(JSONResult.class)) {
88+
JSONResult json = ((ObservableTask) task).getResults(JSONResult.class);
89+
90+
if (json != null && json.getJSON() != null) {
91+
Gson gson = new Gson();
92+
Type type = new TypeToken<GMOrganismsResult>(){}.getType();
93+
GMOrganismsResult res = gson.fromJson(json.getJSON(), type);
94+
95+
if (res != null && res.getOrganisms() != null && !res.getOrganisms().isEmpty())
96+
queryTask.updatetOrganisms(res.getOrganisms());
97+
else
98+
throw new RuntimeException("Unable to retrieve available organisms from GeneMANIA.");
99+
}
100+
}
101+
}
102+
}
103+
104+
@Override
105+
public void allFinished(FinishStatus finishStatus) {
106+
// Never called by Cytoscape...
107+
}
108+
});
109+
110+
ti.append(queryTask);
111+
112+
ti.append(new AbstractTask() {
113+
@Override
114+
public void run(TaskMonitor taskMonitor) throws Exception {
115+
onGeneManiaQueryFinished(queryTask.getResult(), map);
116+
}
117+
});
118+
119+
return ti;
120+
}
121+
122+
123+
private void onGeneManiaQueryFinished(GMSearchResult res, EnrichmentMap map) {
124+
CyNetwork net = null;
125+
126+
if (res != null && res.getNetwork() != null && res.getGenes() != null && !res.getGenes().isEmpty())
127+
net = networkManager.getNetwork(res.getNetwork());
128+
129+
if (net == null) {
130+
invokeOnEDT(() -> {
131+
JOptionPane.showMessageDialog(
132+
jFrameProvider.get(),
133+
"The GeneMANIA search returned no results.",
134+
"No Results",
135+
JOptionPane.INFORMATION_MESSAGE
136+
);
137+
});
138+
} else {
139+
// Update the model
140+
map.addAssociatedNetworkID(net.getSUID());
141+
emManager.addAssociatedAppAttributes(net, map, AssociatedApp.GENEMANIA);
142+
// TODO
143+
// // Modify GeneMANIA's style
144+
// Collection<CyNetworkView> netViewList = netViewManager.getNetworkViews(net);
145+
//
146+
// for (CyNetworkView netView : netViewList)
147+
// updateGeneManiaStyle(netView);
148+
}
149+
}
150+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.baderlab.csplugins.enrichmentmap.task.genemania;
2+
3+
import java.util.Collections;
4+
import java.util.List;
5+
6+
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMap;
7+
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMapManager;
8+
import org.baderlab.csplugins.enrichmentmap.style.EMStyleBuilder.Columns;
9+
import org.cytoscape.model.CyNetwork;
10+
import org.cytoscape.model.CyNode;
11+
import org.cytoscape.model.CyRow;
12+
import org.cytoscape.task.NodeViewTaskFactory;
13+
import org.cytoscape.view.model.CyNetworkView;
14+
import org.cytoscape.view.model.View;
15+
import org.cytoscape.work.TaskIterator;
16+
17+
import com.google.inject.Inject;
18+
19+
public class QueryGeneManiaNodeViewTaskFactory implements NodeViewTaskFactory {
20+
21+
@Inject private GeneManiaMediator geneManiaMediator;
22+
@Inject private EnrichmentMapManager emManager;
23+
24+
25+
@Override
26+
public TaskIterator createTaskIterator(View<CyNode> nodeView, CyNetworkView networkView) {
27+
CyNode node = nodeView.getModel();
28+
CyNetwork network = networkView.getModel();
29+
EnrichmentMap map = emManager.getEnrichmentMap(network.getSUID());
30+
31+
CyRow row = network.getRow(node);
32+
List<String> genes = Columns.NODE_GENES.get(row, map.getParams().getAttributePrefix());
33+
34+
return geneManiaMediator.createTaskIterator(map, genes, Collections.emptySet());
35+
}
36+
37+
@Override
38+
public boolean isReady(View<CyNode> nodeView, CyNetworkView networkView) {
39+
return emManager.isEnrichmentMap(networkView);
40+
}
41+
42+
}

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/task/genemania/QueryGeneManiaTask.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.HashMap;
55
import java.util.List;
66
import java.util.Map;
7+
import java.util.Set;
78

89
import org.baderlab.csplugins.enrichmentmap.task.tunables.GeneListTunable;
910
import org.cytoscape.command.CommandExecutorTaskFactory;
@@ -49,12 +50,12 @@ public class QueryGeneManiaTask extends AbstractTask {
4950
@Inject private CommandExecutorTaskFactory commandExecutorTaskFactory;
5051

5152
public static interface Factory {
52-
QueryGeneManiaTask create(List<String> geneList);
53+
QueryGeneManiaTask create(List<String> geneList, Set<String> leadingEdge);
5354
}
5455

5556
@Inject
56-
public QueryGeneManiaTask(@Assisted List<String> geneList) {
57-
this.geneList = new GeneListTunable(geneList);
57+
public QueryGeneManiaTask(@Assisted List<String> geneList, @Assisted Set<String> leadingEdge) {
58+
this.geneList = new GeneListTunable(geneList, leadingEdge);
5859
this.organisms = new ListSingleSelection<>();
5960
this.weightingMethods = new ListSingleSelection<>(GMWeightingMethod.values());
6061
this.weightingMethods.setSelectedValue(weightingMethods.getPossibleValues().get(0));
@@ -87,7 +88,6 @@ public void run(TaskMonitor tm) throws Exception {
8788
tm.setStatusMessage("Querying GeneMANIA...");
8889

8990
String query = String.join("|", geneList.getSelectedGenes());
90-
System.out.println(query);
9191

9292
Map<String, Object> args = new HashMap<>();
9393
args.put("organism", "" + organisms.getSelectedValue().getTaxonomyId());
@@ -121,7 +121,7 @@ public void allFinished(FinishStatus finishStatus) {
121121
// Never called by Cytoscape...
122122
}
123123
});
124-
getTaskIterator().append(ti);
124+
insertTasksAfterCurrentTask(ti);
125125

126126
// Save this as the default organism for next time
127127
lastTaxonomyId = organisms.getSelectedValue().getTaxonomyId();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.baderlab.csplugins.enrichmentmap.task.string;
2+
3+
import java.util.Collections;
4+
import java.util.List;
5+
6+
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMap;
7+
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMapManager;
8+
import org.baderlab.csplugins.enrichmentmap.style.EMStyleBuilder.Columns;
9+
import org.cytoscape.model.CyNetwork;
10+
import org.cytoscape.model.CyNode;
11+
import org.cytoscape.model.CyRow;
12+
import org.cytoscape.task.NodeViewTaskFactory;
13+
import org.cytoscape.view.model.CyNetworkView;
14+
import org.cytoscape.view.model.View;
15+
import org.cytoscape.work.TaskIterator;
16+
17+
import com.google.inject.Inject;
18+
19+
public class QueryStringNodeViewTaskFactory implements NodeViewTaskFactory {
20+
21+
@Inject private StringAppMediator stringAppMediator;
22+
@Inject private EnrichmentMapManager emManager;
23+
24+
25+
@Override
26+
public TaskIterator createTaskIterator(View<CyNode> nodeView, CyNetworkView networkView) {
27+
CyNode node = nodeView.getModel();
28+
CyNetwork network = networkView.getModel();
29+
EnrichmentMap map = emManager.getEnrichmentMap(network.getSUID());
30+
31+
CyRow row = network.getRow(node);
32+
List<String> genes = Columns.NODE_GENES.get(row, map.getParams().getAttributePrefix());
33+
34+
return stringAppMediator.createTaskIterator(map, genes, Collections.emptySet());
35+
}
36+
37+
@Override
38+
public boolean isReady(View<CyNode> nodeView, CyNetworkView networkView) {
39+
return emManager.isEnrichmentMap(networkView);
40+
}
41+
}

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/task/string/QueryStringTask.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import java.util.HashMap;
44
import java.util.List;
55
import java.util.Map;
6+
import java.util.Set;
67

8+
import org.baderlab.csplugins.enrichmentmap.task.tunables.GeneListTunable;
79
import org.cytoscape.command.CommandExecutorTaskFactory;
810
import org.cytoscape.model.CyNetwork;
911
import org.cytoscape.work.AbstractTask;
@@ -29,6 +31,9 @@ public class QueryStringTask extends AbstractTask {
2931
public static final String STRING_SPECIES_COMMAND = "list species";
3032
public static final String STRING_SEARCH_COMMAND = "protein query";
3133

34+
@Tunable(description = "Genes:")
35+
public GeneListTunable geneList;
36+
3237
@Tunable(description = "Species:")
3338
public ListSingleSelection<STRSpecies> organisms;
3439

@@ -38,21 +43,20 @@ public class QueryStringTask extends AbstractTask {
3843
@Tunable(description = "Max Additional Interactors:", params = "slider=true")
3944
public BoundedInteger limit = new BoundedInteger(0, 0, 100, false, false);
4045

41-
private final String query;
4246
private Long result;
4347

4448
private static long lastTaxonomyId = 9606; // H.sapiens
4549

4650
@Inject private CommandExecutorTaskFactory commandExecutorTaskFactory;
4751

4852
public static interface Factory {
49-
QueryStringTask create(List<String> geneList);
53+
QueryStringTask create(List<String> geneList, Set<String> leadingEdge);
5054
}
5155

5256
@Inject
53-
public QueryStringTask(@Assisted List<String> geneList) {
54-
query = String.join(",", geneList);
55-
organisms = new ListSingleSelection<>();
57+
public QueryStringTask(@Assisted List<String> geneList, @Assisted Set<String> leadingEdge) {
58+
this.geneList = new GeneListTunable(geneList, leadingEdge);
59+
this.organisms = new ListSingleSelection<>();
5660
}
5761

5862
@ProvidesTitle
@@ -81,6 +85,8 @@ public void run(TaskMonitor tm) throws Exception {
8185
tm.setTitle("EnrichmentMap");
8286
tm.setStatusMessage("Querying STRING...");
8387

88+
String query = String.join(",", geneList.getSelectedGenes());
89+
8490
Map<String, Object> args = new HashMap<>();
8591
args.put("taxonID", "" + organisms.getSelectedValue().getTaxonomyId());
8692
args.put("query", query);
@@ -113,7 +119,7 @@ public void allFinished(FinishStatus finishStatus) {
113119
// Never called by Cytoscape...
114120
}
115121
});
116-
getTaskIterator().append(ti);
122+
insertTasksAfterCurrentTask(ti);
117123

118124
// Save this as the default organism for next time
119125
lastTaxonomyId = organisms.getSelectedValue().getTaxonomyId();

0 commit comments

Comments
 (0)