final MulticurveProviderInterface multicurves = sabrData.getMulticurveProvider();
final double pvbpModified = METHOD_SWAP.presentValueBasisPoint(swaption.getUnderlyingSwap(), dayCountModification, multicurves);
final double forwardModified = PRDC.visitFixedCouponSwap(swaption.getUnderlyingSwap(), dayCountModification, multicurves);
final double strikeModified = METHOD_SWAP.couponEquivalent(swaption.getUnderlyingSwap(), pvbpModified, multicurves);
final double maturity = swaption.getMaturityTime();
final PresentValueSABRSensitivityDataBundle sensi = new PresentValueSABRSensitivityDataBundle();
final DoublesPair expiryMaturity = new DoublesPair(swaption.getTimeToExpiry(), maturity);
// Implementation note: option required to pass the strike (in case the swap has non-constant coupon).
final EuropeanVanillaOption option = new EuropeanVanillaOption(strikeModified, swaption.getTimeToExpiry(), swaption.isCall());
final double alpha = sabrData.getSABRParameter().getAlpha(expiryMaturity);
final double beta = sabrData.getSABRParameter().getBeta(expiryMaturity);
final double rho = sabrData.getSABRParameter().getRho(expiryMaturity);
final double nu = sabrData.getSABRParameter().getNu(expiryMaturity);
final SABRFormulaData sabrParam = new SABRFormulaData(alpha, beta, rho, nu);
final SABRExtrapolationRightFunction sabrExtrapolation = new SABRExtrapolationRightFunction(forwardModified, sabrParam, _cutOffStrike, swaption.getTimeToExpiry(), _mu);
final double[] priceDSabr = new double[4];
sabrExtrapolation.priceAdjointSABR(option, priceDSabr);
final double omega = (swaption.isLong() ? 1.0 : -1.0);
sensi.addAlpha(expiryMaturity, omega * pvbpModified * priceDSabr[0]);
sensi.addBeta(expiryMaturity, omega * pvbpModified * priceDSabr[1]);
sensi.addRho(expiryMaturity, omega * pvbpModified * priceDSabr[2]);
sensi.addNu(expiryMaturity, omega * pvbpModified * priceDSabr[3]);
return sensi;
}