/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.analysis.htest.editor;
import org.apache.commons.lang.WordUtils;
import org.apache.velocity.VelocityContext;
import org.gitools.analysis.ToolConfig;
import org.gitools.analysis.htest.HtestAnalysis;
import org.gitools.analysis.stats.test.factory.TestFactory;
import org.gitools.api.analysis.IProgressMonitor;
import org.gitools.api.matrix.IMatrix;
import org.gitools.api.resource.IResourceLocator;
import org.gitools.heatmap.Heatmap;
import org.gitools.heatmap.decorator.impl.BinaryDecorator;
import org.gitools.ui.app.commands.CommandLoadFile;
import org.gitools.ui.app.heatmap.editor.HeatmapEditor;
import org.gitools.ui.core.Application;
import org.gitools.ui.core.components.editor.AnalysisEditor;
import org.gitools.ui.core.components.editor.EditorsPanel;
import org.gitools.ui.platform.progress.JobRunnable;
import org.gitools.ui.platform.progress.JobThread;
import org.gitools.utils.cutoffcmp.CutoffCmp;
import javax.swing.*;
import java.util.HashMap;
import java.util.Map;
public abstract class AbstractHtestAnalysisEditor<T extends HtestAnalysis> extends AnalysisEditor<T> {
protected AbstractHtestAnalysisEditor(T analysis, String template, String formatExtension) {
super(analysis, template, formatExtension);
}
@Override
protected void prepareContext(VelocityContext context) {
T analysis = getModel();
IResourceLocator fileRef = analysis.getData().getLocator();
context.put("dataFile", fileRef != null ? fileRef.getName() : "Not defined");
ToolConfig testConfig = analysis.getTestConfig();
if (!testConfig.get(TestFactory.TEST_NAME_PROPERTY).equals("")) {
context.put("test", WordUtils.capitalize(testConfig.get(TestFactory.TEST_NAME_PROPERTY)));
HashMap<String, Object> testAttributes = new HashMap<>();
for (String key : testConfig.getConfiguration().keySet()) {
if (!key.equals(TestFactory.TEST_NAME_PROPERTY)) {
testAttributes.put(WordUtils.capitalize(key), WordUtils.capitalize(testConfig.get(key)));
}
}
if (testAttributes.size() > 0) {
context.put("testAttributes", testAttributes);
}
}
CutoffCmp cmp = analysis.getBinaryCutoffCmp();
String filterDesc = cmp == null ? "Not filtered" : "Binary cutoff filter for values " + cmp.getLongName() + " " + analysis.getBinaryCutoffValue();
context.put("filterDesc", filterDesc);
fileRef = analysis.getModuleMap().getLocator();
context.put("modulesFile", fileRef != null ? fileRef.getName() : "Unknown");
context.put("moduleMinSize", analysis.getMinModuleSize());
int maxSize = analysis.getMaxModuleSize();
context.put("moduleMaxSize", maxSize != Integer.MAX_VALUE ? maxSize : "No limit");
if (analysis.getMtc().equals("bh")) {
context.put("mtc", "Benjamini Hochberg FDR");
} else if (analysis.getMtc().equals("bonferroni")) {
context.put("mtc", "Bonferroni");
}
if (analysis.getResults() != null) {
fileRef = analysis.getResults().getLocator();
context.put("resultsFile", fileRef != null ? fileRef.getName() : "Not defined");
}
fileRef = analysis.getLocator();
if (fileRef != null) {
context.put("analysisLocation", fileRef.getURL());
if (fileRef.isWritable()) {
setSaveAllowed(true);
}
}
if (analysis.getStartTime() != null) {
context.put("startTime", analysis.getStartTime());
}
if (analysis.getElapsedTime() > 0) {
context.put("elapsedTime", analysis.getElapsedTime());
}
super.prepareContext(context);
}
@Override
protected void performUrlAction(String name, Map<String, String> params) {
if ("NewDataHeatmap".equals(name)) {
newDataHeatmap();
} else if ("NewResultsHeatmap".equals(name)) {
newResultsHeatmap();
} else if ("ViewModuleMap".equals(name)) {
newModuleMap();
}
}
private void newModuleMap() {
final T analysis = getModel();
if (analysis.getModuleMap() == null) {
Application.get().showNotificationPermanent("Analysis doesn't contain a groups (modules) file.");
return;
}
JobThread.execute(Application.get(), new CommandLoadFile(analysis.getModuleMap()));
Application.get().showNotificationPermanent("Heatmap from module files created");
}
protected void newDataHeatmap() {
final T analysis = getModel();
if (analysis.getData() == null) {
Application.get().showNotificationPermanent("Analysis doesn't contain data.");
return;
}
final EditorsPanel editorPanel = Application.get().getEditorsPanel();
JobThread.execute(Application.get(), new JobRunnable() {
@Override
public void run(IProgressMonitor monitor) {
monitor.begin("Creating new heatmap from data ...", 1);
final HeatmapEditor editor = new HeatmapEditor(createDataHeatmap(analysis));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
editorPanel.addEditor(editor);
editor.setName(analysis.getTitle() + "-data");
Application.get().showNotification("Heatmap from data created.");
}
});
}
});
}
protected void newResultsHeatmap() {
final T analysis = getModel();
if (analysis.getResults() == null) {
Application.get().showNotificationPermanent("Analysis doesn't contain results.");
return;
}
final EditorsPanel editorPanel = Application.get().getEditorsPanel();
JobThread.execute(Application.get(), new JobRunnable() {
@Override
public void run(IProgressMonitor monitor) {
monitor.begin("Creating new heatmap from results ...", 1);
final HeatmapEditor editor = new HeatmapEditor(createResultsHeatmap(analysis));
editor.setName(analysis.getTitle() + "-results");
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
editorPanel.addEditor(editor);
Application.get().showNotification("Heatmap results created.");
}
});
}
});
}
@Deprecated
protected abstract Heatmap createResultsHeatmap(T analysis);
@Deprecated
protected Heatmap createDataHeatmap(T analysis) {
return newDataHeatmap(analysis);
}
public static Heatmap newDataHeatmap(HtestAnalysis analysis) {
IMatrix data = analysis.getData().get();
if (data instanceof Heatmap) {
return (Heatmap) data;
}
Heatmap heatmap = new Heatmap(data);
String testName = analysis.getTestConfig().getConfiguration().get(TestFactory.TEST_NAME_PROPERTY);
if (!testName.equals(TestFactory.ZSCORE_TEST)) {
heatmap.getLayers().get(0).setDecorator(new BinaryDecorator());
}
heatmap.setTitle(analysis.getTitle() + " (data)");
return heatmap;
}
}