diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java @ 9533:d9fda7af24ca

No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
author mschaefer
date Thu, 04 Oct 2018 12:48:57 +0200
parents 853f2dafc16e
children 0c114309d2a0
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java	Tue Oct 02 18:19:44 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java	Thu Oct 04 12:48:57 2018 +0200
@@ -24,7 +24,6 @@
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.CalculationResult;
 import org.dive4elements.river.artifacts.model.DateRange;
-import org.dive4elements.river.artifacts.model.river.RiverInfoProvider;
 import org.dive4elements.river.artifacts.resources.Resources;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.common.GaugeDischargeValuesFinder;
@@ -33,7 +32,6 @@
 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
 import org.dive4elements.river.backend.utils.DateUtil;
-import org.dive4elements.river.model.Gauge;
 import org.dive4elements.river.model.MainValueType.MainValueTypeKey;
 import org.dive4elements.river.model.River;
 import org.dive4elements.river.model.sinfo.CollisionAggregateValue;
@@ -88,19 +86,12 @@
                 overViewRows);
         results.addResult(overviewResult, problems);
 
-        // create q-for-w-finders for all gauges of the calculation km range
-        final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange);
-        final Map<Gauge, GaugeDischargeValuesFinder> qFinders = new HashMap<>();
-        final Map<Gauge, GaugeMainValueFinder> zoneFinders = new HashMap<>();
-        for (final Gauge gauge : river.determineGauges(calcRange.getMinimumDouble(), calcRange.getMaximumDouble())) {
-            qFinders.put(gauge, GaugeDischargeValuesFinder.loadValues(gauge, problems));
-            zoneFinders.put(gauge, GaugeMainValueFinder.loadValues(MainValueTypeKey.Q, gauge, problems));
-        }
+        // calculate secondary results for each year
+        final Map<String, GaugeDischargeValuesFinder> qFinders = new HashMap<>();
+        final Map<String, GaugeMainValueFinder> zoneFinders = new HashMap<>();
         final Collection<ResultRow> detailsRows = new ArrayList<>();
-
-        // calculate secondary results for each year
         for (final Integer year : detailYears)
-            calculateDetails(detailsRows, infoProvider, access.getLowerKm(), access.getUpperKm(), year, qFinders, zoneFinders);
+            calculateDetails(detailsRows, river, access.getLowerKm(), access.getUpperKm(), year, qFinders, zoneFinders, problems);
         final CollisionCalcDetailResult detailResult = new CollisionCalcDetailResult("Details", detailsRows);
         results.addResult(detailResult, problems);
 
@@ -145,17 +136,52 @@
     /**
      * Calculates the collision details for a km range of a river and a year, and adds them to a ResultRow collection
      */
-    private void calculateDetails(final Collection<ResultRow> rows, final RiverInfoProvider riverInfo, final double fromKm, final double toKm,
-            final int year, final Map<Gauge, GaugeDischargeValuesFinder> qFinders, final Map<Gauge, GaugeMainValueFinder> zoneFinders) {
-        for (final CollisionValue collision : CollisionValue.getValues(riverInfo.getRiver(), fromKm, toKm, DateUtil.getStartDateFromYear(year),
+    private void calculateDetails(final Collection<ResultRow> rows, final River river, final double fromKm, final double toKm,
+            final int year, final Map<String, GaugeDischargeValuesFinder> qFinders, final Map<String, GaugeMainValueFinder> zoneFinders,
+            final Calculation problems) {
+
+        for (final CollisionValue collision : CollisionValue.getValues(river, fromKm, toKm, DateUtil.getStartDateFromYear(year),
                 DateUtil.getEndDateFromYear(year))) {
-            final Gauge gauge = riverInfo.getGauge(collision.getStation(), true);
-            final double q = qFinders.get(gauge).getDischarge(collision.getGaugeW());
+            final String gaugeName = collision.getGaugeName();
+            final double q = getQ(qFinders, gaugeName, collision.getGaugeW().doubleValue(), river, problems);
             final double qOut = Double.isInfinite(q) ? Double.NaN : q;
+            final String zone = getZone(zoneFinders, gaugeName, q, river, problems);
             rows.add(ResultRow.create().putValue(GeneralResultType.station, collision.getStation())
-                    .putValue(GeneralResultType.dateShort, collision.getEventDate()).putValue(SInfoResultType.collisionGaugeW, collision.getGaugeW())
-                    .putValue(GeneralResultType.gaugeLabelCm, collision.getGaugeName()).putValue(SInfoResultType.dischargeLong, qOut)
-                    .putValue(SInfoResultType.dischargeZone, zoneFinders.get(gauge).findZoneName(q)));
+                    .putValue(GeneralResultType.dateShort, collision.getEventDate())
+                    .putValue(SInfoResultType.collisionGaugeW, collision.getGaugeW())
+                    .putValue(GeneralResultType.gaugeLabelCm, gaugeName)
+                    .putValue(SInfoResultType.dischargeLong, qOut)
+                    .putValue(SInfoResultType.dischargeZone, zone));
         }
     }
+
+    /**
+     * Gets the discharge of a gauge and a W
+     */
+    private double getQ(final Map<String, GaugeDischargeValuesFinder> qFinders, final String gaugeName, final double w,
+            final River river, final Calculation problems) {
+        // Find the gauge and load its discharge table, if not already in the map
+        final String gnKey = gaugeName.toLowerCase();
+        if (!qFinders.containsKey(gnKey))
+            qFinders.put(gnKey, GaugeDischargeValuesFinder.loadValues(river, gaugeName, problems));
+        // Interpolate W.
+        if (qFinders.get(gnKey) == null)
+            return Double.NaN;
+        return qFinders.get(gnKey).getDischarge(w);
+    }
+
+    /**
+     * Gets the main value zone name of a gauge and a Q
+     */
+    private String getZone(final Map<String, GaugeMainValueFinder> zoneFinders, final String gaugeName, final double q,
+            final River river, final Calculation problems) {
+        // Find the gauge and load its main value list, if not already in the map
+        final String gnKey = gaugeName.toLowerCase();
+        if (!zoneFinders.containsKey(gnKey))
+            zoneFinders.put(gnKey, GaugeMainValueFinder.loadValues(MainValueTypeKey.Q, river, gaugeName, problems));
+        // Build the zone name
+        if (zoneFinders.get(gnKey) == null)
+            return "";
+        return zoneFinders.get(gnKey).findZoneName(q);
+    }
 }
\ No newline at end of file

http://dive4elements.wald.intevation.org