diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java @ 9266:465347d12990

Station specific calculation of flood duration curve and infrastructure annotations
author mschaefer
date Wed, 18 Jul 2018 12:20:01 +0200
parents e5367900dd6d
children 83ebeb620b5a
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java	Tue Jul 17 19:48:28 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java	Wed Jul 18 12:20:01 2018 +0200
@@ -10,6 +10,7 @@
 package org.dive4elements.river.artifacts.sinfo.flood_duration;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -118,18 +119,17 @@
             mainValueLabels[i] = wqkmsArray[i].getName();
         results.addResult(new FloodDurationCalculationResult(label, mainValueLabels, this.rows), problems);
 
-        calcWQDays(problems, stationsSorted[0], AttributeKey.LEFT, winfo, results);
-
-        calcMainValueAnnotations(problems, 0, AttributeKey.LEFT, wqkmsArray, results);
-
-        calcInfrastructureAnnotations(problems, this.rows.get(0), wqkmsArray, results);
+        // calcWQDays(problems, stationsSorted[0], AttributeKey.LEFT, winfo, results);
+        //
+        // calcMainValueAnnotations(problems, 0, AttributeKey.LEFT, wqkmsArray, results);
+        //
+        // calcInfrastructureAnnotations(problems, this.rows.get(0), wqkmsArray, results);
     }
 
     /**
-     * Calculate duration curve for a station and add to result collection
+     * Calculates the duration curve for a station
      */
-    private void calcWQDays(final Calculation problems, final double station, final AttributeKey riverside, final WINFOArtifact winfo,
-            final FloodDurationCalculationResults results) {
+    public WQDay calcWQDays(final Calculation problems, final double station, final WINFOArtifact winfo) {
 
         // Same processing as in W-Info DurationCurveState
         winfo.addStringData("ld_locations", Double.toString(station));
@@ -144,13 +144,13 @@
             ws[j] = underflow.getW(i);
             qs[j] = underflow.getQ(i);
         }
-        results.setDurationCurve(new WQDay(days, ws, qs));
+        return new WQDay(days, ws, qs);
     }
 
     /**
      * Calculate the data for the W and Q main value lines in the duration curve chart and add to result collection
      */
-    private void calcMainValueAnnotations(final Calculation problems, final int stationIndex, final AttributeKey riverside,
+    public void calcMainValueAnnotations(final Calculation problems, final int stationIndex, final AttributeKey riverside,
             final WQKms[] wqkmsArray, final FloodDurationCalculationResults results) {
 
         // Same way as in MainValueWFacet and ..QFacet, but special label handling
@@ -178,28 +178,70 @@
      * Calculate the data for the W and Q lines in the duration curve chart for the infrastructure height and add to result
      * collection
      */
-    private void calcInfrastructureAnnotations(final Calculation problems, final ResultRow row, final WQKms[] wqkmsArray,
-            final FloodDurationCalculationResults results) {
+    public List<StickyAxisAnnotation> calcInfrastructureAnnotations(final Calculation problems, final double station,
+            final FloodDurationCalculationResult result) {
 
-        if (row.getValue(SInfoResultType.infrastructuretype) == null) {
-            results.setInfrastructureWAnnotation(null);
-            results.setInfrastructureQAnnotation(null);
-            return;
+        // Search the station in the previously calculated result rows and terminate if no infrastructure row found
+        double station1 = station;
+        if (Double.isNaN(station)) {
+            for (final ResultRow row : result.getRows()) {
+                station1 = row.getDoubleValue(GeneralResultType.station);
+                break;
+            }
+        }
+        final List<ResultRow> stationRows = searchStation(station1, result.getRows());
+        if (stationRows.isEmpty() || (stationRows.get(0).getValue(SInfoResultType.infrastructuretype) == null)) {
+            return null;
         }
         // Same way as in MainValueWFacet and ..QFacet
+        final List<StickyAxisAnnotation> annotations = new ArrayList<>();
+        for (final ResultRow row : stationRows) {
+            annotations.add(calcWAnnotation(row));
+            annotations.add(calcQAnnotation(row));
+        }
+        return annotations;
+    }
+
+    /**
+     * Searches the one or two rows of a station in a result rows collection
+     */
+    private List<ResultRow> searchStation(final double station, final Collection<ResultRow> rows) {
+        final List<ResultRow> found = new ArrayList<>();
+        for (final ResultRow row : rows) {
+            if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001)
+                break;
+            else if (row.getDoubleValue(GeneralResultType.station) > station - 0.0001)
+                found.add(row);
+        }
+        return found;
+    }
+
+    /**
+     * Calculates the Q annotation lines of an infrastructure
+     */
+    private StickyAxisAnnotation calcQAnnotation(final ResultRow row) {
         final String label = Resources.getMsg(this.context.getMeta(), "sinfo.chart.flood_duration.curve.infrastructure",
                 "sinfo.chart.flood_duration.curve.infrastructure",
                 SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype))
                 + ", " + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside)));
-        final StickyAxisAnnotation qAnnotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.floodDischarge),
+        final StickyAxisAnnotation annotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.floodDischarge),
                 SimpleAxis.Y_AXIS, FloodDurationCurveGenerator.YAXIS.Q.idx);
-        FloodDurationMainValuesQFacet.setHitPoint(results.getDurationCurve(), qAnnotation);
-        final StickyAxisAnnotation wAnnotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.infrastructureHeight),
+        annotation.setHitPoint((float) row.getDoubleValue(SInfoResultType.floodDuration));
+        return annotation;
+    }
+
+    /**
+     * Calculates the W annotation lines of an infrastructure
+     */
+    private StickyAxisAnnotation calcWAnnotation(final ResultRow row) {
+        final String label = Resources.getMsg(this.context.getMeta(), "sinfo.chart.flood_duration.curve.infrastructure",
+                "sinfo.chart.flood_duration.curve.infrastructure",
+                SInfoResultType.infrastructuretype.exportValue(this.context, row.getValue(SInfoResultType.infrastructuretype))
+                + ", " + SInfoResultType.riverside.exportValue(this.context, row.getValue(SInfoResultType.riverside)));
+        final StickyAxisAnnotation annotation = new StickyAxisAnnotation(label, (float) row.getDoubleValue(SInfoResultType.infrastructureHeight),
                 SimpleAxis.Y_AXIS, FloodDurationCurveGenerator.YAXIS.W.idx);
-        FloodDurationMainValuesWFacet.setHitPoint(results.getDurationCurve(), wAnnotation);
-
-        results.setInfrastructureQAnnotation(qAnnotation);
-        results.setInfrastructureWAnnotation(wAnnotation);
+        annotation.setHitPoint((float) row.getDoubleValue(SInfoResultType.floodDuration));
+        return annotation;
     }
 
     /**

http://dive4elements.wald.intevation.org