annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculation.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 45f1ad66560e
children 2ed3824a3d53
rev   line source
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
1 /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
2 * Software engineering by
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
5 *
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
9 */
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.artifacts.sinfo.flowdepth;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
11
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
12 import java.util.Collection;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
13
8894
a66f2a7c4f84 SINFO FlowDepth - slight code cleanup
gernotbelger
parents: 8891
diff changeset
14 import org.apache.commons.lang.math.DoubleRange;
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
15 import org.dive4elements.artifacts.CallContext;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
16 import org.dive4elements.river.artifacts.model.Calculation;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
17 import org.dive4elements.river.artifacts.model.CalculationResult;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
18 import org.dive4elements.river.artifacts.model.WKms;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
19 import org.dive4elements.river.artifacts.resources.Resources;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
20 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
21 import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
22 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.DischargeValuesFinder;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
23 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.TkhCalculator;
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
24 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.WaterlevelValuesFinder;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
25 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
26 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
8894
a66f2a7c4f84 SINFO FlowDepth - slight code cleanup
gernotbelger
parents: 8891
diff changeset
27 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
a66f2a7c4f84 SINFO FlowDepth - slight code cleanup
gernotbelger
parents: 8891
diff changeset
28 import org.dive4elements.river.artifacts.sinfo.util.WstInfo;
8882
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
29 import org.dive4elements.river.artifacts.states.WaterlevelData;
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
30 import org.dive4elements.river.artifacts.states.WaterlevelFetcher;
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
31 import org.dive4elements.river.model.River;
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
32
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
33 class FlowDepthCalculation {
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
34
8914
e3519c3e7a0a Workflow for SINFO-Transport bodies heights inclduing winfo calculation
gernotbelger
parents: 8911
diff changeset
35 // private static Logger log = Logger.getLogger(FlowDepthCalculation.class);
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents: 8891
diff changeset
36
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
37 private final CallContext context;
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
38
8882
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
39 public FlowDepthCalculation(final CallContext context) {
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
40 this.context = context;
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
41 }
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
42
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
43 public CalculationResult calculate(final SINFOArtifact sinfo) {
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
44
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
45 final String user = CalculationUtils.findArtifactUser(this.context, sinfo);
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
46
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
47 /* access input data */
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
48 final FlowDepthAccess access = new FlowDepthAccess(sinfo);
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
49 final River river = access.getRiver();
8894
a66f2a7c4f84 SINFO FlowDepth - slight code cleanup
gernotbelger
parents: 8891
diff changeset
50 final RiverInfo riverInfo = new RiverInfo(river);
8854
7bbfb24e6eec SINFO - first prototype of BArt Fließtiefen
gernotbelger
parents:
diff changeset
51
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
52 final Collection<WstSoundingIdPair> diffPairs = access.getDifferencePairs();
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
53
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
54 final DoubleRange calcRange = access.getRange();
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
55
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
56 final boolean useTkh = access.isUseTransportBodies();
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
57
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
58 /* calculate results for each diff pair */
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
59 final Calculation problems = new Calculation();
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
60
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
61 final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange);
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
62
8882
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
63 final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name());
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
64
8894
a66f2a7c4f84 SINFO FlowDepth - slight code cleanup
gernotbelger
parents: 8891
diff changeset
65 final FlowDepthCalculationResults results = new FlowDepthCalculationResults(calcModeLabel, user, riverInfo, calcRange, useTkh);
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
66
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
67 for (final WstSoundingIdPair diffPair : diffPairs) {
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
68 final FlowDepthCalculationResult result = calculateResult(calcRange, diffPair, problems, infoProvider, useTkh);
8980
b194fa64506a SINFO - show results themes according to spec, either raw data or floating mean values.
gernotbelger
parents: 8964
diff changeset
69 results.addResult(result, problems);
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
70 }
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
71
8882
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
72 return new CalculationResult(results, problems);
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
73 }
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
74
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents: 8891
diff changeset
75 /**
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents: 8891
diff changeset
76 * Calculates one W-MSH differences pair.
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
77 *
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
78 * @param infoProvider
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents: 8891
diff changeset
79 */
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
80 private FlowDepthCalculationResult calculateResult(final DoubleRange calcRange, final WstSoundingIdPair diffPair, final Calculation problems,
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
81 final RiverInfoProvider infoProvider, final boolean useTkh) {
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
82
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
83 /* access real input data from database */
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
84 final String soundingId = diffPair.getSoundingId();
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
85 final String wstId = diffPair.getWstId();
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
86
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
87 final BedHeightsFinder bedHeight = BedHeightsFinder.forId(this.context, soundingId, calcRange, problems);
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
88 if (bedHeight == null)
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
89 return null;
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
90
8882
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
91 /* REMARK: fetch ALL wst kms, because we want 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: 8951
diff changeset
92 final WaterlevelData waterlevel = new WaterlevelFetcher().findWaterlevel(this.context, wstId, calcRange, problems);
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
93 if (waterlevel == null)
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
94 return null;
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
95
8882
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
96 final WKms wstKms = waterlevel.getWkms();
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
97
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8882
diff changeset
98 final String wspLabel = wstKms.getName();
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
99 final String soundingLabel = bedHeight.getInfo().getDescription();
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8882
diff changeset
100 final String label = String.format("%s - %s", wspLabel, soundingLabel);
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
101
8951
322b0e6298ea Work on SINFO FlowDepth-Development
gernotbelger
parents: 8946
diff changeset
102 FlowDepthUtils.checkYearDifference(label, waterlevel.getYear(), bedHeight.getInfo().getYear(), problems);
8882
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
103
f762fadc5313 Further work on SINFO-FlowDepth
gernotbelger
parents: 8879
diff changeset
104 /* re-determine the reference gauge, in the same way as the WaterlevelArtifact would do it */
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
105 final RiverInfoProvider riverInfoProvider = infoProvider.forWaterlevel(waterlevel);
8894
a66f2a7c4f84 SINFO FlowDepth - slight code cleanup
gernotbelger
parents: 8891
diff changeset
106
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
107 final int wspYear = waterlevel.getYear();
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
108 final WstInfo wstInfo = new WstInfo(wspLabel, wspYear, riverInfoProvider.getReferenceGauge());
8914
e3519c3e7a0a Workflow for SINFO-Transport bodies heights inclduing winfo calculation
gernotbelger
parents: 8911
diff changeset
109
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8951
diff changeset
110 final WaterlevelValuesFinder waterlevelProvider = WaterlevelValuesFinder.fromKms(problems, wstKms);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
111 final DischargeValuesFinder dischargeProvider = DischargeValuesFinder.fromKms(wstKms);
8886
cc86b0f9b3c3 SINFO-FlowDepth - work on tkh themes
gernotbelger
parents: 8884
diff changeset
112
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
113 final River river = riverInfoProvider.getRiver();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8951
diff changeset
114 final TkhCalculator tkhCalculator = TkhCalculator.buildTkhCalculator(useTkh, problems, label, river, calcRange, waterlevelProvider,
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8951
diff changeset
115 dischargeProvider, bedHeight);
8883
a536e1aacf0f Further work on SINFO-FlowDepth
gernotbelger
parents: 8882
diff changeset
116
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8915
diff changeset
117 final FlowDepthCalculator calculator = new FlowDepthCalculator(riverInfoProvider, wspLabel, bedHeight, tkhCalculator);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8914
diff changeset
118 return calculator.execute(label, wstInfo, calcRange);
8877
9f7a285b0ee3 Some work on SINFO FlowDepth
gernotbelger
parents: 8863
diff changeset
119 }
8884
7a8c12706834 Work on SINFO-FlowDepth
gernotbelger
parents: 8883
diff changeset
120 }

http://dive4elements.wald.intevation.org