Skip to content
Snippets Groups Projects
Commit 4eabf1b9 authored by cramakri's avatar cramakri
Browse files

LMS-1483 Further work on the graph/plot framework.

SVN: 15486
parent 8cc29191
No related merge requests found
......@@ -70,14 +70,14 @@ public class TabularDataGraphServlet extends AbstractDatasetDownloadServlet
private final String filePath;
private final String graphTypeCode;
private final String graphName;
public RequestParams(HttpServletRequest request)
{
sessionId = getRequiredParameter(request, SESSION_ID_PARAM);
datasetCode = getRequiredParameter(request, DATASET_CODE_PARAM);
filePath = getRequiredParameter(request, FILE_PATH_PARAM);
graphTypeCode = getRequiredParameter(request, GRAPH_TYPE_CODE);
graphName = getRequiredParameter(request, GRAPH_TYPE_CODE);
}
private static String getRequiredParameter(final HttpServletRequest request,
......@@ -135,7 +135,7 @@ public class TabularDataGraphServlet extends AbstractDatasetDownloadServlet
// Generate an image image into the stream
ITabularDataGraph generator =
configuration.getGraph(params.graphTypeCode, fileLines, response
configuration.getGraph(params.graphName, fileLines, response
.getOutputStream());
generator.generateImage();
......
......@@ -63,6 +63,20 @@ abstract class AbstractTabularDataGraph<T extends TabularDataGraphConfiguration>
.getImageHeight());
}
/**
* Create an image,overriding the width and height in the configuration from the file lines and
* write it to the output stream.
*
* @param imageWidth The desired width of the image
* @param imageHeight The desired height of the image
* @throws IOException
*/
public void generateImage(int imageWidth, int imageHeight) throws IOException
{
JFreeChart chart = createChart();
ChartUtilities.writeChartAsPNG(out, chart, imageWidth, imageHeight);
}
// For Subclasses
/**
* Return the configuration for this graph.
......
......@@ -29,6 +29,8 @@ import java.util.Properties;
import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
import ch.systemsx.cisd.common.utilities.PropertyUtils;
import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.DatasetFileLines;
import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PropertyParametersUtil;
import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PropertyParametersUtil.SectionProperties;
/**
* @author Chandrasekhar Ramakrishnan
......@@ -39,18 +41,59 @@ public class TabularDataGraphCollectionConfiguration
private static final String IGNORE_COMMENTS_PROPERTY_KEY = "ignore-comments";
// the seperator in the file
private final char separator;
// the full width of the graphs when requested
private static final String IMAGE_WIDTH_KEY = "full-width";
// the full height of the graphs when requested
private static final String IMAGE_HEIGHT_KEY = "full-height";
// the width of the thumbnails shown in the report
private static final String THUMBNAIL_WIDTH_KEY = "column-width";
// the height of the thumbnails shown in the report
private static final String THUMBNAIL_HEIGHT_KEY = "column-height";
// the graphs to display -- each one is shown in a column.
private static final String GRAPHS_KEY = "graphs";
// the type of graph. See @{link GraphType} for valid types.
private static final String GRAPHS_TYPES_KEY = "graph-type";
// keys for the different kinds of graphs
private static final String TITLE_KEY = "title";
private static final String X_AXIS_KEY = "x-axis";
private static final String Y_AXIS_KEY = "y-axis";
private static final String COLUMN_KEY = "column";
private static final String NUMBER_OF_BINS_KEY = "number-of-bins";
private final char columnDelimiter;
private final boolean ignoreComments;
// the comment marker in the file
private final char comment;
private final ArrayList<String> graphTypeCodes;
private final int imageWidth;
private final int imageHeight;
private final int thumbnailWidth;
private final int thumbnailHeight;
private final ArrayList<String> graphNames;
private final HashMap<String, TabularDataGraphConfiguration> graphTypeMap;
private enum GraphType
{
SCATTERPLOT, HISTOGRAM, HEATMAP
}
/**
* Create a configuration from the properties file located at path.
*
......@@ -82,34 +125,93 @@ public class TabularDataGraphCollectionConfiguration
{
comment = '#';
this.separator = PropertyUtils.getChar(properties, SEPARATOR_PROPERTY_KEY, ';');
this.columnDelimiter = PropertyUtils.getChar(properties, SEPARATOR_PROPERTY_KEY, ';');
this.ignoreComments =
PropertyUtils.getBoolean(properties, IGNORE_COMMENTS_PROPERTY_KEY, true);
graphTypeCodes = new ArrayList<String>();
imageWidth = PropertyUtils.getInt(properties, IMAGE_WIDTH_KEY, 800);
imageHeight = PropertyUtils.getInt(properties, IMAGE_HEIGHT_KEY, 600);
thumbnailWidth = PropertyUtils.getInt(properties, THUMBNAIL_WIDTH_KEY, 300);
thumbnailHeight = PropertyUtils.getInt(properties, THUMBNAIL_HEIGHT_KEY, 200);
graphNames = new ArrayList<String>();
initializeGraphTypeCodes(properties);
graphTypeMap = new HashMap<String, TabularDataGraphConfiguration>();
initialzeGraphTypeMap(properties);
}
private void initializeGraphTypeCodes(Properties properties)
{
String graphTypeCodesString = properties.getProperty(GRAPHS_KEY, "");
String[] typeCodeArray = graphTypeCodesString.split(",");
for (String typeCode : typeCodeArray)
{
graphNames.add(typeCode.trim());
}
}
private void initialzeGraphTypeMap(Properties properties)
{
TabularDataGraphConfiguration config =
new TabularDataGraphConfiguration("Test", "TotalCells", "InfectedCells", 300, 200);
graphTypeMap.put("scatter", config);
graphTypeCodes.add("scatter");
SectionProperties[] pluginServicesProperties =
PropertyParametersUtil.extractSectionProperties(properties, GRAPHS_KEY, false);
for (SectionProperties sectionProp : pluginServicesProperties)
{
TabularDataGraphConfiguration config = getConfiguration(sectionProp);
graphTypeMap.put(sectionProp.getKey(), config);
}
}
private TabularDataGraphConfiguration getConfiguration(SectionProperties sectionProp)
{
Properties props = sectionProp.getProperties();
String graphTypeValue = PropertyUtils.getMandatoryProperty(props, GRAPHS_TYPES_KEY);
GraphType type = GraphType.valueOf(graphTypeValue.toUpperCase());
String title = props.getProperty(TITLE_KEY, sectionProp.getKey());
switch (type)
{
case HEATMAP:
String xAxis = PropertyUtils.getMandatoryProperty(props, X_AXIS_KEY);
String yAxis = PropertyUtils.getMandatoryProperty(props, Y_AXIS_KEY);
String zAxis = PropertyUtils.getMandatoryProperty(props, COLUMN_KEY);
if (xAxis.equals(yAxis))
{
return new TabularDataHeatmapConfiguration(title, xAxis, zAxis,
getThumbnailWidth(), getThumbnailHeight());
} else
{
return new TabularDataHeatmapConfiguration(title, xAxis, yAxis, zAxis,
getThumbnailWidth(), getThumbnailHeight());
}
case HISTOGRAM:
return new TabularDataHistogramConfiguration(title, PropertyUtils
.getMandatoryProperty(props, COLUMN_KEY), getThumbnailWidth(),
getThumbnailHeight(), PropertyUtils.getInt(props, NUMBER_OF_BINS_KEY, 10));
case SCATTERPLOT:
return new TabularDataGraphConfiguration(title, PropertyUtils.getMandatoryProperty(
props, X_AXIS_KEY), PropertyUtils.getMandatoryProperty(props, Y_AXIS_KEY),
getThumbnailWidth(), getThumbnailHeight());
}
// should never get here
return null;
}
/**
* Return the graph configuration associated with the graphTypeCode.
*
* @param graphTypeCode The name of the graph type
* @param graphName The name of the graph type
*/
public TabularDataGraphConfiguration getGraphConfiguration(String graphTypeCode)
public TabularDataGraphConfiguration getGraphConfiguration(String graphName)
{
TabularDataGraphConfiguration config = graphTypeMap.get(graphTypeCode);
TabularDataGraphConfiguration config = graphTypeMap.get(graphName);
if (null == config)
{
throw new IllegalArgumentException("No graph associated with code " + graphTypeCode);
throw new IllegalArgumentException("No graph associated with code " + graphName);
}
return config;
}
......@@ -118,24 +220,23 @@ public class TabularDataGraphCollectionConfiguration
* Return the graph generator associated with the graphTypeCode, initialized by the fileLines
* and out.
*
* @param graphTypeCode The name of the graph type
* @param graphName The name of the graph type
* @param fileLines The data to generate a graph from
* @param out The stream to write the graph to
*/
public ITabularDataGraph getGraph(String graphTypeCode, DatasetFileLines fileLines,
OutputStream out)
public ITabularDataGraph getGraph(String graphName, DatasetFileLines fileLines, OutputStream out)
{
TabularDataGraphConfiguration config = graphTypeMap.get(graphTypeCode);
TabularDataGraphConfiguration config = graphTypeMap.get(graphName);
if (null == config)
{
throw new IllegalArgumentException("No graph associated with code " + graphTypeCode);
throw new IllegalArgumentException("No graph associated with code " + graphName);
}
return new TabularDataScatterplot(config, fileLines, out);
}
public char getColumnDelimiter()
{
return separator;
return columnDelimiter;
}
/**
......@@ -153,26 +254,26 @@ public class TabularDataGraphCollectionConfiguration
public int getImageWidth()
{
return 800;
return imageWidth;
}
public int getImageHeight()
{
return 600;
return imageHeight;
}
public int getThumbnailWidth()
{
return 300;
return thumbnailWidth;
}
public int getThumbnailHeight()
{
return 200;
return thumbnailHeight;
}
public List<String> getGraphTypeCodes()
public List<String> getGraphNames()
{
return graphTypeCodes;
return graphNames;
}
}
......@@ -131,7 +131,7 @@ public class ImageAnalysisGraphReportingPlugin extends AbstractDataMergingReport
private List<String> getGraphTypeCodes()
{
return configuration.getGraphTypeCodes();
return configuration.getGraphNames();
}
private int getImageWidth()
......
/*
* Copyright 2010 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.dss.generic.server.graph;
import java.net.URL;
import java.util.List;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
import ch.systemsx.cisd.openbis.dss.generic.server.graph.TabularDataGraphCollectionConfiguration;
import ch.systemsx.cisd.openbis.dss.generic.server.graph.TabularDataGraphConfiguration;
/**
* @author Chandrasekhar Ramakrishnan
*/
public class TabularDataGraphCollectionConfigurationTest extends AssertJUnit
{
@Test
public void testGoodConfigurationFile()
{
URL propertiesUrl = getClass().getResource("graph.properties");
String propertiesFilePath = propertiesUrl.getFile();
TabularDataGraphCollectionConfiguration configuration =
TabularDataGraphCollectionConfiguration.getConfiguration(propertiesFilePath);
// test the file global stuff
assertEquals(',', configuration.getColumnDelimiter());
assertFalse(configuration.isIgnoreComments());
assertEquals(1024, configuration.getImageWidth());
assertEquals(768, configuration.getImageHeight());
assertEquals(30, configuration.getThumbnailWidth());
assertEquals(30, configuration.getThumbnailHeight());
// test the graph configurations
assertEquals(4, configuration.getGraphNames().size());
List<String> graphNames = configuration.getGraphNames();
assertEquals("scatter1", graphNames.get(0));
TabularDataGraphConfiguration graphConfig =
configuration.getGraphConfiguration(graphNames.get(0));
// If not specified, the title should default to the name
assertEquals("scatter1", graphConfig.getTitle());
assertEquals(30, graphConfig.getImageHeight());
assertEquals(30, graphConfig.getImageWidth());
assertEquals("hist", graphNames.get(1));
assertEquals("heat", graphNames.get(2));
assertEquals("scatter2", graphNames.get(3));
}
}
# ------------------------------------------------------------------
# Properties File For Generating Graphs From Tabular Data
# ------------------------------------------------------------------
# The column delimiter
separator = ,
# Should comments be ignored?
ignore-comments = false
# The width of the full image
full-width = 1024
# The height of the full image
full-height = 768
# The width of the table column
column-width = 30
# The height of the table row
column-height = 30
# The graphs shown per row
graphs = scatter1, hist, heat, scatter2
# The properties for the first scatter plot
scatter1.graph-type = scatterplot
scatter1.x-axis = TotalCells
scatter1.y-axis = InfectedCells
# The properties for the histogram
hist.graph-type = histogram
hist.column = TotalCells
# The properties for the heatmap
heat.graph-type = heatmap
heat.x-axis = WellName
heat.y-axis = WellName
heat.column = InfectedCells
# The properties for the second scatter plot
scatter2.graph-type = scatterplot
scatter2.x-axis = TotalCells
scatter2.y-axis = RelativeInfectionIndex
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment