# HG changeset patch # User mschaefer # Date 1549378078 -3600 # Node ID 5395c6d4ca509ee935e1389971d9a9979ace2302 # Parent fbfd66e8fb811753e030eb04bfe2dec4dbba927d Softwaretests...20181219 7.3: no interpolation of missing bed heights for Uinfo/Salix historical scenario and B&U/Bzws diff -r fbfd66e8fb81 -r 5395c6d4ca50 artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstDepthProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstDepthProcessor.java Tue Feb 05 15:43:27 2019 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstDepthProcessor.java Tue Feb 05 15:47:58 2019 +0100 @@ -90,7 +90,7 @@ return generateFieldDepthSeries(generator, bundle, theme, visible, fieldIndex); } - return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), null); + return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), GAP_DISTANCE); } protected AbstractResultType doGetType(final String facetName) { @@ -110,6 +110,6 @@ final BezugswstMainCalculationResult data = (BezugswstMainCalculationResult) getResult(generator, bundle); final double[][] points = data.getFieldValuePoints(fieldIndex, BunduResultType.depthFields); - return buildSeriesForPoints(points, generator, bundle, theme, visible, null); + return buildSeriesForPoints(points, generator, bundle, theme, visible, GAP_DISTANCE); } } \ No newline at end of file diff -r fbfd66e8fb81 -r 5395c6d4ca50 artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstHeightProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstHeightProcessor.java Tue Feb 05 15:43:27 2019 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstHeightProcessor.java Tue Feb 05 15:47:58 2019 +0100 @@ -94,7 +94,7 @@ return generateFieldHeightSeries(generator, bundle, theme, visible, fieldIndex); } - return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), null); + return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), GAP_DISTANCE); } protected AbstractResultType doGetType(final String facetName) { @@ -114,6 +114,6 @@ final BezugswstMainCalculationResult data = (BezugswstMainCalculationResult) getResult(generator, bundle); final double[][] points = data.getFieldValuePoints(fieldIndex, BunduResultType.bedHeightFields); - return buildSeriesForPoints(points, generator, bundle, theme, visible, null); + return buildSeriesForPoints(points, generator, bundle, theme, visible, GAP_DISTANCE); } } \ No newline at end of file diff -r fbfd66e8fb81 -r 5395c6d4ca50 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedHeightsFinder.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedHeightsFinder.java Tue Feb 05 15:43:27 2019 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/BedHeightsFinder.java Tue Feb 05 15:47:58 2019 +0100 @@ -44,6 +44,8 @@ private final boolean isNull; + private final boolean doInterpolate; + /** * Create bed level finders from a collection of bed levels. */ @@ -52,7 +54,22 @@ final List result = new ArrayList<>(bedHeights.size()); for (final BedHeight bedHeight : bedHeights) { - final BedHeightsFinder finder = createBedHeights(problems, bedHeight, range); + final BedHeightsFinder finder = createBedHeights(problems, bedHeight, range, true); + result.add(finder); + } + + return result; + } + + /** + * Create not-interpolated bed level finders from a collection of bed levels. + */ + public static Collection createScenarioBedHeights(final Calculation problems, final DoubleRange range, + final Collection bedHeights) { + final List result = new ArrayList<>(bedHeights.size()); + + for (final BedHeight bedHeight : bedHeights) { + final BedHeightsFinder finder = createBedHeights(problems, bedHeight, range, false); result.add(finder); } @@ -110,7 +127,22 @@ if (bedHeight == null) return null; - return BedHeightsFinder.createBedHeights(problems, bedHeight, range); + return BedHeightsFinder.createBedHeights(problems, bedHeight, range, true); + } + + /** + * Creates a interpolated or not-interpolated {@link BedHeightsFinder} for a dataset from the database, specified by its + * id. + * + * @return null if no bed level with the given id exists. + */ + public static BedHeightsFinder forId(final Calculation problems, final int id, final DoubleRange range, final boolean doInterpolate) { + + final BedHeight bedHeight = BedHeight.getBedHeightById(id); + if (bedHeight == null) + return null; + + return BedHeightsFinder.createBedHeights(problems, bedHeight, range, doInterpolate); } /** @@ -118,14 +150,15 @@ */ public static BedHeightsFinder NullFinder() { final NavigableMap values = new TreeMap<>(); - return new BedHeightsFinder(null, null, values, true); + return new BedHeightsFinder(null, null, values, true, false); } /** * Create a finder for a given bed level. * */ - private static BedHeightsFinder createBedHeights(final Calculation problems, final BedHeight bedHeight, final DoubleRange range) { + private static BedHeightsFinder createBedHeights(final Calculation problems, final BedHeight bedHeight, final DoubleRange range, + final boolean doInterpolate) { // FIXME: sort by station, but in what direction? // FIXME: using river.getKmUp()? @@ -142,14 +175,16 @@ final BedHeightInfo info = BedHeightInfo.from(bedHeight); - return new BedHeightsFinder(problems, info, values, false); + return new BedHeightsFinder(problems, info, values, false, doInterpolate); } - private BedHeightsFinder(final Calculation problems, final BedHeightInfo info, final NavigableMap values, final boolean isNull) { + private BedHeightsFinder(final Calculation problems, final BedHeightInfo info, final NavigableMap values, final boolean isNull, + final boolean doInterpolate) { this.info = info; this.values = values; this.problems = problems; this.isNull = isNull; + this.doInterpolate = doInterpolate; } /** @@ -207,13 +242,23 @@ if (floorEntry == null || ceilingEntry == null) return Double.NaN; + // return NaN if value not found and no-interpolation mode, and report once + if (!this.doInterpolate && (floorEntry != ceilingEntry)) { + if (this.problems != null) { + this.problems.addProblem(km, "sinfo.bedheightsfinder.missing_bedheights"); + this.problems = null; + } + return Double.NaN; + } + final double floorKm = floorEntry.getKey().doubleValue(); final double ceilKm = ceilingEntry.getKey().doubleValue(); - /* report once if the interpolation distance exceeds 1000m */ - if (Math.abs(floorKm - ceilKm) > MAX_DISTANCE_KM && this.problems != null) { - this.problems.addProblem(km, "linearInterpolator.maxdistance", MAX_DISTANCE_KM * 1000); - this.problems = null; + if (Math.abs(floorKm - ceilKm) > MAX_DISTANCE_KM) { + if (this.problems != null) { + this.problems.addProblem(km, "linearInterpolator.maxdistance", MAX_DISTANCE_KM * 1000); + this.problems = null; + } return Double.NaN; } diff -r fbfd66e8fb81 -r 5395c6d4ca50 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java Tue Feb 05 15:43:27 2019 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java Tue Feb 05 15:47:58 2019 +0100 @@ -156,11 +156,11 @@ if (defaultBedHeights.isEmpty()) return; final DoubleRange scenarioRange = new DoubleRange(partFrom, partTo); - final Collection allFinders = BedHeightsFinder.createTkhBedHeights(this.problems, scenarioRange, defaultBedHeights); + final Collection allFinders = BedHeightsFinder.createScenarioBedHeights(this.problems, scenarioRange, defaultBedHeights); final Collection currentFinders = new ArrayList<>(allFinders); // Add historical bed-heights - final BedHeightsFinder historicalFinder = BedHeightsFinder.forId(this.problems, historicalBedHeightId, scenarioRange); + final BedHeightsFinder historicalFinder = BedHeightsFinder.forId(this.problems, historicalBedHeightId, scenarioRange, false); allFinders.add(historicalFinder); final Collection stations = BedHeightsUtils.extractStationCollection(allFinders, true); final List nulls = new ArrayList<>(); diff -r fbfd66e8fb81 -r 5395c6d4ca50 artifacts/src/main/resources/messages.properties --- a/artifacts/src/main/resources/messages.properties Tue Feb 05 15:43:27 2019 +0100 +++ b/artifacts/src/main/resources/messages.properties Tue Feb 05 15:47:58 2019 +0100 @@ -806,6 +806,8 @@ sinfo.bedheightsfinder.configfile.loaderror = Failed to load config file ''{0}'': {1} sinfo.bedheightsfinder.notfound = Failed to access sounding with id ''{0}'' sinfo.bedheightsfinder.empty = The bed levels do not contain any values for the selected calculation stretch +sinfo.bedheightsfinder.missing_bedheights = Missing bed levels + sinfo.bedqualityd50config.configfile.loaderror = Failed to read config file ''{0}'' which contains period specs for D50 bed diameter calculation: {1} sinfo_calc_flow_depth_development=Flow Depth Development diff -r fbfd66e8fb81 -r 5395c6d4ca50 artifacts/src/main/resources/messages_de.properties --- a/artifacts/src/main/resources/messages_de.properties Tue Feb 05 15:43:27 2019 +0100 +++ b/artifacts/src/main/resources/messages_de.properties Tue Feb 05 15:47:58 2019 +0100 @@ -806,6 +806,8 @@ sinfo.bedheightsfinder.configfile.loaderror = Fehler beim Laden der Konfigurationsdatei ''{0}'': {1} sinfo.bedheightsfinder.notfound = Keine Sohlh\u00f6he mit id ''{0}'' vorhanden sinfo.bedheightsfinder.empty = Die Sohlh\u00f6hen enthalten keine Werte f\u00fcr die gew\u00e4hlte Berechnungsstrecke +sinfo.bedheightsfinder.missing_bedheights = Es fehlen Sohlh\u00f6hen + sinfo.bedqualityd50config.configfile.loaderror = Fehler beim Auslesen der Datei ''{0}'' zur Spezifikation der Zeitr\u00e4ume zur Berechnung der D50-Sohlkorndurchmesser: {1} sinfo_calc_flow_depth_development=Flie\u00dftiefenentwicklung