Пример #1
0
        /// <summary>Convert a simulation zone object into a series definition</summary>
        /// <param name="storage">Storage service</param>
        /// <param name="simulationZone">The object to convert</param>
        private SeriesDefinition ConvertToSeriesDefinition(IStorageReader storage, SimulationZone simulationZone)
        {
            SeriesDefinition seriesDefinition = new Models.Graph.SeriesDefinition();

            seriesDefinition.type          = Type;
            seriesDefinition.marker        = simulationZone.visualElement.Marker;
            seriesDefinition.line          = simulationZone.visualElement.Line;
            seriesDefinition.markerSize    = simulationZone.visualElement.MarkerSize;
            seriesDefinition.lineThickness = simulationZone.visualElement.LineThickness;
            seriesDefinition.colour        = simulationZone.visualElement.colour;
            seriesDefinition.xFieldName    = XFieldName;
            seriesDefinition.yFieldName    = YFieldName;
            seriesDefinition.xAxis         = XAxis;
            seriesDefinition.yAxis         = YAxis;
            if (simulationZone.simulationNames.Count > 0)
            {
                seriesDefinition.xFieldUnits = storage.GetUnits(TableName, XFieldName);
                seriesDefinition.yFieldUnits = storage.GetUnits(TableName, YFieldName);
            }
            seriesDefinition.showInLegend = ShowInLegend;
            seriesDefinition.title        = simulationZone.GetSeriesTitle();
            if (IncludeSeriesNameInLegend)
            {
                seriesDefinition.title += ": " + Name;
            }
            if (Checkpoint != "Current")
            {
                seriesDefinition.title += " (" + Checkpoint + ")";
            }
            if (simulationZone.data.Count > 0)
            {
                seriesDefinition.data  = simulationZone.data.ToTable();
                seriesDefinition.x     = GetDataFromTable(seriesDefinition.data, XFieldName);
                seriesDefinition.y     = GetDataFromTable(seriesDefinition.data, YFieldName);
                seriesDefinition.x2    = GetDataFromTable(seriesDefinition.data, X2FieldName);
                seriesDefinition.y2    = GetDataFromTable(seriesDefinition.data, Y2FieldName);
                seriesDefinition.error = GetErrorDataFromTable(seriesDefinition.data, YFieldName);
                if (Cumulative)
                {
                    seriesDefinition.y = MathUtilities.Cumulative(seriesDefinition.y as IEnumerable <double>);
                }
                if (CumulativeX)
                {
                    seriesDefinition.x = MathUtilities.Cumulative(seriesDefinition.x as IEnumerable <double>);
                }
            }
            return(seriesDefinition);
        }
Пример #2
0
        /// <summary>
        /// Paint the visual elements (colour, line and marker) of all simulation / zone pairs.
        /// </summary>
        /// <param name="factors">The simulation/zone pairs to change</param>
        /// <param name="storage">Storage reader</param>
        /// <param name="baseData">Base data</param>
        private List <SeriesDefinition> ConvertToSeriesDefinitions(List <ISimulationGeneratorFactors> factors, IStorageReader storage, DataTable baseData)
        {
            // Create an appropriate painter object
            SimulationZonePainter.IPainter painter;
            if (FactorToVaryColours != null)
            {
                if (FactorToVaryLines == FactorToVaryColours)
                {
                    painter = new SimulationZonePainter.SequentialPainterTwoFactors()
                    {
                        FactorName    = FactorToVaryColours,
                        MaximumIndex1 = ColourUtilities.Colours.Length,
                        MaximumIndex2 = Enum.GetValues(typeof(LineType)).Length - 1, // minus 1 to avoid None type
                        Setter1       = VisualElements.SetColour,
                        Setter2       = VisualElements.SetLineType
                    }
                }
                ;
                else if (FactorToVaryMarkers == FactorToVaryColours)
                {
                    painter = new SimulationZonePainter.SequentialPainterTwoFactors()
                    {
                        FactorName    = FactorToVaryColours,
                        MaximumIndex1 = ColourUtilities.Colours.Length,
                        MaximumIndex2 = Enum.GetValues(typeof(MarkerType)).Length - 1,// minus 1 to avoid None type
                        Setter1       = VisualElements.SetColour,
                        Setter2       = VisualElements.SetMarker
                    }
                }
                ;
                else if (FactorToVaryLines != null)
                {
                    painter = new SimulationZonePainter.DualPainter()
                    {
                        FactorName1   = FactorToVaryColours,
                        FactorName2   = FactorToVaryLines,
                        MaximumIndex1 = ColourUtilities.Colours.Length,
                        MaximumIndex2 = Enum.GetValues(typeof(LineType)).Length - 1, // minus 1 to avoid None type
                        Setter1       = VisualElements.SetColour,
                        Setter2       = VisualElements.SetLineType
                    }
                }
                ;
                else if (FactorToVaryMarkers != null)
                {
                    painter = new SimulationZonePainter.DualPainter()
                    {
                        FactorName1   = FactorToVaryColours,
                        FactorName2   = FactorToVaryMarkers,
                        MaximumIndex1 = ColourUtilities.Colours.Length,
                        MaximumIndex2 = Enum.GetValues(typeof(MarkerType)).Length - 1,// minus 1 to avoid None type
                        Setter1       = VisualElements.SetColour,
                        Setter2       = VisualElements.SetMarker
                    }
                }
                ;
                else
                {
                    painter = new SimulationZonePainter.SequentialPainter()
                    {
                        FactorName   = FactorToVaryColours,
                        MaximumIndex = ColourUtilities.Colours.Length,
                        Setter       = VisualElements.SetColour
                    }
                };
            }
            else if (FactorToVaryLines != null)
            {
                painter = new SimulationZonePainter.SequentialPainter()
                {
                    FactorName   = FactorToVaryLines,
                    MaximumIndex = Enum.GetValues(typeof(LineType)).Length - 1, // minus 1 to avoid None type
                    Setter       = VisualElements.SetLineType
                };
            }
            else if (FactorToVaryMarkers != null)
            {
                painter = new SimulationZonePainter.SequentialPainter()
                {
                    FactorName   = FactorToVaryMarkers,
                    MaximumIndex = Enum.GetValues(typeof(MarkerType)).Length - 1,// minus 1 to avoid None type
                    Setter       = VisualElements.SetMarker
                };
            }
            else
            {
                painter = new SimulationZonePainter.DefaultPainter()
                {
                    Colour = Colour, LineType = Line, MarkerType = Marker
                }
            };

            List <SeriesDefinition> definitions = new List <SeriesDefinition>();

            // Apply the painter to all simulation zone objects.
            foreach (ISimulationGeneratorFactors factor in factors)
            {
                VisualElements visualElement = new VisualElements();
                visualElement.colour        = Colour;
                visualElement.Line          = Line;
                visualElement.LineThickness = LineThickness;
                visualElement.Marker        = Marker;
                visualElement.MarkerSize    = MarkerSize;
                painter.PaintSimulationZone(factor, visualElement);

                SeriesDefinition seriesDefinition = new Models.Graph.SeriesDefinition();
                seriesDefinition.type          = Type;
                seriesDefinition.marker        = visualElement.Marker;
                seriesDefinition.line          = visualElement.Line;
                seriesDefinition.markerSize    = visualElement.MarkerSize;
                seriesDefinition.lineThickness = visualElement.LineThickness;
                seriesDefinition.colour        = visualElement.colour;
                seriesDefinition.xFieldName    = XFieldName;
                seriesDefinition.yFieldName    = YFieldName;
                seriesDefinition.xAxis         = XAxis;
                seriesDefinition.yAxis         = YAxis;
                seriesDefinition.xFieldUnits   = storage.GetUnits(TableName, XFieldName);
                seriesDefinition.yFieldUnits   = storage.GetUnits(TableName, YFieldName);
                seriesDefinition.showInLegend  = ShowInLegend;
                factor.Factors.ForEach(f => seriesDefinition.title += f.Value);
                if (IncludeSeriesNameInLegend)
                {
                    seriesDefinition.title += ": " + Name;
                }
                if (Checkpoint != "Current")
                {
                    seriesDefinition.title += " (" + Checkpoint + ")";
                }
                DataView data = new DataView(baseData);
                try
                {
                    data.RowFilter = CreateRowFilter(storage, new ISimulationGeneratorFactors[] { factor },
                                                     DataTableUtilities.GetColumnNames(baseData));
                }
                catch
                {
                }
                if (data.Count > 0)
                {
                    seriesDefinition.data  = data.ToTable();
                    seriesDefinition.x     = GetDataFromTable(seriesDefinition.data, XFieldName);
                    seriesDefinition.y     = GetDataFromTable(seriesDefinition.data, YFieldName);
                    seriesDefinition.x2    = GetDataFromTable(seriesDefinition.data, X2FieldName);
                    seriesDefinition.y2    = GetDataFromTable(seriesDefinition.data, Y2FieldName);
                    seriesDefinition.error = GetErrorDataFromTable(seriesDefinition.data, YFieldName);
                    if (Cumulative)
                    {
                        seriesDefinition.y = MathUtilities.Cumulative(seriesDefinition.y as IEnumerable <double>);
                    }
                    if (CumulativeX)
                    {
                        seriesDefinition.x = MathUtilities.Cumulative(seriesDefinition.x as IEnumerable <double>);
                    }
                }
                definitions.Add(seriesDefinition);
            }
            return(definitions);
        }
Пример #3
0
        /// <summary>Populate the grid control with data.</summary>
        public void PopulateGrid()
        {
            using (DataTable data = GetData())
            {
                // Strip out unwanted columns.
                if (data != null)
                {
                    int numFrozenColumns = 1;
                    for (int i = 0; i < data.Columns.Count; i++)
                    {
                        if (data.Columns[i].ColumnName.Contains("Date") || data.Columns[i].ColumnName.Contains("Today"))
                        {
                            numFrozenColumns = i;
                            break;
                        }
                    }

                    int simulationId = 0;

                    for (int i = 0; i < data.Columns.Count; i++)
                    {
                        if (data.Columns[i].ColumnName == "SimulationID")
                        {
                            if (simulationId == 0 && data.Rows.Count > 0)
                            {
                                simulationId = (int)data.Rows[0][i];
                            }

                            data.Columns.RemoveAt(i);
                            i--;
                        }
                        else if (i >= numFrozenColumns &&
                                 this.view.ColumnFilter.Value != string.Empty &&
                                 !data.Columns[i].ColumnName.Contains(this.view.ColumnFilter.Value))
                        {
                            data.Columns.RemoveAt(i);
                            i--;
                        }
                    }

                    // Convert the last dot to a CRLF so that the columns in the grid are narrower.
                    foreach (DataColumn column in data.Columns)
                    {
                        string units = null;

                        // Try to obtain units
                        if (dataStore != null && simulationId != 0)
                        {
                            units = dataStore.GetUnits(view.TableList.SelectedValue, column.ColumnName);
                        }

                        int posLastDot = column.ColumnName.LastIndexOf('.');
                        if (posLastDot != -1)
                        {
                            column.ColumnName = column.ColumnName.Insert(posLastDot + 1, "\r\n");
                        }

                        // Add the units, if they're available
                        if (units != null)
                        {
                            column.ColumnName = column.ColumnName + " " + units;
                        }
                    }

                    this.view.Grid.DataSource = data;
                    this.view.Grid.LockLeftMostColumns(numFrozenColumns);  // lock simulationname, zone, date.
                }
            }
        }
Пример #4
0
        /// <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.");
                    }
                }
            }
        }