diff artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9316:72b3270e1568

U-Info salix line with regional and supraregional scenario calculation and chart display
author mschaefer
date Thu, 26 Jul 2018 17:28:32 +0200
parents 9a9f076d5716
children a978b601a034
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Thu Jul 26 17:23:49 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Thu Jul 26 17:28:32 2018 +0200
@@ -13,6 +13,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.NavigableMap;
 
 import org.dive4elements.artifacts.CallContext;
@@ -56,6 +57,9 @@
 
     private WstValueTable wst;
 
+    /**
+     * List of delta-w (may be 0) mapped by km range
+     */
     private NavigableMap<Double, List<Double>> rangeScenarios;
 
 
@@ -72,7 +76,7 @@
      * Calculate the salix line result rows
      */
     public void execute(final Calculation problems, final UINFOArtifact uinfo, final NavigableMap<Double, List<Double>> rangeScenarios,
-            final ScenarioType scenarioType, final SalixLineCalculationResults results) {
+            final ScenarioType scenarioType, final String[] scenarioLabels, final SalixLineCalculationResults results) {
 
         this.problems = problems;
         this.wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver());
@@ -87,13 +91,13 @@
             this.rows.add(createRow(station));
         }
         if (scenarioType == ScenarioType.REGIONAL)
-            results.addResult(new SalixLineCalculationRegionalResult("Salix", null, this.rows), problems);
+            results.addResult(new SalixLineCalculationRegionalResult("Salix", scenarioLabels, this.rows), problems);
         else if (scenarioType == ScenarioType.SUPRAREGIONAL)
-            results.addResult(new SalixLineCalculationSupraRegionalResult("Salix", null, this.rows), problems);
+            results.addResult(new SalixLineCalculationSupraRegionalResult("Salix", this.rows), problems);
         else if (scenarioType == ScenarioType.HISTORICAL)
-            results.addResult(new SalixLineCalculationHistoricalResult("Salix", null, this.rows), problems);
+            results.addResult(new SalixLineCalculationHistoricalResult("Salix", this.rows), problems);
         else
-            results.addResult(new SalixLineCalculationNoScenarioResult("Salix", null, this.rows), problems);
+            results.addResult(new SalixLineCalculationNoScenarioResult("Salix", this.rows), problems);
     }
 
     /**
@@ -128,16 +132,35 @@
     private ResultRow createRow(final double station) {
 
         final ResultRow row = ResultRow.create();
+        // Find station's gauge
         final Gauge gauge = this.riverInfoProvider.getGauge(station, true);
         row.putValue(GeneralResultType.station, station);
+        // Interpolate mnw, mw, and mhw
         final double mnw = interpolateW(station, this.gaugeMnwPos.get(gauge));
         final double mw = interpolateW(station, this.gaugeMwPos.get(gauge));
         final double mhw = interpolateW(station, this.gaugeMhwPos.get(gauge));
         row.putValue(SInfoResultType.waterlevel, mnw);
         row.putValue(SInfoResultType.waterlevel1, mw);
         row.putValue(SInfoResultType.waterlevel2, mhw);
+        // Calc salix-line and mw-mnw
         row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw));
         row.putValue(UInfoResultType.salix_delta_mw, calcMwmnw(mw, mnw));
+        // Calc scenario values (always all scenario types set, Result variant extracts the fields needed)
+        final List<SalixScenario> scenarios = new ArrayList<>();
+        final double[] deltaws = getDeltaWs(station);
+        for (int i = 0; i <= deltaws.length - 1; i++) {
+            if (Math.abs(deltaws[i]) < 0.0001) {
+                row.putValue(UInfoResultType.salix_line_scenario, Double.NaN);
+                row.putValue(UInfoResultType.salix_line_scenario_dwspl, 0); // TODO NaN when changed from int to double
+            }
+            else {
+                final double salix = calcSalix(mhw, mw + deltaws[i]);
+                row.putValue(UInfoResultType.salix_line_scenario, salix);
+                row.putValue(UInfoResultType.salix_line_scenario_dwspl, (int) (deltaws[i] * 100));
+                scenarios.add(new SalixScenario((int) (deltaws[i] * 100), salix));
+            }
+        }
+        row.putValue(UInfoResultType.customMultiRowColSalixRegionalValue_Dwspl, scenarios);
         return row;
     }
 
@@ -164,4 +187,19 @@
     private double calcMwmnw(final double mw, final double mnw) {
         return mnw - mw;
     }
+
+    /**
+     * Gets the station-specific list of delta-ws of the active scenario, at least with one 0 item in any case
+     */
+    private double[] getDeltaWs(final double station) {
+        final Entry<Double, List<Double>> stationScenarios = this.rangeScenarios.floorEntry(station);
+        if (stationScenarios == null)
+            return new double[] { 0.0 };
+        else {
+            final double[] deltaws = new double[stationScenarios.getValue().size()];
+            for (int i = 0; i <= stationScenarios.getValue().size() - 1; i++)
+                deltaws[i] = stationScenarios.getValue().get(i);
+            return deltaws;
+        }
+    }
 }

http://dive4elements.wald.intevation.org