diff artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelFetcher.java @ 8964:45f1ad66560e

Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
author gernotbelger
date Thu, 29 Mar 2018 15:48:17 +0200
parents 708f210ff242
children 392745cccede
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelFetcher.java	Wed Mar 28 17:04:20 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelFetcher.java	Thu Mar 29 15:48:17 2018 +0200
@@ -13,6 +13,7 @@
 import java.util.Date;
 import java.util.List;
 
+import org.apache.commons.lang.math.DoubleRange;
 import org.apache.log4j.Logger;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.D4EArtifact;
@@ -44,8 +45,12 @@
 public class WaterlevelFetcher {
     private static Logger log = Logger.getLogger(WaterlevelFetcher.class);
 
-    public WaterlevelData findWaterlevel(final CallContext context, final String mingle, final double from,
-            final double to, final Calculation problems) {
+    /**
+     * @param simulationRange
+     *            This range is used to check if the found waterlevel covers it. It is NOT used to reduce the fetched data,
+     *            because in case of waterlevels we always need to full set in order to determine the relevant gauge.
+     */
+    public WaterlevelData findWaterlevel(final CallContext context, final String mingle, final DoubleRange simulationRange, final Calculation problems) {
 
         final String[] def = mingle.split(";");
         final String uuid = def[0];
@@ -53,21 +58,25 @@
         final int idx = Integer.parseInt(def[2]);
         final String name = def[3];
         final D4EArtifact d4eArtifact = RiverUtils.getArtifact(uuid, context);
+        if (d4eArtifact == null)
+            return null;
 
-        final WaterlevelData data = fetchWaterlevelFromArtifact(context, d4eArtifact, idx, from, to);
-        if (data != null)
-            return data.withName(name);
+        final WaterlevelData data = fetchWaterlevelFromArtifact(context, d4eArtifact, idx, Double.NaN, Double.NaN);
+        if (data == null) {
+            problems.addProblem("waterlevelfetcher.missing", mingle);
+            return null;
+        }
 
-        problems.addProblem("waterlevelfetcher.missing'", mingle);
-        return null;
+        if (!data.covers(simulationRange)) {
+            problems.addProblem("waterlevelfetcher.empty", data.getName());
+            return null;
+        }
+
+        return data.withName(name);
     }
 
-    private WaterlevelData fetchWaterlevelFromArtifact(final CallContext context, final D4EArtifact d4eArtifact,
-            final int idx, final double from, final double to) {
-        if (d4eArtifact == null) {
-            log.warn("One of the artifacts (1) for diff calculation " + "could not be loaded");
-            return null;
-        }
+    private WaterlevelData fetchWaterlevelFromArtifact(final CallContext context, final D4EArtifact d4eArtifact, final int idx, final double from,
+            final double to) {
 
         if (d4eArtifact instanceof StaticWKmsArtifact) {
             return fetchStaticWKmsArtifactWaterlevel((StaticWKmsArtifact) d4eArtifact, idx, from, to);
@@ -83,7 +92,7 @@
         if (d4eArtifact instanceof FixationArtifact)
             return fetchFixationArtifactWaterlevel(context, (FixationArtifact) d4eArtifact, idx, from, to);
 
-        log.warn(String.format("Get Waterlevel from %s not implemented! )", d4eArtifact.getClass().getSimpleName()));
+        log.warn(String.format("Get Waterlevel from %s not implemented!", d4eArtifact.getClass().getSimpleName()));
         return null;
     }
 
@@ -91,15 +100,13 @@
     // this logic back to the corresponding artifacts. However this will most certainly break existing
     // artifact-serialization
 
-    private WaterlevelData fetchStaticWKmsArtifactWaterlevel(final StaticWKmsArtifact staticWKms, final int idx,
-            final double from, final double to) {
+    private WaterlevelData fetchStaticWKmsArtifactWaterlevel(final StaticWKmsArtifact staticWKms, final int idx, final double from, final double to) {
 
         log.debug("WDifferencesState obtain data from StaticWKms");
 
         final WKms wkms = staticWKms.getWKms(idx, from, to);
 
-        if (wkms != null)
-        {
+        if (wkms != null) {
             final int year = fetchStaticWKmsYear(staticWKms);
             return new WaterlevelData(wkms, year);
         }
@@ -108,15 +115,13 @@
         return null;
     }
 
-    private WaterlevelData fetchStaticWQKmsArtifactWaterlevel(final StaticWQKmsArtifact staticWKms, final double from,
-            final double to) {
+    private WaterlevelData fetchStaticWQKmsArtifactWaterlevel(final StaticWQKmsArtifact staticWKms, final double from, final double to) {
 
         log.debug("WDifferencesState obtain data from StaticWQKms");
 
         final WQKms wkms = staticWKms.getWQKms(from, to);
 
-        if (wkms != null)
-        {
+        if (wkms != null) {
             final int year = fetchStaticWKmsYear(staticWKms);
             return new WaterlevelData(wkms, year);
         }
@@ -125,8 +130,8 @@
         return null;
     }
 
-    private WaterlevelData fetchWINFOArtifactWaterlevel(final CallContext context, final WINFOArtifact flys,
-            final int idx, final double from, final double to) {
+    private WaterlevelData fetchWINFOArtifactWaterlevel(final CallContext context, final WINFOArtifact flys, final int idx, final double from,
+            final double to) {
         log.debug("Get WKms from WINFOArtifact");
 
         final WKms[] wkms = (WKms[]) flys.getWaterlevelData(context).getData();
@@ -146,8 +151,8 @@
         return new WaterlevelData(wkms[idx], year).filterByRange(from, to);
     }
 
-    private WaterlevelData fetchFixationArtifactWaterlevel(final CallContext context,
-            final FixationArtifact fixation, final int idx, final double from, final double to) {
+    private WaterlevelData fetchFixationArtifactWaterlevel(final CallContext context, final FixationArtifact fixation, final int idx, final double from,
+            final double to) {
 
         log.debug("Get WKms from FixationArtifact.");
 

http://dive4elements.wald.intevation.org