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 }

http://dive4elements.wald.intevation.org