public void AddBug() { DateTime t1 = new DateTime(2013, 1, 1); var t2 = t1.AddDays(365); var fn = FileUtility.GetTempFileNameInDirectory(@"c:\temp\", ".pdb"); SQLiteServer svr = new SQLiteServer(fn); TimeSeriesDatabase db = new Reclamation.TimeSeries.TimeSeriesDatabase(svr); var s = new HydrometDailySeries("pal", "af"); s.Name = "pal_af"; s.Read(t1, t2); db.AddSeries(s); var cs = new CalculationSeries("add_test"); cs.Expression = "pal_af + pal_af"; db.AddSeries(cs); cs = db.GetSeriesFromName("add_test") as CalculationSeries; cs.Calculate(t1, t2); cs = db.GetSeriesFromName("add_test") as CalculationSeries; cs.Read(); Assert.IsTrue(cs.Count > 0); }
public void UofIDisaggregation() { SQLiteServer pDB = new SQLiteServer(path); TimeSeriesDatabase DB = new TimeSeriesDatabase(pDB); // Reads input data required by the calculation Series daily = DB.GetSeriesFromName("SS_Day_Mean"); daily.Read();// Source Station Daily data Series monthly = DB.GetSeriesFromName("TS_Mon_Mean"); monthly.Read();// Target Station Monthly data Series known = DB.GetSeriesFromName("C#Disaggregated"); known.Read(t1, t2); Series infilled = Reclamation.TimeSeries.Math.RMSEInterp(daily, monthly); var s = infilled.Subset(t1, t2); s.TimeInterval = TimeInterval.Daily; var diff = Math.Sum(known - s); Assert.IsTrue(System.Math.Abs(diff) < 0.01, "Error"); }
private void ReadFromPisces() { Logger.WriteLine("opening " + m_dbName); SQLiteServer svr = new SQLiteServer(m_dbName); TimeSeriesDatabase db = new TimeSeriesDatabase(svr); SeriesList list = new SeriesList(); for (int i = 0; i < m_seriesName.Count; i++) { Logger.WriteLine("looking for series '" + m_seriesName[i] + "'"); var s = db.GetSeriesFromName(m_seriesName[i]); if (s != null) { s.Read(m_t1, m_t2); list.Add(s); } else { throw new Exception("unable to find series '" + m_seriesName[i] + "' in pisces database '" + m_dbName + "'"); } } WriteToRiverwareFiles(list); }
private void addPiscesDatabase_Click(object sender, EventArgs e) { try { Cursor = Cursors.WaitCursor; Performance p = new Performance(); OpenFileDialog fd = new OpenFileDialog(); fd.DefaultExt = "*.pdb"; fd.Filter = "Pisces database (*.pdb)|*.pdb"; if (fd.ShowDialog() == DialogResult.OK) { SQLiteServer svr = new SQLiteServer(fd.FileName); TimeSeriesDatabase db = new TimeSeriesDatabase(svr, false); DB.InsertDatabase(CurrentFolder, db); DatabaseChanged(); } UserPreference.Save("fileName", fd.FileName); p.Report("done reading " + fd.FileName); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { Cursor = Cursors.Default; } }
public void TestSQLite() { var fn = FileUtility.GetTempFileName(".pdb"); SQLiteServer svr = new SQLiteServer(fn); var db = new TimeSeriesDatabase(svr, false); var sql = "insert into quality_limit values ('*_OB',120,-50,null); "; svr.RunSqlCommand(sql); var s = new Series(); s.Table.TableName = "karl_ob"; s.Add("1-1-2013", 100); s.Add("1-2-2013", -51); s.Add("1-3-2013", 100); s.Add("1-4-2013", 150); //db.TimeSeriesImporter.Process(s); TimeSeriesImporter ti = new TimeSeriesImporter(db); ti.Import(s); //db.ImportSeriesUsingTableName(s, true, setQualityFlags: true); s = db.GetSeriesFromTableName("karl_ob"); s.Read(); Console.WriteLine("has flags = " + s.HasFlags); s.WriteToConsole(true); Assert.AreEqual("", s["1-1-2013"].Flag); Assert.AreEqual("-", s["1-2-2013"].Flag); Assert.AreEqual("", s["1-3-2013"].Flag); Assert.AreEqual("+", s["1-4-2013"].Flag); }
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); 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"); }
public void SiteInfoDesignTest() { var fn = FileUtility.GetTempFileName(".pdb"); SQLiteServer svr = new SQLiteServer(fn); var db = new TimeSeriesDatabase(svr, false); var siteCatalog = db.GetSiteCatalog(); siteCatalog.AddsitecatalogRow("BOII", "Boise station", "ID"); svr.SaveTable(siteCatalog); var sc = db.GetSeriesCatalog(); var s = new Series(); s.SiteID = "BOII"; sc.AddSeriesCatalogRow(s, sc.NextID(), db.GetRootObjects()[0].ID); sc.Save(); var si = db.SiteInfo("BOII"); bool idaho = si.state == "ID"; //idaho var timezone = si.timezone; TimeSeriesDatabaseDataSet.SeriesCatalogDataTable d = si.SeriesList(); TimeSeriesDatabaseDataSet.SeriesCatalogRow row = d[0]; row.Parameter = "Asce ET #5"; d.Save(); Console.WriteLine(si.SeriesList()[0].Parameter); //var goodStats = (si.Parameters()[0].statistic == "Avg"); }
public TestAlarms() { var fn = FileUtility.GetTempFileName(".pdb"); this.svr = new SQLiteServer(fn); this.db = new TimeSeriesDatabase(svr); }
public TestDeleteDatabaseProperties() { string path; if (LinuxUtility.IsLinux()) { path = "/tmp"; } else { path = "C:\\Temp\\"; } string fn = Path.Combine(path, "factory.pdb"); FileUtility.GetTempFileNameInDirectory(path, ".pdb"); SQLiteServer.CreateNewDatabase(fn); SQLiteServer svr = new SQLiteServer(fn); db = new TimeSeriesDatabase(svr, false); string dataPath = TestData.DataPath; Series s = new Series("Glomma River"); db.AddSeries(s); s = db.GetSeriesFromName("Glomma River"); s.TimeSeriesDatabase = db; s.Properties.Set("elevation", " 690 m"); s.Properties.Save(); }
public void TestRMSEMassBalance() { SQLiteServer pDB = new SQLiteServer(path); TimeSeriesDatabase DB = new TimeSeriesDatabase(pDB); // Reads input data required by the calculation Series daily = DB.GetSeriesFromName("CHEI_QD"); Series monthly = DB.GetSeriesFromName("CHEI_QM"); daily.Read(); monthly.Read(); // disaggregated daily summed to monthly acre-feet Series infilled = Math.RMSEInterp(daily, monthly); Series infilledMonthlySumAcreFeet = Math.MonthlySum(infilled) * 1.98347; infilledMonthlySumAcreFeet.TimeInterval = TimeInterval.Monthly; // get equal time period for infilled data to original monthly data Series s = infilledMonthlySumAcreFeet.Subset(monthly.MinDateTime, monthly.MaxDateTime); var diff = System.Math.Abs(Math.Sum(monthly - s)); Assert.IsTrue(diff < 0.01, "UofI RMSEInterp mass balance failed by: " + diff); }
public void UofIInterpolation() { SQLiteServer pDB = new SQLiteServer(path); TimeSeriesDatabase DB = new TimeSeriesDatabase(pDB); // Reads input data required by the calculation Series daily = DB.GetSeriesFromName("SS_Day_Mean"); Series monthly = DB.GetSeriesFromName("TS_Mon_Mean"); Series known = DB.GetSeriesFromName("C#Disaggregated-Interpolated"); daily.Read(); monthly.Read(); known.Read(t1, t2); Series infilled = Math.UofIStreamflowDisaggregation(daily, monthly); var s = infilled.Subset(t1, t2); double diff = 0.0; for (int i = 0; i < known.Count; i++) { diff += (known[i].Value - s[i].Value); } Assert.AreEqual(0.00, diff, 0.01); }
public void ManageSeriesCatalogDirectly() { Logger.EnableLogger(); var filename = @"c:\temp\test.pdb"; if (File.Exists(filename)) { File.Delete(filename); } Console.WriteLine(filename); var server = new SQLiteServer(filename); var db = new TimeSeriesDatabase(server, false); var seriesCatalog = db.GetSeriesCatalog(); var siteCatalog = db.GetSiteCatalog(); // create a folder for each month for (int i = 1; i <= 12; i++) { var t = new DateTime(2015, i, 1); seriesCatalog.GetOrCreateFolder("Months", t.ToString("MMMM")); } // Add USGS series (Boise River) to the January Folder Series s = new UsgsDailyValueSeries("13206000", UsgsDailyParameter.DailyMeanDischarge); s.SiteID = "usgs_13206000"; var januaryIndex = seriesCatalog.GetOrCreateFolder("Months", "January"); seriesCatalog.AddSeriesCatalogRow(s, seriesCatalog.NextID(), januaryIndex, "usgs_boiseriver_flow"); // Add Hydromet series to the February Folder s = new HydrometDailySeries("bhr", "af", HydrometHost.GreatPlains); s.Name = "gphyd_bhr_af"; s.SiteID = "gphyd_bhr"; var feb = seriesCatalog.GetOrCreateFolder("Months", "February"); seriesCatalog.AddSeriesCatalogRow(s, seriesCatalog.NextID(), feb, "usgs_boiseriver_flow"); // Add Site information siteCatalog.AddsitecatalogRow("usgs_13206000", "BOISE RIVER AT GLENWOOD BRIDGE NR BOISE ID", "ID"); siteCatalog.AddsitecatalogRow("gphyd_bhr", "Big Horn Reservoir", "MT"); server.SaveTable(seriesCatalog); s = db.GetSeriesFromName("gphyd_bhr_af"); s.Read(); Console.WriteLine(s.Count); // Add CSV file db.Inventory(); }
public TestParserWithDatabase() { _fn = FileUtility.GetTempFileName(".pdb"); SQLiteServer.CreateNewDatabase(_fn); _svr = new SQLiteServer(_fn); _db = new TimeSeriesDatabase(_svr, false); }
private static TimeSeriesDatabase DB() { var cs = "Data Source=" + FileName + ";Read Only=True;"; SQLiteServer svr = new SQLiteServer(FileName); TimeSeriesDatabase db = new TimeSeriesDatabase(svr); return(db); }
static SQLiteServer GetServer(string filename) { string connectionString = "Data Source=" + filename + ";Synchronous=Off;Pooling=True;Journal Mode=Off"; SQLiteServer server = new SQLiteServer(connectionString); server.CloseAllConnections(); return(server); }
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); 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 TestParserWithDatabase() { string fn = FileUtility.GetTempFileName(".pdb"); SQLiteServer.CreateNewDatabase(fn); var svr = new SQLiteServer(fn); db = new TimeSeriesDatabase(svr, false); }
public void AddSeriesDirectly() { Logger.EnableLogger(); var filename = FileUtility.GetTempFileNameInDirectory(@"c:\temp\", ".pdb"); if (File.Exists(filename)) { File.Delete(filename); } Console.WriteLine(filename); var server = new SQLiteServer(filename); var db = new TimeSeriesDatabase(server); // create a folder for each month for (int i = 1; i <= 12; i++) { var t = new DateTime(2015, i, 1); db.AddFolder("Months", t.ToString("MMMM")); } // Add USGS series (Boise River) to the January Folder Series s = new UsgsDailyValueSeries("13206000", UsgsDailyParameter.DailyMeanDischarge); s.SiteID = "13206000"; var folder = db.GetOrCreateFolder("Months", "January"); s.Read(DateTime.Parse("2015-01-01"), DateTime.Parse("2015-01-10")); db.AddSeries(s, folder); // Add Hydromet series to the February Folder s = new HydrometDailySeries("bhr", "af", HydrometHost.GreatPlains); s.Name = "gphyd_bhr_af"; s.SiteID = "gphyd_bhr"; var feb = db.GetOrCreateFolder("Months", "February"); db.AddSeries(s, feb); // Add Csv file data to March Folder. s = new TextSeries(@"c:\temp\test_river.csv"); s.Read();// read data. Use Read(t1,t2) to limit by dates s.SiteID = "test"; s.Units = "cfs"; s.Table.TableName = "test_river"; // table name needs to be unique db.AddSeries(s, db.GetOrCreateFolder("Months", "March")); s = db.GetSeriesFromName("gphyd_bhr_af"); s.Read(); Console.WriteLine(s.Count); // Add CSV file db.Inventory(); }
public TestMidnightCalculation() { FileUtility.CleanTempPath(); string fn = FileUtility.GetTempFileName(".pdb"); Console.WriteLine(fn); var svr = new SQLiteServer(fn); db = new TimeSeriesDatabase(svr, Reclamation.TimeSeries.Parser.LookupOption.TableName, false); }
public TestImportInstantDependency() { // FileUtility.CleanTempPath(); string fn = FileUtility.GetTempFileName(".pdbaga"); Console.WriteLine(fn); var svr = new SQLiteServer(fn); db = new TimeSeriesDatabase(svr, Reclamation.TimeSeries.Parser.LookupOption.TableName, false); }
private static TimeSeriesDatabase GetNewDatabase() { var fn = FileUtility.GetSimpleTempFileName(".pdb"); var svr = new SQLiteServer(fn); var db = new TimeSeriesDatabase(svr); Logger.EnableLogger(); Console.WriteLine("Created Database: " + fn); return(db); }
public void Draw() { var f = @"C:\Users\KTarbet\Documents\project\Pisces\PiscesTestData\data\rating_tables\yak.pdb"; var svr = new SQLiteServer(f); var db = new TimeSeriesDatabase(svr); var m = db.Hydrography.GetMeasurements("YRWW"); ratingTableZedGraph1.Draw(m.ToArray()); }
/// <summary> /// 获得数据列表 /// </summary> public bool Del(int id) { StringBuilder sql = new StringBuilder(); sql.Append("delete from Dat_Info where id = @id "); SQLiteServer server = new SQLiteServer(); SQLiteParameter[] parameters = { new SQLiteParameter("@Id", DbType.Int32, 4) }; parameters[0].Value = id; return(server.ExecuteNonQuery(sql.ToString(), parameters) > 0); }
public TestRecursive() { string fn = FileUtility.GetTempFileName(".pdb"); Console.WriteLine(fn); var svr = new SQLiteServer(fn); db = new TimeSeriesDatabase(svr, Reclamation.TimeSeries.Parser.LookupOption.TableName, false); dir = FileUtility.GetTempPath(); CreateInputFiles(); }
public void TestSQLite() { var fn = FileUtility.GetTempFileName(".pdb"); System.IO.File.Delete(fn); SQLiteServer svr = new SQLiteServer(fn); var db = new TimeSeriesDatabase(svr, false); BasicDatabaseTest(db); }
/// <summary> /// 获得数据列表 /// </summary> public DataTable GetAllType() { StringBuilder sql = new StringBuilder(); sql.Append("select TypeId,Name Type "); sql.Append(" FROM Dat_Type order by Name"); SQLiteParameter[] parameters = {}; SQLiteServer server = new SQLiteServer(); return(server.ExecuteQuery(sql.ToString(), parameters)); }
public static void CreatePiscesTree(string filename, PiscesFolder CurrentFolder, TimeSeries.TimeSeriesDatabase db) { var sqlite = new SQLiteServer(filename); /*insert into seriescatalog (id,parentid,name,isfolder) values (1,1,"database name",1); * insert into seriescatalog (id,parentid,name,units,tablename) * */ Logger.WriteLine("reading " + filename, "ui"); var variables = sqlite.Table("variables", "select a.var_name,b.value AS units from variables a " + "left join attributes b on a.var_name = b.var_name and b.attribute_name = 'units' order by a.var_name DESC"); Logger.WriteLine("variable count = " + variables.Rows.Count, "ui"); var sc = db.GetSeriesCatalog(); string rootFolderName = Path.GetFileNameWithoutExtension(filename); var rootID = sc.AddFolder(rootFolderName); var prev_FolderName = rootFolderName; int folderID = rootID; int id = sc.NextID(); var cs = ConnectionStringUtility.MakeFileNameRelative("FileName=" + filename + ";", db.DataSource); foreach (DataRow row in variables.Rows) { var var_name = row["var_name"].ToString(); if (var_name.IndexOf("_") > 0) { var tokens = var_name.Split('_'); if (tokens[0] != prev_FolderName) { folderID = sc.AddFolder(tokens[0], rootID); id++; prev_FolderName = tokens[0]; } } var newRow = sc.NewSeriesCatalogRow(); newRow.id = id++; newRow.ParentID = folderID; newRow.Provider = "SQLiteSeries"; newRow.ConnectionString = cs; newRow.IsFolder = false; newRow.TableName = var_name; newRow.Units = row["units"].ToString(); newRow.Name = var_name; newRow.Parameter = row["var_name"].ToString(); sc.AddSeriesCatalogRow(newRow); } db.Server.SaveTable(sc); }
/// <summary> /// Organizing VIC climate unregulated data from one large VIC Pisces database /// into 20 Monthly MODSIM compatible *.PDB. /// </summary> /// <param name="args"></param> static void Main(string[] args) { if (args.Length != 2) { PrintUsage(); return; } var fileNamePdb = args[0]; if (!File.Exists(fileNamePdb) || !fileNamePdb.EndsWith(".pdb")) { PrintUsage(); return; } var fileNameExcel = args[1]; if (!File.Exists(fileNameExcel) || (!fileNameExcel.EndsWith(".xls") && !fileNameExcel.EndsWith(".xlsx"))) { PrintUsage(); return; } //inputs should be good, get to work SQLiteServer svrVic = new SQLiteServer(fileNamePdb); Console.WriteLine("opening " + fileNamePdb); TimeSeriesDatabase dbVic = new TimeSeriesDatabase(svrVic); var xls = new NpoiExcel(fileNameExcel); Console.WriteLine("reading " + fileNameExcel); var correlation = xls.ReadDataTable("Locals"); var forecasts = xls.ReadDataTable("Forecasts"); var period = new string[] { "2020", "2040", "2060", "2080" }; var scenario = new string[] { "Median", "MoreWarmingDry", "MoreWarmingWet", "LessWarmingDry", "LessWarmingWet" }; CreatePiscesDatabaseWithModsimNodeNames(dbVic, correlation, "", "Baseline"); AddForecastsToPiscesDatabase(dbVic, forecasts, "", "Baseline"); for (int i = 0; i < period.Length; i++) { for (int j = 0; j < scenario.Length; j++) { CreatePiscesDatabaseWithModsimNodeNames(dbVic, correlation, period[i], scenario[j]); AddForecastsToPiscesDatabase(dbVic, forecasts, period[i], scenario[j]); } } }
static void Main(string[] args) { var fn = @"C:\temp\pn.pdb"; //var svr_vm = MySqlServer.GetMySqlServer("vm", "timeseries"); var svr_vm = new SQLiteServer(fn); if (svr_vm.TableExists("seriescatalog")) { svr_vm.RunSqlCommand("truncate seriescatalog"); } if (svr_vm.TableExists("sitescatalog")) { svr_vm.RunSqlCommand("truncate sitecatalog"); } var db_vm = new TimeSeriesDatabase(svr_vm, Reclamation.TimeSeries.Parser.LookupOption.TableName); var sites_vm = db_vm.GetSiteCatalog(); var svr = PostgreSQL.GetPostgresServer("timeseries", "lrgs1"); var db = new TimeSeriesDatabase(svr, Reclamation.TimeSeries.Parser.LookupOption.TableName); var sites = db.GetSiteCatalog(); string program = "agrimet"; var sc = db.GetSeriesCatalog("timeinterval='Daily'", "program:" + program); var sc_vm = db_vm.GetSeriesCatalog(); LoadDailyUsbrCatalog(sc, sc_vm, program); //db_vm.Server.SaveTable(sc_vm); LoadUpperSnakeHydromet(sc_vm); db_vm.Server.SaveTable(sc_vm); // install all sites that are referenced in series catalog var tmp = db_vm.Server.Table("tmp", "select distinct siteid from seriescatalog"); for (int i = 0; i < tmp.Rows.Count; i++) { string siteid = tmp.Rows[i]["siteid"].ToString(); var rows = sites.Select("siteid='" + siteid + "'"); if (rows.Length > 0) { var newRow = sites_vm.NewsitecatalogRow(); newRow.ItemArray = rows[0].ItemArray; sites_vm.Rows.Add(newRow); } } db_vm.Server.SaveTable(sites_vm); }
public void TestMergeMassBalance() { SQLiteServer pDB = new SQLiteServer(path); TimeSeriesDatabase DB = new TimeSeriesDatabase(pDB, false); // Reads input data required by the calculation Series daily = DB.GetSeriesFromName("CHEI_QD"); Series monthly = DB.GetSeriesFromName("CHEI_QM"); daily.Read(); monthly.Read(); // disaggregate and merge Series infilled = Disaggregation.RMSEInterp(daily, monthly); Disaggregation.MergeCheckMassBalance(daily, infilled); // generate series of monthly volumes only for months with a computed value, // these will be compared to the observed monthly Series partialMonthlyEstimated = new Series(); for (int i = 0; i < infilled.Count; i++) { Point p = infilled[i]; // Gets the data for the month int numDays = DateTime.DaysInMonth(p.DateTime.Year, p.DateTime.Month); DateTime t1 = new DateTime(p.DateTime.Year, p.DateTime.Month, 1); DateTime t2 = new DateTime(p.DateTime.Year, p.DateTime.Month, numDays); if (p.Flag == PointFlag.Computed && partialMonthlyEstimated.IndexOf(t1) < 0) { partialMonthlyEstimated.Add(t1, Math.Sum(infilled.Subset(t1, t2)) * 1.98347); } } // check observed against infilled for months where data was infilled double diff = 0.0; for (int i = 0; i < partialMonthlyEstimated.Count; i++) { DateTime estDate = partialMonthlyEstimated[i].DateTime; if (monthly.IndexOf(estDate) > 0) { diff += (monthly[estDate].Value - partialMonthlyEstimated[estDate].Value); } } Assert.IsTrue(diff < 0.01, "UofI merge mass balance failed by: " + diff); }