Ejemplo n.º 1
0
        private bool convertParsedDataColumnAndReturnWarningFlag(DataRepository dataRepository, KeyValuePair <ExtendedColumn, IList <SimulationPoint> > columnAndData, string fileName)
        {
            DataColumn dataColumn;
            var        unit        = columnAndData.Value.FirstOrDefault(x => !string.IsNullOrEmpty(x.Unit))?.Unit ?? Constants.Dimension.NO_DIMENSION.DefaultUnitName;
            var        warningFlag = false;
            var        dimension   = columnAndData.Key.Column.Dimension ?? columnAndData.Key.ColumnInfo.SupportedDimensions.FirstOrDefault(x => x.FindUnit(unit, ignoreCase: true) != null);

            if (columnAndData.Key.ColumnInfo.IsBase)
            {
                dataColumn = new BaseGrid(columnAndData.Key.ColumnInfo.Name, dimension);
            }
            else
            {
                if (!containsColumnByName(dataRepository.Columns, columnAndData.Key.ColumnInfo.BaseGridName))
                {
                    throw new BaseGridColumnNotFoundException(columnAndData.Key.ColumnInfo.BaseGridName);
                }

                var baseGrid = findColumnByName(dataRepository.Columns, columnAndData.Key.ColumnInfo.BaseGridName) as BaseGrid;
                dataColumn = new DataColumn(columnAndData.Key.ColumnInfo.Name, dimension, baseGrid);
            }

            var dataInfo = new DataInfo(ColumnOrigins.Undefined);

            dataColumn.DataInfo      = dataInfo;
            dataInfo.DisplayUnitName = unit;

            var values = new float[columnAndData.Value.Count];
            var i      = 0;

            SimulationPoint lloqValue = null;

            //loop over view rows to get the sorted values.
            foreach (var value in columnAndData.Value)
            {
                if (!double.IsNaN(value.Lloq))
                {
                    if (lloqValue != null && !ValueComparer.AreValuesEqual(lloqValue.Lloq, value.Lloq))
                    {
                        warningFlag = true;
                        if (lloqValue.Lloq > value.Lloq)
                        {
                            value.Lloq = lloqValue.Lloq;
                        }
                    }

                    if (lloqValue == null || lloqValue.Lloq < value.Lloq)
                    {
                        lloqValue = value;
                    }
                }

                var adjustedValue = truncateUsingLLOQ(value);
                if (double.IsNaN(adjustedValue))
                {
                    values[i++] = float.NaN;
                }
                else if (unit != null && !string.IsNullOrEmpty(value.Unit))
                {
                    values[i++] = (float)dataColumn.Dimension.UnitValueToBaseUnitValue(dimension?.FindUnit(value.Unit, true), adjustedValue);
                }
                else
                {
                    values[i++] = (float)adjustedValue;
                }
            }

            if (lloqValue != null)
            {
                dataInfo.LLOQ = Convert.ToSingle(dimension?.UnitValueToBaseUnitValue(dimension.FindUnit(lloqValue.Unit), lloqValue.Lloq));
            }

            dataColumn.Values = values;

            var propInfo  = dataInfo.GetType().GetProperty(Constants.AUXILIARY_TYPE);
            var errorType = AuxiliaryType.Undefined;

            if (propInfo != null)
            {
                if (columnAndData.Key.ColumnInfo.IsAuxiliary)
                {
                    switch (columnAndData.Key.ErrorDeviation)
                    {
                    case Constants.STD_DEV_ARITHMETIC:
                        errorType = AuxiliaryType.ArithmeticStdDev;
                        for (i = 0; i < dataColumn.Values.Count; i++)
                        {
                            if (dataColumn.Values[i] < 0F)
                            {
                                dataColumn[i] = float.NaN;
                            }
                        }

                        break;

                    case Constants.STD_DEV_GEOMETRIC:
                        errorType = AuxiliaryType.GeometricStdDev;
                        for (i = 0; i < dataColumn.Values.Count; i++)
                        {
                            if (dataColumn.Values[i] < 1F)
                            {
                                dataColumn[i] = float.NaN;
                            }
                        }

                        break;
                    }
                }

                propInfo.SetValue(dataColumn.DataInfo, errorType, null);
            }

            //special case: Origin
            //if AuxiliaryType is set, set Origin to ObservationAuxiliary else to Observation for standard columns
            //type is set to BaseGrid for baseGrid columnAndData
            if (dataColumn.IsBaseGrid())
            {
                dataInfo.Origin = ColumnOrigins.BaseGrid;
            }
            else
            {
                dataInfo.Origin = (dataColumn.DataInfo.AuxiliaryType == AuxiliaryType.Undefined)
               ? ColumnOrigins.Observation
               : ColumnOrigins.ObservationAuxiliary;
            }

            //meta data information and input parameters currently not handled
            dataRepository.Add(dataColumn);
            return(warningFlag);
        }
        /// <summary>
        ///    This method converts an <see cref="ImportDataColumn" /> object and adds it to the data repository.
        /// </summary>
        /// <param name="dataRepository"></param>
        /// <param name="importDataColumn">Import data column to be converted.</param>
        /// <param name="columnInfos">Specification of columns including specification of meta data.</param>
        /// <param name="errorNaN">
        ///    This is a flag informing the caller about whether error have been changed to NaN because they
        ///    are out of definition.
        /// </param>
        private void convertImportDataColumn(DataRepository dataRepository, ImportDataColumn importDataColumn, IEnumerable <ColumnInfo> columnInfos, out bool errorNaN)
        {
            errorNaN = false;
            if (containsColumnByName(dataRepository.Columns, importDataColumn.ColumnName))
            {
                return;
            }
            if (string.IsNullOrEmpty(importDataColumn.Source))
            {
                return;                                             //not mapped and this means not used.
            }
            var importDataTable = importDataColumn.Table;

            var enumerable = columnInfos as IList <ColumnInfo> ?? columnInfos.ToList();
            var colInfo    = enumerable.FirstOrDefault(col => col.Name == importDataColumn.ColumnName);

            if (colInfo == null)
            {
                return;
            }
            if (importDataColumn.Dimensions == null)
            {
                throw new OSPSuiteException(string.Format("Column {0} has no dimension.", importDataColumn.ColumnName));
            }

            var dimension = _dimensionFactory.Dimension(importDataColumn.ActiveDimension.Name);

            DataColumn dataColumn;

            if (string.IsNullOrEmpty(colInfo.BaseGridName) || (colInfo.BaseGridName == colInfo.Name))
            {
                dataColumn = new BaseGrid(importDataColumn.ColumnName, dimension);
            }
            else
            {
                if (!containsColumnByName(dataRepository.Columns, colInfo.BaseGridName))
                {
                    bool columnErrorNaN;
                    convertImportDataColumn(dataRepository, importDataTable.Columns.ItemByName(colInfo.BaseGridName),
                                            enumerable, out columnErrorNaN);
                    errorNaN |= columnErrorNaN;
                }
                var baseGrid = findColumnByName(dataRepository.Columns, colInfo.BaseGridName) as BaseGrid;
                dataColumn = new DataColumn(importDataColumn.ColumnName, dimension, baseGrid);
            }

            var dataInfo = new DataInfo(ColumnOrigins.Undefined);

            dataColumn.DataInfo = dataInfo;

            if (!string.IsNullOrEmpty(importDataColumn.Source))
            {
                dataInfo.Source = importDataColumn.Source;
            }

            var unit   = dimension.Unit(importDataColumn.ActiveUnit.Name);
            var values = new float[importDataTable.Rows.Count];
            var i      = 0;

            //loop over view rows to get the sorted values.
            foreach (DataRowView row in importDataTable.DefaultView)
            {
                var value = row[importDataColumn.ColumnName];
                if (value == null || value == DBNull.Value)
                {
                    values[i++] = float.NaN;
                }
                else
                {
                    values[i++] = (float)dataColumn.Dimension.UnitValueToBaseUnitValue(unit, (double)value);
                }
            }

            dataInfo.DisplayUnitName = unit.Name;
            dataColumn.Values        = values;

            //transfer input parameters
            if (importDataColumn.ActiveDimension.InputParameters != null)
            {
                //transfer input parameters to extended properties
                foreach (var inputParameter in importDataColumn.ActiveDimension.InputParameters)
                {
                    if (inputParameter.Value == null)
                    {
                        continue;
                    }
                    //create an extended property
                    var extendedProperty =
                        Activator.CreateInstance(typeof(ExtendedProperty <>).MakeGenericType(typeof(double)))
                        as IExtendedProperty;
                    if (extendedProperty == null)
                    {
                        continue;
                    }
                    extendedProperty.Name          = inputParameter.Name;
                    extendedProperty.ValueAsObject = (double)inputParameter.Value;
                    dataInfo.ExtendedProperties.Add(extendedProperty);
                }
            }

            //transfer meta data information to data info fields or extended properties
            if (importDataColumn.MetaData != null && importDataColumn.MetaData.Rows.Count > 0)
            {
                foreach (MetaDataColumn metaData in importDataColumn.MetaData.Columns)
                {
                    var value = importDataColumn.MetaData.Rows.ItemByIndex(0)[metaData];
                    if (value == DBNull.Value && !metaData.Required)
                    {
                        continue;
                    }
                    var propInfo = dataInfo.GetType().GetProperty(metaData.ColumnName);

                    if (propInfo != null)
                    {
                        if (metaData.ColumnName == Constants.AUXILIARY_TYPE)
                        {
                            switch (value.ToString())
                            {
                            case Constants.STD_DEV_ARITHMETIC:
                                value = AuxiliaryType.ArithmeticStdDev;
                                for (i = 0; i < dataColumn.Values.Count; i++)
                                {
                                    if (dataColumn.Values[i] < 0F)
                                    {
                                        dataColumn[i] = float.NaN;
                                        errorNaN      = true;
                                    }
                                }
                                break;

                            case Constants.STD_DEV_GEOMETRIC:
                                value = AuxiliaryType.GeometricStdDev;
                                for (i = 0; i < dataColumn.Values.Count; i++)
                                {
                                    if (dataColumn.Values[i] < 1F)
                                    {
                                        dataColumn[i] = float.NaN;
                                        errorNaN      = true;
                                    }
                                }
                                break;
                            }
                        }
                        else
                        {
                            // set explicitly defined property
                            if (propInfo.PropertyType.IsEnum)
                            {
                                value = Enum.Parse(propInfo.PropertyType, value.ToString(), true);
                            }
                        }
                        propInfo.SetValue(dataColumn.DataInfo, value, null);
                    }
                    else
                    {
                        // add extended property
                        var extendedProperty =
                            Activator.CreateInstance(typeof(ExtendedProperty <>).MakeGenericType(metaData.DataType))
                            as IExtendedProperty;
                        if (extendedProperty == null)
                        {
                            continue;
                        }
                        extendedProperty.Name          = metaData.ColumnName;
                        extendedProperty.ValueAsObject = value;
                        dataInfo.ExtendedProperties.Add(extendedProperty);
                    }
                }
            }

            //special case: Origin
            //if AuxiliaryType is set, set Origin to ObservationAuxiliary else to Observation for standard columns
            //type is set to BaseGrid for baseGrid column
            if (dataColumn.IsBaseGrid())
            {
                dataInfo.Origin = ColumnOrigins.BaseGrid;
            }
            else
            {
                dataInfo.Origin = (dataColumn.DataInfo.AuxiliaryType == AuxiliaryType.Undefined)
               ? ColumnOrigins.Observation
               : ColumnOrigins.ObservationAuxiliary;
            }
            if (dataInfo.Origin == ColumnOrigins.Observation)
            {
                addLowerLimitOfQuantification(importDataColumn, dataColumn);
            }

            dataRepository.Add(dataColumn);
        }