Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation6.java @ 5914:1058b3436dad
D4E river artifacts: Removed historical discharge calculation from WINFO artifact and use access instead.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Tue, 07 May 2013 17:32:33 +0200 |
parents | 4897a58c8746 |
children | 46e85199b667 |
comparison
equal
deleted
inserted
replaced
5913:37a0f4f7c54f | 5914:1058b3436dad |
---|---|
17 | 17 |
18 import org.dive4elements.river.model.DischargeTable; | 18 import org.dive4elements.river.model.DischargeTable; |
19 import org.dive4elements.river.model.Gauge; | 19 import org.dive4elements.river.model.Gauge; |
20 import org.dive4elements.river.model.TimeInterval; | 20 import org.dive4elements.river.model.TimeInterval; |
21 | 21 |
22 import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess; | |
23 import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess.EvaluationMode; | |
24 | |
22 | 25 |
23 /** | 26 /** |
24 * Historical Discharge Calculation. | 27 * Historical Discharge Calculation. |
25 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | 28 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> |
26 */ | 29 */ |
27 public class Calculation6 extends Calculation { | 30 public class Calculation6 extends Calculation { |
28 | 31 |
29 private static final Logger logger = Logger.getLogger(Calculation6.class); | 32 private static final Logger log = Logger.getLogger(Calculation6.class); |
30 | 33 |
31 private int mode; | 34 private int mode; |
32 private long[] timerange; | 35 private long [] timerange; |
33 private double[] values; | 36 private double [] values; |
34 | 37 private Long officialGaugeNumber; |
35 public static final int MODE_W = 0; | 38 |
36 public static final int MODE_Q = 1; | |
37 | 39 |
38 public static final double SCALE = 1d; | 40 public static final double SCALE = 1d; |
41 | |
42 public Calculation6(HistoricalDischargeAccess access) { | |
43 EvaluationMode mode = access.getEvaluationMode(); | |
44 Timerange tr = access.getEvaluationTimerange(); | |
45 double [] vs = mode != null && mode == EvaluationMode.W | |
46 ? access.getWs() | |
47 : access.getQs(); | |
48 | |
49 Long officialGaugeNumber = access.getOfficialGaugeNumber(); | |
50 | |
51 if (mode == null) { | |
52 // TODO: i18n | |
53 addProblem("hist.discharge.mode.not.set"); | |
54 } | |
55 if (tr == null) { | |
56 // TODO: i18n | |
57 addProblem("hist.discharge.time.interval.not.set"); | |
58 } | |
59 if (vs == null || vs.length == 0) { | |
60 // TODO: i18n | |
61 addProblem("hist.discharge.values.not.set"); | |
62 } | |
63 | |
64 if (officialGaugeNumber == null) { | |
65 // TODO: i18n | |
66 addProblem("hist.discharge.reference.gauge.not.set"); | |
67 } | |
68 | |
69 if (!hasProblems()) { | |
70 set( | |
71 mode.getMode(), | |
72 new long [] { tr.getStart(), tr.getEnd()}, | |
73 values, | |
74 officialGaugeNumber); | |
75 } | |
76 } | |
77 | |
78 protected void set( | |
79 int mode, | |
80 long [] timerange, | |
81 double [] values, | |
82 Long officialGaugeNumber | |
83 ) { | |
84 this.mode = mode; | |
85 this.timerange = timerange; | |
86 this.values = values; | |
87 this.officialGaugeNumber = officialGaugeNumber; | |
88 } | |
39 | 89 |
40 public Calculation6(int mode, long[] timerange, double[] values) { | 90 public Calculation6(int mode, long[] timerange, double[] values) { |
41 this.mode = mode; | 91 this.mode = mode; |
42 this.timerange = timerange; | 92 this.timerange = timerange; |
43 this.values = values; | 93 this.values = values; |
44 } | 94 } |
45 | 95 |
46 public CalculationResult calculate(Gauge gauge) { | 96 public CalculationResult calculate() { |
47 if (!checkParameters() || gauge == null) { | 97 if (hasProblems()) { |
48 logger.warn("Parameters not valid for calculation."); | 98 log.warn("Parameters not valid for calculation."); |
49 | |
50 return null; | 99 return null; |
51 } | 100 } |
52 | 101 |
53 if (logger.isDebugEnabled()) { | 102 Gauge gauge = Gauge.getGaugeByOfficialNumber(officialGaugeNumber); |
103 if (gauge == null) { | |
104 // TODO: i18n | |
105 addProblem("hist.discharge.gauge.not.found"); | |
106 return null; | |
107 } | |
108 | |
109 if (log.isDebugEnabled()) { | |
54 debug(); | 110 debug(); |
55 } | 111 } |
56 | 112 |
57 DischargeTable refTable = fetchReferenceTable(gauge); | 113 DischargeTable refTable = fetchReferenceTable(gauge); |
58 List<DischargeTable> dts = fetchDischargeTables(gauge); | 114 List<DischargeTable> dts = fetchDischargeTables(gauge); |
59 | 115 |
60 int numTables = dts.size(); | 116 int numTables = dts.size(); |
61 | 117 |
62 logger.debug("Take " + numTables + " into account."); | 118 log.debug("Take " + numTables + " into account."); |
63 | 119 |
64 if (numTables == 0) { | 120 if (numTables == 0) { |
65 addProblem("cannot.find.hist.q.tables"); | 121 addProblem("cannot.find.hist.q.tables"); |
66 } | 122 } |
67 | 123 |
68 WQTimerange[] wqt = prepareTimerangeData(refTable, dts); | 124 WQTimerange[] wqt = prepareTimerangeData(refTable, dts); |
69 WQKms[] wqs = prepareWQData(dts); | 125 WQKms[] wqs = prepareWQData(dts); |
70 | 126 |
71 logger.debug("Number of calculation results: " + wqt.length); | 127 log.debug("Number of calculation results: " + wqt.length); |
72 | 128 |
73 return new CalculationResult(new HistoricalDischargeData(wqt, wqs), | 129 return new CalculationResult(new HistoricalDischargeData(wqt, wqs), |
74 this); | 130 this); |
75 } | |
76 | |
77 protected boolean checkParameters() { | |
78 if (!(mode == MODE_W || mode == MODE_Q)) { | |
79 logger.warn("Invalid mode '" + mode + "' for calculation."); | |
80 return false; | |
81 } | |
82 | |
83 if (timerange == null || timerange.length < 2) { | |
84 logger.warn("Invalid timerange for calculation."); | |
85 return false; | |
86 } | |
87 | |
88 if (values == null || values.length == 0) { | |
89 logger.warn("No values for W or Q specified."); | |
90 return false; | |
91 } | |
92 | |
93 return true; | |
94 } | 131 } |
95 | 132 |
96 protected DischargeTable fetchReferenceTable(Gauge gauge) { | 133 protected DischargeTable fetchReferenceTable(Gauge gauge) { |
97 return gauge.fetchMasterDischargeTable(); | 134 return gauge.fetchMasterDischargeTable(); |
98 } | 135 } |
130 | 167 |
131 if (stopTime >= timerange[0] && stopTime <= timerange[1]) { | 168 if (stopTime >= timerange[0] && stopTime <= timerange[1]) { |
132 return true; | 169 return true; |
133 } | 170 } |
134 | 171 |
135 logger.debug("DischargeTable not in range: " + start + " -> " + stop); | 172 log.debug("DischargeTable not in range: " + start + " -> " + stop); |
136 | 173 |
137 return false; | 174 return false; |
138 } | 175 } |
139 | 176 |
140 protected WQTimerange[] prepareTimerangeData(DischargeTable refTable, | 177 protected WQTimerange[] prepareTimerangeData(DischargeTable refTable, |
186 /** Without reference. */ | 223 /** Without reference. */ |
187 protected WQTimerange[] prepareSimpleData(List<DischargeTable> dts) { | 224 protected WQTimerange[] prepareSimpleData(List<DischargeTable> dts) { |
188 List<WQTimerange> wqts = new ArrayList<WQTimerange>(values.length); | 225 List<WQTimerange> wqts = new ArrayList<WQTimerange>(values.length); |
189 | 226 |
190 for (double value : values) { | 227 for (double value : values) { |
191 logger.debug("Prepare data for value: " + value); | 228 log.debug("Prepare data for value: " + value); |
192 | 229 |
193 String name = mode == MODE_W ? "W=" + value : "Q=" + value; | 230 String name = mode == EvaluationMode.W.getMode() |
231 ? "W=" + value | |
232 : "Q=" + value; | |
233 | |
194 WQTimerange wqt = null; | 234 WQTimerange wqt = null; |
195 | 235 |
196 for (DischargeTable dt : dts) { | 236 for (DischargeTable dt : dts) { |
197 Date[] ti = prepareTimeInterval(dt); | 237 Date[] ti = prepareTimeInterval(dt); |
198 Timerange t = new Timerange(ti[0], ti[1]); | 238 Timerange t = new Timerange(ti[0], ti[1]); |
199 double w; | 239 double w; |
200 double q; | 240 double q; |
201 | 241 |
202 if (mode == MODE_W) { | 242 if (mode == EvaluationMode.W.getMode()) { |
203 w = value; | 243 w = value; |
204 q = findValueForW(dt, w, DischargeTables.HISTORICAL_SCALE); | 244 q = findValueForW(dt, w, DischargeTables.HISTORICAL_SCALE); |
205 | 245 |
206 if (Double.isNaN(q)) { | 246 if (Double.isNaN(q)) { |
207 logger.warn("Cannot find Q for W: " + w); | 247 log.warn("Cannot find Q for W: " + w); |
208 addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); | 248 addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); |
209 continue; | 249 continue; |
210 } | 250 } |
211 } | 251 } |
212 else { | 252 else { |
213 q = value; | 253 q = value; |
214 w = findValueForQ(dt, q, DischargeTables.HISTORICAL_SCALE); | 254 w = findValueForQ(dt, q, DischargeTables.HISTORICAL_SCALE); |
215 } | 255 } |
216 | 256 |
217 logger.debug("Q=" + q + " | W=" + w); | 257 log.debug("Q=" + q + " | W=" + w); |
218 | 258 |
219 if (wqt == null) { | 259 if (wqt == null) { |
220 wqt = new WQTimerange(name); | 260 wqt = new WQTimerange(name); |
221 } | 261 } |
222 | 262 |
236 List<DischargeTable> dts) { | 276 List<DischargeTable> dts) { |
237 List<HistoricalWQTimerange> wqts = new ArrayList<HistoricalWQTimerange>( | 277 List<HistoricalWQTimerange> wqts = new ArrayList<HistoricalWQTimerange>( |
238 values.length); | 278 values.length); |
239 | 279 |
240 for (double value : values) { | 280 for (double value : values) { |
241 logger.debug("Prepare data plus diff for value: " + value); | 281 log.debug("Prepare data plus diff for value: " + value); |
242 | 282 |
243 String name = mode == MODE_W ? "W=" + value : "Q=" + value; | 283 String name = mode == EvaluationMode.W.getMode() |
284 ? "W=" + value | |
285 : "Q=" + value; | |
244 HistoricalWQTimerange wqt = null; | 286 HistoricalWQTimerange wqt = null; |
245 | 287 |
246 double ref; | 288 double ref; |
247 double diff; | 289 double diff; |
248 | 290 |
249 if (refTable != null && mode == MODE_W) { | 291 if (refTable != null && mode == EvaluationMode.W.getMode()) { |
250 ref = findValueForW(refTable, value, | 292 ref = findValueForW(refTable, value, |
251 DischargeTables.MASTER_SCALE); | 293 DischargeTables.MASTER_SCALE); |
252 } | 294 } |
253 else if (refTable != null) { | 295 else if (refTable != null) { |
254 ref = findValueForQ(refTable, value, | 296 ref = findValueForQ(refTable, value, |
263 | 305 |
264 Timerange t = new Timerange(ti[0], ti[1]); | 306 Timerange t = new Timerange(ti[0], ti[1]); |
265 double w; | 307 double w; |
266 double q; | 308 double q; |
267 | 309 |
268 if (mode == MODE_W) { | 310 if (mode == EvaluationMode.W.getMode()) { |
269 w = value; | 311 w = value; |
270 q = findValueForW(dt, w, DischargeTables.HISTORICAL_SCALE); | 312 q = findValueForW(dt, w, DischargeTables.HISTORICAL_SCALE); |
271 | 313 |
272 if (Double.isNaN(q)) { | 314 if (Double.isNaN(q)) { |
273 logger.warn("Cannot find Q for W: " + w); | 315 log.warn("Cannot find Q for W: " + w); |
274 addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); | 316 addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); |
275 continue; | 317 continue; |
276 } | 318 } |
277 | 319 |
278 diff = ref - q; | 320 diff = ref - q; |
280 else { | 322 else { |
281 q = value; | 323 q = value; |
282 w = findValueForQ(dt, q, DischargeTables.HISTORICAL_SCALE); | 324 w = findValueForQ(dt, q, DischargeTables.HISTORICAL_SCALE); |
283 | 325 |
284 if (Double.isNaN(w)) { | 326 if (Double.isNaN(w)) { |
285 logger.warn("Cannot find W for Q: " + q); | 327 log.warn("Cannot find W for Q: " + q); |
286 addProblem("cannot.find.hist.w.for.q", q, ti[0], ti[1]); | 328 addProblem("cannot.find.hist.w.for.q", q, ti[0], ti[1]); |
287 continue; | 329 continue; |
288 } | 330 } |
289 diff = ref - w; | 331 diff = ref - w; |
290 } | 332 } |
291 | 333 |
292 logger.debug("Q=" + q + " | W=" + w + " | Ref = " + ref); | 334 log.debug("Q=" + q + " | W=" + w + " | Ref = " + ref); |
293 | 335 |
294 if (wqt == null) { | 336 if (wqt == null) { |
295 wqt = new HistoricalWQTimerange(name); | 337 wqt = new HistoricalWQTimerange(name); |
296 } | 338 } |
297 | 339 |
313 | 355 |
314 Date start = ti.getStartTime(); | 356 Date start = ti.getStartTime(); |
315 Date end = ti.getStopTime(); | 357 Date end = ti.getStopTime(); |
316 | 358 |
317 if (end == null) { | 359 if (end == null) { |
318 logger.warn("TimeInterval has no stop time set!"); | 360 log.warn("TimeInterval has no stop time set!"); |
319 | 361 |
320 end = new Date(); | 362 end = new Date(); |
321 } | 363 } |
322 | 364 |
323 return new Date[] { start, end }; | 365 return new Date[] { start, end }; |
335 | 377 |
336 return ws.length == 0 ? Double.NaN : ws[0]; | 378 return ws.length == 0 ? Double.NaN : ws[0]; |
337 } | 379 } |
338 | 380 |
339 /** | 381 /** |
340 * Writes the parameters used for this calculation to logger. | 382 * Writes the parameters used for this calculation to log. |
341 */ | 383 */ |
342 public void debug() { | 384 public void debug() { |
343 StringBuilder sb = new StringBuilder(); | 385 log.debug("========== Calculation6 =========="); |
344 for (double value : values) { | 386 log.debug(" Mode: " + mode); |
345 sb.append(String.valueOf(value) + " "); | 387 log.debug(" Timerange: " + timerange[0] + " - " + timerange[1]); |
346 } | 388 log.debug(" Input values: " + Arrays.toString(values)); |
347 | 389 log.debug("=================================="); |
348 logger.debug("========== Calculation6 =========="); | |
349 logger.debug(" Mode: " + mode); | |
350 logger.debug(" Timerange: " + timerange[0] + " - " + timerange[1]); | |
351 logger.debug(" Input values: " + sb.toString()); | |
352 logger.debug("=================================="); | |
353 } | 390 } |
354 } | 391 } |
355 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 392 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |