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); }