comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java @ 2792:fe987587ebc9

Merged revisions 4539-4540,4543,4545-4546 via svnmerge from file:///home/clients/bsh/bsh-generischer-viewer/Material/SVN/flys-artifacts/trunk ........ r4539 | teichmann | 2012-05-27 20:02:13 +0200 (So, 27 Mai 2012) | 1 line FixA: Added forgotten csv/report facets/generators to conf. ........ r4540 | teichmann | 2012-05-27 20:11:31 +0200 (So, 27 Mai 2012) | 1 line FixA: Fixed class cast bug in report facet. ........ r4543 | teichmann | 2012-05-28 20:35:01 +0200 (Mo, 28 Mai 2012) | 1 line FixA: Added facet to return delta w/t as CSV ........ r4545 | teichmann | 2012-05-28 22:59:27 +0200 (Mo, 28 Mai 2012) | 1 line FixA: Made Delta W/t calculation finally work ........ r4546 | teichmann | 2012-05-28 23:34:24 +0200 (Mo, 28 Mai 2012) | 1 line FixA: corrected fitting (Q->W instead W->Q). ........ flys-artifacts/tags/2.7@4547 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 29 May 2012 04:58:29 +0000
parents 063b784b60b4
children 3cda41b5eb23
comparison
equal deleted inserted replaced
2791:c9815016a3bb 2792:fe987587ebc9
123 } 123 }
124 } 124 }
125 125
126 public CalculationResult calculate() { 126 public CalculationResult calculate() {
127 127
128 boolean debug = log.isDebugEnabled();
129
128 FixingsOverview overview = 130 FixingsOverview overview =
129 FixingsOverviewFactory.getOverview(river); 131 FixingsOverviewFactory.getOverview(river);
130 132
131 if (overview == null) { 133 if (overview == null) {
132 addProblem("fix.no.overview.available"); 134 addProblem("fix.no.overview.available");
171 // TODO: i18n 173 // TODO: i18n
172 addProblem("fix.too.less.data.columns"); 174 addProblem("fix.too.less.data.columns");
173 return new CalculationResult(this); 175 return new CalculationResult(this);
174 } 176 }
175 177
176 double [] kms = DoubleUtil.explode(from, to, step); 178 double [] kms = DoubleUtil.explode(from, to, step / 1000.0);
177 179
178 double [] ws = new double[dataColumns.size()]; 180 double [] ws = new double[dataColumns.size()];
179 double [] qs = new double[ws.length]; 181 double [] qs = new double[ws.length];
180 182
181 String [] parameterNames = func.getParameterNames(); 183 String [] parameterNames = func.getParameterNames();
182 184
183 Parameters results = 185 Parameters results =
184 new Parameters(createColumnNames(parameterNames)); 186 new Parameters(createColumnNames(parameterNames));
185 187
186 boolean invalid = false; 188 boolean invalid = false;
189
190 if (debug) {
191 log.debug("number of kms: " + kms.length);
192 }
193
194 int numFailed = 0;
187 195
188 for (int i = 0; i < kms.length; ++i) { 196 for (int i = 0; i < kms.length; ++i) {
189 double km = kms[i]; 197 double km = kms[i];
190 198
191 for (int j = 0; j < ws.length; ++j) { 199 for (int j = 0; j < ws.length; ++j) {
196 } 204 }
197 205
198 // TODO: Do preprocessing here! 206 // TODO: Do preprocessing here!
199 double [] parameters = fit(func, km, ws, qs); 207 double [] parameters = fit(func, km, ws, qs);
200 if (parameters == null) { // Problems are reported already. 208 if (parameters == null) { // Problems are reported already.
209 ++numFailed;
201 continue; 210 continue;
202 } 211 }
203 212
204 int row = results.newRow(); 213 int row = results.newRow();
205 214
213 } 222 }
214 } 223 }
215 // TODO: Calculate statistics, too! 224 // TODO: Calculate statistics, too!
216 } 225 }
217 226
227 if (debug) {
228 log.debug("success: " + (kms.length - numFailed));
229 log.debug("failed: " + numFailed);
230 }
231
218 if (invalid) { 232 if (invalid) {
219 // TODO: i18n 233 // TODO: i18n
220 addProblem("fix.invalid.values"); 234 addProblem("fix.invalid.values");
221 results.removeNaNs(); 235 results.removeNaNs();
222 } 236 }
235 public DeltaWTsKM calculateDeltaWTs( 249 public DeltaWTsKM calculateDeltaWTs(
236 Function function, 250 Function function,
237 FixingsOverview overview, 251 FixingsOverview overview,
238 Parameters results 252 Parameters results
239 ) { 253 ) {
254 boolean debug = log.isDebugEnabled();
255
240 DeltaWTsKM deltaWTsKM = new DeltaWTsKM(results.size()); 256 DeltaWTsKM deltaWTsKM = new DeltaWTsKM(results.size());
241 257
242 Column [][] analysisColumns = getAnalysisColumns(overview); 258 Column [][] analysisColumns = getAnalysisColumns(overview);
243 259
244 int [] parameterIndices = 260 int [] parameterIndices =
247 double [] parameterValues = 263 double [] parameterValues =
248 new double[parameterIndices.length]; 264 new double[parameterIndices.length];
249 265
250 double [] ow = new double[1]; 266 double [] ow = new double[1];
251 267
268 int kmIdx = results.columnIndex("km");
269
252 for (int i = 0, N = results.size(); i < N; ++i) { 270 for (int i = 0, N = results.size(); i < N; ++i) {
253 double km = results.get(i, "km"); 271 double km = results.get(i, kmIdx);
254 results.get(i, parameterIndices, parameterValues); 272 results.get(i, parameterIndices, parameterValues);
255 273
256 DeltaWTsKM.KM dwtkm = new DeltaWTsKM.KM(km); 274 DeltaWTsKM.KM dwtkm = new DeltaWTsKM.KM(km);
257 deltaWTsKM.add(dwtkm); 275 deltaWTsKM.add(dwtkm);
258 276
262 280
263 // Evaluate all columns for all analysis periods. 281 // Evaluate all columns for all analysis periods.
264 for (int j = 0; j < analysisColumns.length; ++j) { 282 for (int j = 0; j < analysisColumns.length; ++j) {
265 Column [] periodColumns = analysisColumns[j]; 283 Column [] periodColumns = analysisColumns[j];
266 284
285 int failedQ = 0;
286 int failedW = 0;
287 int failedC = 0;
288
267 for (int k = 0; k < periodColumns.length; ++k) { 289 for (int k = 0; k < periodColumns.length; ++k) {
268 Column pc = periodColumns[k]; 290 Column pc = periodColumns[k];
269 291
270 // Q from real data. 292 // Q from real data.
271 double q = pc.data.getQ(km); 293 double q = pc.data.getQ(km);
272 if (Double.isNaN(q)) { 294 if (Double.isNaN(q)) {
295 ++failedQ;
273 continue; 296 continue;
274 } 297 }
275 298
276 // Calculate W from function. 299 // Calculate W from function.
277 double nw = instance.value(q); 300 double nw = instance.value(q);
278 if (Double.isNaN(nw)) { 301 if (Double.isNaN(nw)) {
302 ++failedC;
279 continue; 303 continue;
280 } 304 }
281 305
282 // W from real data. 306 // W from real data.
283 pc.data.getW(km, ow); 307 pc.data.getW(km, ow);
284 308
285 if (Double.isNaN(ow[0])) { 309 if (Double.isNaN(ow[0])) {
310 ++failedW;
286 continue; 311 continue;
287 } 312 }
288 313
289 double deltaW = ow[0] - nw; 314 double deltaW = (ow[0] - nw)*100.0; // in cm
290 315
291 DeltaWT deltaWT = new DeltaWT( 316 DeltaWT deltaWT = new DeltaWT(
292 deltaW, 317 deltaW,
293 pc.meta.getStartTime(), 318 pc.meta.getStartTime(),
294 pc.meta.getDescription()); 319 pc.meta.getDescription());
295 320
296 dwtkm.add(deltaWT); 321 dwtkm.add(deltaWT);
297 } 322 }
323 if (debug) {
324 log.debug("failed W: " + failedW);
325 log.debug("failed Q: " + failedQ);
326 log.debug("failed C: " + failedC);
327 log.debug("input size: " + periodColumns.length);
328 log.debug("outpt size: " + dwtkm.size());
329 }
298 } 330 }
299 } 331 }
300 332
301 return deltaWTsKM; 333 return deltaWTsKM;
302 } 334 }
319 } // class Column 351 } // class Column
320 352
321 /** Fetch meta and data columns for analysis periods. */ 353 /** Fetch meta and data columns for analysis periods. */
322 protected Column [][] getAnalysisColumns(FixingsOverview overview) { 354 protected Column [][] getAnalysisColumns(FixingsOverview overview) {
323 355
356 boolean debug = log.isDebugEnabled();
357 if (debug) {
358 log.debug("number analysis periods: " + analysisPeriods.length);
359 }
360
324 Column columns [][] = new Column[analysisPeriods.length][]; 361 Column columns [][] = new Column[analysisPeriods.length][];
325 362
326 Range range = new Range(from, to); 363 Range range = new Range(from, to);
327 SectorRangeFilter sectorRangeFilter = 364 SectorRangeFilter sectorRangeFilter =
328 new SectorRangeFilter(qSectorStart, qSectorEnd); 365 new SectorRangeFilter(qSectorStart, qSectorEnd);
343 380
344 filter.add(dateRangeFilter); 381 filter.add(dateRangeFilter);
345 filter.add(sectorRangeFilter); 382 filter.add(sectorRangeFilter);
346 383
347 List<Fixing.Column> metaCols = overview.filter(range, filter); 384 List<Fixing.Column> metaCols = overview.filter(range, filter);
385
386 if (debug) {
387 log.debug("number of filtered columns: " + metaCols.size());
388 }
348 389
349 ArrayList<Column> cols = new ArrayList<Column>(metaCols.size()); 390 ArrayList<Column> cols = new ArrayList<Column>(metaCols.size());
350 391
351 // Only use columns which have data. 392 // Only use columns which have data.
352 for (Fixing.Column meta: metaCols) { 393 for (Fixing.Column meta: metaCols) {
353 FixingsColumn data = fcf.getColumnData(meta); 394 FixingsColumn data = fcf.getColumnData(meta);
354 if (data != null) { 395 if (data != null) {
355 cols.add(new Column(meta, data)); 396 cols.add(new Column(meta, data));
356 } 397 }
398 }
399
400 if (debug) {
401 log.debug("failed loading: " + (metaCols.size()-cols.size()));
357 } 402 }
358 columns[i] = cols.toArray(new Column[cols.size()]); 403 columns[i] = cols.toArray(new Column[cols.size()]);
359 } 404 }
360 405
361 return columns; 406 return columns;
376 double [] qs 421 double [] qs
377 ) { 422 ) {
378 LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer(); 423 LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer();
379 CurveFitter cf = new CurveFitter(lmo); 424 CurveFitter cf = new CurveFitter(lmo);
380 425
381 boolean missingWs = false;
382 boolean missingQs = false;
383
384 for (int i = 0; i < ws.length; ++i) { 426 for (int i = 0; i < ws.length; ++i) {
385 boolean ignore = false; 427 if (!Double.isNaN(ws[i]) && !Double.isNaN(qs[i])) {
386 if (Double.isNaN(ws[i])) { 428 cf.addObservedPoint(qs[i], ws[i]);
387 ignore = true;
388 if (!missingWs) {
389 missingWs = true;
390 // TODO: i18n
391 addProblem(km, "fix.missing.w");
392 }
393 }
394 if (Double.isNaN(qs[i])) {
395 ignore = true;
396 if (!missingQs) {
397 missingQs = true;
398 // TODO: i18n
399 addProblem(km, "fix.missing.q");
400 }
401 }
402 if (!ignore) {
403 cf.addObservedPoint(ws[i], qs[i]);
404 } 429 }
405 } 430 }
406 431
407 try { 432 try {
408 return cf.fit(function, function.getInitialGuess()); 433 return cf.fit(function, function.getInitialGuess());
409 } 434 }
410 catch (MathException me) { 435 catch (MathException me) {
436 log.warn(me, me);
411 addProblem(km, "fix.fitting.failed"); 437 addProblem(km, "fix.fitting.failed");
412 } 438 }
413 439
414 return null; 440 return null;
415 } 441 }

http://dive4elements.wald.intevation.org