Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedQualityExporter.java @ 8587:07c9ac22f611
(issue1755) Generalise BedQuality result handling
The bedquality calculation now produces a result for each time period
which has BedQualityResultValues for each specific result type.
Formally this was split up in density, porosity and diameter classes
with some bedload diameter classes mixed in for extra fun.
The intent of this commit is to allow more shared code and generic
access patterns to the BedQuality results.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Wed, 18 Mar 2015 18:42:08 +0100 |
parents | 073ea4bcea58 |
children | 717b58b158c9 |
comparison
equal
deleted
inserted
replaced
8586:19fde13e2db4 | 8587:07c9ac22f611 |
---|---|
20 | 20 |
21 import org.apache.log4j.Logger; | 21 import org.apache.log4j.Logger; |
22 | 22 |
23 import au.com.bytecode.opencsv.CSVWriter; | 23 import au.com.bytecode.opencsv.CSVWriter; |
24 import org.dive4elements.river.artifacts.model.CalculationResult; | 24 import org.dive4elements.river.artifacts.model.CalculationResult; |
25 import org.dive4elements.river.artifacts.model.minfo.BedDiameterResult; | |
26 import org.dive4elements.river.artifacts.model.minfo.BedParametersResult; | |
27 import org.dive4elements.river.artifacts.model.minfo.BedQualityResult; | 25 import org.dive4elements.river.artifacts.model.minfo.BedQualityResult; |
28 import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterResult; | 26 import org.dive4elements.river.artifacts.model.minfo.BedQualityResultValue; |
29 import org.dive4elements.river.exports.AbstractExporter; | 27 import org.dive4elements.river.exports.AbstractExporter; |
30 import org.dive4elements.river.utils.Formatter; | 28 import org.dive4elements.river.utils.Formatter; |
31 | 29 |
32 import org.dive4elements.river.artifacts.access.RangeAccess; | 30 import org.dive4elements.river.artifacts.access.RangeAccess; |
33 import org.dive4elements.river.artifacts.D4EArtifact; | 31 import org.dive4elements.river.artifacts.D4EArtifact; |
39 /** Private log. */ | 37 /** Private log. */ |
40 private static Logger log = Logger.getLogger(BedQualityExporter.class); | 38 private static Logger log = Logger.getLogger(BedQualityExporter.class); |
41 | 39 |
42 private static final String CSV_HEADER_KM = | 40 private static final String CSV_HEADER_KM = |
43 "export.minfo.bedquality.km"; | 41 "export.minfo.bedquality.km"; |
44 private static final String CSV_HEADER_DENSITY_CAP = | 42 private static final String CSV_HEADER_BASE = |
45 "export.minfo.bedquality.density_cap"; | 43 "export.minfo.bedquality"; |
46 private static final String CSV_HEADER_DENSITY_SUB = | |
47 "export.minfo.bedquality.density_sub"; | |
48 private static final String CSV_HEADER_POROSITY_CAP = | |
49 "export.minfo.bedquality.porosity_cap"; | |
50 private static final String CSV_HEADER_POROSITY_SUB = | |
51 "export.minfo.bedquality.porosity_sub"; | |
52 private static final String CSV_HEADER_BEDLOAD = | |
53 "export.minfo.bedquality.bedload"; | |
54 private static final String CSV_HEADER_BED_CAP = | |
55 "export.minfo.bedquality.bed_cap"; | |
56 private static final String CSV_HEADER_BED_SUB = | |
57 "export.minfo.bedquality.bed_sub"; | |
58 | 44 |
59 private BedQualityResult[] results; | 45 private BedQualityResult[] results; |
60 | 46 |
61 public BedQualityExporter() { | 47 public BedQualityExporter() { |
62 results = new BedQualityResult[0]; | 48 results = new BedQualityResult[0]; |
66 private List<double[]> createDataRows() { | 52 private List<double[]> createDataRows() { |
67 | 53 |
68 double[] kms = new RangeAccess((D4EArtifact) master).getKmSteps(); | 54 double[] kms = new RangeAccess((D4EArtifact) master).getKmSteps(); |
69 | 55 |
70 int cols = 1; | 56 int cols = 1; |
71 for (BedQualityResult result : results) { | 57 for (BedQualityResult result: results) { |
72 BedDiameterResult[] beds = result.getBedResults(); | 58 cols += result.getValues().size(); |
73 BedloadDiameterResult[] loads = result.getBedloadResults(); | |
74 | |
75 cols += beds.length * 2; | |
76 if (beds.length > 0) { | |
77 cols += 4; | |
78 } | |
79 cols += loads.length; | |
80 } | 59 } |
81 | 60 |
82 List<double[]> rows = new ArrayList<double[]>(kms.length); | 61 List<double[]> rows = new ArrayList<double[]>(kms.length); |
83 for (double km: kms) { | 62 for (double km: kms) { |
84 double[] row = new double[cols]; | 63 double[] row = new double[cols]; |
85 row[0] = km; | 64 row[0] = km; |
86 for (int j = 0; j < results.length; j++) { | 65 for (BedQualityResult result: results) { |
87 | 66 int i = 1; |
88 BedloadDiameterResult[] loads = results[j].getBedloadResults(); | 67 for (BedQualityResultValue value: result.getValues()) { |
89 | 68 row[i++] = value.getDataInterpolated(km); |
90 for(int k = 0; k < loads.length; k++) { | |
91 // k + 1: shift km column. | |
92 // j* loads.length: shift periods. | |
93 row[(k + 1) + (j * loads.length)] = | |
94 loads[k].getDiameterInterpol(km); | |
95 } | |
96 | |
97 BedDiameterResult[] beds = results[j].getBedResults(); | |
98 if (beds.length == 0) { | |
99 continue; | |
100 } | |
101 for (int k = 0; k < beds.length; k++) { | |
102 // k * 2 + 1: shift km column. | |
103 // j * beds.length * 2: shift periods. | |
104 // loads.length * results.length: shift bed load columns. | |
105 int ndx = (k * 2 + 1) + (j * beds.length * 2) + (loads.length * results.length); | |
106 row[ndx] = beds[k].getDiameterCapInterpol(km); | |
107 row[ndx + 1] = beds[k].getDiameterSubInterpol(km); | |
108 } | |
109 | |
110 BedParametersResult[] params = results[j].getParameters(); | |
111 for(int k = 0; k < params.length; k++) { | |
112 // loads.length + (beds.lenght * 2) * (j + 1): shift bed and bedload columns. | |
113 int ndx = 1 + (loads.length + (beds.length * 2) * (j + 1)); | |
114 row[ndx] = params[k].getDensityCapInterpol(km); | |
115 row[ndx + 1] = params[k].getDensitySubInterpol(km); | |
116 row[ndx + 2] = params[k].getPorosityCapInterpol(km); | |
117 row[ndx + 3] = params[k].getPorositySubInterpol(km); | |
118 } | 69 } |
119 } | 70 } |
120 rows.add(row); | 71 rows.add(row); |
121 } | 72 } |
122 | 73 |
168 | 119 |
169 protected void writeCSVHeader(CSVWriter writer) { | 120 protected void writeCSVHeader(CSVWriter writer) { |
170 log.debug("writeCSVHeader()"); | 121 log.debug("writeCSVHeader()"); |
171 | 122 |
172 List<String> header = new ArrayList<String>(); | 123 List<String> header = new ArrayList<String>(); |
173 if (results != null) { | 124 if (results == null) { |
174 header.add(msg(CSV_HEADER_KM, "km")); | 125 writer.writeNext(header.toArray(new String[header.size()])); |
175 for (int i = 0; i < results.length; i++) { | 126 return; |
176 DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy"); | 127 } |
177 String d1 = df.format(results[i].getDateRange().getFrom()); | 128 |
178 String d2 = df.format(results[i].getDateRange().getTo()); | 129 header.add(msg(CSV_HEADER_KM, "km")); |
179 BedloadDiameterResult[] loads = results[i].getBedloadResults(); | 130 DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy"); |
180 BedDiameterResult[] beds = results[i].getBedResults(); | 131 for (BedQualityResult result: results) { |
181 BedParametersResult[] params = results[i].getParameters(); | 132 String d1 = df.format(result.getDateRange().getFrom()); |
182 for (int j = 0; j < loads.length; j++) { | 133 String d2 = df.format(result.getDateRange().getTo()); |
183 header.add(msg(CSV_HEADER_BEDLOAD, CSV_HEADER_BEDLOAD) + | 134 for (BedQualityResultValue value: result.getValues()) { |
184 " - " + | 135 String i18n; |
185 msg(loads[j].getType().toString(), | 136 if (value.isDiameterResult()) { |
186 loads[j].getType().toString()) + " - " + | 137 i18n = CSV_HEADER_BASE + ".diameter." + value.getType(); |
187 d1 + "-" + d2); | 138 header.add(msg(i18n, i18n) + |
188 } | 139 " - " + value.getName() + " - " + d1 + "-" + d2); |
189 for (int j = 0; j < beds.length; j++) { | 140 } else { |
190 header.add(msg(CSV_HEADER_BED_CAP, CSV_HEADER_BED_CAP) + " - " + | 141 i18n = CSV_HEADER_BASE + "." + value.getName() + "." + value.getType(); |
191 msg(beds[j].getType().toString(), | 142 header.add(msg(i18n, i18n) + " - " + d1 + "-" + d2); |
192 beds[j].getType().toString()) + " - " + | |
193 d1 + "-" + d2); | |
194 header.add(msg(CSV_HEADER_BED_SUB, CSV_HEADER_BED_SUB) + " - " + | |
195 msg(beds[j].getType().toString(), | |
196 beds[j].getType().toString()) + " - " + | |
197 d1 + "-" + d2); | |
198 } | |
199 if (beds.length == 0) { | |
200 continue; | |
201 } | |
202 if (params.length > 0) { | |
203 header.add( | |
204 msg(CSV_HEADER_DENSITY_CAP, CSV_HEADER_DENSITY_CAP) + | |
205 " - " + d1 + "-" + d2); | |
206 header.add( | |
207 msg(CSV_HEADER_DENSITY_SUB, CSV_HEADER_DENSITY_SUB) + | |
208 " - " + d1 + "-" + d2); | |
209 header.add( | |
210 msg(CSV_HEADER_POROSITY_CAP, CSV_HEADER_POROSITY_CAP) + | |
211 " - " + d1 + "-" + d2); | |
212 header.add( | |
213 msg(CSV_HEADER_POROSITY_SUB, CSV_HEADER_POROSITY_SUB) + | |
214 " - " + d1 + "-" + d2); | |
215 } | 143 } |
216 } | 144 } |
217 } | 145 } |
218 writer.writeNext(header.toArray(new String[header.size()])); | 146 writer.writeNext(header.toArray(new String[header.size()])); |
219 } | 147 } |