Beispiel #1
0
        public void Load(RatingModelDescription ratingModelDescription)
        {
            RatingModelDescription = ratingModelDescription;

            var allParameters = Client.Provisioning.Get(new GetParameters()).Results;

            InputParameter  = allParameters.Single(p => p.Identifier == ratingModelDescription.InputParameter);
            OutputParameter = allParameters.Single(p => p.Identifier == ratingModelDescription.OutputParameter);

            using (SoapClient = CreateConnectedClient())
            {
                var ratingModelInfo = GetRatingModelInfo();

                AopBytes = GetRatingModelAop(ratingModelInfo.RatingModelId);

                HydroMlXml = GetHydroMlXml();

                HydroModel = new CHydroModel(AopBytes);

                CsvMetaHeader = "LocationId,InParameter,OutParameter";
                CsvMetadata   = $"UNKNOWN,{ratingModelDescription.InputParameter},{ratingModelDescription.OutputParameter}";

                LoadFieldVisitReadings();
            }
        }
        public RatingCurveResult LoadEffectiveRatingCurve(RatingModelDescription ratingModelDescription, double stepSize, DateTimeOffset curveEffectiveTime)
        {
            var result = new RatingCurveResult();

            var expandedRatingCurve = GetExpandedRatingCurve(ratingModelDescription, stepSize, curveEffectiveTime);

            if (expandedRatingCurve == null)
            {
                return(result);
            }

            if (expandedRatingCurve.BaseRatingTable.Count != expandedRatingCurve.AdjustedRatingTable.Count)
            {
                throw new ExpectedException($"Expanded rating curve for '{ratingModelDescription.Identifier}:{expandedRatingCurve.Id}' has a mis-matched point count. {nameof(expandedRatingCurve.BaseRatingTable)}.Count = {expandedRatingCurve.BaseRatingTable.Count} points but {nameof(expandedRatingCurve.AdjustedRatingTable)}.Count = {expandedRatingCurve.AdjustedRatingTable.Count} points.");
            }

            for (var i = 0; i < expandedRatingCurve.BaseRatingTable.Count; ++i)
            {
                result.ExpandedPoints.Add(new ExpandedPoint
                {
                    Stage            = expandedRatingCurve.BaseRatingTable[i].InputValue ?? double.NaN,
                    Discharge        = expandedRatingCurve.BaseRatingTable[i].OutputValue ?? double.NaN,
                    ShiftedStage     = expandedRatingCurve.AdjustedRatingTable[i].InputValue ?? double.NaN,
                    ShiftedDischarge = expandedRatingCurve.AdjustedRatingTable[i].OutputValue ?? double.NaN
                });
            }

            var curveStartTime = expandedRatingCurve.PeriodsOfApplicability.First().StartTime;
            var curveEndTime   = expandedRatingCurve.PeriodsOfApplicability.Last().EndTime;

            var exceptions = GetRatingExceptions(expandedRatingCurve.Id);

            var fieldVisitReadings = FieldVisitReadings.Where(r =>
            {
                var time = new DateTimeOffset(DateTime.SpecifyKind(r.MeasurementTime, DateTimeKind.Unspecified), TimeSpan.FromHours(r.UtcOffset));

                return(exceptions.IncludeIds.Contains(r.DiscreteMeasurementId) ||
                       !exceptions.ExcludeIds.Contains(r.DiscreteMeasurementId) && curveStartTime <= time && time < curveEndTime);
            }).ToList();

            var measurementIds = fieldVisitReadings
                                 .Select(f => f.DiscreteMeasurementId)
                                 .Distinct();

            result.RatingMeasurements = measurementIds
                                        .Select(id => CreateRatingMeasurement(fieldVisitReadings.Where(f => f.DiscreteMeasurementId == id).ToList()))
                                        .Where(r => r != null)
                                        .ToList();

            return(result);
        }
        public AllTablesResult LoadAllTables(RatingModelDescription ratingModelDescription, RatingCurveListServiceResponse ratingCurves, double stepSize)
        {
            var result = new AllTablesResult();

            var validTableNumbers = new HashSet <double>(
                ratingCurves
                .RatingCurves
                .Select(c => double.TryParse(c.Id, out var number) ? (double?)number : null)
                .Where(d => d.HasValue)
                .Select(d => d.Value));

            for (var i = 0; i < ratingCurves.RatingCurves.Count; ++i)
            {
                var ratingCurve = ratingCurves.RatingCurves[i];

                if (!double.TryParse(ratingCurve.Id, out var tableNumber))
                {
                    tableNumber = 1.0 + i;

                    while (validTableNumbers.Contains(tableNumber))
                    {
                        tableNumber += ratingCurves.RatingCurves.Count;
                    }
                }

                result.Tables.Add(new Table
                {
                    TableNumber = tableNumber,
                    TableName   = ratingCurve.Id,
                    NumPeriods  = ratingCurve.PeriodsOfApplicability.Count,
                    NumPoints   = ratingCurve.BaseRatingTable.Count
                });

                result.TableDates.AddRange(ratingCurve.PeriodsOfApplicability.Select(p => new TableDate
                {
                    TableNumber = tableNumber,
                    StartDate   = p.StartTime,
                    EndDate     = p.EndTime
                }));

                result.TableValues.AddRange(ratingCurve.BaseRatingTable.Select(p => new TableValue
                {
                    TableNumber = tableNumber,
                    Input       = p.InputValue ?? double.NaN,
                    Output      = p.OutputValue ?? double.NaN
                }));
            }

            return(result);
        }
        public void Load(RatingModelDescription ratingModelDescription)
        {
            RatingModelDescription = ratingModelDescription;

            var allParameters = Client.Provisioning.Get(new GetParameters()).Results;

            InputParameter  = allParameters.Single(p => p.Identifier == ratingModelDescription.InputParameter);
            OutputParameter = allParameters.Single(p => p.Identifier == ratingModelDescription.OutputParameter);

            CreateConnectedClient();

            var ratingModelInfo = GetRatingModelInfo();

            AopBytes = GetRatingModelAop(ratingModelInfo.RatingModelId);

            HydroMlXml = GetHydroMlXml();

            LoadFieldVisitReadings();
        }
        private ExpandedRatingCurve GetExpandedRatingCurve(RatingModelDescription ratingModelDescription, double stepSize, DateTimeOffset curveEffectiveTime)
        {
            try
            {
                return(Client.Publish.Get(new EffectiveRatingCurveServiceRequest
                {
                    RatingModelIdentifier = ratingModelDescription.Identifier,
                    EffectiveTime = curveEffectiveTime,
                    StepSize = stepSize
                }).ExpandedRatingCurve);
            }
            catch (WebServiceException exception)
            {
                if (exception.StatusCode == (int)HttpStatusCode.BadRequest && exception.ErrorMessage.Contains(" has no active Rating Curves"))
                {
                    return(null);
                }

                throw;
            }
        }
        public DataTable RatingModelTable(string tableName, string inputOutputParameters, string ratingModelLabel, string locationIdentifier)
        {
            DataTable ratingModelTable = new DataTable(tableName);

            ratingModelTable.Columns.Add("Identifier", typeof(string));
            ratingModelTable.Columns.Add("InputParameter", typeof(string));
            ratingModelTable.Columns.Add("InputUnitId", typeof(string));
            ratingModelTable.Columns.Add("InputUnitSymbol", typeof(string));
            ratingModelTable.Columns.Add("InputParameterRoundingSpec", typeof(string));
            ratingModelTable.Columns.Add("OutputParameter", typeof(string));
            ratingModelTable.Columns.Add("OutputUnitId", typeof(string));
            ratingModelTable.Columns.Add("OutputUnitSymbol", typeof(string));
            ratingModelTable.Columns.Add("OutputParameterRoundingSpec", typeof(string));
            ratingModelTable.Columns.Add("Description", typeof(string));
            ratingModelTable.Columns.Add("Comment", typeof(string));
            ratingModelTable.Columns.Add("TimeRange", typeof(string));
            ratingModelTable.Columns.Add("RatingModelInfo", typeof(string));

            ratingModelTable.Columns.Add("RatingModelDescriptionObject", typeof(object));

            string ratingModelIdentifier = string.Format("{0}.{1}@{2}", inputOutputParameters, ratingModelLabel, locationIdentifier);

            DataRow ratingModelRow = ratingModelTable.NewRow();

            ratingModelRow["Identifier"] = ratingModelIdentifier;
            ratingModelTable.Rows.Add(ratingModelRow);

            RatingModelDescription ratingModelDescription = _Common.GetRatingModelDescription(ratingModelIdentifier, locationIdentifier);

            ratingModelRow["RatingModelDescriptionObject"] = ratingModelDescription;

            string locationName = _Common.GetLocationDescriptionByIdentifier(locationIdentifier).Name;

            if (ratingModelDescription == null)
            {
                if (string.IsNullOrEmpty(ratingModelLabel) && string.IsNullOrEmpty(inputOutputParameters))
                {
                    ratingModelRow["RatingModelInfo"] = Resources.RatingModelUnspecified;
                }
                else
                {
                    ratingModelRow["RatingModelInfo"] = string.Format(Resources.NoRatingModelFoundWithXYZZ,
                                                                      inputOutputParameters, ratingModelLabel, locationIdentifier, locationName);
                }
            }
            else
            {
                string inputParameterDisplayId  = ratingModelDescription.InputParameter;
                string inputUnitId              = ratingModelDescription.InputUnit;
                string outputParameterDisplayId = ratingModelDescription.OutputParameter;
                string outputUnitId             = ratingModelDescription.OutputUnit;
                string rmDescription            = ratingModelDescription.Description;

                ratingModelRow["InputParameter"]             = inputParameterDisplayId;
                ratingModelRow["InputUnitId"]                = inputUnitId;
                ratingModelRow["InputUnitSymbol"]            = _Common.GetUnitSymbol(inputUnitId);
                ratingModelRow["InputParameterRoundingSpec"] = _Common.GetParameterRoundingSpec(inputParameterDisplayId);

                ratingModelRow["OutputParameter"]             = outputParameterDisplayId;
                ratingModelRow["OutputUnitId"]                = outputUnitId;
                ratingModelRow["OutputUnitSymbol"]            = _Common.GetUnitSymbol(outputUnitId);
                ratingModelRow["OutputParameterRoundingSpec"] = _Common.GetParameterRoundingSpec(outputParameterDisplayId);

                ratingModelRow["Description"] = rmDescription;
                ratingModelRow["Comment"]     = ratingModelDescription.Comment;

                ratingModelRow["RatingModelInfo"] = string.Format(Resources.NoRatingCurvesFoundWithXY,
                                                                  ratingModelIdentifier, locationName);

                RatingCurveListServiceResponse ratingCurveListResponse = _Common.GetRatingCurveList(ratingModelIdentifier);

                if (ratingCurveListResponse != null)
                {
                    ratingModelRow["RatingModelInfo"] = string.Format(Resources.RatingModelInformation,
                                                                      ratingModelIdentifier, locationName,
                                                                      inputParameterDisplayId, _Common.GetUnitSymbol(inputUnitId),
                                                                      outputParameterDisplayId, _Common.GetUnitSymbol(outputUnitId),
                                                                      ratingCurveListResponse.RatingCurves.Count);
                }
            }

            return(ratingModelTable);
        }