/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.fxforward;
import java.util.Map;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.financial.analytics.DoubleLabelledMatrix1D;
import com.opengamma.financial.analytics.curve.CurveDefinition;
import com.opengamma.financial.analytics.model.multicurve.MultiCurveUtils;
import com.opengamma.financial.security.fx.FXForwardSecurity;
import com.opengamma.sesame.Environment;
import com.opengamma.util.money.Currency;
import com.opengamma.util.result.FailureStatus;
import com.opengamma.util.result.Result;
public class DiscountingFXForwardYieldCurveNodeSensitivitiesFn implements FXForwardYieldCurveNodeSensitivitiesFn {
private final FXForwardCalculatorFn _fxForwardCalculatorFn;
private final CurveDefinition _curveDefinition;
public DiscountingFXForwardYieldCurveNodeSensitivitiesFn(FXForwardCalculatorFn fxForwardCalculatorFn,
CurveDefinition curveDefinition) {
_fxForwardCalculatorFn = fxForwardCalculatorFn;
_curveDefinition = curveDefinition;
}
@Override
public Result<DoubleLabelledMatrix1D> calculateYieldCurveNodeSensitivities(Environment env,
FXForwardSecurity security) {
Result<FXForwardCalculator> forwardCalculatorResult =
_fxForwardCalculatorFn.generateCalculator(env, security);
if (forwardCalculatorResult.isSuccess()) {
FXForwardCalculator fxForwardCalculator = forwardCalculatorResult.getValue();
final MultipleCurrencyParameterSensitivity sensitivities = fxForwardCalculator.generateBlockCurveSensitivities(env);
return findMatchingSensitivities(sensitivities);
} else {
return Result.failure(forwardCalculatorResult);
}
}
private Result<DoubleLabelledMatrix1D> findMatchingSensitivities(MultipleCurrencyParameterSensitivity sensitivities) {
final String curveName = _curveDefinition.getName();
final Map<Currency, DoubleMatrix1D> matches = sensitivities.getSensitivityByName(curveName);
if (matches.isEmpty()) {
return Result.failure(FailureStatus.MISSING_DATA, "No sensitivities found for curve name: {}", curveName);
} else {
final DoubleMatrix1D sensitivity = matches.values().iterator().next();
return Result.success(MultiCurveUtils.getLabelledMatrix(sensitivity, _curveDefinition));
}
}
}