private void BindPredictedObservedVariables(int predictedObservedId)
        {
            List <vVariable> VariableList = PredictedObservedDS.GetVariablesByPredictedObservedID(predictedObservedId);

            ddlVariables.DataSource = VariableList;
            ddlVariables.DataBind();
        }
        /// <summary>
        /// Get the PredictedObserved Details based on the Predicted Observed Id, and then call
        /// BindCurrentAcceptedValues, passing the requrid details
        /// </summary>
        /// <param name="variable"></param>
        /// <param name="predictedObservedId"></param>
        private void BindCurrentAcceptedChartAndValues(bool updateChart)
        {
            string variable            = ddlVariables.SelectedItem.Text;
            int    predictedObservedId = int.Parse(Convert.ToString(hfPredictedObservedID.Value));

            PredictedObservedDetail currPODetails = PredictedObservedDS.GetByPredictedObservedID(predictedObservedId);

            POValuesList = BindCurrentAcceptedValuesssssss(variable, currPODetails);

            POValuesDT            = Genfuncs.ToDataTable(POValuesList);
            Session["POValuesDT"] = POValuesDT;

            gvPOValues.DataSource = POValuesDT;
            gvPOValues.PageSize   = Convert.ToInt32(ddlPageSize.SelectedValue);

            gvPOValues.DataBind();

            UpdatePanel2.Update();

            if (updateChart == true)
            {
                BindCurrentAcceptedChart(variable, POValuesList);
                UpdatePanel4.Update();
            }
        }
Exemple #3
0
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                int predictedObservedId = 0;
                if (!string.IsNullOrEmpty(Request.QueryString["PO_Id"]))
                {
                    predictedObservedId = int.Parse(Request.QueryString["PO_Id"]);
                }

                if (predictedObservedId > 0)
                {
                    hfPredictedObservedID.Value = predictedObservedId.ToString();
                    PredictedObservedDetail currPODetails = PredictedObservedDS.GetByPredictedObservedID(predictedObservedId);
                    ApsimFile apsim = ApsimFilesDS.GetByID(currPODetails.ApsimFilesID);
                    hfPullRequestID.Value = apsim.PullRequestId.ToString();

                    lblPullRequest.Text = "Pull Request: " + apsim.PullRequestId.ToString();
                    lblApsimFile.Text   = "Apsim File: " + apsim.FileName;
                    lblPOTableName.Text = "Table: " + currPODetails.TableName + " (PO Id: " + currPODetails.ID.ToString() + ")";

                    //now bind the data
                    RetrieveDataAndBindCharts(currPODetails);
                }
            }
        }
        private List <vCurrentAndAccepted> BindCurrentAcceptedValuesssssss(String variable, PredictedObservedDetail currPODetails)
        {
            List <vCurrentAndAccepted> POCurrentValuesList;

            //some of the older records may not have this yet.  So find it the old way.
            if ((currPODetails.AcceptedPredictedObservedDetailsID == null) || (currPODetails.AcceptedPredictedObservedDetailsID <= 0))
            {
                //Retrieve the curresponding (parent) ApsimFile for this PredictedObservedDetail
                ApsimFile apsimFile = ApsimFilesDS.GetByID(currPODetails.ApsimFilesID);

                //get the Pull Request Id for the lastest released pull request that is not the current one
                int acceptPullRequestId = ApsimFilesDS.GetLatestMergedPullRequestId(apsimFile.PullRequestId);

                //get the PredictedObservedDetail.ID for the records that match our current record 'matching' criteria
                currPODetails.AcceptedPredictedObservedDetailsID = PredictedObservedDS.GetIDByMatchingDetails(acceptPullRequestId, apsimFile.FileName, currPODetails.TableName,
                                                                                                              currPODetails.PredictedTableName, currPODetails.ObservedTableName, currPODetails.FieldNameUsedForMatch);
            }


            POCurrentValuesList = PredictedObservedDS.GetCurrentAcceptedValuesWithNulls(variable, currPODetails.ID, (int)currPODetails.AcceptedPredictedObservedDetailsID);
            //POCurrentValuesList = PredictedObservedDS.GetCurrentAcceptedValues(variable, currPODetails.ID, (int)currPODetails.AcceptedPredictedObservedDetailsID);
            //get the data to be displayed in the chart and grid
            //POValuesList = PredictedObservedDS.GetCurrentAcceptedValues(variable, currPODetails.ID, (int)currPODetails.AcceptedPredictedObservedDetailsID);

            //POValuesDT = Genfuncs.ToDataTable(POCurrentValuesList);

            return(POCurrentValuesList);
        }
Exemple #5
0
        private void BindVariableNames(string fileName, string tableName)
        {
            List <vVariable> variableNameList = PredictedObservedDS.GetDistinctVariableNames(fileName, tableName);
            vVariable        selectItem       = new vVariable();

            selectItem.Name  = "Select a Variable";
            selectItem.Value = "0";
            variableNameList.Insert(0, selectItem);
            ddlVariableName.DataSource = variableNameList;
            ddlVariableName.DataBind();
        }
        private void BindPredictedObservedTestsDiffs()
        {
            //lblTests.Text = "Tests for " + variable;
            //get the data to be displayed in the chart and grid
            int pullRequestId = int.Parse(hfPullRequestID.Value.ToString());

            POTestsList = PredictedObservedDS.GetCurrentAcceptedTestsDiffsSubset(pullRequestId);

            POTestsDT            = Genfuncs.ToDataTable(POTestsList);
            Session["POTestsDT"] = POTestsDT;
        }
Exemple #7
0
        private void BindTableNames(string renameType, string fileName)
        {
            List <vVariable> tableNameList = PredictedObservedDS.GetDistinctTableNames(fileName);
            vVariable        selectItem    = new vVariable();

            selectItem.Name  = "Select a Table";
            selectItem.Value = "0";
            tableNameList.Insert(0, selectItem);

            ddlTableName.DataSource = tableNameList;
            ddlTableName.DataBind();
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                int    predictedObservedId = 0;
                string variable            = string.Empty;
                if (!string.IsNullOrEmpty(Request.QueryString["PO_Id"]))
                {
                    predictedObservedId = int.Parse(Request.QueryString["PO_Id"]);
                }

                if (predictedObservedId > 0)
                {
                    hfPredictedObservedID.Value = predictedObservedId.ToString();
                    PredictedObservedDetail currPODetails = PredictedObservedDS.GetByPredictedObservedID(predictedObservedId);
                    ApsimFile apsim = ApsimFilesDS.GetByID(currPODetails.ApsimFilesID);
                    hfPullRequestID.Value = apsim.PullRequestId.ToString();

                    Session["POTestsDT"] = null;
                    BindCurrentAcceptedTestsDataTable();

                    lblPullRequest.Text = "Pull Request: " + apsim.PullRequestId.ToString();
                    lblApsimFile.Text   = "Apsim File: " + apsim.FileName;
                    lblPOTableName.Text = "Table: " + currPODetails.TableName + " (PO Id: " + currPODetails.ID.ToString() + ")";

                    if (!string.IsNullOrEmpty(Request.QueryString["Variable"]))
                    {
                        //LoadTimer.Enabled = false;
                        variable = Request.QueryString["Variable"].ToString();
                        BindPredictedObservedVariables(currPODetails.ID);
                        ddlVariables.SelectedValue = variable;

                        ClientScript.RegisterStartupScript(this.GetType(), "ScrollScript", "scrollToDiv();", true);
                    }
                    else
                    {
                        BindPredictedObservedVariables(currPODetails.ID);
                    }

                    //if (gvPOTests.Rows.Count > 0)
                    //{
                    //    //NOTE:  This is registered using the ClientScript (not ScriptManager), with different parameters, as this grid is NOT in an update panel
                    //    ClientScript.RegisterStartupScript(this.GetType(), "CreateGridHeader", "<script>CreateGridHeader('GridDataDiv_POTests', 'ContentPlaceHolder1_gvPOTests', 'GridHeaderDiv_POTests');</script>");
                    //}
                }
            }
            //if (gvPOValues.Rows.Count > 0)
            //{
            //    //NOTE:  This is registered using the ScriptManager (not ClientScript), with different parameters, as this grid is nested in an update panel
            //    ScriptManager.RegisterStartupScript(this, GetType(), "CreateGridHeader_POValues", "CreateGridHeader('GridDataDiv_POValues', 'ContentPlaceHolder1_gvPOValues', 'GridHeaderDiv_POValues');", true);
            //}
        }
        private string GetPredictedObservedIDforPullRequestID(int predictedObservedId, int pullRequestId, string fileName, string tablename)
        {
            int altAcceptedPredictedObservedDetailsID = 0;

            try
            {
                //get the PredictedObservedDetail.ID for the records that match our current record 'matching' criteria
                altAcceptedPredictedObservedDetailsID = PredictedObservedDS.GetIDByMatchingDetails(pullRequestId, fileName, tablename);
            }
            catch (Exception)
            {
            }
            return(altAcceptedPredictedObservedDetailsID.ToString());
        }
        /// <summary>
        /// Retrieve the Tests data for the specified predicted observed id
        /// </summary>
        /// <param name="predictedObservedId"></param>
        private void BindCurrentAcceptedTests()
        {
            int predictedObservedId = int.Parse(hfPredictedObservedID.Value.ToString());

            POTestsList = PredictedObservedDS.GetCurrentAcceptedTestsSubset(predictedObservedId);

            POTestsDT            = Genfuncs.ToDataTable(POTestsList);
            Session["POTestsDT"] = POTestsDT;

            //if (gvPOTests.Rows.Count > 0)
            //{
            //    //NOTE:  This is registered using the ClientScript (not ScriptManager), with different parameters, as this grid is NOT in an update panel
            //    ClientScript.RegisterStartupScript(this.GetType(), "CreateGridHeader", "<script>CreateGridHeader('GridDataDiv_POTests', 'ContentPlaceHolder1_gvPOTests', 'GridHeaderDiv_POTests');</script>");
            //}
        }
Exemple #11
0
        private void RetrieveDataAndBindCharts(PredictedObservedDetail currPODetails)
        {
            //some of the older records may not have this yet.  So find it the old way.
            if ((currPODetails.AcceptedPredictedObservedDetailsID == null) || (currPODetails.AcceptedPredictedObservedDetailsID <= 0))
            {
                //Retrieve the curresponding (parent) ApsimFile for this PredictedObservedDetail
                ApsimFile apsimFile = ApsimFilesDS.GetByID(currPODetails.ApsimFilesID);

                //get the Pull Request Id for the lastest released pull request that is not the current one
                int acceptPullRequestId = ApsimFilesDS.GetLatestMergedPullRequestId(apsimFile.PullRequestId);

                //get the PredictedObservedDetail.ID for the records that match our current record 'matching' criteria
                currPODetails.AcceptedPredictedObservedDetailsID = PredictedObservedDS.GetIDByMatchingDetails(acceptPullRequestId, apsimFile.FileName, currPODetails.TableName,
                                                                                                              currPODetails.PredictedTableName, currPODetails.ObservedTableName, currPODetails.FieldNameUsedForMatch);
            }

            List <vSimulationPredictedObserved> POCurrentValuesList = PredictedObservedDS.GetCurrentAcceptedSimulationValues(currPODetails.ID, (int)currPODetails.AcceptedPredictedObservedDetailsID);
            string             holdVariable       = string.Empty;
            string             holdSimulationName = string.Empty;
            string             tooltip            = string.Empty;
            string             textAnnotation     = string.Empty;
            List <PODataPoint> acceptedData       = new List <PODataPoint>();
            List <PODataPoint> currentData        = new List <PODataPoint>();
            double             maxXYValue         = 0;
            bool newchart = false;
            int  chartNo  = 0;

            foreach (vSimulationPredictedObserved item in POCurrentValuesList)
            {
                if (holdVariable == string.Empty)
                {
                    holdVariable       = item.ValueName;
                    holdSimulationName = item.SimulationName;
                    tooltip            = String.Format("{0} - {1}", item.SimulationName, item.ValueName);
                }

                newchart = false;
                //if (item.SimulationName != holdSimulationName) { newchart = true; }
                if (item.ValueName != holdVariable)
                {
                    newchart = true;
                }

                if (newchart == true)
                {
                    //create the chart
                    if ((currentData.Count > 0) || (currentData.Count > 0))
                    {
                        chartNo       += 1;
                        textAnnotation = GetPredictedObservedTests(currPODetails.ID, holdVariable);
                        BindCurrentAcceptedChart(chartNo, holdVariable, currPODetails.ID, tooltip, currentData.ToArray(), acceptedData.ToArray(), maxXYValue, textAnnotation);
                    }
                    //reset the variables
                    acceptedData.Clear();
                    currentData.Clear();
                    maxXYValue         = 0;
                    holdVariable       = item.ValueName;
                    holdSimulationName = item.SimulationName;
                }

                if ((item.AcceptedObservedValue != null) && (item.AcceptedPredictedValue != null))
                {
                    acceptedData.Add(new PODataPoint()
                    {
                        X = (double)item.AcceptedObservedValue,
                        Y = (double)item.AcceptedPredictedValue,
                        SimulationName = item.SimulationName
                    });
                    if ((double)item.AcceptedObservedValue > maxXYValue)
                    {
                        maxXYValue = (double)item.AcceptedObservedValue;
                    }
                    if ((double)item.AcceptedPredictedValue > maxXYValue)
                    {
                        maxXYValue = (double)item.AcceptedPredictedValue;
                    }
                }

                if ((item.CurrentObservedValue != null) && (item.CurrentPredictedValue != null))
                {
                    currentData.Add(new PODataPoint()
                    {
                        X = (double)item.CurrentObservedValue,
                        Y = (double)item.CurrentPredictedValue,
                        SimulationName = item.SimulationName
                    });
                    if ((double)item.CurrentObservedValue > maxXYValue)
                    {
                        maxXYValue = (double)item.CurrentObservedValue;
                    }
                    if ((double)item.CurrentPredictedValue > maxXYValue)
                    {
                        maxXYValue = (double)item.CurrentPredictedValue;
                    }
                }
            }
            if ((currentData.Count > 0) || (acceptedData.Count > 0))
            {
                chartNo       += 1;
                textAnnotation = GetPredictedObservedTests(currPODetails.ID, holdVariable);
                BindCurrentAcceptedChart(chartNo, holdVariable, currPODetails.ID, tooltip, currentData.ToArray(), acceptedData.ToArray(), maxXYValue, textAnnotation);
            }
        }
Exemple #12
0
        private string GetPredictedObservedTests(int currentPoID, string variable)
        {
            StringBuilder sb          = new StringBuilder();
            string        returnTests = string.Empty;
            //double? cIntercept = 0, cMAE = 0, cME = 0, cn = 0, cNSE = 0, cR2 = 0, cRMSE = 0, cRSR = 0, cSEintercept = 0, cSEslope = 0, cSlope = 0;
            //double? aIntercept = 0, aMAE = 0, aME = 0, an = 0, aNSE = 0, aR2 = 0, aRMSE = 0, aRSR = 0, aSEintercept = 0, aSEslope = 0, aSlope = 0;
            string cIntercept = string.Empty, aIntercept = string.Empty, cSlope = string.Empty, aSlope = string.Empty;

            //string htmlCodeBlack = "<font style='color:black'>";
            //string htmlCodeRed = "<font style='color:red'>";
            //string htmlCodeGreen = "<font style='color:green'>";
            //string htmlCodeEnd = "</font>";
            string newLine = " \n";

            string strCurrentY    = "Y=";
            string strCurrentR2   = "R2=";
            string strCurrentNSE  = "NSE=";
            string strCurrentRMSE = "RMSE=";
            string strCurrentME   = "ME=";
            string strCurrentMAE  = "MAE=";
            string strCurrentN    = "N=";

            string strAcceptedY    = "Y=";
            string strAcceptedR2   = "R2=";
            string strAcceptedNSE  = "NSE=";
            string strAcceptedRMSE = "RMSE=";
            string strAcceptedME   = "ME=";
            string strAcceptedMAE  = "MAE=";
            string strAcceptedN    = "N=";
            string itemCurrentStr  = string.Empty;

            List <vPredictedObservedTestsFormatted> tests = PredictedObservedDS.GetPredictedObservedTestFormatted(currentPoID, variable);

            foreach (vPredictedObservedTestsFormatted item in tests)
            {
                try
                {
                    itemCurrentStr = item.CurrentF;

                    switch (item.Test)
                    {
                    case "Intercept":
                        aIntercept = item.AcceptedF;
                        cIntercept = itemCurrentStr;
                        break;

                    case "MAE":
                        strAcceptedMAE = strAcceptedMAE + item.AcceptedF;
                        strCurrentMAE  = strCurrentMAE + itemCurrentStr;
                        break;

                    case "ME":
                        strAcceptedME = strAcceptedME + item.AcceptedF;
                        strCurrentME  = strCurrentME + itemCurrentStr;
                        break;

                    case "n":
                        strAcceptedN = strAcceptedN + item.AcceptedF;
                        strCurrentN  = strCurrentN + itemCurrentStr;
                        break;

                    case "NSE":
                        strAcceptedNSE = strAcceptedNSE + item.AcceptedF;
                        strCurrentNSE  = strCurrentNSE + itemCurrentStr;
                        break;

                    case "R2":
                        strAcceptedR2 = strAcceptedR2 + item.AcceptedF;
                        strCurrentR2  = strCurrentR2 + itemCurrentStr;
                        break;

                    case "RMSE":
                        strAcceptedRMSE = strAcceptedRMSE + item.AcceptedF;
                        strCurrentRMSE  = strCurrentRMSE + itemCurrentStr;
                        break;

                    case "Slope":
                        aSlope = item.AcceptedF;
                        cSlope = itemCurrentStr;
                        break;
                    }
                }
                catch (Exception)
                {
                }
            }
            strCurrentY  = strCurrentY + cSlope + "x + " + cIntercept;
            strAcceptedY = strAcceptedY + aSlope + "x + " + aIntercept;

            sb.Append("ACCEPTED" + newLine);
            sb.Append(strAcceptedY + newLine);
            sb.Append(strAcceptedR2 + newLine);
            sb.Append(strAcceptedRMSE + newLine);
            sb.Append(strAcceptedME + newLine);
            sb.Append(strAcceptedMAE + newLine);
            sb.Append(strAcceptedN + newLine);
            sb.Append(newLine + "CURRENT" + newLine);
            sb.Append(strCurrentY + newLine);
            sb.Append(strCurrentR2 + newLine);
            sb.Append(strCurrentRMSE + newLine);
            sb.Append(strCurrentME + newLine);
            sb.Append(strCurrentMAE + newLine);
            sb.Append(strCurrentN + newLine);
            returnTests = sb.ToString();

            return(returnTests);
        }
Exemple #13
0
        private void RetrieveDataAndBindCharts()
        {
            int pullRequestId = int.Parse(hfPullRequestID.Value.ToString());
            List <vPredictedObservedTests> POTestsList = PredictedObservedDS.GetCurrentAcceptedTests(pullRequestId);

            bool   newchart      = false;
            string holdFileName  = string.Empty;
            string holdTableName = string.Empty;
            string holdVariable  = string.Empty;
            string holdTitle     = string.Empty;
            string holdPO_Id     = string.Empty;
            string tooltip       = string.Empty;
            //string[] xValues = { "September", "October", "November", "December" };
            //double[] yValues = { 15, 60, 12, 13 };


            List <string> AcceptedXValues = new List <string>();
            List <double> AcceptedYValues = new List <double>();
            List <Color>  AcceptedColours = new List <Color>();
            List <string> CurrentXValues  = new List <string>();
            List <double> CurrentYValues  = new List <double>();
            List <Color>  CurrentColours  = new List <Color>();


            Color currColour, accColour;
            int   chartNo = 0;

            foreach (vPredictedObservedTests item in POTestsList)
            {
                //this is the first instance
                if (holdFileName == string.Empty)
                {
                    holdFileName  = item.FileName;
                    holdTableName = item.TableName;
                    holdVariable  = item.Variable;

                    holdPO_Id = item.PredictedObservedDetailsID.ToString();
                }

                newchart = false;
                if (item.FileName != holdFileName)
                {
                    newchart = true;
                }
                if (item.TableName != holdTableName)
                {
                    newchart = true;
                }
                if (item.Variable != holdVariable)
                {
                    newchart = true;
                }

                if (newchart == true)
                {
                    if ((AcceptedXValues.Count > 0) || (CurrentXValues.Count > 0))
                    {
                        chartNo += 1;
                        tooltip  = string.Format("{0} - {1}", holdFileName, holdTableName);
                        CreateCharts(chartNo, holdVariable, holdPO_Id, tooltip, AcceptedColours.ToArray(), AcceptedXValues.ToArray(), AcceptedYValues.ToArray(),
                                     CurrentColours.ToArray(), CurrentXValues.ToArray(), CurrentYValues.ToArray());
                    }
                    //clear these for next time
                    AcceptedXValues = new List <string>();
                    AcceptedYValues = new List <double>();
                    AcceptedColours = new List <Color>();
                    CurrentXValues  = new List <string>();
                    CurrentYValues  = new List <double>();
                    CurrentColours  = new List <Color>();
                    holdFileName    = item.FileName;
                    holdTableName   = item.TableName;
                    holdVariable    = item.Variable;
                    holdPO_Id       = item.PredictedObservedDetailsID.ToString();
                }

                if ((item.Test != "n") && (item.Test != "RMSE"))
                {
                    if (item.Accepted != null)
                    {
                        AcceptedXValues.Add(item.Test);
                        AcceptedYValues.Add((double)item.Accepted);
                        if (Math.Abs((double)item.Accepted) > 1)
                        {
                            accColour = Color.Black;
                        }
                        else
                        {
                            accColour = Color.Gray;
                        }
                        AcceptedColours.Add(accColour);
                    }

                    if (item.Current != null)
                    {
                        try
                        {
                            CurrentXValues.Add(item.Test);
                            CurrentYValues.Add((double)item.Current);
                            if (Math.Abs((double)item.Current) > 1)
                            {
                                currColour = Color.Orange;
                            }
                            else if (((bool)item.IsImprovement) || ((bool)item.PassedTest))
                            {
                                currColour = Color.Green;
                            }
                            else if (item.Accepted != null)
                            {
                                if ((double)item.Current == (double)item.Accepted)
                                {
                                    currColour = Color.Gray;
                                }
                                else
                                {
                                    currColour = Color.Red;
                                }
                            }
                            else
                            {
                                currColour = Color.Red;
                            }
                            CurrentColours.Add(currColour);
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
            }

            if ((AcceptedXValues.Count > 0) || (CurrentXValues.Count > 0))
            {
                chartNo += 1;
                tooltip  = string.Format("{0} - {1}", holdFileName, holdTableName);
                CreateCharts(chartNo, holdVariable, holdPO_Id, tooltip, AcceptedColours.ToArray(), AcceptedXValues.ToArray(), AcceptedYValues.ToArray(),
                             CurrentColours.ToArray(), CurrentXValues.ToArray(), CurrentYValues.ToArray());
            }
        }
Exemple #14
0
        //private void myChart_Click(object sender, System.Web.UI.WebControls.ImageMapEventArgs e)
        //{
        //    string PO_Id = e.PostBackValue;
        //    Response.Redirect(string.Format("PODetails.aspx?PO_Id={0}", PO_Id));
        //}

        #endregion

        #region Data Retreval and Binding

        private void RetrieveDataAndBindGrids()
        {
            AddPerformanceRatingTable();
            int pullRequestId = int.Parse(hfPullRequestID.Value.ToString());
            List <vPredictedObservedTests> POTestsList = PredictedObservedDS.GetCurrentAcceptedTestsFiltered(pullRequestId);

            bool   newVariable   = false;
            string holdFileName  = string.Empty;
            string holdTableName = string.Empty;
            string holdVariable  = string.Empty;
            string currPO_ID     = string.Empty;
            bool   firstVariable = true;
            bool   firstFileName = true;

            string ArrowChars = "&#10004;";
            string CrossChars = "&#10008;";
            string diff       = string.Empty;

            string N_Current = string.Empty, N_Accepted = string.Empty;
            string RMSE_Current = string.Empty, RMSE_Accepted = string.Empty, RMSE_Difference = string.Empty;
            string NSE_Current = string.Empty, NSE_Accepted = string.Empty, NSE_Difference = string.Empty;
            string Bias_Current = string.Empty, Bias_Accepted = string.Empty, Bias_Difference = string.Empty;
            string RSR_Current = string.Empty, RSR_Accepted = string.Empty, RSR_Difference = string.Empty;
            bool   hasChanged = false;

            Table table = new Table();

            table.CssClass = "TGR_Table";
            table.Rows.Add(DefineTableStructure());

            foreach (vPredictedObservedTests item in POTestsList)
            {
                //this is the first instance
                newVariable = false;
                if (item.Variable != holdVariable)
                {
                    newVariable = true;
                }


                if (newVariable == true)
                {
                    //we need to output details
                    //have we output the actual file name details
                    //NEED TO ALLOW FOR FIRST TIME OUTPUT
                    if (firstFileName == true)
                    {
                        table.Rows.Add(DefineSimNameRow(item.FileName));
                        holdFileName  = item.FileName;
                        firstVariable = true;
                        table.Rows.Add(DefineTableRow(item.TableName));
                        holdTableName = item.TableName;
                        firstFileName = false;
                    }

                    if (holdVariable != string.Empty)
                    {
                        //then we can print the variable details
                        table.Rows.Add(DefineTableVariableRow(holdVariable, currPO_ID, N_Current, N_Accepted, RMSE_Current, RMSE_Accepted, RMSE_Difference, NSE_Current, NSE_Accepted, NSE_Difference, RSR_Current, RSR_Accepted, RSR_Difference, hasChanged));
                        N_Current       = string.Empty;
                        N_Accepted      = string.Empty;
                        RMSE_Current    = string.Empty;
                        RMSE_Accepted   = string.Empty;
                        RMSE_Difference = string.Empty;
                        NSE_Current     = string.Empty;
                        NSE_Accepted    = string.Empty;
                        NSE_Difference  = string.Empty;
                        RSR_Current     = string.Empty;
                        RSR_Accepted    = string.Empty;
                        RSR_Difference  = string.Empty;
                        currPO_ID       = string.Empty;
                        hasChanged      = false;
                    }

                    if (item.FileName != holdFileName)
                    {
                        table.Rows[table.Rows.Count - 1].Style.Add("margin-bottom", "1em");
                        table.Rows.Add(DefineSimNameRow(item.FileName));
                        holdFileName  = item.FileName;
                        firstVariable = true;

                        //alway output the PO table when we change filename
                        table.Rows.Add(DefineTableRow(item.TableName));
                        holdTableName = item.TableName;
                    }

                    //have we output the table name details
                    if (item.TableName != holdTableName)
                    {
                        table.Rows.Add(DefineTableRow(item.TableName));
                        holdTableName = item.TableName;
                        firstVariable = false;
                    }
                    //holdTableName = item.TableName;

                    firstVariable = false;
                }


                bool isImprovement = false;
                if (item.IsImprovement != null)
                {
                    isImprovement = (bool)item.IsImprovement;
                }

                bool passedTest = false;
                if (item.PassedTest != null)
                {
                    passedTest = (bool)item.PassedTest;
                }

                diff = string.Empty;
                if (isImprovement == true)
                {
                    hasChanged = true;
                    diff       = "<span style=\"font-weight: bold; color: Green;\">" + ArrowChars + "</span>";
                }
                else if (passedTest != true)
                {
                    hasChanged = true;
                    diff       = "<span style=\"font-weight: bold; color: Red;\">" + CrossChars + "</span>";
                }

                switch (item.Test)
                {
                case "RMSE":
                    RMSE_Current    = FormatSignificant(item.Current, 6, false);
                    RMSE_Accepted   = FormatSignificant(item.Accepted, 6, true);
                    RMSE_Difference = diff;
                    break;

                case "NSE":
                    NSE_Current  = RoundValues(item.Current, 3, false);
                    NSE_Accepted = RoundValues(item.Accepted, 3, true);
                    if (item.Current != null)
                    {
                        if (((double)item.Current > 0.75) && ((double)item.Current <= 1.00))
                        {
                            diff = diff + "***";
                        }
                        if (((double)item.Current > 0.65) && ((double)item.Current <= 0.75))
                        {
                            diff = diff + "**";
                        }
                        if (((double)item.Current > 0.50) && ((double)item.Current <= 0.65))
                        {
                            diff = diff + "*";
                        }
                    }
                    NSE_Difference = diff;
                    break;

                case "n":
                    N_Current  = RoundValues(item.Current, 0, false);
                    N_Accepted = RoundValues(item.Accepted, 0, true);
                    break;

                case "RSR":
                    RSR_Current  = RoundValues(item.Current, 3, false);
                    RSR_Accepted = RoundValues(item.Accepted, 3, true);
                    if (item.Current != null)
                    {
                        if (((double)item.Current >= 0.00) && ((double)item.Current <= 0.50))
                        {
                            diff = diff + "***";
                        }
                        if (((double)item.Current > 0.50) && ((double)item.Current <= 0.60))
                        {
                            diff = diff + "**";
                        }
                        if (((double)item.Current > 0.60) && ((double)item.Current <= 0.70))
                        {
                            diff = diff + "*";
                        }
                    }
                    RSR_Difference = diff;
                    break;
                }
                //we need this for the hyperlink
                currPO_ID    = item.PredictedObservedDetailsID.ToString();
                holdVariable = item.Variable;
            }

            //output details here
            //have we output the table name details
            if (holdVariable != string.Empty)
            {
                //then we can print the variable details
                table.Rows.Add(DefineTableVariableRow(holdVariable, currPO_ID, N_Current, N_Accepted, RMSE_Current, RMSE_Accepted, RMSE_Difference, NSE_Current, NSE_Accepted, NSE_Difference, RSR_Current, RSR_Accepted, RSR_Difference, hasChanged));
            }
            phGrids.Controls.Add(table);
        }