Skip to content

Commit e9a2d34

Browse files
committed
Warn user if ranks file is unsorted.
Refs #500
1 parent aeea40a commit e9a2d34

File tree

11 files changed

+394
-101
lines changed

11 files changed

+394
-101
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/commands/MastermapCommandTask.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
import org.baderlab.csplugins.enrichmentmap.resolver.DataSetResolverTask;
1313
import org.baderlab.csplugins.enrichmentmap.task.CreateEMNetworkTask;
1414
import org.baderlab.csplugins.enrichmentmap.task.CreateEnrichmentMapTaskFactory;
15+
import org.baderlab.csplugins.enrichmentmap.util.DelegatingTaskMonitor;
1516
import org.baderlab.csplugins.enrichmentmap.util.NullTaskMonitor;
17+
import org.baderlab.csplugins.enrichmentmap.util.SimpleSyncTaskManager;
1618
import org.baderlab.csplugins.enrichmentmap.util.TaskUtil;
1719
import org.cytoscape.work.AbstractTask;
1820
import org.cytoscape.work.ContainsTunables;
1921
import org.cytoscape.work.ObservableTask;
20-
import org.cytoscape.work.SynchronousTaskManager;
2122
import org.cytoscape.work.TaskIterator;
2223
import org.cytoscape.work.TaskMonitor;
2324
import org.cytoscape.work.TaskMonitor.Level;
@@ -56,7 +57,6 @@ public class MastermapCommandTask extends AbstractTask implements ObservableTask
5657

5758

5859

59-
@Inject private SynchronousTaskManager<?> taskManager;
6060
@Inject private CreateEnrichmentMapTaskFactory.Factory createEMTaskFactory;
6161

6262

@@ -77,7 +77,17 @@ public void run(TaskMonitor tm) throws Exception {
7777
throw new IllegalArgumentException("rootFolder is invalid: " + rootFolder);
7878
}
7979

80-
runTask(tm);
80+
var delegatingTM = new DelegatingTaskMonitor(tm) {
81+
@Override
82+
public void setStatusMessage(String message) {
83+
// Kind of a hack, used to suppress the flood of status messages from ComputeSimilarityTaskParallel
84+
if(message != null && message.startsWith("Computing Geneset Similarity:"))
85+
return;
86+
super.setStatusMessage(message);
87+
}
88+
};
89+
90+
runTask(delegatingTM);
8191

8292
tm.setStatusMessage("Done");
8393
}
@@ -92,6 +102,8 @@ private void runTask(TaskMonitor tm) {
92102
resolverTask.setPathMatcher(matcher);
93103
}
94104

105+
var taskManager = new SimpleSyncTaskManager(tm);
106+
95107
taskManager.execute(new TaskIterator(resolverTask)); // blocks
96108
var dataSets = resolverTask.getDataSetResults();
97109

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/parsers/RanksFileReaderTask.java

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,12 @@
5757
import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMap;
5858
import org.baderlab.csplugins.enrichmentmap.model.Rank;
5959
import org.baderlab.csplugins.enrichmentmap.model.Ranking;
60+
import org.baderlab.csplugins.enrichmentmap.task.UnsortedRanksException;
6061
import org.baderlab.csplugins.enrichmentmap.util.NullTaskMonitor;
6162
import org.cytoscape.work.AbstractTask;
63+
import org.cytoscape.work.ObservableTask;
6264
import org.cytoscape.work.TaskMonitor;
65+
import org.cytoscape.work.TaskMonitor.Level;
6366

6467
/**
6568
* Created by User: risserlin Date: May 1, 2009 Time: 9:10:22 AM
@@ -72,53 +75,32 @@
7275
* rank but also have three bland columns.
7376
*
7477
*/
75-
public class RanksFileReaderTask extends AbstractTask {
78+
public class RanksFileReaderTask extends AbstractTask implements ObservableTask {
7679

77-
private String RankFileName;
78-
private EMDataSet dataset;
80+
public enum UnsortedRanksStrategy {
81+
LOG_WARNING,
82+
FAIL_IMMEDIATELY;
83+
}
84+
85+
private final String RankFileName;
86+
private final EMDataSet dataset;
7987
private String ranks_name;
88+
89+
private final UnsortedRanksStrategy unsortedRanksStrategy;
8090

8191

8292
//distinguish between load from enrichment map input panel and heatmap interface
8393
private boolean loadFromHeatmap = false;
94+
private boolean sorted = true;
95+
8496

8597

86-
/**
87-
* Class constructor
88-
*
89-
* @param rankFileName - file name of ranks file
90-
* @param dataset - which dataset is this rank file related to (dataset 1 or dataset 2)
91-
*/
92-
public RanksFileReaderTask(String rankFileName, EMDataSet dataset, boolean loadFromHeatmap) {
98+
public RanksFileReaderTask(String rankFileName, EMDataSet dataset, String ranks_name, boolean loadFromHeatmap, UnsortedRanksStrategy unsortedRanksStrategy) {
9399
this.RankFileName = rankFileName;
94-
this.dataset = dataset;
95-
this.loadFromHeatmap = loadFromHeatmap;
96-
}
97-
98-
/**
99-
* Class constructor - curent task monitor specified.
100-
*
101-
* @param rankFileName - file name of ranks file
102-
* @param dataset - which dataset is this rank file related to (dataset 1 or dataset 2)
103-
*/
104-
public RanksFileReaderTask(String rankFileName, EMDataSet dataset, String ranks_name, boolean loadFromHeatmap) {
105-
RankFileName = rankFileName;
106100
this.ranks_name = ranks_name;
107101
this.dataset = dataset;
108102
this.loadFromHeatmap = loadFromHeatmap;
109-
}
110-
111-
/**
112-
* Class constructor - for late loaded rank file that aren't specific to a dataset.
113-
*
114-
* @param params - enrichment map parameters for current map
115-
* @param rankFileName - file name of ranks file
116-
* @param ranks_name - name of rankings to be used in heat map drop down to refer to it.
117-
*/
118-
public RanksFileReaderTask(String rankFileName, String ranks_name, boolean loadFromHeatmap) {
119-
this.RankFileName = rankFileName;
120-
this.ranks_name = ranks_name;
121-
this.loadFromHeatmap = loadFromHeatmap;
103+
this.unsortedRanksStrategy = unsortedRanksStrategy;
122104
}
123105

124106

@@ -153,6 +135,9 @@ public void parse(TaskMonitor taskMonitor) throws IOException {
153135
*/
154136

155137
int nScores = 0; //number of found scores
138+
double prevScore = Double.MAX_VALUE;
139+
boolean sorted = true;
140+
156141
for(int i = 0; i < lines.size(); i++) {
157142
String line = lines.get(i);
158143

@@ -225,12 +210,25 @@ public void parse(TaskMonitor taskMonitor) throws IOException {
225210
int percentComplete = (int) (((double) currentProgress / maxValue) * 100);
226211
taskMonitor.setProgress(percentComplete);
227212
currentProgress++;
228-
213+
214+
if(score > prevScore) {
215+
sorted = false;
216+
}
217+
prevScore = score;
229218
}
230219

231220
//the none of the genes are in the gene list
232221
if(ranks.isEmpty()) {
233-
throw new IllegalThreadStateException("None of the genes in the rank file are found in the expression file. Make sure the identifiers of the two files match.");
222+
throw new IllegalArgumentException("None of the genes in the rank file are found in the expression file. Make sure the identifiers of the two files match.");
223+
}
224+
225+
if(!sorted) {
226+
String message = "The ranks file '" + RankFileName + "' is not sorted from greatest to least.";
227+
if(unsortedRanksStrategy == UnsortedRanksStrategy.LOG_WARNING) {
228+
taskMonitor.showMessage(Level.WARN, message);
229+
} else {
230+
throw new UnsortedRanksException(message, RankFileName);
231+
}
234232
}
235233

236234
//remove Null values from collector
@@ -300,4 +298,13 @@ public void run(TaskMonitor taskMonitor) throws Exception {
300298
taskMonitor.setTitle("Parsing Ranks file");
301299
parse(taskMonitor);
302300
}
301+
302+
public boolean isSorted() {
303+
return sorted;
304+
}
305+
306+
@Override
307+
public <R> R getResults(Class<? extends R> type) {
308+
return null;
309+
}
303310
}

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.baderlab.csplugins.enrichmentmap.parsers.ParseGenericEnrichmentResults;
3535
import org.baderlab.csplugins.enrichmentmap.parsers.RanksFileReaderTask;
3636
import org.baderlab.csplugins.enrichmentmap.resolver.DataSetResolver;
37-
import org.baderlab.csplugins.enrichmentmap.task.InitializeGenesetsOfInterestTask.MissingGenesetStrategy;
3837
import org.baderlab.csplugins.enrichmentmap.util.Baton;
3938
import org.cytoscape.service.util.CyServiceRegistrar;
4039
import org.cytoscape.work.AbstractTask;
@@ -66,25 +65,24 @@ public CreateEnrichmentMapTaskFactory(@Assisted EMCreationParameters params, @As
6665
this.params = params;
6766
}
6867

69-
7068
public TaskIterator createTaskIterator() {
71-
return createTaskIterator(MissingGenesetStrategy.FAIL_IMMEDIATELY, ParseGSEAEnrichmentStrategy.FAIL_IMMEDIATELY);
69+
return createTaskIterator(TaskErrorStrategies.commandDefaults());
7270
}
7371

74-
public TaskIterator createTaskIterator(MissingGenesetStrategy genesetStrategy, ParseGSEAEnrichmentStrategy gseaStrategy) {
72+
public TaskIterator createTaskIterator(TaskErrorStrategies strategies) {
7573
TaskIterator tasks = new TaskIterator();
7674
if(dataSets.isEmpty())
7775
return tasks;
7876
tasks.append(new TitleTask("Building EnrichmentMap"));
7977

8078
EnrichmentMap map = new EnrichmentMap(params, serviceRegistrar);
81-
createTasks(map, tasks, genesetStrategy, gseaStrategy);
79+
createTasks(map, tasks, strategies);
8280

8381
return tasks;
8482
}
8583

8684

87-
private void createTasks(EnrichmentMap map, TaskIterator tasks, MissingGenesetStrategy genesetStrategy, ParseGSEAEnrichmentStrategy gseaStrategy) {
85+
private void createTasks(EnrichmentMap map, TaskIterator tasks, TaskErrorStrategies strategies) {
8886
for(DataSetParameters dataSetParameters : dataSets) {
8987
String datasetName = dataSetParameters.getName();
9088
Method method = dataSetParameters.getMethod();
@@ -120,7 +118,7 @@ private void createTasks(EnrichmentMap map, TaskIterator tasks, MissingGenesetSt
120118
tasks.append(new GMTFileReaderTask(dataset));
121119

122120
// Load the enrichments
123-
tasks.append(getEnrichmentParserTasks(dataset, gseaStrategy));
121+
tasks.append(getEnrichmentParserTasks(dataset, strategies.getGseaStrategy()));
124122

125123
// Load expression file if specified in the dataset.
126124
// If there is no expression file then create a dummy file to associate with this dataset so we can still use the expression viewer (heat map)
@@ -132,15 +130,15 @@ private void createTasks(EnrichmentMap map, TaskIterator tasks, MissingGenesetSt
132130
// Load ranks if present
133131
String ranksName = dataset.getMethod() == Method.GSEA ? Ranking.GSEARanking : datasetName;
134132
if(dataset.getRanksByName(ranksName) != null)
135-
tasks.append(new RanksFileReaderTask(files.getRankedFile(), dataset, ranksName, false));
133+
tasks.append(new RanksFileReaderTask(files.getRankedFile(), dataset, ranksName, false, strategies.getRanksStrategy()));
136134

137135
if(!Strings.isNullOrEmpty(dataset.getDataSetFiles().getClassFile()))
138136
tasks.append(new ClassFileReaderTask(dataset));
139137
}
140138
}
141139

142140
// Filter out genesets that don't pass the p-value and q-value thresholds
143-
InitializeGenesetsOfInterestTask genesetsTask = new InitializeGenesetsOfInterestTask(map, genesetStrategy);
141+
InitializeGenesetsOfInterestTask genesetsTask = new InitializeGenesetsOfInterestTask(map, strategies.getGenesetStrategy());
144142
tasks.append(genesetsTask);
145143

146144
// Trim the genesets to only contain the genes that are in the data file.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.baderlab.csplugins.enrichmentmap.task;
2+
3+
import java.util.Objects;
4+
5+
import org.baderlab.csplugins.enrichmentmap.parsers.ParseGSEAEnrichmentResults.ParseGSEAEnrichmentStrategy;
6+
import org.baderlab.csplugins.enrichmentmap.parsers.RanksFileReaderTask.UnsortedRanksStrategy;
7+
import org.baderlab.csplugins.enrichmentmap.task.InitializeGenesetsOfInterestTask.MissingGenesetStrategy;
8+
9+
public class TaskErrorStrategies {
10+
11+
private final MissingGenesetStrategy genesetStrategy;
12+
private final ParseGSEAEnrichmentStrategy gseaStrategy;
13+
private final UnsortedRanksStrategy ranksStrategy;
14+
15+
16+
public TaskErrorStrategies(MissingGenesetStrategy genesetStrategy, ParseGSEAEnrichmentStrategy gseaStrategy, UnsortedRanksStrategy ranksStrategy) {
17+
this.genesetStrategy = Objects.requireNonNull(genesetStrategy);
18+
this.gseaStrategy = Objects.requireNonNull(gseaStrategy);
19+
this.ranksStrategy = Objects.requireNonNull(ranksStrategy);
20+
}
21+
22+
23+
public static TaskErrorStrategies dialogDefaults() {
24+
return new TaskErrorStrategies(
25+
MissingGenesetStrategy.FAIL_AT_END,
26+
ParseGSEAEnrichmentStrategy.FAIL_IMMEDIATELY,
27+
UnsortedRanksStrategy.FAIL_IMMEDIATELY);
28+
}
29+
30+
public static TaskErrorStrategies commandDefaults() {
31+
return new TaskErrorStrategies(
32+
MissingGenesetStrategy.FAIL_AT_END,
33+
ParseGSEAEnrichmentStrategy.FAIL_IMMEDIATELY,
34+
UnsortedRanksStrategy.LOG_WARNING);
35+
}
36+
37+
public static TaskErrorStrategies testDefaults() {
38+
return new TaskErrorStrategies(
39+
MissingGenesetStrategy.FAIL_IMMEDIATELY,
40+
ParseGSEAEnrichmentStrategy.FAIL_IMMEDIATELY,
41+
UnsortedRanksStrategy.FAIL_IMMEDIATELY);
42+
}
43+
44+
45+
public MissingGenesetStrategy getGenesetStrategy() {
46+
return genesetStrategy;
47+
}
48+
49+
public ParseGSEAEnrichmentStrategy getGseaStrategy() {
50+
return gseaStrategy;
51+
}
52+
53+
public UnsortedRanksStrategy getRanksStrategy() {
54+
return ranksStrategy;
55+
}
56+
57+
58+
public TaskErrorStrategies with(MissingGenesetStrategy genesetStrategy) {
59+
return new TaskErrorStrategies(genesetStrategy, gseaStrategy, ranksStrategy);
60+
}
61+
62+
public TaskErrorStrategies with(ParseGSEAEnrichmentStrategy gseaStrategy) {
63+
return new TaskErrorStrategies(genesetStrategy, gseaStrategy, ranksStrategy);
64+
}
65+
66+
public TaskErrorStrategies with(UnsortedRanksStrategy ranksStrategy) {
67+
return new TaskErrorStrategies(genesetStrategy, gseaStrategy, ranksStrategy);
68+
}
69+
70+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.baderlab.csplugins.enrichmentmap.task;
2+
3+
@SuppressWarnings("serial")
4+
public class UnsortedRanksException extends RuntimeException {
5+
6+
private final String ranksFileName;
7+
8+
public UnsortedRanksException(String message, String ranksFileName) {
9+
super(message);
10+
this.ranksFileName = ranksFileName;
11+
}
12+
13+
public String getRanksFileName() {
14+
return ranksFileName;
15+
}
16+
17+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.baderlab.csplugins.enrichmentmap.util;
2+
3+
import org.cytoscape.work.TaskMonitor;
4+
5+
public class DelegatingTaskMonitor implements TaskMonitor {
6+
7+
8+
private final TaskMonitor delegate;
9+
10+
public DelegatingTaskMonitor(TaskMonitor delegate) {
11+
this.delegate = delegate;
12+
}
13+
14+
@Override
15+
public void setTitle(String title) {
16+
delegate.setTitle(title);
17+
}
18+
19+
@Override
20+
public void setProgress(double progress) {
21+
delegate.setProgress(progress);
22+
}
23+
24+
@Override
25+
public void setStatusMessage(String statusMessage) {
26+
delegate.setStatusMessage(statusMessage);
27+
}
28+
29+
@Override
30+
public void showMessage(Level level, String message) {
31+
delegate.showMessage(level, message);
32+
}
33+
34+
}

0 commit comments

Comments
 (0)