/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.curve; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.threeten.bp.Instant; import org.threeten.bp.LocalDate; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.config.ConfigSource; import com.opengamma.financial.analytics.curve.credit.CurveDefinitionSource; import com.opengamma.financial.analytics.curve.credit.CurveSpecificationBuilder; import com.opengamma.financial.analytics.ircurve.strips.CurveNode; import com.opengamma.financial.analytics.ircurve.strips.CurveNodeVisitor; import com.opengamma.id.VersionCorrection; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; /** * Contains helper methods for curve construction functions. */ public class CurveUtils { /** * Builds a {@link CurveSpecification} from a curve definition that is valid at a particular time. This method handles only {@link CurveDefinition} and {@link InterpolatedCurveDefinition}. * * @param valuationTime The valuation time, not null * @param curveDefinitionSource The curve definition source, not null * @param curveSpecificationBuilder The curve specification builder, not null * @param curveDate The curve date, not null * @param curveName The curve name, not null * @return The curve specification * @throws OpenGammaRuntimeException if the curve definition is not found. * @deprecated This method does not handle definition types other than {@link CurveDefinition} and {@link InterpolatedCurveDefinition}. Use * {@link #getSpecification(Instant, ConfigSource, LocalDate, String, VersionCorrection)}. */ @Deprecated public static CurveSpecification getCurveSpecification(final Instant valuationTime, final CurveDefinitionSource curveDefinitionSource, final CurveSpecificationBuilder curveSpecificationBuilder, final LocalDate curveDate, final String curveName) { ArgumentChecker.notNull(valuationTime, "valuation time"); ArgumentChecker.notNull(curveDefinitionSource, "curveDefinitionSource"); ArgumentChecker.notNull(curveSpecificationBuilder, "curveSpecificationBuilder"); ArgumentChecker.notNull(curveDate, "curve date"); ArgumentChecker.notNull(curveName, "curve name"); final CurveDefinition curveDefinition = curveDefinitionSource.getCurveDefinition(curveName); if (curveDefinition == null) { throw new OpenGammaRuntimeException("Could not get curve definition called " + curveName); } return curveSpecificationBuilder.buildCurve(valuationTime, curveDate, curveDefinition); } /** * Builds a {@link CurveSpecification} from a curve definition that is valid at a particular time. This method handles only {@link CurveDefinition} and {@link InterpolatedCurveDefinition}. * * @param valuationTime The valuation time, not null * @param curveDefinitionSource The curve definition source, not null * @param curveSpecificationBuilder The curve specification builder, not null * @param curveDate The curve date, not null * @param curveName The curve name, not null * @return The curve specification * @throws OpenGammaRuntimeException if the curve definition is not found. */ public static AbstractCurveSpecification getSpecification(final Instant valuationTime, final CurveDefinitionSource curveDefinitionSource, final CurveSpecificationBuilder curveSpecificationBuilder, final LocalDate curveDate, final String curveName) { ArgumentChecker.notNull(valuationTime, "valuation time"); ArgumentChecker.notNull(curveDefinitionSource, "curveDefinitionSource"); ArgumentChecker.notNull(curveSpecificationBuilder, "curveSpecificationBuilder"); ArgumentChecker.notNull(curveDate, "curve date"); ArgumentChecker.notNull(curveName, "curve name"); final AbstractCurveDefinition curveDefinition = curveDefinitionSource.getDefinition(curveName); if (curveDefinition == null) { throw new OpenGammaRuntimeException("Could not get curve definition called " + curveName); } return curveSpecificationBuilder.buildSpecification(valuationTime, curveDate, curveDefinition); } /** * Gets the names of all the curves that are to be constructed in this configuration. * * @param configuration The curve construction configuration, not null * @return The names of all of the curves to be constructed */ public static String[] getCurveNamesForConstructionConfiguration(final CurveConstructionConfiguration configuration) { ArgumentChecker.notNull(configuration, "configuration"); final List<String> names = new ArrayList<>(); for (final CurveGroupConfiguration group : configuration.getCurveGroups()) { for (final Map.Entry<String, List<? extends CurveTypeConfiguration>> entry : group.getTypesForCurves().entrySet()) { names.add(entry.getKey()); } } return names.toArray(new String[names.size()]); } /** * Gets the definitions for all of the curves in a configuration, including any in exogenous configurations. * * @param configuration The curve construction configuration, not null * @param curveDefinitionSource The curve definition source, not null * @param curveConstructionConfigurationSource The config source that contains information about any exogenous curve configurations, not null * @param curveNodeCurrencyVisitor The curve node currency visitor, not null * @return An ordered set of currencies for these curves * @throws OpenGammaRuntimeException if any of the definitions are not found */ public static Set<Currency> getCurrencies(final CurveConstructionConfiguration configuration, final CurveDefinitionSource curveDefinitionSource, final CurveConstructionConfigurationSource curveConstructionConfigurationSource, final CurveNodeVisitor<Set<Currency>> curveNodeCurrencyVisitor) { ArgumentChecker.notNull(configuration, "configuration"); ArgumentChecker.notNull(curveConstructionConfigurationSource, "curveConstructionConfigurationSource"); ArgumentChecker.notNull(curveNodeCurrencyVisitor, "curve node currency visitor"); final Set<Currency> currencies = new TreeSet<>(); for (final CurveGroupConfiguration group : configuration.getCurveGroups()) { for (final Map.Entry<String, List<? extends CurveTypeConfiguration>> entry : group.getTypesForCurves().entrySet()) { final String curveName = entry.getKey(); final AbstractCurveDefinition curveDefinition = curveDefinitionSource.getDefinition(curveName); if (curveDefinition == null) { throw new OpenGammaRuntimeException("Could not get curve definition called " + curveName); } if (curveDefinition instanceof InterpolatedCurveDefinition) { for (final CurveNode node : ((InterpolatedCurveDefinition) curveDefinition).getNodes()) { currencies.addAll(node.accept(curveNodeCurrencyVisitor)); } } else if (curveDefinition instanceof CurveDefinition) { for (final CurveNode node : ((InterpolatedCurveDefinition) curveDefinition).getNodes()) { currencies.addAll(node.accept(curveNodeCurrencyVisitor)); } } else { return Collections.emptySet(); } } } final List<String> exogenousConfigurations = configuration.getExogenousConfigurations(); if (exogenousConfigurations != null && !exogenousConfigurations.isEmpty()) { for (final String name : exogenousConfigurations) { final CurveConstructionConfiguration exogenousConfiguration = curveConstructionConfigurationSource.getCurveConstructionConfiguration(name); if (exogenousConfiguration == null) { throw new OpenGammaRuntimeException("Exogenous configuration called " + name + " in " + configuration.getName() + " was not present in the config master"); } currencies.addAll(getCurrencies(exogenousConfiguration, curveDefinitionSource, curveConstructionConfigurationSource, curveNodeCurrencyVisitor)); } } return currencies; } }