Mercurial > dive4elements > river
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.");