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