// Composition - publication strictly before valuation date: try accessing fixing time-series
            internal double pastCompositionFactor()
            {
                double    compositionFactor  = 1.0d;
                LocalDate currentFixing      = firstFixing;
                LocalDate currentPublication = computation.calculatePublicationFromFixing(currentFixing);

                while ((currentFixing.isBefore(lastFixingNonCutoff)) && rates.ValuationDate.isAfter(currentPublication))
                {   // publication before valuation
                    LocalDate effectiveDate = computation.calculateEffectiveFromFixing(currentFixing);
                    LocalDate maturityDate  = computation.calculateMaturityFromEffective(effectiveDate);
                    double    accrualFactor = dayCount.yearFraction(effectiveDate, maturityDate);
                    compositionFactor *= 1.0d + accrualFactor * checkedFixing(currentFixing, indexFixingDateSeries, computation.Index);
                    currentFixing      = computation.FixingCalendar.next(currentFixing);
                    currentPublication = computation.calculatePublicationFromFixing(currentFixing);
                }
                if (currentFixing.Equals(lastFixingNonCutoff) && rates.ValuationDate.isAfter(currentPublication))
                {   // publication before valuation
                    double    rate          = checkedFixing(currentFixing, indexFixingDateSeries, computation.Index);
                    LocalDate effectiveDate = computation.calculateEffectiveFromFixing(currentFixing);
                    LocalDate maturityDate  = computation.calculateMaturityFromEffective(effectiveDate);
                    double    accrualFactor = dayCount.yearFraction(effectiveDate, maturityDate);
                    compositionFactor *= 1.0d + accrualFactor * rate;
                    for (int i = 0; i < cutoffOffset - 1; i++)
                    {
                        compositionFactor *= 1.0d + accrualFactorCutoff[i] * rate;
                    }
                    currentFixing = computation.FixingCalendar.next(currentFixing);
                }
                nextFixing = currentFixing;
                return(compositionFactor);
            }
            internal LocalDate nextFixing;                   // Running variable through the different methods: next fixing date to be analyzed

            internal ObservationDetails(OvernightCompoundedRateComputation computation, OvernightIndexRates rates)
            {
                this.computation           = computation;
                this.rates                 = rates;
                this.indexFixingDateSeries = rates.Fixings;
                this.dayCount              = computation.Index.DayCount;
                // Details of the cutoff period
                this.firstFixing         = computation.StartDate;
                this.lastFixingP1        = computation.EndDate;
                this.lastFixing          = computation.FixingCalendar.previous(lastFixingP1);
                this.cutoffOffset        = Math.Max(computation.RateCutOffDays, 1);
                this.accrualFactorCutoff = new double[cutoffOffset - 1];
                LocalDate currentFixing = lastFixing;

                for (int i = 0; i < cutoffOffset - 1; i++)
                {
                    currentFixing = computation.FixingCalendar.previous(currentFixing);
                    LocalDate effectiveDate = computation.calculateEffectiveFromFixing(currentFixing);
                    LocalDate maturityDate  = computation.calculateMaturityFromEffective(effectiveDate);
                    accrualFactorCutoff[i] = dayCount.yearFraction(effectiveDate, maturityDate);
                }
                this.lastFixingNonCutoff = currentFixing;
                LocalDate startUnderlyingPeriod = computation.calculateEffectiveFromFixing(firstFixing);
                LocalDate endUnderlyingPeriod   = computation.calculateMaturityFromFixing(lastFixing);

                this.accrualFactorTotal = dayCount.yearFraction(startUnderlyingPeriod, endUnderlyingPeriod);
            }