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); //truncate baseline to observed record for proper quantile lookup Utils.TruncateToObs(observedMonthly, ref 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); }
private static List <Point> DataToMonthly(List <Point> data) { /* if data is monthly return data, if data is daily process * data, otherwise print error message and get out of here */ if (Utils.IsDataMonthly(data)) { return(data); } else if (Utils.IsDataDaily(data)) { return(DailyToMonthly(data)); } else { Console.WriteLine("error: only monthly or daily inputs supported"); return(new List <Point> { }); } }
private static void WriteFile(List <Point> sim_new, string filename, TextFormat fmt) { //make sure directory to filename exists string outdir = Path.GetDirectoryName(Path.GetFullPath(filename)); if (!Directory.Exists(outdir)) { Directory.CreateDirectory(outdir); } //fill lines with sim new data string[] lines = new string[sim_new.Count]; for (int i = 0; i < sim_new.Count; i++) { Point pt = sim_new[i]; if (fmt == TextFormat.vic) { lines[i] = string.Format("{0} {1} {2:0.000}", pt.Date.Year, pt.Date.Month, pt.Value); if (Utils.IsDataDaily(sim_new)) { lines[i] = string.Format("{0} {1} {2} {3:0.000}", pt.Date.Year, pt.Date.Month, pt.Date.Day, pt.Value); } } if (fmt == TextFormat.csv) { lines[i] = string.Format("{0:M/d/yyyy},{1:0.000}", pt.Date, pt.Value); } } //write file File.WriteAllLines(filename, lines); }