/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.analytics.formatting; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.opengamma.analytics.math.surface.ConstantDoublesSurface; import com.opengamma.analytics.math.surface.InterpolatedDoublesSurface; import com.opengamma.analytics.math.surface.NodalDoublesSurface; import com.opengamma.analytics.math.surface.Surface; import com.opengamma.web.server.conversion.LabelFormatter; /** * */ /* package */ class SurfaceFormatterUtils { static final String X_LABELS = "xLabels"; static final String Y_LABELS = "yLabels"; static final String Y_VALUES = "yValues"; static final String X_VALUES = "xValues"; static final String X_TITLE = "xTitle"; static final String Y_TITLE = "yTitle"; static final String VOL = "vol"; /* package */ static Object formatExpanded(Surface<Double, Double, Double> surface) { if (surface instanceof InterpolatedDoublesSurface) { List<Double> vol = Lists.newArrayList(); // the x and y values won't necessarily be unique and won't necessarily map to a rectangular grid // this projects them onto a grid with values at every point Set<Double> xData = Sets.newTreeSet(Arrays.asList(surface.getXData())); Set<Double> yData = Sets.newTreeSet(Arrays.asList(surface.getYData())); for (Double y : yData) { for (Double x : xData) { vol.add(surface.getZValue(x, y)); } } Map<String, Object> results = Maps.newHashMap(); results.put(X_VALUES, xData); results.put(X_LABELS, SurfaceFormatterUtils.getAxisLabels(xData)); results.put(X_TITLE, ""); // TODO use labels from VolatilitySurface once they exist results.put(Y_VALUES, yData); results.put(Y_LABELS, SurfaceFormatterUtils.getAxisLabels(yData)); results.put(Y_TITLE, ""); // TODO use labels from VolatilitySurface once they exist results.put(VOL, vol); return results; } else if (surface instanceof ConstantDoublesSurface) { Map<String, Object> results = Maps.newHashMap(); results.put(LabelledMatrix2DFormatter.X_LABELS, Collections.singletonList("All")); results.put(LabelledMatrix2DFormatter.Y_LABELS, Collections.singletonList("All")); results.put(LabelledMatrix2DFormatter.MATRIX, Collections.singletonList(surface.getZData())); return results; } else { // TODO format as matrix // TODO this won't work - the cell value isn't an error so this makes no difference return new MissingValueFormatter("Unable to format surface of type " + surface.getClass().getSimpleName()); } } /* package */ static DataType getDataType(Surface<Double, Double, Double> surface) { if (surface instanceof InterpolatedDoublesSurface) { return DataType.SURFACE_DATA; } else { return DataType.LABELLED_MATRIX_2D; } } /* package */ static Object formatCell(Surface<Double, Double, Double> surface) { if (surface instanceof InterpolatedDoublesSurface || surface instanceof NodalDoublesSurface) { return "Volatility Surface (" + surface.getXData().length + " x " + surface.getYData().length + ")"; } else { return "Volatility Surface"; } } /* package */ static List<String> getAxisLabels(Collection<?> values) { List<String> labels = Lists.newArrayListWithCapacity(values.size()); for (Object value : values) { labels.add(LabelFormatter.format(value)); } return labels; } }