Skip to content

Commit 504237d

Browse files
committed
Filter 'Color by Data Set' chart pie segments when moving sliders.
Refs #423
1 parent 053197f commit 504237d

File tree

4 files changed

+204
-106
lines changed

4 files changed

+204
-106
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/task/ApplyEMStyleTask.java

Lines changed: 66 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
import java.util.Arrays;
55
import java.util.Collection;
66
import java.util.HashMap;
7-
import java.util.Iterator;
87
import java.util.List;
98
import java.util.Map;
9+
import java.util.Set;
1010
import java.util.stream.Collectors;
1111

1212
import org.baderlab.csplugins.enrichmentmap.model.AbstractDataSet;
13+
import org.baderlab.csplugins.enrichmentmap.model.EMCreationParameters;
1314
import org.baderlab.csplugins.enrichmentmap.model.EMDataSet;
1415
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMap;
1516
import org.baderlab.csplugins.enrichmentmap.style.AbstractColumnDescriptor;
@@ -22,10 +23,14 @@
2223
import org.baderlab.csplugins.enrichmentmap.style.EMStyleBuilder.Columns;
2324
import org.baderlab.csplugins.enrichmentmap.style.EMStyleOptions;
2425
import org.baderlab.csplugins.enrichmentmap.style.charts.AbstractChart;
26+
import org.baderlab.csplugins.enrichmentmap.view.control.ControlPanelMediator;
27+
import org.baderlab.csplugins.enrichmentmap.view.control.FilterUtil;
28+
import org.baderlab.csplugins.enrichmentmap.view.control.io.ViewParams;
29+
import org.baderlab.csplugins.enrichmentmap.view.control.io.ViewParams.CutoffParam;
2530
import org.baderlab.csplugins.enrichmentmap.view.util.ChartUtil;
2631
import org.cytoscape.model.CyNetwork;
27-
import org.cytoscape.model.CyNetworkManager;
2832
import org.cytoscape.model.CyNode;
33+
import org.cytoscape.model.CyRow;
2934
import org.cytoscape.model.CyTable;
3035
import org.cytoscape.view.model.CyNetworkView;
3136
import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics2;
@@ -47,10 +52,10 @@ public class ApplyEMStyleTask extends AbstractTask {
4752

4853
@Inject private VisualMappingManager visualMappingManager;
4954
@Inject private VisualStyleFactory visualStyleFactory;
50-
@Inject private CyNetworkManager networkManager;
5155
@Inject private ChartFactoryManager chartFactoryManager;
5256
@Inject private CyColumnIdentifierFactory columnIdFactory;
5357
@Inject private Provider<EMStyleBuilder> styleBuilderProvider;
58+
@Inject private Provider<ControlPanelMediator> controlPanelMediatorProvider;
5459

5560
private final EMStyleOptions options;
5661
private final boolean updateChartOnly;
@@ -85,36 +90,81 @@ public void run(TaskMonitor tm) throws Exception {
8590

8691
private void createOrUpdateDataSetColumn() {
8792
EnrichmentMap map = options.getEnrichmentMap();
88-
CyNetwork network = networkManager.getNetwork(map.getNetworkID());
93+
CyNetworkView netView = options.getNetworkView();
94+
CyNetwork network = netView.getModel();
8995
CyTable nodeTable = network.getDefaultNodeTable();
90-
Collection<? extends AbstractDataSet> dataSets = filterEMDataSets(options.getDataSets());
9196

9297
String prefix = map.getParams().getAttributePrefix();
9398

9499
if(!Columns.DATASET_CHART.hasColumn(nodeTable, prefix)) {
95100
Columns.DATASET_CHART.createColumn(nodeTable, prefix);
96101
}
97102

103+
Map<Long,int[]> columnData = getDatasetChartColumnData();
104+
105+
columnData.forEach((suid, data) ->
106+
Columns.DATASET_CHART.set(nodeTable.getRow(suid), prefix, Ints.asList(data))
107+
);
108+
}
109+
110+
111+
private Map<Long, int[]> getDatasetChartColumnData() {
112+
EnrichmentMap map = options.getEnrichmentMap();
113+
CyNetworkView netView = options.getNetworkView();
114+
CyNetwork network = netView.getModel();
115+
CyTable nodeTable = network.getDefaultNodeTable();
116+
117+
Collection<? extends AbstractDataSet> dataSets = filterEMDataSets(options.getDataSets());
118+
98119
Map<Long, int[]> columnData = new HashMap<>();
99120
int n = dataSets.size();
100121

101122
for(CyNode node : network.getNodeList()) {
102123
columnData.put(node.getSUID(), new int[n]);
103124
}
104125

105-
Iterator<? extends AbstractDataSet> iter = dataSets.iterator();
106-
int i = 0;
107-
while(iter.hasNext()) {
108-
AbstractDataSet ds = iter.next();
109-
for(Long suid : ds.getNodeSuids()) {
110-
columnData.get(suid)[i] = 1;
126+
// Don't show pie slices that are filtered out by the p-value or q-value sliders :)
127+
ViewParams viewParams = controlPanelMediatorProvider.get().getViewParams(netView.getSUID());
128+
CutoffParam cutoffParam = viewParams.getNodeCutoffParam();
129+
EMCreationParameters params = map.getParams();
130+
131+
Set<String> columns;
132+
double[] values;
133+
134+
if(cutoffParam == CutoffParam.P_VALUE) {
135+
columns = params.getPValueColumnNames();
136+
values = controlPanelMediatorProvider.get().getPValueSliderValues(netView.getSUID());
137+
} else {
138+
columns = params.getQValueColumnNames();
139+
values = controlPanelMediatorProvider.get().getQValueSliderValues(netView.getSUID());
140+
}
141+
142+
if(values == null) {
143+
int dataSetIndex = 0;
144+
for(AbstractDataSet ds : dataSets) {
145+
for(Long nodeSuid : ds.getNodeSuids()) {
146+
columnData.get(nodeSuid)[dataSetIndex] = 1;
147+
}
148+
dataSetIndex++;
149+
}
150+
} else {
151+
Double maxCutoff = values[1];
152+
Double minCutoff = values[0];
153+
154+
int dataSetIndex = 0;
155+
for(AbstractDataSet ds : dataSets) {
156+
String column = FilterUtil.getColumnName(columns, ds);
157+
for(Long nodeSuid : ds.getNodeSuids()) {
158+
CyRow row = nodeTable.getRow(nodeSuid);
159+
if(column == null || FilterUtil.passesFilter(column, nodeTable, row, maxCutoff, minCutoff)) {
160+
columnData.get(nodeSuid)[dataSetIndex] = 1;
161+
}
162+
}
163+
dataSetIndex++;
111164
}
112-
i++;
113165
}
114-
115-
columnData.forEach((suid, data) ->
116-
Columns.DATASET_CHART.set(nodeTable.getRow(suid), prefix, Ints.asList(data))
117-
);
166+
167+
return columnData;
118168
}
119169

120170
private void applyVisualStyle() {

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/control/ControlPanelMediator.java

Lines changed: 63 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMapManager;
5454
import org.baderlab.csplugins.enrichmentmap.model.ExpressionCache;
5555
import org.baderlab.csplugins.enrichmentmap.model.ExpressionData;
56-
import org.baderlab.csplugins.enrichmentmap.model.LegacySupport;
5756
import org.baderlab.csplugins.enrichmentmap.model.Transform;
5857
import org.baderlab.csplugins.enrichmentmap.model.Uncompressed;
5958
import org.baderlab.csplugins.enrichmentmap.style.AssociatedStyleOptions;
@@ -292,27 +291,53 @@ public Map<Long, ViewParams> getAllViewParams() {
292291
Map<Long, ViewParams> map = new HashMap<>();
293292

294293
getControlPanel().getAllControlPanels().forEach((suid, panel) -> {
295-
CutoffParam cuttofParam = panel.getPValueRadio().isSelected() ? CutoffParam.P_VALUE : CutoffParam.Q_VALUE;
296-
Double pVal = panel.getPValueSliderPanel() != null ? panel.getPValueSliderPanel().getValue() : null;
297-
Double qVal = panel.getQValueSliderPanel() != null ? panel.getQValueSliderPanel().getValue() : null;
298-
Double sCoeff = panel.getSimilaritySliderPanel() != null ? panel.getSimilaritySliderPanel().getValue() : null;
299-
300-
Set<AbstractDataSet> uncheckedDataSets = panel.getUncheckedDataSets();
301-
Set<String> filteredDataSets = uncheckedDataSets.stream()
302-
.map(AbstractDataSet::getName)
303-
.collect(Collectors.toSet());
304-
305-
EMStyleOptions options = createStyleOptions(panel.getNetworkView());
306-
ChartOptions chartOptions = options != null ? options.getChartOptions() : null;
307-
boolean pubReady = panel.getPublicationReadyCheck().isSelected();
308-
ViewParams params = new ViewParams(suid, cuttofParam, pVal, qVal, sCoeff, filteredDataSets, chartOptions, pubReady);
309-
294+
ViewParams params = createViewParams(suid, panel);
310295
map.put(suid, params);
311296
});
312297

313298
return map;
314299
}
315300

301+
public ViewParams getViewParams(Long networkViewSuid) {
302+
EMViewControlPanel panel = getControlPanel().getAllControlPanels().get(networkViewSuid);
303+
return createViewParams(networkViewSuid, panel);
304+
}
305+
306+
private ViewParams createViewParams(Long networkViewSuid, EMViewControlPanel panel) {
307+
CutoffParam cuttofParam = panel.getPValueRadio().isSelected() ? CutoffParam.P_VALUE : CutoffParam.Q_VALUE;
308+
Double pVal = panel.getPValueSliderPanel() != null ? panel.getPValueSliderPanel().getValue() : null;
309+
Double qVal = panel.getQValueSliderPanel() != null ? panel.getQValueSliderPanel().getValue() : null;
310+
Double sCoeff = panel.getSimilaritySliderPanel() != null ? panel.getSimilaritySliderPanel().getValue() : null;
311+
312+
Set<AbstractDataSet> uncheckedDataSets = panel.getUncheckedDataSets();
313+
Set<String> filteredDataSets = uncheckedDataSets.stream()
314+
.map(AbstractDataSet::getName)
315+
.collect(Collectors.toSet());
316+
317+
EMStyleOptions options = createStyleOptions(panel.getNetworkView());
318+
ChartOptions chartOptions = options != null ? options.getChartOptions() : null;
319+
boolean pubReady = panel.getPublicationReadyCheck().isSelected();
320+
ViewParams params = new ViewParams(networkViewSuid, cuttofParam, pVal, qVal, sCoeff, filteredDataSets, chartOptions, pubReady);
321+
322+
return params;
323+
}
324+
325+
public double[] getPValueSliderValues(Long networkSuid) {
326+
EMViewControlPanel panel = getControlPanel().getAllControlPanels().get(networkSuid);
327+
SliderBarPanel sliderPanel = panel.getPValueSliderPanel();
328+
if(sliderPanel == null)
329+
return null;
330+
return new double[] { sliderPanel.getMin(), sliderPanel.getValue(), sliderPanel.getMax() };
331+
}
332+
333+
public double[] getQValueSliderValues(Long networkSuid) {
334+
EMViewControlPanel panel = getControlPanel().getAllControlPanels().get(networkSuid);
335+
SliderBarPanel sliderPanel = panel.getQValueSliderPanel();
336+
if(sliderPanel == null)
337+
return null;
338+
return new double[] { sliderPanel.getMin(), sliderPanel.getValue(), sliderPanel.getMax() };
339+
}
340+
316341
public void updateDataSetList(CyNetworkView netView) {
317342
EMViewControlPanel viewPanel = getControlPanel().getViewControlPanel(netView);
318343
viewPanel.updateDataSetSelector();
@@ -412,38 +437,36 @@ else if (viewPanel instanceof AssociatedViewControlPanel)
412437
private void addListeners(EMViewControlPanel viewPanel, EnrichmentMap map) {
413438
CyNetworkView netView = viewPanel.getNetworkView();
414439

440+
Runnable updateFilters = () -> {
441+
if (!updating) {
442+
filterNodesAndEdges(viewPanel, map);
443+
ChartData data = (ChartData) viewPanel.getChartDataCombo().getSelectedItem();
444+
if(data == ChartData.DATA_SET) {
445+
updateVisualStyle(map, viewPanel, true);
446+
}
447+
}
448+
};
449+
415450
viewPanel.getQValueRadio().addActionListener(evt -> {
416451
viewPanel.updateFilterPanel();
417-
418-
if (!updating)
419-
filterNodesAndEdges(viewPanel, map);
452+
updateFilters.run();
420453
});
421454
viewPanel.getPValueRadio().addActionListener(evt -> {
422455
viewPanel.updateFilterPanel();
423-
424-
if (!updating)
425-
filterNodesAndEdges(viewPanel, map);
456+
updateFilters.run();
426457
});
427458

428459
SliderBarPanel pvSliderPanel = viewPanel.getPValueSliderPanel();
429460
SliderBarPanel qvSliderPanel = viewPanel.getQValueSliderPanel();
430461
SliderBarPanel sSliderPanel = viewPanel.getSimilaritySliderPanel();
431462

463+
432464
if (pvSliderPanel != null)
433-
pvSliderPanel.addChangeListener(evt -> {
434-
if (!updating)
435-
filterNodesAndEdges(viewPanel, map);
436-
});
465+
pvSliderPanel.addChangeListener(e -> updateFilters.run());
437466
if (qvSliderPanel != null)
438-
qvSliderPanel.addChangeListener(evt -> {
439-
if (!updating)
440-
filterNodesAndEdges(viewPanel, map);
441-
});
467+
qvSliderPanel.addChangeListener(e -> updateFilters.run());
442468
if (sSliderPanel != null)
443-
sSliderPanel.addChangeListener(evt -> {
444-
if (!updating)
445-
filterNodesAndEdges(viewPanel, map);
446-
});
469+
sSliderPanel.addChangeListener(e -> updateFilters.run());
447470

448471
viewPanel.getDataSetSelector().addPropertyChangeListener("checkedData", evt -> {
449472
if (!updating) {
@@ -878,7 +901,7 @@ private void filterNodesAndEdges(EMViewControlPanel viewPanel, EnrichmentMap map
878901
timer.stop();
879902
}
880903

881-
timer.setInitialDelay(350);
904+
timer.setInitialDelay(400);
882905
timer.start();
883906
}
884907

@@ -1050,14 +1073,12 @@ private Set<CyNode> getFilteredInNodes(Set<AbstractDataSet> selectedDataSets) {
10501073

10511074
// Only p or q value, but not both!
10521075
if (viewPanel.getPValueSliderPanel() != null && viewPanel.getPValueSliderPanel().isVisible()) {
1053-
Set<String> columnNames = getFilteredColumnNames(params.getPValueColumnNames(), selectedDataSets);
1054-
1076+
Set<String> columnNames = FilterUtil.getColumnNames(params.getPValueColumnNames(), selectedDataSets);
10551077
return getFilteredInNodes(viewPanel.getPValueSliderPanel(), map, netView, columnNames, dataSetNodes);
10561078
}
10571079

10581080
if (viewPanel.getQValueSliderPanel() != null && viewPanel.getQValueSliderPanel().isVisible()) {
1059-
Set<String> columnNames = getFilteredColumnNames(params.getQValueColumnNames(), selectedDataSets);
1060-
1081+
Set<String> columnNames = FilterUtil.getColumnNames(params.getQValueColumnNames(), selectedDataSets);
10611082
return getFilteredInNodes(viewPanel.getQValueSliderPanel(), map, netView, columnNames, dataSetNodes);
10621083
}
10631084

@@ -1123,7 +1144,7 @@ private Set<CyNode> getFilteredInNodes(SliderBarPanel sliderPanel, EnrichmentMap
11231144
show = false;
11241145
} else if (table.getColumn(prefix + NODE_GS_TYPE) != null
11251146
&& NODE_GS_TYPE_ENRICHMENT.equalsIgnoreCase(row.get(prefix + NODE_GS_TYPE, String.class))) {
1126-
show = showElement(columnNames, table, row, maxCutoff, minCutoff);
1147+
show = FilterUtil.passesFilter(columnNames, table, row, maxCutoff, minCutoff);
11271148
}
11281149

11291150
if (show)
@@ -1153,7 +1174,7 @@ private Set<CyEdge> getFilteredInEdges(SliderBarPanel sliderPanel, EnrichmentMap
11531174

11541175
boolean show;
11551176
if(EDGE_DATASET_VALUE_COMPOUND.equals(dataset)) { // compound edge
1156-
show = showElement(columnNames, table, row, maxCutoff, minCutoff);
1177+
show = FilterUtil.passesFilter(columnNames, table, row, maxCutoff, minCutoff);
11571178
}
11581179
else { // discrete edge
11591180
if (dataSetEdges != null && !dataSetEdges.contains(e.getSUID())) {
@@ -1163,7 +1184,7 @@ private Set<CyEdge> getFilteredInEdges(SliderBarPanel sliderPanel, EnrichmentMap
11631184
if (EDGE_INTERACTION_VALUE_SIG.equals(interaction)) {
11641185
show = true;
11651186
} else {
1166-
show = showElement(columnNames, table, row, maxCutoff, minCutoff);
1187+
show = FilterUtil.passesFilter(columnNames, table, row, maxCutoff, minCutoff);
11671188
}
11681189
}
11691190
}
@@ -1174,52 +1195,5 @@ private Set<CyEdge> getFilteredInEdges(SliderBarPanel sliderPanel, EnrichmentMap
11741195

11751196
return edges;
11761197
}
1177-
1178-
private boolean showElement(Set<String> columnNames, CyTable table, CyRow row, Double maxCutoff, Double minCutoff) {
1179-
boolean show = true;
1180-
for (String colName : columnNames) {
1181-
if (table.getColumn(colName) == null)
1182-
continue; // Ignore this column name (maybe the user deleted it)
1183-
1184-
Double value = row.get(colName, Double.class);
1185-
1186-
// Possible that there isn't value for this interaction
1187-
if (value == null)
1188-
continue;
1189-
1190-
if (value >= minCutoff && value <= maxCutoff) {
1191-
show = true;
1192-
break;
1193-
} else {
1194-
show = false;
1195-
}
1196-
}
1197-
return show;
1198-
}
1199-
1200-
private Set<String> getFilteredColumnNames(Set<String> columnNames, Collection<AbstractDataSet> dataSets) {
1201-
Set<String> filteredNames = new HashSet<>();
1202-
1203-
for (String name : columnNames) {
1204-
for (AbstractDataSet ds : dataSets) {
1205-
if (ds.getMap().isLegacy()) {
1206-
if(LegacySupport.DATASET1.equals(ds.getName()) && name.endsWith("dataset1")) {
1207-
filteredNames.add(name);
1208-
break;
1209-
}
1210-
if(LegacySupport.DATASET2.equals(ds.getName()) && name.endsWith("dataset2")) {
1211-
filteredNames.add(name);
1212-
break;
1213-
}
1214-
}
1215-
if (name.endsWith(" (" + ds.getName() + ")")) {
1216-
filteredNames.add(name);
1217-
break;
1218-
}
1219-
}
1220-
}
1221-
1222-
return filteredNames;
1223-
}
12241198
}
12251199
}

0 commit comments

Comments
 (0)