comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhCalculation.java @ 8938:9c02733a1b3c

Work on Sinfo-tkh - exports; using same logic for wst-description as winfo
author gernotbelger
date Tue, 06 Mar 2018 17:09:39 +0100
parents 5d5d0051723f
children 11bf13cf0463
comparison
equal deleted inserted replaced
8937:8596f95673b1 8938:9c02733a1b3c
28 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.TkhCalculator; 28 import org.dive4elements.river.artifacts.sinfo.tkhcalculation.TkhCalculator;
29 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; 29 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
30 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; 30 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
31 import org.dive4elements.river.artifacts.sinfo.util.WstInfo; 31 import org.dive4elements.river.artifacts.sinfo.util.WstInfo;
32 import org.dive4elements.river.artifacts.states.WaterlevelData; 32 import org.dive4elements.river.artifacts.states.WaterlevelData;
33 import org.dive4elements.river.exports.WaterlevelDescriptionBuilder;
33 import org.dive4elements.river.model.River; 34 import org.dive4elements.river.model.River;
34 35
35 /** 36 /**
36 * @author Gernot Belger 37 * @author Gernot Belger
37 */ 38 */
54 final Calculation problems = new Calculation(); 55 final Calculation problems = new Calculation();
55 56
56 /* find relevant bed-heights */ 57 /* find relevant bed-heights */
57 final Collection<BedHeightsFinder> bedHeights = BedHeightsFinder.createTkhBedHeights(river, problems, calcRange); 58 final Collection<BedHeightsFinder> bedHeights = BedHeightsFinder.createTkhBedHeights(river, problems, calcRange);
58 59
60 /* misuse winfo-artifact to calculate waterlevels in the same way */
61 final WINFOArtifact winfo = new WinfoArtifactWrapper(sinfo);
62
59 /* calculate waterlevels */ 63 /* calculate waterlevels */
60 final WQKms[] kms = calculateWaterlevels(sinfo, problems); 64 final WQKms[] kms = calculateWaterlevels(winfo, problems);
61 65
62 final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange); 66 final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange);
63 67
64 final String user = CalculationUtils.findArtifactUser(this.context, sinfo); 68 final String user = CalculationUtils.findArtifactUser(this.context, sinfo);
65 69
66 final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name()); 70 final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name());
67 71
72 final WaterlevelDescriptionBuilder descBuilder = new WaterlevelDescriptionBuilder(winfo, this.context);
73 final String descriptionHeader = descBuilder.getColumnHeader();
74
68 /* for each waterlevel, do a tkh calculation */ 75 /* for each waterlevel, do a tkh calculation */
69 final TkhCalculationResults results = new TkhCalculationResults(calcModeLabel, user, riverInfo, calcRange); 76 final TkhCalculationResults results = new TkhCalculationResults(calcModeLabel, user, riverInfo, calcRange, descriptionHeader);
70 77
71 for (final WQKms wqKms : kms) { 78 for (final WQKms wqKms : kms) {
72 79
73 final TkhCalculationResult result = calculateResult(calcRange, infoProvider, wqKms, bedHeights, problems); 80 final TkhCalculationResult result = calculateResult(calcRange, infoProvider, wqKms, bedHeights, descBuilder, problems);
74 if (result != null) 81 if (result != null)
75 // FIXME: must be sorted by station! 82 // FIXME: must be sorted by station!
76 results.addResult(result); 83 results.addResult(result);
77 } 84 }
78 85
79 return new CalculationResult(results, problems); 86 return new CalculationResult(results, problems);
80 } 87 }
81 88
82 private WQKms[] calculateWaterlevels(final SINFOArtifact sinfo, final Calculation problems) { 89 private WQKms[] calculateWaterlevels(final WINFOArtifact winfo, final Calculation problems) {
83
84 /* misuse winfo-artifact to calculate waterlevels in the same way */
85 final WINFOArtifact winfo = new WinfoArtifactWrapper(sinfo);
86 90
87 final CalculationResult waterlevelData = winfo.getWaterlevelData(this.context); 91 final CalculationResult waterlevelData = winfo.getWaterlevelData(this.context);
88 92
89 /* copy all problems */ 93 /* copy all problems */
90 final Calculation winfoProblems = waterlevelData.getReport(); 94 final Calculation winfoProblems = waterlevelData.getReport();
97 101
98 return (WQKms[]) waterlevelData.getData(); 102 return (WQKms[]) waterlevelData.getData();
99 } 103 }
100 104
101 private TkhCalculationResult calculateResult(final DoubleRange calcRange, final RiverInfoProvider riverInfo, final WQKms wkms, 105 private TkhCalculationResult calculateResult(final DoubleRange calcRange, final RiverInfoProvider riverInfo, final WQKms wkms,
102 final Collection<BedHeightsFinder> bedHeights, final Calculation problems) { 106 final Collection<BedHeightsFinder> bedHeights, final WaterlevelDescriptionBuilder descBuilder, final Calculation problems) {
103 107
104 // FIXME: wo kommt das her? via winfo kein jahr vorhanden, oder doch? aber soll in metadaten ausgegeben werden... 108 // FIXME: wo kommt das her? via winfo kein jahr vorhanden, oder doch? aber soll in metadaten ausgegeben werden...
105 final int wspYear = -1; 109 final int wspYear = -1;
106 // FIXME: richtig? vgl. WInfo? 110 // FIXME: richtig? vgl. WInfo?
107 final boolean showAllGauges = false; 111 final boolean showAllGauges = false;
108 final WaterlevelData waterlevel = new WaterlevelData(wkms, wspYear, showAllGauges); 112 final WaterlevelData waterlevel = new WaterlevelData(wkms, wspYear, showAllGauges);
109 113
110 final RiverInfoProvider riverInfoProvider = riverInfo.forWaterlevel(waterlevel); 114 final RiverInfoProvider riverInfoProvider = riverInfo.forWaterlevel(waterlevel);
111 115
112 final String label = waterlevel.getName(); 116 // FIXME: check with winfo how the name is generated
117 final String wstLabel = waterlevel.getName();
113 118
114 final WstInfo wstInfo = new WstInfo(label, wspYear, riverInfoProvider.getReferenceGauge()); 119 final WstInfo wstInfo = new WstInfo(wstLabel, wspYear, riverInfoProvider.getReferenceGauge());
115 120
116 final Collection<TkhResultRow> rows = new ArrayList<>(); 121 final Collection<TkhResultRow> rows = new ArrayList<>();
117 122
118 /* 123 /*
119 * for each separate bed height dataset we do the calculation and put everything into one result, bed heights must not 124 * for each separate bed height dataset we do the calculation and put everything into one result, bed heights must not
122 for (final BedHeightsFinder bedHeightsProvider : bedHeights) { 127 for (final BedHeightsFinder bedHeightsProvider : bedHeights) {
123 128
124 final DischargeValuesFinder dischargeProvider = DischargeValuesFinder.fromKms(wkms); 129 final DischargeValuesFinder dischargeProvider = DischargeValuesFinder.fromKms(wkms);
125 130
126 /* initialize tkh calculator */ 131 /* initialize tkh calculator */
127 final TkhCalculator tkhCalculator = TkhCalculator.buildTkhCalculator(true, this.context, problems, label, riverInfoProvider.getRiver(), calcRange, 132 final TkhCalculator tkhCalculator = TkhCalculator.buildTkhCalculator(true, this.context, problems, wstLabel, riverInfoProvider.getRiver(),
133 calcRange,
128 dischargeProvider, bedHeightsProvider); 134 dischargeProvider, bedHeightsProvider);
129 if (tkhCalculator == null) { 135 if (tkhCalculator == null) {
130 /* just abort, problems have already been updated by buildTkhCalculator() */ 136 /* just abort, problems have already been updated by buildTkhCalculator() */
131 return null; 137 return null;
132 } 138 }
142 final double station = wkms.getKm(i); 148 final double station = wkms.getKm(i);
143 final double wst = wkms.getW(i); 149 final double wst = wkms.getW(i);
144 150
145 final Tkh tkh = tkhCalculator.getTkh(station, wst); 151 final Tkh tkh = tkhCalculator.getTkh(station, wst);
146 152
153 final String description = descBuilder.getDesc(wkms);
147 final String gaugeLabel = riverInfoProvider.findGauge(station); 154 final String gaugeLabel = riverInfoProvider.findGauge(station);
148 final String location = riverInfoProvider.getLocation(station); 155 final String location = riverInfoProvider.getLocation(station);
149 156
150 rows.add(new TkhResultRow(tkh, label, gaugeLabel, location)); 157 rows.add(new TkhResultRow(tkh, description, gaugeLabel, location));
151 } 158 }
152 } 159 }
153 160
154 return new TkhCalculationResult(label, wstInfo, true, rows); 161 return new TkhCalculationResult(wstLabel, wstInfo, true, rows);
155 } 162 }
156 } 163 }

http://dive4elements.wald.intevation.org