comparison artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedQualityExporter.java @ 8581:073ea4bcea58

(issue1755) Interpolate BedQuality Results This adds an interpolation function to each various bedQuality result class. Imho this is ok as the interpolation function can be seen as part of the result. The interpolation function is initalized on first use and can be accessed through get.*Interpol functions.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 16 Mar 2015 15:36:38 +0100
parents e4606eae8ea5
children 07c9ac22f611
comparison
equal deleted inserted replaced
8580:d9f038b8e2ce 8581:073ea4bcea58
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde 1 /* Copyright (C) 2011, 2012, 2013, 2015 by Bundesanstalt für Gewässerkunde
2 * Software engineering by Intevation GmbH 2 * Software engineering by Intevation GmbH
3 * 3 *
4 * This file is Free Software under the GNU AGPL (>=v3) 4 * This file is Free Software under the GNU AGPL (>=v3)
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the 5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
6 * documentation coming with Dive4Elements River for details. 6 * documentation coming with Dive4Elements River for details.
26 import org.dive4elements.river.artifacts.model.minfo.BedParametersResult; 26 import org.dive4elements.river.artifacts.model.minfo.BedParametersResult;
27 import org.dive4elements.river.artifacts.model.minfo.BedQualityResult; 27 import org.dive4elements.river.artifacts.model.minfo.BedQualityResult;
28 import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterResult; 28 import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterResult;
29 import org.dive4elements.river.exports.AbstractExporter; 29 import org.dive4elements.river.exports.AbstractExporter;
30 import org.dive4elements.river.utils.Formatter; 30 import org.dive4elements.river.utils.Formatter;
31
32 import org.dive4elements.river.artifacts.access.RangeAccess;
33 import org.dive4elements.river.artifacts.D4EArtifact;
31 34
32 35
33 public class BedQualityExporter 36 public class BedQualityExporter
34 extends AbstractExporter 37 extends AbstractExporter
35 { 38 {
57 60
58 public BedQualityExporter() { 61 public BedQualityExporter() {
59 results = new BedQualityResult[0]; 62 results = new BedQualityResult[0];
60 } 63 }
61 64
62 /** Populate param kms with kms from param beds and loads, return it. */
63 private TDoubleArrayList populateKmList(BedDiameterResult[] beds,
64 BedloadDiameterResult[] loads,
65 TDoubleArrayList kms) {
66 for (int j = 0; j < beds.length; j++) {
67 TDoubleArrayList bkms = beds[j].getKms();
68 for (int k = 0, K = bkms.size(); k < K; k++) {
69 double km = bkms.get(k);
70 if (!kms.contains(km)) { // XXX: O(N^2)
71 kms.add(km);
72 }
73 }
74 }
75 for (int j = 0; j < loads.length; j++) {
76 TDoubleArrayList lkms = loads[j].getKms();
77 for (int k = 0, L = lkms.size(); k < L; k++) {
78 double km = lkms.get(k);
79 if (!kms.contains(km)) { // XXX: O(N^2)
80 kms.add(km);
81 }
82 }
83 }
84 return kms;
85 }
86
87 /** Create double[] containing the data for rows in csv. */ 65 /** Create double[] containing the data for rows in csv. */
88 private List<double[]> createDataRows() { 66 private List<double[]> createDataRows() {
89 // Calculate how many columns and rows we need. 67
90 TDoubleArrayList kms = new TDoubleArrayList(); 68 double[] kms = new RangeAccess((D4EArtifact) master).getKmSteps();
91 69
92 int cols = 1; 70 int cols = 1;
93 for (BedQualityResult result : results) { 71 for (BedQualityResult result : results) {
94 BedDiameterResult[] beds = result.getBedResults(); 72 BedDiameterResult[] beds = result.getBedResults();
95 BedloadDiameterResult[] loads = result.getBedloadResults(); 73 BedloadDiameterResult[] loads = result.getBedloadResults();
96 74
97 kms = populateKmList(beds, loads, kms);
98
99 cols += beds.length * 2; 75 cols += beds.length * 2;
100 if (beds.length > 0) { 76 if (beds.length > 0) {
101 cols += 4; 77 cols += 4;
102 } 78 }
103 cols += loads.length; 79 cols += loads.length;
104 } 80 }
105 81
106 kms.sort(); 82 List<double[]> rows = new ArrayList<double[]>(kms.length);
107 83 for (double km: kms) {
108 List<double[]> rows = new ArrayList<double[]>(kms.size());
109 for (int i = 0, K = kms.size(); i < K; i++) {
110 double[] row = new double[cols]; 84 double[] row = new double[cols];
111 double km = kms.get(i);
112 row[0] = km; 85 row[0] = km;
113 for (int j = 0; j < results.length; j++) { 86 for (int j = 0; j < results.length; j++) {
87
114 BedloadDiameterResult[] loads = results[j].getBedloadResults(); 88 BedloadDiameterResult[] loads = results[j].getBedloadResults();
115 89
116 for(int k = 0; k < loads.length; k++) { 90 for(int k = 0; k < loads.length; k++) {
117 // k + 1: shift km column. 91 // k + 1: shift km column.
118 // j* loads.length: shift periods. 92 // j* loads.length: shift periods.
119 row[(k + 1) + (j * loads.length)] = 93 row[(k + 1) + (j * loads.length)] =
120 loads[k].getDiameter(km); 94 loads[k].getDiameterInterpol(km);
121 } 95 }
96
122 BedDiameterResult[] beds = results[j].getBedResults(); 97 BedDiameterResult[] beds = results[j].getBedResults();
123 if (beds.length == 0) { 98 if (beds.length == 0) {
124 continue; 99 continue;
125 } 100 }
126 for (int k = 0; k < beds.length; k++) { 101 for (int k = 0; k < beds.length; k++) {
127 // k * 2 + 1: shift km column. 102 // k * 2 + 1: shift km column.
128 // j * beds.length * 2: shift periods. 103 // j * beds.length * 2: shift periods.
129 // loads.length * results.length: shift bed load columns. 104 // loads.length * results.length: shift bed load columns.
130 int ndx = (k * 2 + 1) + (j * beds.length * 2) + (loads.length * results.length); 105 int ndx = (k * 2 + 1) + (j * beds.length * 2) + (loads.length * results.length);
131 row[ndx] = beds[k].getDiameterCap(km); 106 row[ndx] = beds[k].getDiameterCapInterpol(km);
132 row[ndx + 1] = beds[k].getDiameterSub(km); 107 row[ndx + 1] = beds[k].getDiameterSubInterpol(km);
133 } 108 }
109
134 BedParametersResult[] params = results[j].getParameters(); 110 BedParametersResult[] params = results[j].getParameters();
135 for(int k = 0; k < params.length; k++) { 111 for(int k = 0; k < params.length; k++) {
136 // loads.length + (beds.lenght * 2) * (j + 1): shift bed and bedload columns. 112 // loads.length + (beds.lenght * 2) * (j + 1): shift bed and bedload columns.
137 int ndx = 1 + (loads.length + (beds.length * 2) * (j + 1)); 113 int ndx = 1 + (loads.length + (beds.length * 2) * (j + 1));
138 row[ndx] = params[k].getLoadDensityCap(km); 114 row[ndx] = params[k].getDensityCapInterpol(km);
139 row[ndx + 1] = params[k].getLoadDensitySub(km); 115 row[ndx + 1] = params[k].getDensitySubInterpol(km);
140 row[ndx + 2] = params[k].getPorosityCap(km); 116 row[ndx + 2] = params[k].getPorosityCapInterpol(km);
141 row[ndx + 3] = params[k].getPorositySub(km); 117 row[ndx + 3] = params[k].getPorositySubInterpol(km);
142 } 118 }
143 } 119 }
144 rows.add(row); 120 rows.add(row);
145 } 121 }
146 122
147 return rows; 123 return rows;
148 } 124 }
149 125
150 @Override 126 @Override
151 protected void writeCSVData(CSVWriter writer) throws IOException { 127 protected void writeCSVData(CSVWriter writer) throws IOException {
152 // TODO Auto-generated method stub
153 writeCSVHeader(writer); 128 writeCSVHeader(writer);
154 129
155 NumberFormat nf = Formatter.getFormatter(context, 1, 3); 130 NumberFormat nf = Formatter.getFormatter(context, 1, 3);
156 131
157 for (double[] d : createDataRows()) { 132 for (double[] d : createDataRows()) {
175 150
176 } 151 }
177 152
178 @Override 153 @Override
179 protected void addData(Object data) { 154 protected void addData(Object data) {
180 // TODO Auto-generated method stub
181 log.debug("addData()"); 155 log.debug("addData()");
182 if (!(data instanceof CalculationResult)) { 156 if (!(data instanceof CalculationResult)) {
183 log.warn("Invalid data type."); 157 log.warn("Invalid data type.");
184 return; 158 return;
185 } 159 }

http://dive4elements.wald.intevation.org