/**
* 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.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.opengamma.analytics.financial.model.volatility.smile.fitting.sabr.SmileSurfaceDataBundle;
import com.opengamma.analytics.financial.model.volatility.surface.BlackVolatilitySurfaceMoneynessFcnBackedByGrid;
import com.opengamma.engine.value.ValueSpecification;
/* package */ class BlackVolatilitySurfaceMoneynessFcnBackedByGridFormatter
extends AbstractFormatter<BlackVolatilitySurfaceMoneynessFcnBackedByGrid> {
/* package */ BlackVolatilitySurfaceMoneynessFcnBackedByGridFormatter() {
super(BlackVolatilitySurfaceMoneynessFcnBackedByGrid.class);
addFormatter(new Formatter<BlackVolatilitySurfaceMoneynessFcnBackedByGrid>(Format.EXPANDED) {
@Override
Object format(BlackVolatilitySurfaceMoneynessFcnBackedByGrid value,
ValueSpecification valueSpec,
Object inlineKey) {
return formatExpanded(value);
}
});
}
@Override
public Object formatCell(BlackVolatilitySurfaceMoneynessFcnBackedByGrid value,
ValueSpecification valueSpec,
Object inlineKey) {
return SurfaceFormatterUtils.formatCell(value.getSurface());
}
private Object formatExpanded(BlackVolatilitySurfaceMoneynessFcnBackedByGrid value) {
SmileSurfaceDataBundle gridData = value.getGridData();
Set<Double> strikes = new TreeSet<Double>();
for (double[] outer : gridData.getStrikes()) {
for (double inner : outer) {
strikes.add(inner);
}
}
List<Double> vol = Lists.newArrayList();
// x values (outer loop of vol) strikes
// y values (inner loop of vol) expiries
List<Double> expiries = Lists.newArrayListWithCapacity(gridData.getExpiries().length);
for (double expiry : gridData.getExpiries()) {
expiries.add(expiry);
}
for (Double strike : strikes) {
for (Double expiry : expiries) {
vol.add(value.getVolatility(expiry, strike));
}
}
Map<String, Object> results = Maps.newHashMap();
results.put(SurfaceFormatterUtils.X_VALUES, expiries);
results.put(SurfaceFormatterUtils.X_LABELS, SurfaceFormatterUtils.getAxisLabels(expiries));
results.put(SurfaceFormatterUtils.X_TITLE, "Time to Expiry");
results.put(SurfaceFormatterUtils.Y_VALUES, strikes);
results.put(SurfaceFormatterUtils.Y_LABELS, SurfaceFormatterUtils.getAxisLabels(strikes));
results.put(SurfaceFormatterUtils.Y_TITLE, "Strike");
results.put(SurfaceFormatterUtils.VOL, vol);
return results;
}
@Override
public DataType getDataType() {
return DataType.SURFACE_DATA;
}
}