Skip to content

Commit 864b63a

Browse files
committed
Updating node chart colours, data and type is now faster most of the time.
1 parent 4c94c27 commit 864b63a

File tree

5 files changed

+128
-30
lines changed

5 files changed

+128
-30
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/style/EMStyleBuilder.java

Lines changed: 105 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,14 @@
4646
import org.cytoscape.view.presentation.property.LineTypeVisualProperty;
4747
import org.cytoscape.view.presentation.property.values.LineType;
4848
import org.cytoscape.view.presentation.property.values.NodeShape;
49+
import org.cytoscape.view.vizmap.VisualMappingFunction;
4950
import org.cytoscape.view.vizmap.VisualMappingFunctionFactory;
5051
import org.cytoscape.view.vizmap.VisualStyle;
5152
import org.cytoscape.view.vizmap.events.VisualStyleChangeRecord;
5253
import org.cytoscape.view.vizmap.events.VisualStyleChangedEvent;
5354
import org.cytoscape.view.vizmap.mappings.BoundaryRangeValues;
5455
import org.cytoscape.view.vizmap.mappings.ContinuousMapping;
56+
import org.cytoscape.view.vizmap.mappings.ContinuousMappingPoint;
5557
import org.cytoscape.view.vizmap.mappings.DiscreteMapping;
5658
import org.cytoscape.view.vizmap.mappings.PassthroughMapping;
5759
import org.jcolorbrewer.ColorBrewer;
@@ -181,6 +183,9 @@ public static NodeShape getDefaultNodeShape(ChartType chartType) {
181183
return chartType == null || chartType == ChartType.RADIAL_HEAT_MAP ? ELLIPSE : RECTANGLE;
182184
}
183185

186+
/**
187+
* Updates the whole EM style.
188+
*/
184189
public void updateProperties(VisualStyle vs, EMStyleOptions options, CyCustomGraphics2<?> chart) {
185190
eventHelper.silenceEventSource(vs);
186191

@@ -208,7 +213,6 @@ public void updateProperties(VisualStyle vs, EMStyleOptions options, CyCustomGra
208213
if (options.isPublicationReady()) {
209214
vs.removeVisualMappingFunction(BasicVisualLexicon.NODE_LABEL);
210215
vs.setDefaultValue(BasicVisualLexicon.NODE_LABEL, "");
211-
vs.removeVisualMappingFunction(BasicVisualLexicon.NETWORK_BACKGROUND_PAINT);
212216
vs.setDefaultValue(BasicVisualLexicon.NETWORK_BACKGROUND_PAINT, Color.WHITE);
213217
}
214218
} finally {
@@ -217,6 +221,23 @@ public void updateProperties(VisualStyle vs, EMStyleOptions options, CyCustomGra
217221
}
218222
}
219223

224+
public void updateNodeChart(VisualStyle vs, EMStyleOptions options, CyCustomGraphics2<?> chart) {
225+
eventHelper.silenceEventSource(vs);
226+
227+
try {
228+
String chartName = chart != null ? chart.getDisplayName() : null;
229+
ChartType chartType = ChartType.toChartType(chartName);
230+
231+
setNodeChartDefaults(vs, chartType);
232+
setNodeShapes(vs, options, chartType);
233+
setNodeSize(vs, options, chartType);
234+
setNodeChart(vs, chart);
235+
} finally {
236+
eventHelper.unsilenceEventSource(vs);
237+
eventHelper.addEventPayload(vs, new VisualStyleChangeRecord(), VisualStyleChangedEvent.class);
238+
}
239+
}
240+
220241
@SuppressWarnings({ "rawtypes", "unchecked" })
221242
private void setNodeChart(VisualStyle vs, CyCustomGraphics2<?> chart) {
222243
VisualLexicon lexicon = renderingEngineManager.getDefaultVisualLexicon();
@@ -318,23 +339,53 @@ private void setNodeDefaults(VisualStyle vs, EMStyleOptions options, ChartType c
318339
// Set the default node appearance
319340
vs.setDefaultValue(NODE_FILL_COLOR, Colors.DEF_NODE_COLOR);
320341
vs.setDefaultValue(NODE_BORDER_PAINT, Colors.DEF_NODE_BORDER_COLOR);
321-
vs.setDefaultValue(NODE_SHAPE, getDefaultNodeShape(chartType));
322-
vs.setDefaultValue(NODE_SIZE, chartType == ChartType.RADIAL_HEAT_MAP ? MIN_NODE_SIZE : (MAX_NODE_SIZE + MIN_NODE_SIZE) / 2);
323342
vs.setDefaultValue(NODE_BORDER_WIDTH, DEF_NODE_BORDER_WIDTH);
324343
vs.setDefaultValue(NODE_TRANSPARENCY, DEF_NODE_TRANSPARENCY);
325344
vs.setDefaultValue(NODE_BORDER_TRANSPARENCY, DEF_NODE_TRANSPARENCY);
326345
vs.setDefaultValue(NODE_LABEL_TRANSPARENCY, DEF_NODE_TRANSPARENCY);
346+
setNodeChartDefaults(vs, chartType);
347+
}
348+
349+
/**
350+
* Sets default node visual properties that can be affected by the chart type.
351+
*/
352+
private void setNodeChartDefaults(VisualStyle vs, ChartType chartType) {
353+
vs.setDefaultValue(NODE_SHAPE, getDefaultNodeShape(chartType));
354+
vs.setDefaultValue(NODE_SIZE, chartType == ChartType.RADIAL_HEAT_MAP ? MIN_NODE_SIZE : (MAX_NODE_SIZE + MIN_NODE_SIZE) / 2);
327355
}
328356

357+
@SuppressWarnings({ "unchecked", "rawtypes" })
329358
private void setNodeShapes(VisualStyle vs, EMStyleOptions options, ChartType chartType) {
330359
String prefix = options.getAttributePrefix();
360+
String columnName = Columns.NODE_GS_TYPE.with(prefix, null);
361+
NodeShape enrShape = getDefaultNodeShape(chartType);
362+
363+
VisualMappingFunction<?, NodeShape> oldMapping = vs.getVisualMappingFunction(NODE_SHAPE);
331364

332-
// Add mapping function for node shape
333-
DiscreteMapping<String, NodeShape> nodeShape = (DiscreteMapping<String, NodeShape>) dmFactory
334-
.createVisualMappingFunction(Columns.NODE_GS_TYPE.with(prefix, null), String.class, NODE_SHAPE);
335-
nodeShape.putMapValue(Columns.NODE_GS_TYPE_ENRICHMENT, getDefaultNodeShape(chartType));
336-
nodeShape.putMapValue(Columns.NODE_GS_TYPE_SIGNATURE, SIGNATURE_NODE_SHAPE);
337-
vs.addVisualMappingFunction(nodeShape);
365+
// This is done for performance optimization only!
366+
boolean update = oldMapping instanceof DiscreteMapping == false;
367+
368+
if (!update) {
369+
// Also test the mapped column name
370+
update = !columnName.equals(oldMapping.getMappingColumnName());
371+
372+
if (!update) {
373+
// Finally test the mapping values
374+
Object enrVal = ((DiscreteMapping) oldMapping).getMapValue(Columns.NODE_GS_TYPE_ENRICHMENT);
375+
Object sigVal = ((DiscreteMapping) oldMapping).getMapValue(Columns.NODE_GS_TYPE_SIGNATURE);
376+
377+
update = !enrShape.equals(enrVal) || !SIGNATURE_NODE_SHAPE.equals(sigVal);
378+
}
379+
}
380+
381+
if (update) {
382+
// Add mapping function for node shape
383+
DiscreteMapping<String, NodeShape> nodeShape = (DiscreteMapping<String, NodeShape>) dmFactory
384+
.createVisualMappingFunction(columnName, String.class, NODE_SHAPE);
385+
nodeShape.putMapValue(Columns.NODE_GS_TYPE_ENRICHMENT, enrShape);
386+
nodeShape.putMapValue(Columns.NODE_GS_TYPE_SIGNATURE, SIGNATURE_NODE_SHAPE);
387+
vs.addVisualMappingFunction(nodeShape);
388+
}
338389
}
339390

340391
private void setNodeBorderColors(VisualStyle vs, EMStyleOptions options) {
@@ -440,18 +491,54 @@ private void setNodeTooltip(VisualStyle vs, EMStyleOptions options) {
440491
vs.addVisualMappingFunction(nodeLabel);
441492
}
442493

494+
@SuppressWarnings("rawtypes")
443495
private void setNodeSize(VisualStyle vs, EMStyleOptions options, ChartType chartType) {
444496
if (chartType == null || chartType == ChartType.RADIAL_HEAT_MAP) {
445497
String prefix = options.getAttributePrefix();
446-
ContinuousMapping<Integer, Double> nodeSize = (ContinuousMapping<Integer, Double>) cmFactory
447-
.createVisualMappingFunction(Columns.NODE_GS_SIZE.with(prefix,null), Integer.class, NODE_SIZE);
448-
449-
BoundaryRangeValues<Double> bv0 = new BoundaryRangeValues<Double>(MIN_NODE_SIZE, MIN_NODE_SIZE, MIN_NODE_SIZE);
450-
BoundaryRangeValues<Double> bv1 = new BoundaryRangeValues<Double>(MAX_NODE_SIZE, MAX_NODE_SIZE, MAX_NODE_SIZE);
451-
nodeSize.addPoint(10, bv0);
452-
nodeSize.addPoint(474, bv1);
453-
454-
vs.addVisualMappingFunction(nodeSize);
498+
String columnName = Columns.NODE_GS_SIZE.with(prefix, null);
499+
int val0 = 10;
500+
int val1 = 474;
501+
502+
VisualMappingFunction<?, Double> oldMapping = vs.getVisualMappingFunction(NODE_SIZE);
503+
504+
// This is done for performance optimization only!
505+
boolean update = oldMapping instanceof ContinuousMapping == false;
506+
507+
if (!update) {
508+
try {
509+
// Also test the mapped column name and number of points
510+
update = !columnName.equals(oldMapping.getMappingColumnName())
511+
|| ((ContinuousMapping) oldMapping).getPointCount() != 2;
512+
513+
if (!update) {
514+
// And the mapping values
515+
ContinuousMappingPoint pt0 = ((ContinuousMapping) oldMapping).getPoint(0);
516+
ContinuousMappingPoint pt1 = ((ContinuousMapping) oldMapping).getPoint(1);
517+
518+
update = val0 != (Integer) pt0.getValue();
519+
update = update || val1 != (Integer) pt1.getValue();
520+
521+
if (!update) // Finally test the boundary ranges
522+
update = MIN_NODE_SIZE != pt0.getRange().equalValue
523+
|| MAX_NODE_SIZE != pt1.getRange().equalValue;
524+
}
525+
} catch (Exception e) {
526+
e.printStackTrace();
527+
update = true;
528+
}
529+
}
530+
531+
if (update) {
532+
ContinuousMapping<Integer, Double> mapping = (ContinuousMapping<Integer, Double>) cmFactory
533+
.createVisualMappingFunction(columnName, Integer.class, NODE_SIZE);
534+
535+
BoundaryRangeValues<Double> bv0 = new BoundaryRangeValues<>(MIN_NODE_SIZE, MIN_NODE_SIZE, MIN_NODE_SIZE);
536+
BoundaryRangeValues<Double> bv1 = new BoundaryRangeValues<>(MAX_NODE_SIZE, MAX_NODE_SIZE, MAX_NODE_SIZE);
537+
mapping.addPoint(val0, bv0);
538+
mapping.addPoint(val1, bv1);
539+
540+
vs.addVisualMappingFunction(mapping);
541+
}
455542
} else {
456543
vs.removeVisualMappingFunction(NODE_SIZE);
457544
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,18 @@ public class ApplyEMStyleTask extends AbstractTask {
2626

2727
private final EMStyleOptions options;
2828
private final CyCustomGraphics2<?> chart;
29+
private final boolean updateChartOnly;
2930

3031
public interface Factory {
31-
ApplyEMStyleTask create(EMStyleOptions options, CyCustomGraphics2<?> chart);
32+
ApplyEMStyleTask create(EMStyleOptions options, CyCustomGraphics2<?> chart, boolean updateChartOnly);
3233
}
3334

3435
@Inject
35-
public ApplyEMStyleTask(@Assisted EMStyleOptions options, @Assisted @Nullable CyCustomGraphics2<?> chart) {
36+
public ApplyEMStyleTask(@Assisted EMStyleOptions options, @Assisted @Nullable CyCustomGraphics2<?> chart,
37+
@Assisted boolean updateChartOnly) {
3638
this.options = options;
3739
this.chart = chart;
40+
this.updateChartOnly = updateChartOnly;
3841
}
3942

4043
@Override
@@ -47,7 +50,11 @@ public void run(TaskMonitor taskMonitor) throws Exception {
4750
private void applyVisualStyle() {
4851
CyNetworkView view = options.getNetworkView();
4952
VisualStyle vs = getVisualStyle(options.getEnrichmentMap());
50-
styleBuilderProvider.get().updateProperties(vs, options, chart);
53+
54+
if (updateChartOnly)
55+
styleBuilderProvider.get().updateNodeChart(vs, options, chart);
56+
else
57+
styleBuilderProvider.get().updateProperties(vs, options, chart);
5158

5259
if (!vs.equals(visualMappingManager.getVisualStyle(view)))
5360
visualMappingManager.setVisualStyle(vs, view);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private void visualizeMap() {
5454
if (layout == null)
5555
layout = layoutManager.getDefaultLayout();
5656

57-
Task styleTask = applyStyleTaskFactory.create(new EMStyleOptions(view, map), null);
57+
Task styleTask = applyStyleTaskFactory.create(new EMStyleOptions(view, map), null, false);
5858
TaskIterator layoutTasks = layout.createTaskIterator(view, layout.createLayoutContext(),
5959
CyLayoutAlgorithm.ALL_NODE_VIEWS, null);
6060

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ private void addNetworkView(CyNetworkView netView) {
477477
updating = false;
478478
}
479479

480-
updateVisualStyle(map, viewPanel);
480+
updateVisualStyle(map, viewPanel, true);
481481
}
482482
});
483483
viewPanel.getChartTypeCombo().addItemListener(evt -> {
@@ -491,16 +491,16 @@ private void addNetworkView(CyNetworkView netView) {
491491
updating = false;
492492
}
493493

494-
updateVisualStyle(map, viewPanel);
494+
updateVisualStyle(map, viewPanel, true);
495495
}
496496
});
497497
viewPanel.getChartColorsCombo().addItemListener(evt -> {
498498
if (!updating && evt.getStateChange() == ItemEvent.SELECTED)
499-
updateVisualStyle(map, viewPanel);
499+
updateVisualStyle(map, viewPanel, true);
500500
});
501501
viewPanel.getShowChartLabelsCheck().addActionListener(evt -> {
502502
if (!updating)
503-
updateVisualStyle(map, viewPanel);
503+
updateVisualStyle(map, viewPanel, true);
504504
});
505505
viewPanel.getPublicationReadyCheck().addActionListener(evt -> {
506506
if (!updating)
@@ -613,13 +613,17 @@ private void updateLegends(EMViewControlPanel viewPanel) {
613613
}
614614

615615
private void updateVisualStyle(EnrichmentMap map, EMViewControlPanel viewPanel) {
616+
updateVisualStyle(map, viewPanel, false);
617+
}
618+
619+
private void updateVisualStyle(EnrichmentMap map, EMViewControlPanel viewPanel, boolean updateChartOnly) {
616620
EMStyleOptions options = createStyleOptions(map, viewPanel);
617621
CyCustomGraphics2<?> chart = createChart(options);
618-
applyVisualStyle(options, chart);
622+
applyVisualStyle(options, chart, updateChartOnly);
619623
}
620624

621-
private void applyVisualStyle(EMStyleOptions options, CyCustomGraphics2<?> chart) {
622-
ApplyEMStyleTask task = applyStyleTaskFactory.create(options, chart);
625+
private void applyVisualStyle(EMStyleOptions options, CyCustomGraphics2<?> chart, boolean updateChartOnly) {
626+
ApplyEMStyleTask task = applyStyleTaskFactory.create(options, chart, updateChartOnly);
623627
dialogTaskManager.execute(new TaskIterator(task), new TaskObserver() {
624628
@Override
625629
public void taskFinished(ObservableTask task) {

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/postanalysis/PostAnalysisPanelMediator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ private void addGeneSets(CyNetworkView netView, PostAnalysisParameters params) {
140140
ControlPanelMediator controlPanelMediator = controlPanelMediatorProvider.get();
141141
EMStyleOptions options = controlPanelMediator.createStyleOptions(netView);
142142
CyCustomGraphics2<?> chart = controlPanelMediator.createChart(options);
143-
tasks.append(applyStyleTaskFactory.create(options, chart));
143+
tasks.append(applyStyleTaskFactory.create(options, chart, false));
144144

145145
taskManager.execute(tasks, new DialogObserver());
146146
} else {

0 commit comments

Comments
 (0)