annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentCalculation.java @ 8980:b194fa64506a

SINFO - show results themes according to spec, either raw data or floating mean values. Some improvements to error handling and handling of empty results.
author gernotbelger
date Thu, 05 Apr 2018 18:30:34 +0200
parents b5600453bb8f
children d5802f22e4f5
rev   line source
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
2 * Software engineering by
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
5 *
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
9 */
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.artifacts.sinfo.flowdepthdev;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
11
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
12 import java.util.ArrayList;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
13 import java.util.Collection;
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
14 import java.util.TreeSet;
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
15
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
16 import org.apache.commons.lang.math.DoubleRange;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
17 import org.dive4elements.artifacts.CallContext;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
18 import org.dive4elements.river.artifacts.model.Calculation;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
19 import org.dive4elements.river.artifacts.model.CalculationResult;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
20 import org.dive4elements.river.artifacts.model.WKms;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
21 import org.dive4elements.river.artifacts.resources.Resources;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
22 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
23 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
24 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultRow;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
25 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
26 import org.dive4elements.river.artifacts.sinfo.flowdepth.FlowDepthUtils;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
27 import org.dive4elements.river.artifacts.sinfo.flowdepth.WstSoundingIdPair;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
28 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.WaterlevelValuesFinder;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
29 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
30 import org.dive4elements.river.artifacts.sinfo.util.BedHeightInfo;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
31 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
32 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
33 import org.dive4elements.river.artifacts.sinfo.util.WstInfo;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
34 import org.dive4elements.river.artifacts.states.WaterlevelData;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
35 import org.dive4elements.river.artifacts.states.WaterlevelFetcher;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
36 import org.dive4elements.river.model.River;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
37
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
38 /**
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
39 * @author Gernot Belger
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
40 */
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
41 final class FlowDepthDevelopmentCalculation {
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
42
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
43 private final CallContext context;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
44
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
45 public FlowDepthDevelopmentCalculation(final CallContext context) {
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
46 this.context = context;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
47 }
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
48
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
49 public CalculationResult calculate(final SINFOArtifact sinfo) {
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
50
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
51 final String user = CalculationUtils.findArtifactUser(this.context, sinfo);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
52
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
53 /* access input data */
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
54 final FlowDepthDevelopmentAccess access = new FlowDepthDevelopmentAccess(sinfo);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
55 final River river = access.getRiver();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
56 final RiverInfo riverInfo = new RiverInfo(river);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
57
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
58 final WstSoundingIdPair currentPair = access.getCurrentPair();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
59 final WstSoundingIdPair histPair = access.getHistoricalPair();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
60
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
61 final DoubleRange calcRange = access.getRange();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
62
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
63 /* calculate results for each diff pair */
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
64 final Calculation problems = new Calculation();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
65
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
66 final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
67
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
68 final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name());
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
69
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
70 final FlowDepthDevelopmentCalculationResults results = new FlowDepthDevelopmentCalculationResults(calcModeLabel, user, riverInfo, calcRange);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
71
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
72 final FlowDepthDevelopmentCalculationResult result = calculateResult(calcRange, currentPair, histPair, problems, infoProvider);
8980
b194fa64506a SINFO - show results themes according to spec, either raw data or floating mean values.
gernotbelger
parents: 8978
diff changeset
73 results.addResult(result, problems);
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
74
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
75 return new CalculationResult(results, problems);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
76 }
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
77
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
78 private FlowDepthDevelopmentCalculationResult calculateResult(final DoubleRange calcRange, final WstSoundingIdPair currentPair,
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
79 final WstSoundingIdPair histPair, final Calculation problems, final RiverInfoProvider infoProvider) {
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
80
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
81 /* access real input data from database */
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
82 final WaterlevelData currentWaterlevel = loadWaterlevel(currentPair, calcRange, problems);
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
83 if (currentWaterlevel == null)
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
84 return null;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
85
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
86 final WaterlevelData historicalWaterlevel = loadWaterlevel(histPair, calcRange, problems);
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
87 if (historicalWaterlevel == null)
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
88 return null;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
89
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
90 final BedHeightsFinder currentSounding = loadBedHeight(currentPair, calcRange, problems);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
91 if (currentSounding == null)
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
92 return null;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
93
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
94 final BedHeightsFinder historicalSounding = loadBedHeight(histPair, calcRange, problems);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
95 if (historicalSounding == null)
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
96 return null;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
97
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
98 // FIXME: check current/hist wst have same discharge...
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
99 // FIXME: what means 'same discharge'
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
100
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
101 final BedHeightInfo currentSoundingInfo = currentSounding.getInfo();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
102 final BedHeightInfo historicalSoundingInfo = historicalSounding.getInfo();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
103
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
104 final int currentWstYear = currentWaterlevel.getYear();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
105 final int historicalWstYear = historicalWaterlevel.getYear();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
106 final int currentSoundingYear = currentSoundingInfo.getYear();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
107 final int historicalSoundingYear = historicalSoundingInfo.getYear();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
108
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
109 if (currentWstYear < 0) {
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
110 problems.addProblem("flowdepthdevelopmentcalculation.missingCurrentYear", currentWaterlevel.getName());
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
111 return null;
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
112 }
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
113
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
114 if (historicalWstYear < 0) {
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
115 problems.addProblem("flowdepthdevelopmentcalculation.missingHistoricalYear", historicalWaterlevel.getName());
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
116 return null;
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
117 }
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
118
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
119 // FIXME: distinguish error messages
8980
b194fa64506a SINFO - show results themes according to spec, either raw data or floating mean values.
gernotbelger
parents: 8978
diff changeset
120 FlowDepthUtils.checkYearDifference(Resources.getMsg(this.context.getMeta(), "flowdepthdevelopmentcalculation.yearDifferenceCurrent"), currentWstYear,
b194fa64506a SINFO - show results themes according to spec, either raw data or floating mean values.
gernotbelger
parents: 8978
diff changeset
121 currentSoundingYear, problems);
b194fa64506a SINFO - show results themes according to spec, either raw data or floating mean values.
gernotbelger
parents: 8978
diff changeset
122 FlowDepthUtils.checkYearDifference(Resources.getMsg(this.context.getMeta(), "flowdepthdevelopmentcalculation.yearDifferenceHistorical"),
b194fa64506a SINFO - show results themes according to spec, either raw data or floating mean values.
gernotbelger
parents: 8978
diff changeset
123 historicalWstYear,
b194fa64506a SINFO - show results themes according to spec, either raw data or floating mean values.
gernotbelger
parents: 8978
diff changeset
124 historicalSoundingYear, problems);
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
125
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
126 /* re-determine the reference gauge, in the same way as the WaterlevelArtifact would do it */
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
127 final RiverInfoProvider currentRiverInfoProvider = infoProvider.forWaterlevel(currentWaterlevel);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
128 final RiverInfoProvider histRiverInfoProvider = infoProvider.forWaterlevel(historicalWaterlevel);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
129
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
130 final WstInfo currentWstInfo = new WstInfo(currentWaterlevel.getName(), currentWstYear, currentRiverInfoProvider.getReferenceGauge());
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
131 final WstInfo historicalWstInfo = new WstInfo(historicalWaterlevel.getName(), historicalWstYear, histRiverInfoProvider.getReferenceGauge());
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
132
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
133 final WKms currentWkms = currentWaterlevel.getWkms();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
134 final WaterlevelValuesFinder currentWstProvider = WaterlevelValuesFinder.fromKms(problems, currentWkms);
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
135
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
136 final WKms historicalWkms = historicalWaterlevel.getWkms();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
137 final WaterlevelValuesFinder historicalWstProvider = WaterlevelValuesFinder.fromKms(problems, historicalWkms);
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
138
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
139 final int currentMeanYear = (currentWstYear + currentSoundingYear) / 2;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
140 final int historcialMeanYear = (historicalWstYear + historicalSoundingYear) / 2;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
141
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
142 final double diffYear = currentMeanYear - historcialMeanYear;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
143
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
144 /* real calculation loop */
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
145 final Collection<SInfoResultRow> rows = new ArrayList<>();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
146
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
147 final Collection<Double> stations = determineCalculationSteps(currentSounding, historicalSounding);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
148 for (final double station : stations) {
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
149 if (calcRange.containsDouble(station)) {
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
150
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
151 final double currentWst = currentWstProvider.getWaterlevel(station);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
152 final double currentBedHeight = currentSounding.getMeanBedHeight(station);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
153
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
154 final double historicalWst = historicalWstProvider.getWaterlevel(station);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
155 final double historicalBedHeight = historicalSounding.getMeanBedHeight(station);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
156
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
157 /* ignore invalid lines */
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
158 if (Double.isNaN(currentWst) || Double.isNaN(currentBedHeight) || Double.isNaN(historicalWst) || Double.isNaN(historicalBedHeight))
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
159 continue;
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
160
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
161 final double diffWst = (currentWst - historicalWst) * 100;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
162 final double diffBedHeight = (currentBedHeight - historicalBedHeight) * 100;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
163
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
164 final double flowDepthDevelopment = diffWst - diffBedHeight;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
165
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
166 final double flowDepthDevelopmentPerYear = flowDepthDevelopment / diffYear;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
167
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
168 final double currentFlowDepth = currentWst - currentBedHeight;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
169 final double historicalFlowDepth = historicalWst - historicalBedHeight;
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
170
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
171 // REMARK: access the location once only during calculation
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
172 final String location = currentRiverInfoProvider.getLocation(station);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
173
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
174 final SInfoResultRow row = SInfoResultRow.create().//
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
175 putValue(SInfoResultType.station, station). //
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
176 putValue(SInfoResultType.flowdepthDevelopment, flowDepthDevelopment). //
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
177 putValue(SInfoResultType.flowdepthDevelopmentPerYear, flowDepthDevelopmentPerYear). //
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
178 putValue(SInfoResultType.waterlevelDifference, diffWst). //
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
179 putValue(SInfoResultType.bedHeightDifference, diffBedHeight). //
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
180 putValue(SInfoResultType.flowdepthCurrent, currentFlowDepth). //
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
181 putValue(SInfoResultType.flowdepthHistorical, historicalFlowDepth). //
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
182 putValue(SInfoResultType.location, location);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
183 rows.add(row);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
184 }
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
185 }
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
186
8953
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
187 final String label = buildLabel(currentWaterlevel, currentSoundingInfo, historicalWaterlevel, historicalSoundingInfo);
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
188
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
189 return new FlowDepthDevelopmentCalculationResult(label, currentWstInfo, historicalWstInfo, currentSoundingInfo, historicalSoundingInfo,
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
190 rows);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
191 }
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
192
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
193 /**
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
194 * Calculation steps are simply the union of all stations of all involved bed-height datasets
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
195 */
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
196 private Collection<Double> determineCalculationSteps(final BedHeightsFinder currentSounding, final BedHeightsFinder historicalSounding) {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
197
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
198 final Collection<Double> allStations = new TreeSet<>();
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
199
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
200 allStations.addAll(currentSounding.getStations());
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
201 allStations.addAll(historicalSounding.getStations());
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
202
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
203 return allStations;
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
204 }
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
205
8953
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
206 private String buildLabel(final WaterlevelData currentWaterlevel, final BedHeightInfo currentSounding, final WaterlevelData historicalWaterlevel,
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
207 final BedHeightInfo historicalSounding) {
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
208
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
209 return new StringBuilder(). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
210 append(currentWaterlevel.getName()). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
211 append('/'). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
212 append(historicalWaterlevel.getName()). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
213 append(" - "). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
214 append(currentSounding.getDescription()). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
215 append('/'). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
216 append(historicalSounding.getDescription()). //
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
217 toString();
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
218 }
c40db8e8dcae SINFO - Flow depth development - implemented exporters
gernotbelger
parents: 8951
diff changeset
219
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
220 /* REMARK: fetch ALL wst kms, because we need to determine the original reference gauge */
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
221 private WaterlevelData loadWaterlevel(final WstSoundingIdPair pair, final DoubleRange calcRange, final Calculation problems) {
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
222 final String wstId = pair.getWstId();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8953
diff changeset
223 return new WaterlevelFetcher().findWaterlevel(this.context, wstId, calcRange, problems);
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
224 }
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
225
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
226 private BedHeightsFinder loadBedHeight(final WstSoundingIdPair pair, final DoubleRange calcRange, final Calculation problems) {
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
227 final String soundingId = pair.getSoundingId();
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
228 return BedHeightsFinder.forId(this.context, soundingId, calcRange, problems);
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
229 }
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents:
diff changeset
230 }

http://dive4elements.wald.intevation.org