public void ImportDecodesAndProcessWithFlagLimits() { Logger.EnableLogger(); FileUtility.CleanTempPath(); var fn1 = FileUtility.GetTempFileName(".pdb"); Console.WriteLine(fn1); var svr = new SQLiteServer(fn1); var db = new TimeSeriesDatabase(svr, Reclamation.TimeSeries.Parser.LookupOption.TableName,false); var tmpDir = CopyTestDecodesFileToTempDirectory("decodes_lapo.txt"); var rtlapo = CreateTempRatingTable("lapo.csv", new double[] {3.50,3.54,3.55,5.54 }, new double[] {1,2,3,10 }); // set limits gh: low=3.53, high 3.6, rate of change/hour 1 Quality q = new Quality(db); q.SaveLimits("instant_lapo_gh", 3.6, 3.53, 1.0); q.SaveLimits("instant_lapo_q", 5, 1.1, 0); var site = db.GetSiteCatalog(); site.AddsitecatalogRow("lapo", "", "OR"); db.Server.SaveTable(site); var c = new CalculationSeries("instant_lapo_q"); c.SiteID = "lapo"; c.Expression = "FileRatingTable(%site%_gh,\""+rtlapo+"\")"; db.AddSeries(c); //SeriesExpressionParser.Debug = true; FileImporter import = new FileImporter(db); import.Import(tmpDir,RouteOptions.None,computeDependencies:true,searchPattern:"*.txt"); db.Inventory(); var s = db.GetSeriesFromTableName("instant_lapo_gh"); var expectedFlags = new string[] { "", "", "", "+", "", "", "", "-" }; for (int i = 0; i < s.Count; i++) { Assert.AreEqual(expectedFlags[i], s[i].Flag, " flag not expected "); } s = db.GetSeriesFromTableName("instant_lapo_q"); s.Read(); Assert.IsTrue(s.Count > 0, "No flow data computed lapo"); s.WriteToConsole(true); // computed flows should be: 2 2 2 10 2 2 1 expectedFlags = new string[]{"","","","+","","","","-"}; //q>=1 and q<= 5 for (int i = 0; i < s.Count; i++) { Assert.AreEqual(expectedFlags[i], s[i].Flag.Trim()," Flag check on Flow (Q) "); } SeriesExpressionParser.Debug = false; }
public void Interpolate2DWithDatabase() { Logger.EnableLogger(); var fn = FileUtility.GetTempFileName(".pdb"); File.Delete(fn); SQLiteServer svr = new SQLiteServer(fn); var db = new TimeSeriesDatabase(svr,false ); var c = new CalculationSeries("rir_q"); var path = Path.Combine(TestData.DataPath, "rating_tables"); path = Path.Combine(path, "rir_q.txt"); c.Expression = "FileLookupInterpolate2D(rir_fb, rir_ra, \"" + path + "\")" + " + FileLookupInterpolate2D(rir_fb, rir_rb, \"" + path + "\")"; c.TimeInterval = TimeInterval.Irregular; db.AddSeries(c); var fb = new Series("rir_fb"); fb.TimeInterval = TimeInterval.Irregular; db.AddSeries(fb); fb.Add("6-1-2011", 5110.99); fb.Add("6-2-2011", 5111.31); fb.Add("6-3-2011", 5111.71); fb.Add("6-4-2011", 5112.09); var ra = new Series("rir_ra"); ra.TimeInterval = TimeInterval.Irregular; ra.Add("6-1-2011", 2.1); ra.Add("6-2-2011", 1.29); ra.Add("6-3-2011", 1.29); ra.Add("6-4-2011", 1.29); db.AddSeries(ra); var rb = new Series("rir_rb"); rb.TimeInterval = TimeInterval.Irregular; rb.Add("6-1-2011", 2.1); rb.Add("6-2-2011", 1.28); rb.Add("6-3-2011", 1.28); rb.Add("6-4-2011", 1.28); db.AddSeries(rb); TimeSeriesImporter ti = new TimeSeriesImporter(db); ti.Import(fb, computeDependencies: true);// this should force a calculation... var q = db.GetSeriesFromTableName("rir_q"); Assert.NotNull(q, "Series not created"); q.Read(); /* * Flows from Hydromet * 6-1-2011, 1009.87 * 6-2-2011, 602.24 * 6-3-2011, 603.32 * 6-4-2011, 604.34 */ Assert.AreEqual(4, q.Count); Assert.AreEqual(1009.87, System.Math.Round(q[0].Value, 2)); Assert.AreEqual(603.32, System.Math.Round(q[2].Value, 2)); }
public void ImportDecodesWithMissingGageHeight() { FileUtility.CleanTempPath(); var fn1 = FileUtility.GetTempFileName(".pdb"); Console.WriteLine(fn1); var svr = new SQLiteServer(fn1); var db = new TimeSeriesDatabase(svr, Reclamation.TimeSeries.Parser.LookupOption.TableName,false); Logger.EnableLogger(); var tmpDir = CopyTestDecodesFileToTempDirectory("decodes_mabo_missing_gh.txt"); var ratingTableFileName =CreateTempRatingTable("mabo.csv", 2.37, 2.8, x => (x*10)); var c = new CalculationSeries("instant_mabo_q"); c.Expression = "FileRatingTable(mabo_gh,\""+ratingTableFileName+"\")"; db.AddSeries(c); FileImporter import = new FileImporter(db); import.Import(tmpDir, RouteOptions.Outgoing, computeDependencies: true,searchPattern:"*.txt"); db.Inventory(); var s = db.GetSeriesFromTableName("instant_mabo_q"); s.Read(); Assert.IsTrue(s.CountMissing() == 0); Assert.IsTrue(s.Count > 0, "No flow data computed"); }
private static void SaveTableToSeries(TimeSeriesDatabase db, DataTable table, TimeInterval interval) { int i = 1; string tablePrefix="daily"; if (interval == TimeInterval.Irregular) tablePrefix = "instant"; if (interval == TimeInterval.Monthly) tablePrefix = "monthly"; while( i < table.Columns.Count ) { string tn = table.Columns[i].ColumnName.Trim().ToLower(); tn = tn.Replace(" ", "_"); TimeSeriesName tsn = new TimeSeriesName(tn,interval.ToString().ToLower()); var series1 = db.GetSeriesFromTableName(tn, tablePrefix); Console.Write(tn+ " "); for (int r = 0; r < table.Rows.Count; r++) { var row = table.Rows[r]; object o = row[i]; double val = Point.MissingValueFlag; if (o != DBNull.Value) val = Convert.ToDouble(row[i]); else { continue; // mixing 5 and 15-minute data can cause gaps } string flag = "hmet-import"; if (interval == TimeInterval.Irregular|| interval == TimeInterval.Monthly) flag = row[i + 1].ToString(); DateTime t = Convert.ToDateTime(row[0]); if (interval == TimeInterval.Monthly) { //if( tsn.pcode.ToLower() == "fc" || tsn.pcode.ToLower() == "se" || tsn.pcode.ToLower() == "fcm") t = t.FirstOfMonth(); //if (val != Point.MissingValueFlag && HydrometMonthlySeries.LookupUnits(tsn.pcode) == "1000 acre-feet") // val = val * 1000; } var pt = new Point(t, val, flag); series1.Add(pt); } if (interval == TimeInterval.Irregular || interval == TimeInterval.Monthly) { i += 2;// flag column } else { i++; } int rc = series1.Count; if( rc>0) rc = db.SaveTimeSeriesTable(series1.ID, series1, DatabaseSaveOptions.UpdateExisting); Console.WriteLine(rc + " records saved "+POR(series1.Table)); } }
public void ReservoirContentsWithDatabase() { Logger.EnableLogger(); var fn = FileUtility.GetTempFileName(".pdb"); System.IO.File.Delete(fn); SQLiteServer svr = new SQLiteServer(fn); var db = new TimeSeriesDatabase(svr, Reclamation.TimeSeries.Parser.LookupOption.TableName,false); var c = new CalculationSeries("instant_karl_af"); var path = Path.Combine(Globals.TestDataPath, "rating_tables"); path = Path.Combine(path, "karl_af.txt"); c.Expression = "FileRatingTable(instant_karl_fb,\""+path+"\")"; c.TimeInterval = TimeInterval.Irregular; db.AddSeries(c); var fb = new Series("instant_karl_fb"); fb.TimeInterval = TimeInterval.Irregular; db.AddSeries(fb); fb.Add("1-1-2013", 1); fb.Add("1-2-2013", 2); fb.Add("1-3-2013", 3); fb.Add("1-4-2013", 4); TimeSeriesImporter ti = new TimeSeriesImporter(db); ti.Import(fb,computeDependencies:true);// this should force a calculation... var af = db.GetSeriesFromTableName("instant_karl_af"); Assert.NotNull(af, "Series not created"); af.Read(); Assert.AreEqual(4, af.Count); Assert.AreEqual(300, af[2].Value); }