protected virtual double seasonalityCorrection(double rate, Date atDate, DayCounter dc,
Date curveBaseDate, bool isZeroRate)
{
// need _two_ corrections in order to get: seasonality = factor[atDate-seasonalityBase] / factor[reference-seasonalityBase]
// i.e. for ZERO inflation rates you have the true fixing at the curve base so this factor must be normalized to one
// for YoY inflation rates your reference point is the year before
double factorAt = this.seasonalityFactor(atDate);
//Getting seasonality correction for either ZC or YoY
double f;
if (isZeroRate)
{
double factorBase = this.seasonalityFactor(curveBaseDate);
double seasonalityAt = factorAt / factorBase;
double timeFromCurveBase = dc.yearFraction(curveBaseDate, atDate);
f = Math.Pow(seasonalityAt, 1 / timeFromCurveBase);
}
else
{
double factor1Ybefore = this.seasonalityFactor(atDate - new Period(1, TimeUnit.Years));
f = factorAt / factor1Ybefore;
}
return (rate + 1) * f - 1;
}