# HG changeset patch # User mschaefer # Date 1532539765 -7200 # Node ID 9a9f076d5716c0cc69711f075cbf9df125f036f3 # Parent 9055afc19ec6aa9177a6e0735f60a927e9f1a098 Work on U-Info salix line calculation diff -r 9055afc19ec6 -r 9a9f076d5716 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java Wed Jul 25 19:28:54 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java Wed Jul 25 19:29:25 2018 +0200 @@ -32,6 +32,34 @@ // ld_from_part; ld_to_part // scenario_selection (mögliche Werte:"scenarioType.option1" "scenarioType.option2" "scenarioType.option3" + /** + * Type of a salix line scenario with key property used by the client + */ + public enum ScenarioType { + NONE(""), // + REGIONAL("scenarioType.option1"), // + SUPRAREGIONAL("scenarioType.option2"), // + HISTORICAL("scenarioType.option3"); + + private String key; + + private ScenarioType(final String key) { + this.key = key; + } + + public static ScenarioType forKey(final String key) { + for (final ScenarioType st : ScenarioType.values()) { + if (st.getKey().equals(key)) + return st; + } + return NONE; + } + + public String getKey() { + return this.key; + } + } + public SalixLineAccess(final UINFOArtifact artifact) { super(artifact); @@ -44,11 +72,11 @@ return super.getBoolean("use_scenario"); } - public String getScenario() { - if (getUseScenario()) { - return getString("scenario_selection"); - } - return null; + public ScenarioType getScenario() { + if (getUseScenario()) + return ScenarioType.forKey(getString("scenario_selection")); + else + return ScenarioType.NONE; } public Double getFromPart() { diff -r 9055afc19ec6 -r 9a9f076d5716 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 Wed Jul 25 19:28:54 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java Wed Jul 25 19:29:25 2018 +0200 @@ -9,11 +9,16 @@ */ package org.dive4elements.river.artifacts.uinfo.salix; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; +import java.util.NavigableMap; +import java.util.TreeMap; import org.apache.commons.lang.math.DoubleRange; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.access.RangeAccess; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.resources.Resources; @@ -21,6 +26,7 @@ import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; +import org.dive4elements.river.artifacts.uinfo.salix.SalixLineAccess.ScenarioType; import org.dive4elements.river.model.River; /** @@ -46,27 +52,29 @@ final River river = accessSalix.getRiver(); final RiverInfo riverInfo = new RiverInfo(river); - final DoubleRange range = accessSalix.getRange(); - final boolean useScenario = accessSalix.getUseScenario(); - final String selectedScenario = accessSalix.getScenario(); - final Double fromPart = accessSalix.getFromPart(); - final Double toPart = accessSalix.getToPart(); - - final boolean useSCenario = accessSalix.getUseScenario(); - final String scenario = accessSalix.getScenario(); + // final DoubleRange range = accessSalix.getRange(); + // final boolean useScenario = accessSalix.getUseScenario(); + // final String selectedScenario = accessSalix.getScenario(); + // final Double fromPart = accessSalix.getFromPart(); + // final Double toPart = accessSalix.getToPart(); + // + // final boolean useSCenario = accessSalix.getUseScenario(); + // final String scenario = accessSalix.getScenario(); // calculation_mode // ld_from , ld_to // use_scenario (boolean) // ld_from_part; ld_to_part // scenario_selection (mögliche Werte:"scenarioType.option1" "scenarioType.option2" "scenarioType.option3" - final RiverInfoProvider riverInfoProvider = RiverInfoProvider.forRange(this.context, river, range); + final RiverInfoProvider riverInfoProvider = RiverInfoProvider.forRange(this.context, river, accessSalix.getRange()); // FIXME: real calculation - final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, range); + final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, accessSalix.getRange()); final SalixLineCalculator calculator = new SalixLineCalculator(this.context, riverInfoProvider); - calculator.execute(problems, uinfo, results); + final NavigableMap> rangeScenarios = buildRangeScenarios(accessSalix); + + calculator.execute(problems, uinfo, rangeScenarios, accessSalix.getScenario(), results); // final Collection rows = new ArrayList<>(); // SalixLineCalculationNoScenarioResult result = null; // verzweigung etwas ungünstig. möglicherweise auch die @@ -145,6 +153,61 @@ return new CalculationResult(results, problems); } + /** + * Build a map of delta-Ws by km-range for the selected scenario + */ + private NavigableMap> buildRangeScenarios(final SalixLineAccess access) { + final NavigableMap> rangeScenarios = new TreeMap<>(); + if (access.getScenario() == ScenarioType.REGIONAL) + fillRangeScenarios(rangeScenarios, access, access.getFromPart().doubleValue(), access.getToPart().doubleValue(), + access.getRegionalScenarioIntegers()); + else if (access.getScenario() == ScenarioType.SUPRAREGIONAL) + fillRangeScenarios(rangeScenarios, access.getSupraRegionalString()); + // TODO else if (access.getScenario().equals(ScenarioType.HISTORICAL.getKey())) + // historisches Szenario aus MSH etc. + else + fillRangeScenarios(rangeScenarios, access); + return rangeScenarios; + } + + /** + * Fill a map of delta-Ws with only one 0-delta for the whole calc range (no scenario) + */ + private void fillRangeScenarios(final NavigableMap> rangeScenarios, final RangeAccess calcRange) { + final List nulls = new ArrayList<>(); + nulls.add(0.0); + rangeScenarios.put(Double.valueOf(calcRange.getLowerKm() - 0.0001), nulls); + } + + /** + * Fill a map of delta-Ws by km-range from the regional scenario input data + */ + private void fillRangeScenarios(final NavigableMap> rangeScenarios, final RangeAccess calcRange, final double partFrom, + final double partTo, final int[] deltaWs) { + final List nulls = new ArrayList<>(); + final List dwsm = new ArrayList<>(); + for (int i = 0; i <= deltaWs.length - 1; i++) { + nulls.add(0.0); + dwsm.add(deltaWs[i] / 100.0); + } + rangeScenarios.put(Double.valueOf(calcRange.getLowerKm() - 0.0001), nulls); + rangeScenarios.put(Double.valueOf(partFrom - 0.0001), dwsm); + rangeScenarios.put(Double.valueOf(partTo + 0.0001), nulls); + } + + /** + * Fill a map of delta-Ws by km-range from the supraregional scenario input data + * (the zones input by the user cover the calc range completely) + */ + private void fillRangeScenarios(final NavigableMap> rangeScenarios, final String zones) { + final List parts = SalixZone.parse(zones); + for (final SalixZone part : parts) { + final List dwsm = new ArrayList<>(); + dwsm.add(part.getDwsplValue() / 100.0); + rangeScenarios.put(Double.valueOf(part.getFromKm().doubleValue() - 0.0001), dwsm); + } + } + private SalixScenario findScenarioByKm(final double km, final Map rangeScenarioMap) { final Iterator rangeIterator = rangeScenarioMap.keySet().iterator(); while (rangeIterator.hasNext()) { diff -r 9055afc19ec6 -r 9a9f076d5716 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationRegionalResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationRegionalResult.java Wed Jul 25 19:28:54 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculationRegionalResult.java Wed Jul 25 19:29:25 2018 +0200 @@ -26,11 +26,9 @@ final class SalixLineCalculationRegionalResult extends SalixLineCalculationNoScenarioResult { private static final long serialVersionUID = 1L; - private final int[] scenarioValues; - public SalixLineCalculationRegionalResult(final String label, final WstInfo wst, final Collection rows, final int[] scenarioValues) { + public SalixLineCalculationRegionalResult(final String label, final WstInfo wst, final Collection rows) { super(label, wst, rows); - this.scenarioValues = scenarioValues; // TODO: diese values müssen eigentlich nur ne anzahl sein, oder so. Ergibt sihc in der Berech } @Override @@ -38,12 +36,9 @@ final Collection header = super.writeNoScenarioHeader(exportContextCSV); - for (int i = 0; i < this.scenarioValues.length; i++) { - // index wurde verworfen, stattdessen 2 spalten + header.add(exportContextCSV.msg(SalixScenario.getScenarioValueHeader())); + header.add(exportContextCSV.msg(SalixScenario.getDwsplHeader())); - header.add(exportContextCSV.msg(SalixScenario.getScenarioValueHeader()) + " (" + (i + 1) + ")"); // index kann auch weg, war nur ne idee - header.add(exportContextCSV.msg(SalixScenario.getDwsplHeader()) + " (" + (i + 1) + ")"); - } exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); } diff -r 9055afc19ec6 -r 9a9f076d5716 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Wed Jul 25 19:28:54 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Wed Jul 25 19:29:25 2018 +0200 @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.NavigableMap; import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.WINFOArtifact; @@ -29,6 +30,7 @@ import org.dive4elements.river.artifacts.sinfo.tkhstate.WinfoArtifactWrapper; import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; import org.dive4elements.river.artifacts.uinfo.commons.UInfoResultType; +import org.dive4elements.river.artifacts.uinfo.salix.SalixLineAccess.ScenarioType; import org.dive4elements.river.model.Gauge; import org.dive4elements.river.model.MainValue; import org.dive4elements.river.model.MainValueType.MainValueTypeKey; @@ -54,6 +56,9 @@ private WstValueTable wst; + private NavigableMap> rangeScenarios; + + public SalixLineCalculator(final CallContext context, final RiverInfoProvider riverInfoProvider) { this.context = context; this.riverInfoProvider = riverInfoProvider; @@ -66,10 +71,12 @@ /** * Calculate the salix line result rows */ - public void execute(final Calculation problems, final UINFOArtifact uinfo, final SalixLineCalculationResults results) { + public void execute(final Calculation problems, final UINFOArtifact uinfo, final NavigableMap> rangeScenarios, + final ScenarioType scenarioType, final SalixLineCalculationResults results) { this.problems = problems; this.wst = WstValueTableFactory.getTable(this.riverInfoProvider.getRiver()); + this.rangeScenarios = rangeScenarios; fetchGaugeMainValuePositions(); @@ -79,7 +86,14 @@ for (final double station : new ComputationRangeAccess(winfo).getKms()) { this.rows.add(createRow(station)); } - results.addResult(new SalixLineCalculationNoScenarioResult("Salix", null, this.rows), problems); + if (scenarioType == ScenarioType.REGIONAL) + results.addResult(new SalixLineCalculationRegionalResult("Salix", null, this.rows), problems); + else if (scenarioType == ScenarioType.SUPRAREGIONAL) + results.addResult(new SalixLineCalculationSupraRegionalResult("Salix", null, this.rows), problems); + else if (scenarioType == ScenarioType.HISTORICAL) + results.addResult(new SalixLineCalculationHistoricalResult("Salix", null, this.rows), problems); + else + results.addResult(new SalixLineCalculationNoScenarioResult("Salix", null, this.rows), problems); } /**