comparison artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java @ 9361:2aec052d4088

Refactoring on SalixLineCalculationResult etc., calculation using MQ etc., scenario (regional+supra) csv columns and meta data added
author mschaefer
date Wed, 01 Aug 2018 18:01:11 +0200
parents a978b601a034
children 2da486c7c05f
comparison
equal deleted inserted replaced
9360:ddcd52d239cd 9361:2aec052d4088
15 import java.util.TreeMap; 15 import java.util.TreeMap;
16 16
17 import org.apache.commons.lang.math.DoubleRange; 17 import org.apache.commons.lang.math.DoubleRange;
18 import org.dive4elements.artifacts.CallContext; 18 import org.dive4elements.artifacts.CallContext;
19 import org.dive4elements.river.artifacts.access.RangeAccess; 19 import org.dive4elements.river.artifacts.access.RangeAccess;
20 import org.dive4elements.river.artifacts.common.GeneralResultType;
20 import org.dive4elements.river.artifacts.model.Calculation; 21 import org.dive4elements.river.artifacts.model.Calculation;
21 import org.dive4elements.river.artifacts.model.CalculationResult; 22 import org.dive4elements.river.artifacts.model.CalculationResult;
22 import org.dive4elements.river.artifacts.resources.Resources; 23 import org.dive4elements.river.artifacts.resources.Resources;
23 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; 24 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider;
24 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; 25 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
59 final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, range); 60 final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, range);
60 61
61 final SalixLineCalculator calculator = new SalixLineCalculator(riverInfoProvider); 62 final SalixLineCalculator calculator = new SalixLineCalculator(riverInfoProvider);
62 final NavigableMap<Double, List<Double>> rangeScenarios = buildRangeScenarios(accessSalix); 63 final NavigableMap<Double, List<Double>> rangeScenarios = buildRangeScenarios(accessSalix);
63 64
64 calculator.execute(problems, uinfo, rangeScenarios, scenarioType, buildScenarioLabels(accessSalix), results); 65 calculator.execute(problems, uinfo, rangeScenarios, scenarioType, buildScenarioLabels(accessSalix), buildPartialRangeString(accessSalix),
65 66 buildAdditionalString(accessSalix), results);
66 // final Collection<ResultRow> rows = new ArrayList<>(); 67
67 // SalixLineCalculationNoScenarioResult result = null; // verzweigung etwas ungünstig. möglicherweise auch die
68 // Abstraktion. ist erstmal nur ne idee
69 // final ResultRow row1 = ResultRow.create(). //
70 // putValue(BunduResultType.station, 100).//
71 // putValue(UInfoResultType.salixline, 28).//
72 // putValue(UInfoResultType.salix_delta_mw, 2);
73 //
74 // if (!useScenario) {
75 //
76 // rows.add(row1);
77 // result = new SalixLineCalculationNoScenarioResult("Ergebnis 1", null, rows);
78 // } else {
79 //
80 // if (scenario.equals("scenarioType.option1")) { // REGIONAL
81 //
82 // final int[] scenarios = accessSalix.getRegionalScenarioIntegers();
83 // final List<SalixScenario> list = new ArrayList<>();
84 // for (final int scen_val : scenarios) {
85 // list.add(new SalixScenario(scen_val, 666.));// TODO: replace 666 by real calculated value
86 // }
87 // row1.putValue(UInfoResultType.customMultiRowColSalixRegionalValue_Dwspl, list);//
88 // rows.add(row1);
89 // result = new SalixLineCalculationRegionalResult("Ergebnis 1 regional test", null, rows, scenarios);
90 //
91 // } else if (scenario.equals("scenarioType.option2")) { // SUPRA-REGIONAL
92 //
93 // final String supraRegional = accessSalix.getSupraRegionalString();
94 // final List<SalixZone> list = SalixZone.parse(supraRegional);
95 //
96 // final Map<DoubleRange, SalixScenario> rangeScenarioMap = new HashMap<>();
97 // // make double range
98 // for (int i = 0; i < list.size(); i++) {
99 // final SalixZone zone = list.get(i);
100 // final double upper = i < list.size() - 1 ? (zone.getUpperFromTo() - 0.0001) : zone.getUpperFromTo() + 0.0001;//
101 // "halboffenes Intervall
102 //
103 // final DoubleRange zonerange = new DoubleRange((double) zone.getLowerFromTo(), upper);
104 // final double salixValue = 666.;// TODO: calculate the salix value
105 // final SalixScenario salixscen = new SalixScenario(zone.getDwsplValue(), salixValue);
106 //
107 // rangeScenarioMap.put(zonerange, salixscen);
108 // }
109 //
110 // // make calculation
111 // double currentKm = range.getMinimumDouble();
112 // final double step = 0.1; // TODO: get from global setting?
113 // while (currentKm < range.getMaximumDouble()) {
114 // final ResultRow rowSupraRegional = ResultRow.create(). //
115 // putValue(BunduResultType.station, currentKm).//
116 // putValue(UInfoResultType.salixline, 28).//
117 // putValue(UInfoResultType.salix_delta_mw, 2);
118 //
119 // final SalixScenario scenarioCurrentKm = findScenarioByKm(currentKm, rangeScenarioMap);
120 //
121 // if (scenarioCurrentKm != null) { // should not happen, scenarioCurrentKm == null -> BUG
122 // rowSupraRegional.putValue(UInfoResultType.salix_line_scenario, scenarioCurrentKm.getSalixValue());
123 // rowSupraRegional.putValue(UInfoResultType.salix_line_scenario_dwspl, scenarioCurrentKm.getDwspl());
124 // }
125 // rows.add(rowSupraRegional);
126 //
127 // currentKm = currentKm + step;
128 // }
129 //
130 // result = new SalixLineCalculationSupraRegionalResult("Ergebnis 1 supra regional test", null, rows);
131 //
132 // } else if (scenario.equals("scenarioType.option3")) { // HISTORICAL
133 // row1.putValue(UInfoResultType.salixlinehist, 66).//
134 // putValue(UInfoResultType.salix_line_scenario_dwspl, 88);
135 // rows.add(row1);
136 // result = new SalixLineCalculationHistoricalResult("Ergebnis 1 historical test", null, rows);
137 // }
138 // }
139 // results.addResult(result, problems);
140 return new CalculationResult(results, problems); 68 return new CalculationResult(results, problems);
141 } 69 }
142 70
143 /** 71 /**
144 * Build a map of delta-Ws by km-range for the selected scenario 72 * Build a map of delta-Ws by from-km for the selected scenario
145 */ 73 */
146 private NavigableMap<Double, List<Double>> buildRangeScenarios(final SalixLineAccess access) { 74 private NavigableMap<Double, List<Double>> buildRangeScenarios(final SalixLineAccess access) {
147 final NavigableMap<Double, List<Double>> rangeScenarios = new TreeMap<>(); 75 final NavigableMap<Double, List<Double>> rangeScenarios = new TreeMap<>();
148 if (access.getScenario() == ScenarioType.REGIONAL) 76 if (access.getScenario() == ScenarioType.REGIONAL)
149 fillRangeScenarios(rangeScenarios, access, access.getFromPart().doubleValue(), access.getToPart().doubleValue(), 77 fillRangeScenarios(rangeScenarios, access, access.getFromPart().doubleValue(), access.getToPart().doubleValue(),
205 final int[] deltaws = access.getRegionalScenarioIntegers(); 133 final int[] deltaws = access.getRegionalScenarioIntegers();
206 for (int i = 0; i <= deltaws.length - 1; i++) 134 for (int i = 0; i <= deltaws.length - 1; i++)
207 if (deltaws[i] != 0) 135 if (deltaws[i] != 0)
208 labels.add(Integer.toString(deltaws[i]) + " cm"); 136 labels.add(Integer.toString(deltaws[i]) + " cm");
209 } 137 }
138 else if (access.getScenario() == ScenarioType.SUPRAREGIONAL)
139 labels.add(Resources.getMsg(this.context.getMeta(), "uinfo_salix_scenario_supraregional"));
140 else if (access.getScenario() == ScenarioType.HISTORICAL)
141 labels.add(Resources.getMsg(this.context.getMeta(), "uinfo_salix_scenario_historical"));
210 return labels.toArray(new String[labels.size()]); 142 return labels.toArray(new String[labels.size()]);
211 } 143 }
144
145 /**
146 * Build the km range string for the scenario type
147 */
148 private String buildPartialRangeString(final SalixLineAccess access) {
149 if ((access.getScenario() == ScenarioType.REGIONAL) || (access.getScenario() == ScenarioType.HISTORICAL)) {
150 return String.format("%s - %s", GeneralResultType.station.exportValue(this.context, access.getFromPart().doubleValue()),
151 GeneralResultType.station.exportValue(this.context, access.getToPart().doubleValue()));
152 }
153 if (access.getScenario() == ScenarioType.SUPRAREGIONAL) {
154 String ranges = "";
155 String sep = "";
156 final List<SalixZone> parts = SalixZone.parse(access.getSupraRegionalString());
157 for (final SalixZone part : parts) {
158 if (part.getDwsplValue() != 0) {
159 ranges = ranges + sep + String.format("%s - %s", GeneralResultType.station.exportValue(this.context, part.getFromKm().doubleValue()),
160 GeneralResultType.station.exportValue(this.context, part.getToKm().doubleValue()));
161 sep = ", ";
162 }
163 }
164 return ranges;
165 }
166 return "";
167 }
168
169 /**
170 * Build the delta w or time string for the scenario type
171 */
172 private String buildAdditionalString(final SalixLineAccess access) {
173 if (access.getScenario() == ScenarioType.REGIONAL) {
174 String deltas = "";
175 String sep = "";
176 for (final int d : access.getRegionalScenarioIntegers()) {
177 deltas = deltas + sep + Integer.toString(d);
178 sep = ", ";
179 }
180 return deltas;
181 }
182 if (access.getScenario() == ScenarioType.HISTORICAL) {
183 if (access.getYear() != null)
184 return access.getYear().toString();
185 else
186 return access.getEpoch().toString();
187 }
188 if (access.getScenario() == ScenarioType.SUPRAREGIONAL) {
189 String deltas = "";
190 String sep = "";
191 final List<SalixZone> parts = SalixZone.parse(access.getSupraRegionalString());
192 for (final SalixZone part : parts) {
193 if (part.getDwsplValue() != 0) {
194 deltas = deltas + sep + Integer.toString(part.getDwsplValue());
195 sep = ", ";
196 }
197 }
198 return deltas;
199 }
200 return "";
201 }
212 } 202 }

http://dive4elements.wald.intevation.org