/* * #%L * gitools-core * %% * 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.plugins.mutex.analysis; import com.google.common.base.Strings; import org.gitools.analysis.Analysis; import org.gitools.analysis.clustering.ClusteringData; import org.gitools.analysis.clustering.ClusteringException; import org.gitools.analysis.clustering.annotations.AnnPatClusteringData; import org.gitools.analysis.clustering.annotations.AnnPatClusteringMethod; import org.gitools.api.analysis.Clusters; import org.gitools.api.matrix.IKey; import org.gitools.api.matrix.IMatrixDimension; import org.gitools.api.matrix.Key; import org.gitools.api.matrix.MatrixDimensionKey; import org.gitools.api.modulemap.IModuleMap; import org.gitools.api.resource.ResourceReference; import org.gitools.api.resource.adapter.ResourceReferenceXmlAdapter; import org.gitools.heatmap.Heatmap; import org.gitools.heatmap.HeatmapDimension; import org.gitools.heatmap.HeatmapLayers; import org.gitools.heatmap.decorator.impl.NonEventToNullFunction; import org.gitools.heatmap.decorator.impl.PValueDecorator; import org.gitools.heatmap.decorator.impl.ZScoreDecorator; import org.gitools.matrix.modulemap.HashModuleMap; import org.gitools.resource.Property; import org.gitools.ui.platform.settings.Settings; import org.gitools.utils.progressmonitor.DefaultProgressMonitor; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.util.HashMap; import java.util.Map; import java.util.Set; @XmlRootElement public class MutualExclusiveAnalysis extends Analysis { @XmlTransient public static IKey<MutualExclusiveAnalysis> CACHE_KEY_MUTEX_ANALYSIS = new Key<>(); private String layer; @XmlJavaTypeAdapter(ResourceReferenceXmlAdapter.class) private ResourceReference<Heatmap> results; @XmlJavaTypeAdapter(ResourceReferenceXmlAdapter.class) private ResourceReference<Heatmap> data; @XmlJavaTypeAdapter(ResourceReferenceXmlAdapter.class) private ResourceReference<IModuleMap> rowsModuleMap; @XmlJavaTypeAdapter(ResourceReferenceXmlAdapter.class) private ResourceReference<IModuleMap> columnsModuleMap; private MatrixDimensionKey testDimensionKey; private MatrixDimensionKey weightDimensionKey; private int iterations = 10000; @XmlTransient private NonEventToNullFunction eventFunction; private boolean discardEmpty = false; public MutualExclusiveAnalysis(Heatmap heatmap) { setData(heatmap); } public MutualExclusiveAnalysis() { //JAXB requirement } public static HashModuleMap createModules(String pattern, boolean allItemGroup, HeatmapDimension dimension) { HashModuleMap moduleMap = new HashModuleMap(); Map<String, Set<String>> colGroups = new HashMap<>(); if (!Strings.isNullOrEmpty(pattern)) { ClusteringData data = new AnnPatClusteringData(dimension, pattern); Clusters results = null; try { results = new AnnPatClusteringMethod().cluster(data, new DefaultProgressMonitor()); } catch (ClusteringException e) { e.printStackTrace(); } colGroups = results.getClustersMap(); } for (String key : colGroups.keySet()) { moduleMap.addMapping(key, colGroups.get(key)); } if (allItemGroup) { moduleMap.addMapping("All " + dimension.getId().getLabel() + "s", dimension.toList()); } return moduleMap; } public IMatrixDimension getTestDimension() { return getData().get().getDimension(testDimensionKey); } public void setTestDimension(IMatrixDimension testDimension) { this.testDimensionKey = testDimension.getId(); this.weightDimensionKey = testDimensionKey.equals(MatrixDimensionKey.ROWS) ? MatrixDimensionKey.COLUMNS : MatrixDimensionKey.ROWS; } public ResourceReference<IModuleMap> getRowsModuleMap() { return rowsModuleMap; } public void setRowsModuleMap(ResourceReference<IModuleMap> rowsModuleMap) { this.rowsModuleMap = rowsModuleMap; } public void setRowModuleMap(IModuleMap rowsModuleMap) { setRowsModuleMap(new ResourceReference<>("rowsModuleMap", rowsModuleMap)); } public ResourceReference<IModuleMap> getColumnsModuleMap() { return columnsModuleMap; } public void setColumnsModuleMap(ResourceReference<IModuleMap> columnsModuleMap) { this.columnsModuleMap = columnsModuleMap; } public void setColumnsModuleMap(IModuleMap columnsModuleMap) { setColumnsModuleMap(new ResourceReference<>("setColumnsModuleMap", columnsModuleMap)); } public ResourceReference<Heatmap> getData() { return data; } private void setData(ResourceReference<Heatmap> data) { this.data = data; } private void setData(Heatmap data) { setData(new ResourceReference<>("data", data)); } public String getLayer() { if (layer == null) { return getData().get().getLayers().iterator().next().getId(); } return layer; } public void setLayer(String layer) { this.layer = layer; } public ResourceReference<Heatmap> getResults() { return results; } public void setResults(ResourceReference<Heatmap> results) { this.results = results; Heatmap heatmap = results.get(); heatmap.setTitle(getTitle() + " (Results)"); heatmap.setAuthorName(Settings.get().getAuthorName()); heatmap.setAuthorEmail(Settings.get().getAuthorEmail()); HeatmapLayers layers = heatmap.getLayers(); layers.get(MutualExclusiveResult.COOC_PVALUE).setDecorator(new PValueDecorator()); layers.get(MutualExclusiveResult.MUTEX_PVALUE).setDecorator(new PValueDecorator()); layers.get(MutualExclusiveResult.Z_SCORE).setDecorator(new ZScoreDecorator()); layers.setTopLayer(layers.get(MutualExclusiveResult.Z_SCORE)); } public IMatrixDimension getWeightDimension() { return getData().get().getDimension(weightDimensionKey); } public int getIterations() { return iterations; } public void setIterations(int iterations) { this.iterations = iterations; } public NonEventToNullFunction getEventFunction() { this.addProperty(new Property("Events", eventFunction.getDescription())); return eventFunction; } public void setEventFunction(NonEventToNullFunction eventFunction) { this.eventFunction = eventFunction; } public boolean isDiscardEmpty() { return discardEmpty; } public void setDiscardEmpty(boolean discardEmpty) { this.discardEmpty = discardEmpty; } }