Skip to content

Commit 320179b

Browse files
committed
Make sure data sets for nodes adjacent to signature edges are included
in heat map. Fixes #404
1 parent 3cfbe23 commit 320179b

File tree

2 files changed

+88
-51
lines changed

2 files changed

+88
-51
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/model/EnrichmentMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public Map<String, Set<Integer>> unionAllGeneSetsOfInterest() {
285285
return unionGeneSetsOfInterest(x -> true);
286286
}
287287

288-
public Map<String, Set<Integer>> unionGeneSetsOfInterest(Collection<EMDataSet> dataSets) {
288+
public Map<String, Set<Integer>> unionGeneSetsOfInterest(Collection<? extends AbstractDataSet> dataSets) {
289289
return unionGeneSetsOfInterest(dataSets::contains);
290290
}
291291

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/heatmap/HeatMapMediator.java

Lines changed: 87 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.Iterator;
1111
import java.util.List;
1212
import java.util.Map;
13+
import java.util.Objects;
1314
import java.util.Optional;
1415
import java.util.Properties;
1516
import java.util.Set;
@@ -18,6 +19,7 @@
1819
import org.baderlab.csplugins.enrichmentmap.AfterInjection;
1920
import org.baderlab.csplugins.enrichmentmap.PropertyManager;
2021
import org.baderlab.csplugins.enrichmentmap.actions.OpenPathwayCommonsTask;
22+
import org.baderlab.csplugins.enrichmentmap.model.AbstractDataSet;
2123
import org.baderlab.csplugins.enrichmentmap.model.AssociatedApp;
2224
import org.baderlab.csplugins.enrichmentmap.model.Compress;
2325
import org.baderlab.csplugins.enrichmentmap.model.EMDataSet;
@@ -26,9 +28,11 @@
2628
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMapManager;
2729
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentResult;
2830
import org.baderlab.csplugins.enrichmentmap.model.GSEAResult;
31+
import org.baderlab.csplugins.enrichmentmap.model.PostAnalysisParameters;
2932
import org.baderlab.csplugins.enrichmentmap.model.Ranking;
3033
import org.baderlab.csplugins.enrichmentmap.model.Transform;
3134
import org.baderlab.csplugins.enrichmentmap.style.EMStyleBuilder;
35+
import org.baderlab.csplugins.enrichmentmap.task.ApplyEMStyleTask;
3236
import org.baderlab.csplugins.enrichmentmap.task.genemania.GeneManiaMediator;
3337
import org.baderlab.csplugins.enrichmentmap.task.string.StringAppMediator;
3438
import org.baderlab.csplugins.enrichmentmap.util.CoalesceTimer;
@@ -238,48 +242,6 @@ private void heatMapParamsChanged(HeatMapParams params) {
238242
}
239243

240244

241-
private Collection<EMDataSet> getEnabledDataSets(
242-
CyNetworkView networkView, EnrichmentMap map,
243-
List<CyNode> selectedNodes, List<CyEdge> selectedEdges
244-
) {
245-
// must maintain the order returned by map.getDataSetList() (issue #390)
246-
List<EMDataSet> dataSets = new ArrayList<>(map.getDataSetList());
247-
248-
// Remove Data Sets that are not selected in the control panel
249-
if(propertyManager.isTrue(PropertyManager.HEATMAP_DATASET_SYNC)) {
250-
ViewParams params = controlPanelMediatorProvider.get().getAllViewParams().get(networkView.getSUID());
251-
if(params != null) {
252-
Set<String> filter = params.getFilteredOutDataSets();
253-
dataSets.removeIf(ds -> filter.contains(ds.getName()));
254-
}
255-
}
256-
257-
// Remove Data Sets that are not part of the selected nodes/edges
258-
if(propertyManager.isTrue(PropertyManager.HEATMAP_SELECT_SYNC)) {
259-
boolean distinctEdges = map.getParams().getCreateDistinctEdges();
260-
261-
Iterator<EMDataSet> iter = dataSets.iterator();
262-
while(iter.hasNext()) {
263-
EMDataSet ds = iter.next();
264-
265-
boolean remove = true;
266-
if(ds.containsAnyNode(selectedNodes))
267-
remove = false;
268-
else if(!distinctEdges && !selectedEdges.isEmpty())
269-
remove = false;
270-
else if(distinctEdges && ds.containsAnyEdge(selectedEdges))
271-
remove = false;
272-
273-
if(remove) {
274-
iter.remove();
275-
}
276-
}
277-
}
278-
279-
return dataSets;
280-
}
281-
282-
283245
private void updateHeatMap(CyNetworkView networkView) {
284246
if (!isHeatMapPanelRegistered())
285247
return;
@@ -298,14 +260,23 @@ private void updateHeatMap(CyNetworkView networkView) {
298260
final Set<String> inter;
299261
final Collection<EMDataSet> dataSets;
300262

301-
if (emManager.isEnrichmentMap(networkView)) {
302-
String prefix = map.getParams().getAttributePrefix();
263+
if(emManager.isEnrichmentMap(networkView)) {
264+
// Need to add nodes that are adjacent to signature edges, because signature edges are not in any of the normal data sets.
265+
Set<CyNode> allNodesToUse = new HashSet<>(selectedNodes);
266+
List<CyNode> extraNodes = getNodesAdjacentToSignatureEdges(network, selectedEdges);
267+
if(extraNodes != null) {
268+
allNodesToUse.addAll(extraNodes);
269+
}
303270

304-
dataSets = getEnabledDataSets(networkView, map, selectedNodes, selectedEdges);
305-
Map<String,Set<Integer>> geneSetToGenes = map.unionGeneSetsOfInterest(dataSets);
271+
Collection<AbstractDataSet> dataSetsToUse = getEnabledDataSets(networkView, map, allNodesToUse, selectedEdges);
272+
Map<String,Set<Integer>> geneSetToGenes = map.unionGeneSetsOfInterest(dataSetsToUse);
306273

307-
union = unionGenesets(geneSetToGenes, map, network, selectedNodes, selectedEdges, prefix);
308-
inter = interGenesets(geneSetToGenes, map, network, selectedNodes, selectedEdges, prefix);
274+
String prefix = map.getParams().getAttributePrefix();
275+
union = unionGenesets(geneSetToGenes, map, network, allNodesToUse, selectedEdges, prefix);
276+
inter = interGenesets(geneSetToGenes, map, network, allNodesToUse, selectedEdges, prefix);
277+
278+
// remove signature data sets at this point, they don't contain expression data
279+
dataSets = ApplyEMStyleTask.filterEMDataSets(dataSetsToUse);
309280
} else {
310281
AssociatedApp app = NetworkUtil.getAssociatedApp(network);
311282
if (app != null) {
@@ -343,6 +314,72 @@ private void updateHeatMap(CyNetworkView networkView) {
343314
});
344315
}
345316

317+
318+
319+
private List<AbstractDataSet> getEnabledDataSets(
320+
CyNetworkView networkView, EnrichmentMap map,
321+
Collection<CyNode> selectedNodes, Collection<CyEdge> selectedEdges
322+
) {
323+
if(selectedNodes.isEmpty() && selectedEdges.isEmpty())
324+
return Collections.emptyList();
325+
326+
// must maintain the order returned by map.getDataSetList() (issue #390)
327+
List<AbstractDataSet> dataSets = new ArrayList<>(map.getDataSetList());
328+
dataSets.addAll(map.getSignatureSetList());
329+
330+
// Remove Data Sets that are not selected in the control panel
331+
if(propertyManager.isTrue(PropertyManager.HEATMAP_DATASET_SYNC)) {
332+
ViewParams params = controlPanelMediatorProvider.get().getAllViewParams().get(networkView.getSUID());
333+
if(params != null) {
334+
Set<String> filter = params.getFilteredOutDataSets();
335+
dataSets.removeIf(ds -> filter.contains(ds.getName()));
336+
}
337+
}
338+
339+
// Remove Data Sets that are not part of the selected nodes/edges
340+
if(propertyManager.isTrue(PropertyManager.HEATMAP_SELECT_SYNC)) {
341+
boolean distinctEdges = map.getParams().getCreateDistinctEdges();
342+
343+
Iterator<AbstractDataSet> iter = dataSets.iterator();
344+
while(iter.hasNext()) {
345+
AbstractDataSet ds = iter.next();
346+
347+
boolean remove = true;
348+
if(ds.containsAnyNode(selectedNodes))
349+
remove = false;
350+
else if(!distinctEdges && !selectedEdges.isEmpty())
351+
remove = false;
352+
else if(distinctEdges && ds.containsAnyEdge(selectedEdges))
353+
remove = false;
354+
355+
if(remove) {
356+
iter.remove();
357+
}
358+
}
359+
}
360+
361+
return dataSets;
362+
}
363+
364+
365+
private List<CyNode> getNodesAdjacentToSignatureEdges(CyNetwork network, Collection<CyEdge> edges) {
366+
// Iterating over edges doesn't scale, if there are thousands of edges then just forget it
367+
if(edges.size() > 10000)
368+
return null;
369+
370+
List<CyNode> nodes = null;
371+
for(CyEdge edge : edges) {
372+
String interaction = network.getRow(edge).get(CyEdge.INTERACTION, String.class);
373+
if(Objects.equals(interaction, PostAnalysisParameters.SIGNATURE_INTERACTION_TYPE)) {
374+
if(nodes == null)
375+
nodes = new ArrayList<>();
376+
nodes.add(edge.getSource());
377+
nodes.add(edge.getTarget());
378+
}
379+
}
380+
return nodes;
381+
}
382+
346383
private HeatMapParams getHeatMapParams(EnrichmentMap map, Long networkSUID, boolean onlyEdges) {
347384
HeatMapParams params = emManager.getHeatMapParams(networkSUID, onlyEdges);
348385

@@ -501,7 +538,7 @@ private List<RankingOption> getDataSetRankOptions(EnrichmentMap map, CyNetwork n
501538
}
502539

503540
public static Set<String> unionGenesets(Map<String,Set<Integer>> geneSetToGenes,
504-
EnrichmentMap map, CyNetwork network, List<CyNode> nodes, List<CyEdge> edges, String prefix) {
541+
EnrichmentMap map, CyNetwork network, Collection<CyNode> nodes, Collection<CyEdge> edges, String prefix) {
505542
Set<Integer> union = new HashSet<>();
506543
for(CyNode node : nodes) {
507544
union.addAll(getGenes(map, geneSetToGenes, network, node, prefix));
@@ -514,7 +551,7 @@ public static Set<String> unionGenesets(Map<String,Set<Integer>> geneSetToGenes,
514551
}
515552

516553
public static Set<String> interGenesets(Map<String,Set<Integer>> geneSetToGenes,
517-
EnrichmentMap map, CyNetwork network, List<CyNode> nodes, List<CyEdge> edges, String prefix) {
554+
EnrichmentMap map, CyNetwork network, Collection<CyNode> nodes, Collection<CyEdge> edges, String prefix) {
518555
Set<Integer> inter = null;
519556
for(CyNode node : nodes) {
520557
Collection<Integer> genes = getGenes(map, geneSetToGenes, network, node, prefix);

0 commit comments

Comments
 (0)