final MultiCurveCalculationConfig curveCalculationConfig = (MultiCurveCalculationConfig) curveCalculationConfigObject;
final Object curveSensitivitiesObject = inputs.getValue(ValueRequirementNames.FX_CURVE_SENSITIVITIES);
if (curveSensitivitiesObject == null) {
throw new OpenGammaRuntimeException("Could not get curve sensitivities");
}
final MultipleCurrencyInterestRateCurveSensitivity curveSensitivities = (MultipleCurrencyInterestRateCurveSensitivity) curveSensitivitiesObject;
final Currency payCurrency = security.accept(ForexVisitors.getPayCurrencyVisitor());
final Currency receiveCurrency = security.accept(ForexVisitors.getReceiveCurrencyVisitor());
final String fullCurveName = curveName + "_" + curveCurrency;
if (curveCalculationConfig.getCalculationMethod().equals(FXImpliedYieldCurveFunction.FX_IMPLIED)) {
final ConfigSource configSource = OpenGammaExecutionContext.getConfigSource(executionContext);
final ConfigDBFXForwardCurveDefinitionSource definitionSource = new ConfigDBFXForwardCurveDefinitionSource(configSource);
final UnorderedCurrencyPair currencyPair = UnorderedCurrencyPair.of(payCurrency, receiveCurrency);
final FXForwardCurveDefinition definition = definitionSource.getDefinition(curveName, currencyPair.toString());
if (definition == null) {
throw new OpenGammaRuntimeException("Could not get FX forward curve definition called " + curveName + " for currency pair " + currencyPair);
}
final Tenor[] tenors = definition.getTenors();
final YieldCurveBundle interpolatedCurveForCurrency = new YieldCurveBundle();
interpolatedCurveForCurrency.setCurve(fullCurveName, data.getCurve(fullCurveName));
final Map<String, List<DoublesPair>> sensitivitiesForCurrency = curveSensitivities.getSensitivity(Currency.of(curveCurrency)).getSensitivities();
return getFXImpliedSensitivities(inputs, tenors, interpolatedCurveForCurrency, sensitivitiesForCurrency, spec);
}
String otherCurveCurrency, otherCurveName;
if (curveCurrency.equals(payCurrency.getCode())) {
otherCurveCurrency = receiveCurrency.getCode();
otherCurveName = desiredValue.getConstraint(ValuePropertyNames.RECEIVE_CURVE);
} else {
otherCurveCurrency = payCurrency.getCode();
otherCurveName = desiredValue.getConstraint(ValuePropertyNames.PAY_CURVE);
}
final YieldCurveBundle interpolatedCurveForCurrency = new YieldCurveBundle();
final String fullOtherCurveName = otherCurveName + "_" + otherCurveCurrency;
interpolatedCurveForCurrency.setCurve(fullOtherCurveName, data.getCurve(fullOtherCurveName));
final Object curveSpecObject = inputs.getValue(ValueRequirementNames.YIELD_CURVE_SPEC);
if (curveSpecObject == null) {
throw new OpenGammaRuntimeException("Could not get interpolated yield curve specification for " + fullCurveName);
}
final InterpolatedYieldCurveSpecificationWithSecurities curveSpec = (InterpolatedYieldCurveSpecificationWithSecurities) curveSpecObject;
final Map<String, List<DoublesPair>> sensitivitiesForCurrency = curveSensitivities.getSensitivity(Currency.of(otherCurveCurrency)).getSensitivities();
final ValueSpecification adjustedSpec = new ValueSpecification(spec.getValueName(), spec.getTargetSpecification(), desiredValue.getConstraints().copy().get());
return getExogenousSensitivities(inputs, curveSpec, interpolatedCurveForCurrency, sensitivitiesForCurrency, adjustedSpec);
}