annotate artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java @ 9404:bc9a45d2b1fa

common time range for gauges incl. error messages
author gernotbelger
date Wed, 15 Aug 2018 13:59:09 +0200
parents 6ebc9357550c
children 4cccbd32b680
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
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
64 final List<DailyDischargeValue> qdvs = DailyDischargeValue.getValues(gauge, startTime, endTime, OrderByField.DAY);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
65 if (qdvs.isEmpty())
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
66 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
67 // return;
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
68
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
69 // Build yearly aggregates
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
70 final TDoubleArrayList mnqs = new TDoubleArrayList();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
71 final TDoubleArrayList mqs = new TDoubleArrayList();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
72 int mqcnt = 0;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
73 final TDoubleArrayList mhqs = new TDoubleArrayList();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
74 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
75 final DailyDischargeValue qdv = qdvs.get(i);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
76 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
77 // Continue aggregating the values of the current year
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
78 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
79 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
80 mqs.set(j, mqs.get(j) + qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
81 mqcnt++;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
82 if (i == qdvs.size() - 1)
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
83 mqs.set(j, mqs.get(j) / mqcnt);
9404
bc9a45d2b1fa common time range for gauges incl. error messages
gernotbelger
parents: 9396
diff changeset
84 } else {
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
85 // Complete mq aggregation
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
86 if (mqcnt >= 1) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
87 mqs.set(j, mqs.get(j) / mqcnt);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
88 j++;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
89 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
90 // Start next year
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
91 mnqs.add(qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
92 mhqs.add(qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
93 mqs.add(qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
94 mqcnt = 1;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
95 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
96 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
97
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
98 // Compute arithmetic means of the yearly values
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
99 final Session session = SessionHolder.HOLDER.get();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
100 final TimeInterval timeperiod = new TimeInterval(startTime, endTime);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
101 final double mnq = DoubleUtil.sum(mnqs.toNativeArray()) / mnqs.size();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
102 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("MNQ", session), mnq, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
103 final double mq = DoubleUtil.sum(mqs.toNativeArray()) / mqs.size();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
104 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("MQ", session), mq, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
105 final double mhq = DoubleUtil.sum(mhqs.toNativeArray()) / mhqs.size();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
106 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("MHQ", session), mhq, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
107
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
108 // Compute hq5 - obsolete
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
109 // mhqs.sort();
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
110 // 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
111 // 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
112
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
113 // 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
114 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
115 if (hsq2 != null)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
116 mainValues.add(hsq2);
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
117
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
118 // Query the gauge's daily Q values and build a list sorted by ascending Q
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
119 final TDoubleArrayList qs = new TDoubleArrayList();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
120 for (final DailyDischargeValue qdv : qdvs)
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
121 qs.add(qdv.getDischarge().doubleValue());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
122 qs.sort();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
123
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
124 // 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
125 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
126 double glq20 = Double.NaN;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
127 for (int i = 0, k = 0; (i <= 364) && (k <= qs.size() - 1); i++, k += yearCnt) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
128 final NamedMainValue nmv = fetchNamedQMainValue(i, session, mainValues.get(0).getMainValue().getType());
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
129 if (nmv != null) {
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
130 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
131 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
132 if (i == 20)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
133 glq20 = q;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
134 }
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
135 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
136 mainValues.add(createMainValue(gauge, fetchNamedQMainValue("GlQ", session), glq20, timeperiod));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
137 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
138
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
139 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
140 * Checks year equality of two dates (calendar year)
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 private boolean isSameQYear(final Date a, final Date b) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
143 final Calendar ca = Calendar.getInstance();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
144 ca.setTime(a);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
145 final Calendar cb = Calendar.getInstance();
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
146 cb.setTime(b);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
147 return (ca.get(Calendar.YEAR) == cb.get(Calendar.YEAR));
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
148 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
149
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
150 /**
9395
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
151 * 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
152 */
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
153 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
154 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
155 if (nmv == null)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
156 return null;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
157 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
158 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
159 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
160 return mv;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
161 }
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
162 return null;
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
163 }
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
164
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
165 /**
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
166 * 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
167 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
168 private NamedMainValue fetchNamedQMainValue(final String name, final Session session) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
169 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
170 if (nmv != null)
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
171 nmv.setOfficialLines(new ArrayList<OfficialLine>());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
172 return nmv;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
173 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
174
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
175 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
176 * 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
177 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
178 private NamedMainValue fetchNamedQMainValue(final int days, final Session session, final MainValueType qType) {
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
179 final NamedMainValue nmv = NamedMainValue.fetchByNameAndType(Integer.toString(days), MainValueTypeKey.DURATION.getName(), session);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
180 // final NamedMainValue nmv = new NamedMainValue(Integer.toString(days), qType);
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
181 if (nmv != null)
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
182 nmv.setOfficialLines(new ArrayList<OfficialLine>());
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
183 return nmv;
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
184 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
185
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
186 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
187 * Creates a main value for a main value name
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 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
190 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
191 }
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
192
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
193 /**
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
194 * 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
195 */
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
196 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
197 if (i == 0)
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
198 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
199 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
200 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
201 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
202 }
0255c51283a4 Bundu dynamix main value calculation: added hsq-ii, removed hq5, correction of duration q calculation
mschaefer
parents: 9392
diff changeset
203 // 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
204 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
205 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
206 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
207 return qplus.doubleValue();
9392
e4a6679b868f Implemented first approach of bundu dynamic main value calculation
mschaefer
parents: 9288
diff changeset
208 }
9288
82c67b859aa7 bundu.bezugswst worklflow incl. service impl for mainValues to be calculated
gernotbelger
parents:
diff changeset
209 }

http://dive4elements.wald.intevation.org