BiasCorrectQ.Utils.AlignPeriods C# (CSharp) Method

AlignPeriods() static private method

static private AlignPeriods ( List obs, List data ) : void
obs List
data List
return void
        internal static void AlignPeriods(List<Point> obs, List<Point> data)
        {
            //align beginning of data so start dates match
            if (obs.First().Date < data.First().Date)
            {
            //truncate obs to data
            foreach (var pt in obs.ToList())
            {
                if (pt.Date < data.First().Date)
                {
                    obs.Remove(pt);
                }
                else
                {
                    break;
                }
            }
            }
            else
            {
            //truncate data to obs
            foreach (var pt in data.ToList())
            {
                if (pt.Date < obs.First().Date)
                {
                    data.Remove(pt);
                }
                else
                {
                    break;
                }
            }
            }

            //align end of data so end dates match
            if (obs.Last().Date > data.Last().Date)
            {
            //truncate obs to data
            for (int i = obs.Count - 1; i >= 0; i--)
            {
                var pt = obs[i];
                if (pt.Date > data.Last().Date)
                {
                    obs.Remove(pt);
                }
                else
                {
                    break;
                }
            }
            }
            else
            {
            //truncate data to obs
            for (int i = data.Count - 1; i >= 0; i--)
            {
                var pt = data[i];
                if (pt.Date > obs.Last().Date)
                {
                    data.Remove(pt);
                }
                else
                {
                    break;
                }
            }
            }
        }

Usage Example

Example #1
0
        internal static List <Point> DoBiasCorrection(string observedFile,
                                                      string baselineFile, string futureFile, TextFormat infmt)
        {
            //get input data
            List <Point> observed = GetInputData(observedFile, infmt);
            List <Point> baseline = GetInputData(baselineFile, infmt);
            List <Point> future   = GetInputData(futureFile, infmt);

            if (observed.Count == 0 || baseline.Count == 0 || future.Count == 0)
            {
                Console.WriteLine("error parsing input file(s)");
                return(new List <Point> {
                });
            }

            //get monthly data
            List <Point> observedMonthly = DataToMonthly(observed);
            List <Point> baselineMonthly = DataToMonthly(baseline);
            List <Point> futureMonthly   = DataToMonthly(future);

            if (observedMonthly.Count == 0 || baselineMonthly.Count == 0 ||
                futureMonthly.Count == 0)
            {
                Console.WriteLine("error parsing input file(s) to monthly");
                return(new List <Point> {
                });
            }

            //truncate inputs to water year data
            Utils.TruncateToWYs(observedMonthly);
            Utils.TruncateToWYs(baselineMonthly);
            Utils.TruncateToWYs(futureMonthly);
            Utils.TruncateToWYs(future);

            //align baseline and observed records for proper quantile lookup
            Utils.AlignPeriods(observedMonthly, baselineMonthly);

            //do monthly bias correction
            List <Point> biasedMonthly = DoMonthlyBiasCorrection(observedMonthly,
                                                                 baselineMonthly, futureMonthly);
            List <Point> biasedFinal = DoAnnualBiasCorrection(observedMonthly,
                                                              baselineMonthly, futureMonthly, biasedMonthly);

            //do daily adjustments
            if (Utils.IsDataDaily(future))
            {
                List <Point> biasedDaily = AdjDailyToMonthly(future, biasedFinal);
                AdjMonthlyBoundary(biasedDaily);
                biasedFinal = AdjDailyToMonthly(biasedDaily, biasedFinal);
            }

            return(biasedFinal);
        }