/* * #%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.actions.data.analysis; import org.apache.commons.lang.StringUtils; import org.gitools.analysis.groupcomparison.GroupComparisonAnalysis; import org.gitools.analysis.groupcomparison.dimensiongroups.DimensionGroup; import org.gitools.api.analysis.IProgressMonitor; import org.gitools.api.matrix.*; import org.gitools.heatmap.Heatmap; import org.gitools.heatmap.HeatmapDimension; import org.gitools.heatmap.header.HeatmapColoredLabelsHeader; import org.gitools.heatmap.header.HeatmapHeader; import org.gitools.ui.app.analysis.groupcomparison.editor.GroupComparisonAnalysisEditor; import org.gitools.ui.app.commands.AddHeaderColoredLabelsCommand; import org.gitools.ui.app.heatmap.editor.HeatmapEditor; import org.gitools.ui.core.Application; import org.gitools.ui.core.HeatmapPosition; import org.gitools.ui.core.actions.HeatmapAction; import org.gitools.ui.core.actions.dynamicactions.IHeatmapDimensionAction; import org.gitools.ui.core.components.editor.AbstractEditor; import org.gitools.ui.core.components.editor.EditorsPanel; import org.gitools.ui.platform.icons.IconNames; import org.gitools.ui.platform.progress.JobRunnable; import org.gitools.ui.platform.progress.JobThread; import java.awt.event.ActionEvent; import java.util.ArrayList; public class ViewGroupComparisonResultDataAction extends HeatmapAction implements IHeatmapDimensionAction { public static final String GROUP_GC_ANALYSIS_ANNOTATION = "Group (GC-analysis)"; private String annotationValue; private HeatmapColoredLabelsHeader coloredHeader; private GroupComparisonAnalysis analysis; private String rowId; public ViewGroupComparisonResultDataAction() { super("<html><i>ViewEnrichmentModuleDataAction</i></html>"); setSmallIconFromResource(IconNames.view16); } @Override public void actionPerformed(ActionEvent e) { if (rowId == null) { return; } JobThread.execute(Application.get(), new JobRunnable() { @Override public void run(IProgressMonitor monitor) throws Exception { IMatrix data = analysis.getData().get(); Heatmap dataHeatmap = null; if (data instanceof Heatmap) { dataHeatmap = (Heatmap) data; data = ((Heatmap) data).getContents(); } EditorsPanel epanel = Application.get().getEditorsPanel(); HeatmapEditor heatmapEditor = getOpenInEditor(data); if (heatmapEditor != null) { epanel.setSelectedEditor(heatmapEditor); } else { monitor.begin("Creating new heatmap from data ...", 1); heatmapEditor = new HeatmapEditor(GroupComparisonAnalysisEditor.createDataHeatmap(analysis)); epanel.addEditor(heatmapEditor); heatmapEditor.setName(analysis.getTitle() + "-data"); dataHeatmap = heatmapEditor.getModel(); } // Show row in question ArrayList<String> rowIds = new ArrayList<>(); rowIds.add(rowId); dataHeatmap.getRows().show(rowIds); if (dataHeatmap.getRows().getCellSize() < 30) { dataHeatmap.getRows().setCellSize(30); } // Layer dataHeatmap.getLayers().setTopLayer(dataHeatmap.getLayers().get(analysis.getLayerName())); // Column groups ArrayList<String> colOrder = new ArrayList<>(); IMatrixLayer<Double> layer = dataHeatmap.getLayers().get(analysis.getLayerName()); for (DimensionGroup group : analysis.getGroups()) { IMatrixPosition pos = dataHeatmap.getContents().newPosition().set(dataHeatmap.getRows(), rowId); IMatrixIterable<Double> iterable = pos.iterate(layer, dataHeatmap.getColumns()).filter(group.getPredicate()); for (Double value : iterable) { String columnName = iterable.getPosition().get(dataHeatmap.getColumns()); colOrder.add(columnName); dataHeatmap.getColumns().getAnnotations().setAnnotation(columnName, GROUP_GC_ANALYSIS_ANNOTATION, group.getName()); } } dataHeatmap.getColumns().show(colOrder); // add header if not already added boolean hasHeader = false; for (HeatmapHeader h : dataHeatmap.getColumns().getHeaders()) { if (h.getTitle().equals(GROUP_GC_ANALYSIS_ANNOTATION)) { hasHeader = true; } } if (!hasHeader) { new AddHeaderColoredLabelsCommand(heatmapEditor.getName(), MatrixDimensionKey.COLUMNS, "${" + GROUP_GC_ANALYSIS_ANNOTATION + "}", null, null, true, true, "").execute(monitor); } Application.get().showNotificationPermanent("Data for '" + rowId + "' grouped and shown."); } }); } public HeatmapEditor getOpenInEditor(IMatrix data) { EditorsPanel epanel = Application.get().getEditorsPanel(); for (AbstractEditor e : epanel.getEditors()) { if (e instanceof HeatmapEditor) { if (((Heatmap) e.getModel()).getContents() == data) { return (HeatmapEditor) e; } } } return null; } @Override public void onConfigure(HeatmapDimension dimension, HeatmapPosition position) { boolean enable = getHeatmap().getMetadata(GroupComparisonAnalysis.CACHE_KEY_GC_ANALYSIS) != null && dimension.getId().equals(MatrixDimensionKey.ROWS); setEnabled(enable); if (enable) { this.analysis = getHeatmap().getMetadata(GroupComparisonAnalysis.CACHE_KEY_GC_ANALYSIS); this.rowId = dimension.getLabel(position.getRow()); } this.setName("<html><i>View</i> data for '" + StringUtils.abbreviate(rowId, 25) + "' results</html>"); } }