annotate artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java @ 9588:c57caff9b00b

Punkt 10.6 CSV-Ausgabe Abflusszeitreihenlänge
author gernotbelger
date Thu, 10 Jan 2019 11:56:39 +0100
parents 879c902c4a2d
children
rev   line source
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
2 * Software engineering by Intevation GmbH
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
3 *
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
6 * documentation coming with Dive4Elements River for details.
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
7 */
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
8
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
9 package org.dive4elements.river.artifacts.services;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
10
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
11 import java.math.BigDecimal;
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
12 import java.math.MathContext;
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
13 import java.math.RoundingMode;
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
14 import java.util.ArrayList;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
15 import java.util.Calendar;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
16 import java.util.Date;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
17 import java.util.List;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
18
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
19 import org.dive4elements.artifacts.common.utils.DateUtils;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
20 import org.dive4elements.river.backend.SessionHolder;
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
21 import org.dive4elements.river.model.Gauge;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
22 import org.dive4elements.river.model.MainValue;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
23 import org.dive4elements.river.model.MainValueType;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
24 import org.dive4elements.river.model.MainValueType.MainValueTypeKey;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
25 import org.dive4elements.river.model.NamedMainValue;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
26 import org.dive4elements.river.model.OfficialLine;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
27 import org.dive4elements.river.model.River;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
28 import org.dive4elements.river.model.TimeInterval;
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
29 import org.dive4elements.river.model.sinfo.DailyDischargeValue;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
30 import org.dive4elements.river.model.sinfo.DailyDischargeValue.OrderByField;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
31 import org.dive4elements.river.utils.DoubleUtil;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
32 import org.hibernate.Session;
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
33
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
34 import gnu.trove.TDoubleArrayList;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
35
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
36 /**
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
37 * This service returns the main values of a river's gauge based on the start
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
38 * and end point of the river.
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
39 *
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
40 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
41 */
9404
bc9a45d2b1fa common time range for gauges incl. error messages
gernotbelger
parents: 9396
diff changeset
42 public class DynamicMainValuesService extends AbstractDynamicMainValuesService {
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
43
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
44 private static final long serialVersionUID = 1L;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
45
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
46 /**
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
47 * Computes a gauge's main values for a period of time based on its daily discharges stored in the database
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
48 */
9404
bc9a45d2b1fa common time range for gauges incl. error messages
gernotbelger
parents: 9396
diff changeset
49 @Override
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
50 protected List<MainValue> getMainValues(final River river, final Gauge gauge, final Date startTime, final Date endTime) throws MainValuesServiceException {
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
51
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
52 final List<MainValue> mainValues = new ArrayList<>();
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
53 computeMainDischargeValues(gauge, startTime, endTime, mainValues);
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
54 return mainValues;
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
55 }
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
56
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
57 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
58 * Computes mnq, mq, mhq, hq5 and q(d=0..364) and adds them to a MainValue list
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
59 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
60 private void computeMainDischargeValues(final Gauge gauge, final Date startTime, final Date endTime, final List<MainValue> mainValues)
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
61 throws MainValuesServiceException {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
62
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
63 // Query the gauge's daily Q values
9494
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
64 final Date qStartTime = DateUtils.getAbflussYear(startTime)[0];
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
65 final List<DailyDischargeValue> qdvs = DailyDischargeValue.getValues(gauge, qStartTime, endTime, OrderByField.DAY);
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
66 if (qdvs.isEmpty())
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
67 throw new MainValuesServiceException("no daily discharge values for gauge " + gauge.getName() + " in the requested time period");
9404
bc9a45d2b1fa common time range for gauges incl. error messages
gernotbelger
parents: 9396
diff changeset
68 // return;
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
69
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
70 // Build yearly aggregates
9494
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
71 final Date qYearEnd = DateUtils.getPreviousAbflussYear(endTime)[1];
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
72 final TDoubleArrayList mnqs = new TDoubleArrayList();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
73 final TDoubleArrayList mqs = new TDoubleArrayList();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
74 int mqcnt = 0;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
75 final TDoubleArrayList mhqs = new TDoubleArrayList();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
76 for (int i = 0, j = 0; i <= qdvs.size() - 1; i++) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
77 final DailyDischargeValue qdv = qdvs.get(i);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
78 if ((i >= 1) && isSameQYear(qdv.getDay(), qdvs.get(i - 1).getDay())) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
79 // Continue aggregating the values of the current year
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
80 mnqs.set(j, Math.min(mnqs.get(j), qdv.getDischarge().doubleValue()));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
81 mhqs.set(j, Math.max(mhqs.get(j), qdv.getDischarge().doubleValue()));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
82 mqs.set(j, mqs.get(j) + qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
83 mqcnt++;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
84 if (i == qdvs.size() - 1)
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
85 mqs.set(j, mqs.get(j) / mqcnt);
9404
bc9a45d2b1fa common time range for gauges incl. error messages
gernotbelger
parents: 9396
diff changeset
86 } else {
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
87 // Complete mq aggregation
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
88 if (mqcnt >= 1) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
89 mqs.set(j, mqs.get(j) / mqcnt);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
90 j++;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
91 }
9494
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
92 if (qdv.getDay().after(qYearEnd))
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
93 break;
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
94 // Start next year
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
95 mnqs.add(qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
96 mhqs.add(qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
97 mqs.add(qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
98 mqcnt = 1;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
99 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
100 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
101
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
102 // Compute arithmetic means of the yearly values
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
103 final Session session = SessionHolder.HOLDER.get();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
104 final TimeInterval timeperiod = new TimeInterval(startTime, endTime);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
105 final double mnq = DoubleUtil.sum(mnqs.toNativeArray()) / mnqs.size();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
106 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("MNQ", session), mnq, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
107 final double mq = DoubleUtil.sum(mqs.toNativeArray()) / mqs.size();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
108 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("MQ", session), mq, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
109 final double mhq = DoubleUtil.sum(mhqs.toNativeArray()) / mhqs.size();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
110 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("MHQ", session), mhq, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
111
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
112 // Compute hq5 - obsolete
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
113 // mhqs.sort();
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
114 // final double hq5 = mhqs.get((int) Math.ceil(4 * mhqs.size() / 5));
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
115 // mainValues.add(createMainValue(gauge, fetchNamedQMainValue("HQ5", session), hq5, timeperiod));
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
116
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
117 // Add HSQ-II from the gauge's main values
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
118 final MainValue hsq2 = fetchHsqII(gauge, session);
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
119 if (hsq2 != null)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
120 mainValues.add(hsq2);
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
121
9494
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
122 // Query the gauge's daily Q values from the first new year on, and build a list sorted by ascending Q
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
123 final TDoubleArrayList qs = new TDoubleArrayList();
9494
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
124 for (final DailyDischargeValue qdv : qdvs) {
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
125 if (qdv.getDay().compareTo(startTime) >= 0)
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
126 qs.add(qdv.getDischarge().doubleValue());
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
127 }
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
128 qs.sort();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
129
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
130 // Step through the sorted Q list and get the duration discharges
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
131 final int yearCnt = DateUtils.getYearFromDate(endTime) - DateUtils.getYearFromDate(startTime) + 1;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
132 double glq20 = Double.NaN;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
133 for (int i = 0, k = 0; (i <= 364) && (k <= qs.size() - 1); i++, k += yearCnt) {
9454
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
134 final NamedMainValue nmv = fetchNamedQMainValue(i, session);
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
135 if (nmv != null) {
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
136 final double q = getDurationQ(qs, k);
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
137 mainValues.add(createMainValue(gauge, nmv, q, timeperiod));
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
138 if (i == 20)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
139 glq20 = q;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
140 }
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
141 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
142 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("GlQ", session), glq20, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
143 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
144
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
145 /**
9494
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
146 * Checks year equality of two dates (Abflussjahr)
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
147 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
148 private boolean isSameQYear(final Date a, final Date b) {
9494
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
149 return (qYear(a) == qYear(b));
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
150 }
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
151
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
152 /**
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
153 * Gets the q year (Abflussjahr) of a date
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
154 */
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
155 private int qYear(final Date day) {
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
156 final Calendar cal = Calendar.getInstance();
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
157 cal.setTime(day);
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
158 if (cal.get(Calendar.MONTH) >= 10)
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
159 return cal.get(Calendar.YEAR) + 1;
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
160 else
879c902c4a2d Changed main value calculations from calendar year to Abflussjahr, modified time range determination accordingly
mschaefer
parents: 9454
diff changeset
161 return cal.get(Calendar.YEAR);
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
162 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
163
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
164 /**
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
165 * Fetches the gauge's HSQ-II from the database, or returns null
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
166 */
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
167 private MainValue fetchHsqII(final Gauge gauge, final Session session) {
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
168 final NamedMainValue nmv = NamedMainValue.fetchByNameAndType("HSQ-II", MainValueTypeKey.UNKNOWN.getName(), session);
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
169 if (nmv == null)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
170 return null;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
171 final List<MainValue> mvs = gauge.getMainValues();
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
172 for (final MainValue mv : mvs) {
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
173 if (mv.getMainValue().getId() == nmv.getId())
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
174 return mv;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
175 }
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
176 return null;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
177 }
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
178
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
179 /**
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
180 * Fetches a named main Q value from the database, if existing
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
181 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
182 private NamedMainValue fetchNamedQMainValue(final String name, final Session session) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
183 final NamedMainValue nmv = NamedMainValue.fetchByNameAndType(name, MainValueTypeKey.Q.getName(), session);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
184 if (nmv != null)
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
185 nmv.setOfficialLines(new ArrayList<OfficialLine>());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
186 return nmv;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
187 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
188
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
189 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
190 * Fetches a named main Q(duration) value from the database, if existing
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
191 */
9454
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
192 private NamedMainValue fetchNamedQMainValue(final int days, final Session session) {
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
193
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
194 NamedMainValue nmv = NamedMainValue.fetchByNameAndType(Integer.toString(days), MainValueTypeKey.DURATION.getName(), session);
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
195 if (nmv == null) {
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
196 final MainValueType mvt = new MainValueType(MainValueTypeKey.INVISIBLE_D.name());
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
197 nmv = new NamedMainValue(Integer.toString(days), mvt);
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
198 }
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
199
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
200 nmv.setOfficialLines(new ArrayList<OfficialLine>());
4cccbd32b680 Bundu.wst.UD -> Q-Values are set on Client side now
gernotbelger
parents: 9404
diff changeset
201
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
202 return nmv;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
203 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
204
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
205 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
206 * Creates a main value for a main value name
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
207 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
208 private MainValue createMainValue(final Gauge gauge, final NamedMainValue nmv, final double value, final TimeInterval timeperiod) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
209 return new MainValue(gauge, nmv, BigDecimal.valueOf(value).setScale(0, RoundingMode.HALF_EVEN), timeperiod); // TODO Scale per Formatter-Konstante o.ä.
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
210 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
211
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
212 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
213 * Gets the q from a list at a list position, or the next larger q if the immediate successors are equal
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
214 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
215 private double getDurationQ(final TDoubleArrayList qs, final int i) {
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
216 if (i == 0)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
217 return qs.getQuick(0);
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
218 for (int j = i; j <= qs.size() - 1; j++) {
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
219 if (qs.getQuick(j) > qs.getQuick(j - 1) + 0.001)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
220 return qs.getQuick(j);
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
221 }
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
222 // Identical values at end of list: increment q on third significant digit
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
223 final MathContext mc = new MathContext(3, RoundingMode.FLOOR);
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
224 BigDecimal qplus = BigDecimal.valueOf(qs.getQuick(qs.size() - 1));
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
225 qplus = qplus.round(mc).add(BigDecimal.ONE.scaleByPowerOfTen(-qplus.scale()));
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
226 return qplus.doubleValue();
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
227 }
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
228 }

http://dive4elements.wald.intevation.org