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 :

http://dive4elements.wald.intevation.org