Skip to content

Commit 31a6a0d

Browse files
committed
CreateEMNetworkTask is cancelable
Fixes #528
1 parent 14611fa commit 31a6a0d

File tree

2 files changed

+82
-31
lines changed

2 files changed

+82
-31
lines changed

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

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.baderlab.csplugins.enrichmentmap.model.LegacySupport;
2121
import org.baderlab.csplugins.enrichmentmap.model.SimilarityKey;
2222
import org.baderlab.csplugins.enrichmentmap.style.EMStyleBuilder.Columns;
23+
import org.baderlab.csplugins.enrichmentmap.util.DiscreteTaskMonitor;
2324
import org.cytoscape.model.CyEdge;
2425
import org.cytoscape.model.CyNetwork;
2526
import org.cytoscape.model.CyNetworkFactory;
@@ -49,7 +50,7 @@ public class CreateEMNetworkTask extends AbstractTask implements ObservableTask
4950

5051
private final Supplier<Map<SimilarityKey,GenesetSimilarity>> supplier;
5152

52-
private long networkSuidResult;
53+
private Long networkSuidResult;
5354

5455
public interface Factory {
5556
CreateEMNetworkTask create(EnrichmentMap map, Supplier<Map<SimilarityKey,GenesetSimilarity>> supplier);
@@ -63,10 +64,10 @@ public CreateEMNetworkTask(@Assisted EnrichmentMap map, @Assisted Supplier<Map<S
6364
}
6465

6566
@Override
66-
public void run(TaskMonitor taskMonitor) throws Exception {
67-
taskMonitor.setTitle("Creating EnrichmentMap Network");
68-
networkSuidResult = createEMNetwork();
69-
taskMonitor.setStatusMessage("");
67+
public void run(TaskMonitor tm) {
68+
tm.setTitle("Creating EnrichmentMap Network");
69+
networkSuidResult = createEMNetwork(tm);
70+
tm.setStatusMessage("");
7071
}
7172

7273

@@ -86,8 +87,41 @@ public <R> R getResults(Class<? extends R> type) {
8687
}
8788

8889

89-
private long createEMNetwork() {
90-
// Create the CyNetwork
90+
private Long createEMNetwork(TaskMonitor tm) {
91+
CyNetwork network = createNetwork();
92+
map.setNetworkID(network.getSUID());
93+
94+
createNodeColumns(network);
95+
createEdgeColumns(network);
96+
97+
Map<String,Set<Integer>> geneSets = map.unionAllGeneSetsOfInterest();
98+
Map<SimilarityKey,GenesetSimilarity> similarities = supplier.get();
99+
100+
int numNodes = geneSets.size();
101+
int numEdges = similarities.size();
102+
103+
tm.setProgress(0.1);
104+
105+
var nodeTm = new DiscreteTaskMonitor(tm, numNodes, 0.1, 0.2).percentMessage("Creating " + numNodes + " Nodes: {0,number,#%}");
106+
Map<String,CyNode> nodes = createNodes(network, geneSets, nodeTm);
107+
108+
if(cancelled)
109+
return null;
110+
111+
var edgeTm = new DiscreteTaskMonitor(tm, numEdges, 0.2, 1.0).percentMessage("Creating " + numEdges + " Edges: {0,number,#%}");
112+
createEdges(network, nodes, similarities, edgeTm);
113+
114+
if(cancelled)
115+
return null;
116+
117+
networkManager.addNetwork(network);
118+
emManager.registerEnrichmentMap(map);
119+
120+
return network.getSUID();
121+
}
122+
123+
124+
private CyNetwork createNetwork() {
91125
CyNetwork network = networkFactory.createNetwork();
92126
CyRootNetwork rootNetwork = ((CySubNetwork)network).getRootNetwork();
93127

@@ -98,25 +132,17 @@ private long createEMNetwork() {
98132

99133
rootNetwork.getRow(rootNetwork).set(CyNetwork.NAME, LegacySupport.EM_NAME);
100134
network.getRow(network).set(CyNetwork.NAME, networkName);
101-
102-
map.setNetworkID(network.getSUID());
103-
104-
createNodeColumns(network);
105-
createEdgeColumns(network);
106-
107-
Map<String,CyNode> nodes = createNodes(network);
108-
createEdges(network, nodes);
109-
110-
networkManager.addNetwork(network);
111-
emManager.registerEnrichmentMap(map);
112-
return network.getSUID();
135+
return network;
113136
}
114137

115-
private Map<String, CyNode> createNodes(CyNetwork network) {
138+
139+
private Map<String, CyNode> createNodes(CyNetwork network, Map<String,Set<Integer>> geneSets, DiscreteTaskMonitor tm) {
116140
Map<String,CyNode> nodes = new HashMap<>();
117-
Map<String,Set<Integer>> geneSets = map.unionAllGeneSetsOfInterest();
118141

119142
for(String genesetName : geneSets.keySet()) {
143+
if(cancelled)
144+
return null;
145+
120146
CyNode node = network.addNode();
121147
nodes.put(genesetName, node);
122148

@@ -163,6 +189,8 @@ private Map<String, CyNode> createNodes(CyNetwork network) {
163189
else if(result instanceof GenericResult)
164190
setGenericResultNodeAttributes(row, ds, (GenericResult) result);
165191
}
192+
193+
tm.inc();
166194
}
167195

168196
return nodes;
@@ -236,12 +264,12 @@ private Double getMaxNegLog10pval(String genesetName) {
236264

237265
/**
238266
* Note, we expect that GenesetSimilarity object that don't pass the cutoff have already been filtered out.
239-
* @param network
240-
* @param nodes
241267
*/
242-
private void createEdges(CyNetwork network, Map<String,CyNode> nodes) {
243-
Map<SimilarityKey,GenesetSimilarity> similarities = supplier.get();
268+
private void createEdges(CyNetwork network, Map<String,CyNode> nodes, Map<SimilarityKey,GenesetSimilarity> similarities, DiscreteTaskMonitor tm) {
244269
for(SimilarityKey key : similarities.keySet()) {
270+
if(cancelled)
271+
return;
272+
245273
GenesetSimilarity similarity = similarities.get(key);
246274

247275
CyNode node1 = nodes.get(similarity.getGeneset1Name());
@@ -275,6 +303,8 @@ private void createEdges(CyNetwork network, Map<String,CyNode> nodes) {
275303
} else {
276304
Columns.EDGE_DATASET.set(row, prefix, null, similarity.getDataSetName());
277305
}
306+
307+
tm.inc();
278308
}
279309
}
280310

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/util/DiscreteTaskMonitor.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.baderlab.csplugins.enrichmentmap.util;
22

3+
import java.text.MessageFormat;
4+
import java.util.Objects;
35
import java.util.concurrent.atomic.AtomicInteger;
46
import java.util.function.BiFunction;
57
import java.util.function.Function;
@@ -15,6 +17,7 @@ public class DiscreteTaskMonitor implements TaskMonitor {
1517

1618
private final int totalWork;
1719
private AtomicInteger currentWork = new AtomicInteger(0);
20+
private String lastMessage = null;
1821

1922
private BiFunction<Integer,Integer,String> ofMessage;
2023
private Function<Double,String> percentMessage;
@@ -31,14 +34,28 @@ public DiscreteTaskMonitor(TaskMonitor delegate, int totalWork) {
3134
this(delegate, totalWork, 0.0, 1.0);
3235
}
3336

34-
public void setOfMessageCallback(BiFunction<Integer,Integer,String> ofMessage) {
37+
38+
public DiscreteTaskMonitor setOfMessageCallback(BiFunction<Integer,Integer,String> ofMessage) {
3539
this.ofMessage = ofMessage;
40+
return this;
41+
}
42+
43+
public DiscreteTaskMonitor ofMessage(String messageFormat) {
44+
setOfMessageCallback((current, total) -> MessageFormat.format(messageFormat, current, total));
45+
return this;
3646
}
3747

38-
public void setPercentMessageCallback(Function<Double,String> percentMessage) {
48+
public DiscreteTaskMonitor setPercentMessageCallback(Function<Double,String> percentMessage) {
3949
this.percentMessage = percentMessage;
50+
return this;
4051
}
4152

53+
public DiscreteTaskMonitor percentMessage(String messageFormat) {
54+
setPercentMessageCallback(percent -> MessageFormat.format(messageFormat, percent));
55+
return this;
56+
}
57+
58+
4259
private static double map(double in, double inStart, double inEnd, double outStart, double outEnd) {
4360
double slope = (outEnd - outStart) / (inEnd - inStart);
4461
return outStart + slope * (in - inStart);
@@ -48,12 +65,16 @@ private static double map(double in, double inStart, double inEnd, double outSta
4865
public void setProgress(double progress) {
4966
double mappedProgress = map(progress, 0.0, 1.0, low, high);
5067
delegate.setProgress(mappedProgress);
68+
69+
String message = null;
5170
if(ofMessage != null) {
52-
String message = ofMessage.apply(getCurrentWork(), getTotalWork());
53-
delegate.setStatusMessage(message);
71+
message = ofMessage.apply(getCurrentWork(), getTotalWork());
5472
} else if(percentMessage != null) {
55-
String message = percentMessage.apply(getCurrentWorkPercent());
56-
delegate.setStatusMessage(message);
73+
message = percentMessage.apply(getCurrentWorkPercent());
74+
}
75+
76+
if(!Objects.equals(message, lastMessage)) {
77+
delegate.setStatusMessage(lastMessage = message);
5778
}
5879
}
5980

0 commit comments

Comments
 (0)