/// <summary>Get a list of database fieldnames. /// Returns the names associated with the first table name in the property list /// </summary> /// <returns>A list of fieldnames.</returns> private List <string> GetFieldNames() { List <string> fieldNames = null; for (int i = 0; i < properties.Count; i++) { if (properties[i].Display != null && properties[i].Display.Type == DisplayType.TableName) { IGridCell cell = grid.GetCell(1, i); if (cell.Value != null && cell.Value.ToString() != string.Empty) { string tableName = cell.Value.ToString(); DataTable data = null; if (storage.TableNames.Contains(tableName)) { data = storage.RunQuery("SELECT * FROM " + tableName + " LIMIT 1"); } if (data != null) { fieldNames = DataTableUtilities.GetColumnNames(data).ToList(); if (fieldNames.Contains("SimulationID")) { fieldNames.Add("SimulationName"); } } } } } return(fieldNames); }
/// <summary>Get a list of database fieldnames. /// Returns the names associated with the first table name in the property list /// </summary> /// <returns>A list of fieldnames.</returns> private string[] GetFieldNames() { string[] fieldNames = null; for (int i = 0; i < this.properties.Count; i++) { if (this.properties[i].DisplayType == DisplayAttribute.DisplayTypeEnum.TableName) { IGridCell cell = this.grid.GetCell(1, i); if (cell.Value != null && cell.Value.ToString() != string.Empty) { DataTable data = storage.RunQuery("SELECT * FROM " + cell.Value.ToString() + " LIMIT 1"); if (data != null) { fieldNames = DataTableUtilities.GetColumnNames(data); } } } } return(fieldNames); }
/// <summary>Main run method for performing our calculations and storing data.</summary> /// <param name="dataStore">The data store.</param> /// <exception cref="ApsimXException"> /// Could not find model data table: + PredictedTableName /// or /// Could not find observed data table: + ObservedTableName /// </exception> public void Run(IStorageReader dataStore) { if (PredictedTableName != null && ObservedTableName != null) { dataStore.DeleteDataInTable(this.Name); List <string> predictedDataNames = dataStore.GetTableColumns(PredictedTableName); List <string> observedDataNames = dataStore.GetTableColumns(ObservedTableName); if (predictedDataNames == null) { throw new ApsimXException(this, "Could not find model data table: " + PredictedTableName); } if (observedDataNames == null) { throw new ApsimXException(this, "Could not find observed data table: " + ObservedTableName); } // get the common columns between these lists of columns IEnumerable <string> commonCols = predictedDataNames.Intersect(observedDataNames); StringBuilder query = new StringBuilder("SELECT "); foreach (string s in commonCols) { if (s == FieldNameUsedForMatch || s == FieldName2UsedForMatch || s == FieldName3UsedForMatch) { query.Append("I.'@field', "); } else { query.Append("I.'@field' AS 'Observed.@field', R.'@field' AS 'Predicted.@field', "); } query.Replace("@field", s); } query.Append("FROM " + ObservedTableName + " I INNER JOIN " + PredictedTableName + " R USING (SimulationID) WHERE I.'@match1' = R.'@match1'"); if (FieldName2UsedForMatch != null && FieldName2UsedForMatch != string.Empty) { query.Append(" AND I.'@match2' = R.'@match2'"); } if (FieldName3UsedForMatch != null && FieldName3UsedForMatch != string.Empty) { query.Append(" AND I.'@match3' = R.'@match3'"); } int checkpointID = dataStore.GetCheckpointID("Current"); query.Append(" AND R.CheckpointID = " + checkpointID); query.Replace(", FROM", " FROM"); // get rid of the last comma query.Replace("I.'SimulationID' AS 'Observed.SimulationID', R.'SimulationID' AS 'Predicted.SimulationID'", "I.'SimulationID' AS 'SimulationID'"); query = query.Replace("@match1", FieldNameUsedForMatch); query = query.Replace("@match2", FieldName2UsedForMatch); query = query.Replace("@match3", FieldName3UsedForMatch); if (Parent is Folder) { // Limit it to particular simulations in scope. List <string> simulationNames = new List <string>(); foreach (Experiment experiment in Apsim.FindAll(this, typeof(Experiment))) { simulationNames.AddRange(experiment.GetSimulationNames()); } foreach (Simulation simulation in Apsim.FindAll(this, typeof(Simulation))) { if (!(simulation.Parent is Experiment)) { simulationNames.Add(simulation.Name); } } query.Append(" AND I.SimulationID in ("); foreach (string simulationName in simulationNames) { if (simulationName != simulationNames[0]) { query.Append(','); } query.Append(dataStore.GetSimulationID(simulationName)); } query.Append(")"); } DataTable predictedObservedData = dataStore.RunQuery(query.ToString()); if (predictedObservedData != null) { predictedObservedData.TableName = this.Name; dataStore.WriteTable(predictedObservedData); List <string> unitFieldNames = new List <string>(); List <string> unitNames = new List <string>(); // write units to table. foreach (string fieldName in commonCols) { string units = dataStore.GetUnits(PredictedTableName, fieldName); if (units != null && units != "()") { string unitsMinusBrackets = units.Replace("(", "").Replace(")", ""); unitFieldNames.Add("Predicted." + fieldName); unitNames.Add(unitsMinusBrackets); unitFieldNames.Add("Observed." + fieldName); unitNames.Add(unitsMinusBrackets); } } if (unitNames.Count > 0) { dataStore.AddUnitsForTable(Name, unitFieldNames, unitNames); } } else { // Determine what went wrong. DataTable predictedData = dataStore.RunQuery("SELECT * FROM " + PredictedTableName); DataTable observedData = dataStore.RunQuery("SELECT * FROM " + ObservedTableName); if (predictedData == null || predictedData.Rows.Count == 0) { throw new Exception(Name + ": Cannot find any predicted data."); } else if (observedData == null || observedData.Rows.Count == 0) { throw new Exception(Name + ": Cannot find any observed data in node: " + ObservedTableName + ". Check for missing observed file or move " + ObservedTableName + " to top of child list under DataStore (order is important!)"); } else { throw new Exception(Name + ": Observed data was found but didn't match the predicted values. Make sure the values in the SimulationName column match the simulation names in the user interface. Also ensure column names in the observed file match the APSIM report column names."); } } } }
/// <summary>Main run method for performing our post simulation calculations</summary> /// <param name="dataStore">The data store.</param> public void Run(IStorageReader dataStore) { string sql = "SELECT * FROM REPORT WHERE SimulationName LIKE '" + Name + "%' ORDER BY SimulationID"; DataTable predictedData = dataStore.RunQuery(sql); if (predictedData != null && hasRun) { // Determine how many years we have per simulation DataView view = new DataView(predictedData); view.RowFilter = "SimulationName='" + Name + "Simulation1'"; Years = DataTableUtilities.GetColumnAsIntegers(view, "Clock.Today.Year"); // Create a table of all predicted values DataTable predictedValues = new DataTable(); List <string> descriptiveColumnNames = new List <string>(); List <string> variableNames = new List <string>(); foreach (double year in Years) { view.RowFilter = "Clock.Today.Year=" + year; foreach (DataColumn predictedColumn in view.Table.Columns) { if (predictedColumn.DataType == typeof(double)) { double[] valuesForYear = DataTableUtilities.GetColumnAsDoubles(view, predictedColumn.ColumnName); if (valuesForYear.Distinct().Count() == 1) { if (!descriptiveColumnNames.Contains(predictedColumn.ColumnName)) { descriptiveColumnNames.Add(predictedColumn.ColumnName); } } else { DataTableUtilities.AddColumn(predictedValues, predictedColumn.ColumnName + year, valuesForYear); if (!variableNames.Contains(predictedColumn.ColumnName)) { variableNames.Add(predictedColumn.ColumnName); } } } } } // Run R DataTable eeDataRaw; DataTable statsDataRaw; RunRPostSimulation(predictedValues, out eeDataRaw, out statsDataRaw); // Get ee data from R and store in ee table. // EE data from R looks like: // "ResidueWt", "FASW", "CN2", "Cona", "variable","path" // - 22.971008269563,0.00950570342209862,-0.00379987333757356,56.7587080430652,"FallowEvaporation1996",1 // - 25.790599484188, 0.0170777988614538, -0.0265991133629069,58.0240658644712,"FallowEvaporation1996",2 // - 26.113599477728, 0.0113851992409871, 0.0113996200126667,57.9689677010766,"FallowEvaporation1996",3 // - 33.284199334316, 0.0323193916349732, -0.334388853704853,60.5376820772641,"FallowEvaporation1996",4 DataView eeView = new DataView(eeDataRaw); IndexedDataTable eeTableKey = new IndexedDataTable(new string[] { "Parameter", "Year" }); // Create a path variable. var pathValues = Enumerable.Range(1, NumPaths).ToArray(); foreach (var parameter in Parameters) { foreach (DataColumn column in predictedValues.Columns) { eeView.RowFilter = "variable = '" + column.ColumnName + "'"; if (eeView.Count != NumPaths) { throw new Exception("Found only " + eeView.Count + " paths for variable " + column.ColumnName + " in ee table"); } int year = Convert.ToInt32(column.ColumnName.Substring(column.ColumnName.Length - 4)); string variableName = column.ColumnName.Substring(0, column.ColumnName.Length - 4); eeTableKey.SetIndex(new object[] { parameter.Name, year }); List <double> values = DataTableUtilities.GetColumnAsDoubles(eeView, parameter.Name).ToList(); for (int i = 0; i < values.Count; i++) { values[i] = Math.Abs(values[i]); } var runningMean = MathUtilities.RunningAverage(values); eeTableKey.SetValues("Path", pathValues); eeTableKey.SetValues(variableName + ".MuStar", runningMean); } } DataTable eeTable = eeTableKey.ToTable(); eeTable.TableName = Name + "PathAnalysis"; // Get stats data from R and store in MuStar table. // Stats data coming back from R looks like: // "mu", "mustar", "sigma", "param","variable" // -30.7331368183818, 30.7331368183818, 5.42917964248002,"ResidueWt","FallowEvaporation1996" // -0.0731299918470997,0.105740687296631,0.450848277601353, "FASW","FallowEvaporation1996" // -0.83061431285624,0.839772007599748, 1.75541097254145, "CN2","FallowEvaporation1996" // 62.6942591520838, 62.6942591520838, 5.22778043503867, "Cona","FallowEvaporation1996" // -17.286285468283, 19.4018404625051, 24.1361388348929,"ResidueWt","FallowRunoff1996" // 8.09850688306722, 8.09852589447407, 15.1988107373113, "FASW","FallowRunoff1996" // 18.6196168461051, 18.6196168461051, 15.1496277765849, "CN2","FallowRunoff1996" // -7.12794888887507, 7.12794888887507, 5.54014788597839, "Cona","FallowRunoff1996" IndexedDataTable tableKey = new IndexedDataTable(new string[2] { "Parameter", "Year" }); foreach (DataRow row in statsDataRaw.Rows) { string variable = row["variable"].ToString(); int year = Convert.ToInt32(variable.Substring(variable.Length - 4)); variable = variable.Substring(0, variable.Length - 4); tableKey.SetIndex(new object[] { row["param"], year }); tableKey.Set(variable + ".Mu", row["mu"]); tableKey.Set(variable + ".MuStar", row["mustar"]); tableKey.Set(variable + ".Sigma", row["sigma"]); // Need to bring in the descriptive values. view.RowFilter = "Clock.Today.Year=" + year; foreach (var descriptiveColumnName in descriptiveColumnNames) { var values = DataTableUtilities.GetColumnAsStrings(view, descriptiveColumnName); if (values.Distinct().Count() == 1) { tableKey.Set(descriptiveColumnName, view[0][descriptiveColumnName]); } } } DataTable muStarTable = tableKey.ToTable(); muStarTable.TableName = Name + "Statistics"; dataStore.DeleteDataInTable(eeTable.TableName); dataStore.WriteTable(eeTable); dataStore.DeleteDataInTable(muStarTable.TableName); dataStore.WriteTable(muStarTable); } hasRun = false; }
/// <summary>Main run method for performing our calculations and storing data.</summary> /// <param name="dataStore">The data store.</param> /// <exception cref="ApsimXException"> /// Could not find model data table: + ObservedTableName /// or /// Could not find observed data table: + ObservedTableName /// </exception> public void Run(IStorageReader dataStore) { if (PredictedTableName != null && ObservedTableName != null) { dataStore.DeleteTable(this.Name); DataTable predictedDataNames = dataStore.RunQuery("PRAGMA table_info(" + PredictedTableName + ")"); DataTable observedDataNames = dataStore.RunQuery("PRAGMA table_info(" + ObservedTableName + ")"); if (predictedDataNames == null) { throw new ApsimXException(this, "Could not find model data table: " + ObservedTableName); } if (observedDataNames == null) { throw new ApsimXException(this, "Could not find observed data table: " + ObservedTableName); } IEnumerable <string> commonCols = from p in predictedDataNames.AsEnumerable() join o in observedDataNames.AsEnumerable() on p["name"] equals o["name"] select p["name"] as string; StringBuilder query = new StringBuilder("SELECT "); foreach (string s in commonCols) { if (s == FieldNameUsedForMatch || s == FieldName2UsedForMatch || s == FieldName3UsedForMatch) { query.Append("I.'@field', "); } else { query.Append("I.'@field' AS 'Observed.@field', R.'@field' AS 'Predicted.@field', "); } query.Replace("@field", s); } query.Append("FROM " + ObservedTableName + " I INNER JOIN " + PredictedTableName + " R USING (SimulationID) WHERE I.'@match1' = R.'@match1'"); if (FieldName2UsedForMatch != null && FieldName2UsedForMatch != string.Empty) { query.Append(" AND I.'@match2' = R.'@match2'"); } if (FieldName3UsedForMatch != null && FieldName3UsedForMatch != string.Empty) { query.Append(" AND I.'@match3' = R.'@match3'"); } query.Replace(", FROM", " FROM"); // get rid of the last comma query.Replace("I.'SimulationID' AS 'Observed.SimulationID', R.'SimulationID' AS 'Predicted.SimulationID'", "I.'SimulationID' AS 'SimulationID'"); query = query.Replace("@match1", FieldNameUsedForMatch); query = query.Replace("@match2", FieldName2UsedForMatch); query = query.Replace("@match3", FieldName3UsedForMatch); if (Parent is Folder) { // Limit it to particular simulations in scope. List <string> simulationNames = new List <string>(); foreach (Experiment experiment in Apsim.FindAll(this, typeof(Experiment))) { simulationNames.AddRange(experiment.GetSimulationNames()); } foreach (Simulation simulation in Apsim.FindAll(this, typeof(Simulation))) { if (!(simulation.Parent is Experiment)) { simulationNames.Add(simulation.Name); } } query.Append(" AND I.SimulationID in ("); foreach (string simulationName in simulationNames) { if (simulationName != simulationNames[0]) { query.Append(','); } query.Append(dataStore.GetSimulationID(simulationName)); } query.Append(")"); } DataTable predictedObservedData = dataStore.RunQuery(query.ToString()); if (predictedObservedData != null) { predictedObservedData.TableName = this.Name; dataStore.WriteTableRaw(predictedObservedData); } else { // Determine what went wrong. DataTable predictedData = dataStore.RunQuery("SELECT * FROM " + PredictedTableName); DataTable observedData = dataStore.RunQuery("SELECT * FROM " + ObservedTableName); if (predictedData == null || predictedData.Rows.Count == 0) { throw new Exception(Name + ": Cannot find any predicted data."); } else if (observedData == null || observedData.Rows.Count == 0) { throw new Exception(Name + ": Cannot find any observed data in node: " + ObservedTableName + ". Check for missing observed file or move " + ObservedTableName + " to top of child list under DataStore (order is important!)"); } else { throw new Exception(Name + ": Observed data was found but didn't match the predicted values. Make sure the values in the SimulationName column match the simulation names in the user interface. Also ensure column names in the observed file match the APSIM report column names."); } } } }