OpenTemp.CalculateSeriesOffsets()

        /// <summary>
        /// Calculate the offsets for every series.
        /// </summary>
        /// <remarks>The temperature for every cell is computed using all stations that affect the cell.
        /// See Cell.DefineStations() for details.</remarks>
        /// <returns>Number of series offsets calculated if successful; -ve for error code</returns>
        protected int CalculateSeriesOffsets()
        {
            OpenTemp.WriteLine(string.Format("Calculating series offsets for every series..."));
            int nSeries = 0;
            // Loop over every series
            foreach (Station station in _stations.Values)
            {
                foreach (byte seriesNumber in station.SeriesNumbers)
                {
                    SortedList<DateTime, float?> readings = station.GetReadings(seriesNumber);

                    // Loop over every month
                    int nMonths = 0;
                    float difference = 0.0f;
                    foreach (DateTime date in readings.Keys)
                    {
                        if (!readings[date].HasValue) continue;
                        if (_monthlyAverages.ContainsKey(date))
                        {
                            difference += _monthlyAverages[date] - readings[date].Value;
                            nMonths++;
                        }
                    }

                    // Store series offset
                    if (nMonths > 0)
                    {
                        station.SetSeriesOffset(seriesNumber, difference / nMonths);
                        nSeries++;
                    }
                }
            }

            // Done
            OpenTemp.WriteLine(string.Format("  Series offsets completed for {0} series", nSeries));
            return nSeries;
        }