/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.pnl;
import static com.opengamma.engine.value.ValuePropertyNames.CURRENCY;
import static com.opengamma.engine.value.ValuePropertyNames.SAMPLING_FUNCTION;
import static com.opengamma.engine.value.ValuePropertyNames.SAMPLING_PERIOD;
import static com.opengamma.engine.value.ValuePropertyNames.SCHEDULE_CALCULATOR;
import java.util.HashSet;
import java.util.Set;
import com.opengamma.core.position.Position;
import com.opengamma.core.security.Security;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.financial.OpenGammaCompilationContext;
import com.opengamma.financial.analytics.model.credit.CreditSecurityToIdentifierVisitor;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityUtils;
import com.opengamma.financial.security.cds.CreditDefaultSwapIndexSecurity;
/**
*
*/
public class CreditDefaultSwapIndexCS01PnLFunction extends CreditInstrumentCS01PnLFunction {
@Override
public boolean canApplyTo(final FunctionCompilationContext context, final ComputationTarget target) {
final Security security = target.getPosition().getSecurity();
return security instanceof CreditDefaultSwapIndexSecurity;
}
@Override
public Set<ValueRequirement> getRequirements(final FunctionCompilationContext context, final ComputationTarget target, final ValueRequirement desiredValue) {
final Position position = target.getPosition();
final FinancialSecurity security = (FinancialSecurity) position.getSecurity();
final String currency = FinancialSecurityUtils.getCurrency(security).getCode();
final ValueProperties constraints = desiredValue.getConstraints();
final Set<String> periodNames = constraints.getValues(SAMPLING_PERIOD);
if (periodNames == null || periodNames.size() != 1) {
return null;
}
final String samplingPeriod = periodNames.iterator().next();
final Set<String> scheduleNames = constraints.getValues(SCHEDULE_CALCULATOR);
if (scheduleNames == null || scheduleNames.size() != 1) {
return null;
}
final Set<String> samplingFunctionNames = constraints.getValues(SAMPLING_FUNCTION);
if (samplingFunctionNames == null || samplingFunctionNames.size() != 1) {
return null;
}
final CreditSecurityToIdentifierVisitor identifierVisitor = new CreditSecurityToIdentifierVisitor(OpenGammaCompilationContext.getSecuritySource(context));
final String spreadCurveName = security.accept(identifierVisitor).getUniqueId().getValue();
final Set<ValueRequirement> requirements = new HashSet<>();
requirements.add(getBucketedCS01Requirement(security));
requirements.add(getCreditSpreadCurveHTSRequirement(security, getCurvePrefix() + "_" + spreadCurveName, samplingPeriod));
final Set<String> resultCurrencies = constraints.getValues(CURRENCY);
if (resultCurrencies != null && resultCurrencies.size() == 1) {
final ValueRequirement ccyConversionTSRequirement = getCurrencyConversionTSRequirement(position, currency, resultCurrencies);
if (ccyConversionTSRequirement != null) {
requirements.add(ccyConversionTSRequirement);
requirements.add(new ValueRequirement(ValueRequirementNames.CURRENCY_PAIRS, ComputationTargetSpecification.NULL));
}
}
return requirements;
}
@Override
protected String getCurvePrefix() {
return "CDS_INDEX";
}
}