Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9321:a978b601a034
Salix: Fixed ArrrayoutOfBoundsException; minor cleanup
author | gernotbelger |
---|---|
date | Fri, 27 Jul 2018 10:25:09 +0200 |
parents | 72b3270e1568 |
children | b3d3c958a594 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Fri Jul 27 10:19:38 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Fri Jul 27 10:25:09 2018 +0200 @@ -16,7 +16,6 @@ import java.util.Map.Entry; import java.util.NavigableMap; -import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.WINFOArtifact; import org.dive4elements.river.artifacts.access.ComputationRangeAccess; import org.dive4elements.river.artifacts.common.GeneralResultType; @@ -41,14 +40,12 @@ * * @author Matthias Schäfer */ -public class SalixLineCalculator { +final class SalixLineCalculator { private final List<ResultRow> rows = new ArrayList<>(); private final RiverInfoProvider riverInfoProvider; - private final CallContext context; - private final Map<Gauge, QPosition> gaugeMwPos; private final Map<Gauge, QPosition> gaugeMnwPos; private final Map<Gauge, QPosition> gaugeMhwPos; @@ -57,21 +54,13 @@ private WstValueTable wst; - /** - * List of delta-w (may be 0) mapped by km range - */ - private NavigableMap<Double, List<Double>> rangeScenarios; - - - public SalixLineCalculator(final CallContext context, final RiverInfoProvider riverInfoProvider) { - this.context = context; + public SalixLineCalculator(final RiverInfoProvider riverInfoProvider) { this.riverInfoProvider = riverInfoProvider; this.gaugeMwPos = new HashMap<>(); this.gaugeMnwPos = new HashMap<>(); this.gaugeMhwPos = new HashMap<>(); } - /** * Calculate the salix line result rows */ @@ -80,7 +69,6 @@ this.problems = problems; this.wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver()); - this.rangeScenarios = rangeScenarios; fetchGaugeMainValuePositions(); @@ -88,7 +76,7 @@ winfo.addStringData("ld_mode", "distance"); winfo.addStringData("ld_step", "100"); for (final double station : new ComputationRangeAccess(winfo).getKms()) { - this.rows.add(createRow(station)); + this.rows.add(createRow(station, rangeScenarios)); } if (scenarioType == ScenarioType.REGIONAL) results.addResult(new SalixLineCalculationRegionalResult("Salix", scenarioLabels, this.rows), problems); @@ -128,8 +116,10 @@ /** * Create a result row for a station and its gauge, and add w-q-values as selected + * + * @param rangeScenarios2 */ - private ResultRow createRow(final double station) { + private ResultRow createRow(final double station, final NavigableMap<Double, List<Double>> rangeScenarios) { final ResultRow row = ResultRow.create(); // Find station's gauge @@ -147,13 +137,14 @@ 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); + final double[] deltaws = getDeltaWs(station, rangeScenarios); 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 { + /* always need to add a member, so the exporter will produce empty columns */ + scenarios.add(null); + } 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)); @@ -170,8 +161,8 @@ private double interpolateW(final double station, final QPosition qPosition) { if (qPosition != null) return this.wst.interpolateW(station, qPosition, this.problems); - else - return Double.NaN; + + return Double.NaN; } /** @@ -190,16 +181,17 @@ /** * Gets the station-specific list of delta-ws of the active scenario, at least with one 0 item in any case + * + * @param rangeScenarios */ - private double[] getDeltaWs(final double station) { - final Entry<Double, List<Double>> stationScenarios = this.rangeScenarios.floorEntry(station); + private double[] getDeltaWs(final double station, final NavigableMap<Double, List<Double>> rangeScenarios) { + final Entry<Double, List<Double>> stationScenarios = 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; - } + + 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; } -} +} \ No newline at end of file