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);
        }
Beispiel #2
0
        public RatingCurveResult LoadRatingCurve(RatingCurve curve, int stepPrecision, DateTimeOffset curveEffectiveTime)
        {
            var result = new RatingCurveResult();

            var curveCsv = HydroModel.GetExpandedRatingTable(
                curveEffectiveTime.UtcDateTime.ToOADate(),
                stepPrecision,
                CsvMetaHeader,
                CsvMetadata);

            if (string.IsNullOrEmpty(curveCsv))
            {
                return(result);
            }

            var csvRating = AQCSV.Load(curveCsv, true, new[] { "ExpandedPoints", "OriginalPoints" });

            var regularStages     = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 0);
            var regularDischarges = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 1);
            var shiftStages       = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 2);
            var shiftDischarges   = CSVUtil.ToDouble(csvRating.dataSet[0].datas, 3);

            for (var i = 0; i < regularStages.Length; ++i)
            {
                result.ExpandedPoints.Add(new ExpandedPoint
                {
                    Stage            = regularStages[i],
                    Discharge        = regularDischarges[i],
                    ShiftedStage     = shiftStages[i],
                    ShiftedDischarge = shiftDischarges[i]
                });
            }

            var equationStages     = CSVUtil.ToDouble(csvRating.dataSet[1].datas, 0);
            var equationDischarges = CSVUtil.ToDouble(csvRating.dataSet[1].datas, 1);

            for (var i = 0; i < equationStages.Length; ++i)
            {
                result.EquationPoints.Add(new EquationPoint
                {
                    Stage     = equationStages[i],
                    Discharge = equationDischarges[i]
                });
            }

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

            var exceptions = GetRatingExceptions(curve.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);
        }