comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 643:a9bde508824a

flys/issue82: Only successful interpolations are named. flys-artifacts/trunk@2027 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 30 May 2011 09:19:57 +0000
parents 2dbbb5be30a1
children 433f67a076aa
comparison
equal deleted inserted replaced
642:2dbbb5be30a1 643:a9bde508824a
1 package de.intevation.flys.artifacts; 1 package de.intevation.flys.artifacts;
2 2
3 import java.util.List; 3 import java.util.List;
4 import java.util.Set;
5 import java.util.HashSet;
4 import java.util.Vector; 6 import java.util.Vector;
5 import java.util.ArrayList; 7 import java.util.ArrayList;
6 8
7 import org.w3c.dom.Document; 9 import org.w3c.dom.Document;
8 import org.w3c.dom.Element; 10 import org.w3c.dom.Element;
275 WstValueTable wst = WstValueTableFactory.getTable(river); 277 WstValueTable wst = WstValueTableFactory.getTable(river);
276 if (wst == null) { 278 if (wst == null) {
277 throw new NullPointerException("No Wst found for selected river."); 279 throw new NullPointerException("No Wst found for selected river.");
278 } 280 }
279 281
280 WQKms[] results = computeWaterlevelData(kms, qs, wst, river.getKmUp()); 282 HashSet<Integer> failed = new HashSet<Integer>();
283
284 WQKms[] results = computeWaterlevelData(
285 kms, qs, wst, river.getKmUp(), failed);
281 286
282 // TODO Introduce a caching mechanism here! 287 // TODO Introduce a caching mechanism here!
283 288
284 setWaterlevelNames(results, qSel ? qs : ws, qSel ? "Q" : "W"); 289 setWaterlevelNames(
290 results, qSel ? qs : ws, qSel ? "Q" : "W", failed);
285 291
286 return results; 292 return results;
287 } 293 }
288 294
289 295
293 * 299 *
294 * @param r The waterlevel columns. 300 * @param r The waterlevel columns.
295 * @param v The input values of the computations. 301 * @param v The input values of the computations.
296 * @param wq The WQ mode - can be one of "W" or "Q". 302 * @param wq The WQ mode - can be one of "W" or "Q".
297 */ 303 */
298 public static void setWaterlevelNames(WQKms[] r, double[] v, String wq) { 304 public static void setWaterlevelNames(
305 WQKms[] r,
306 double[] v,
307 String wq,
308 Set failed
309 ) {
310 int pos = 0;
299 for (int i = 0; i < v.length; i++) { 311 for (int i = 0; i < v.length; i++) {
300 r[i].setName(wq + "=" + Double.toString(v[i])); 312 if (!failed.contains(i)) {
313 r[pos++].setName(wq + "=" + v[i]);
314 }
301 } 315 }
302 } 316 }
303 317
304 318
305 /** 319 /**
314 */ 328 */
315 public static WQKms[] computeWaterlevelData( 329 public static WQKms[] computeWaterlevelData(
316 double[] kms, 330 double[] kms,
317 double[] qs, 331 double[] qs,
318 WstValueTable wst, 332 WstValueTable wst,
319 boolean up 333 boolean up,
334 Set<Integer> failed
320 ) { 335 ) {
321 logger.info("WINFOArtifact.computeWaterlevelData"); 336 logger.info("WINFOArtifact.computeWaterlevelData");
322 337
323 WQKms[] wqkms = new WQKms[qs.length]; 338 WQKms[] wqkms = new WQKms[qs.length];
324 339
334 if (qPosition != null) { 349 if (qPosition != null) {
335 results.add(new WQKms(kms, oqs, ows)); 350 results.add(new WQKms(kms, oqs, ows));
336 } 351 }
337 else { 352 else {
338 logger.warn("interpolation failed for q = " + qs[i]); 353 logger.warn("interpolation failed for q = " + qs[i]);
354 failed.add(i);
339 } 355 }
340 } 356 }
341 357
342 return results.toArray(new WQKms[results.size()]); 358 return results.toArray(new WQKms[results.size()]);
343 } 359 }
565 logger.warn("no qs given"); 581 logger.warn("no qs given");
566 return new WQKms[0]; 582 return new WQKms[0];
567 } 583 }
568 if (qs.length == 1) { 584 if (qs.length == 1) {
569 double [] kms = getKms(segments[0]); 585 double [] kms = getKms(segments[0]);
570 return computeWaterlevelData(kms, qs, wst, kmUp); 586 HashSet<Integer> failed = new HashSet<Integer>();
587 WQKms [] results = computeWaterlevelData
588 (kms, qs, wst, kmUp, failed);
589 setWaterlevelNames(
590 results, qs, isQ() ? "Q" : "W", failed);
591 return results;
571 } 592 }
572 } 593 }
573 594
574 // more than one segment 595 // more than one segment
575 596
650 671
651 ArrayList<WQKms> results = new ArrayList<WQKms>(); 672 ArrayList<WQKms> results = new ArrayList<WQKms>();
652 673
653 int referenceIndex = kmUp ? 0 : boundKms.length-1; 674 int referenceIndex = kmUp ? 0 : boundKms.length-1;
654 675
676 HashSet<Integer> failed = new HashSet<Integer>();
677
655 for (int i = 0; i < iqs.length; ++i) { 678 for (int i = 0; i < iqs.length; ++i) {
656 double [] iqsi = iqs[i]; 679 double [] iqsi = iqs[i];
657 680
658 QPosition qPosition = wst.interpolate( 681 QPosition qPosition = wst.interpolate(
659 iqsi[0], 682 iqsi[0],
660 referenceIndex, 683 referenceIndex,
661 boundKms, boundWs, boundQs); 684 boundKms, boundWs, boundQs);
662 685
663 if (qPosition == null) { 686 if (qPosition == null) {
664 logger.warn("interpolation failed for " + iqsi[i]); 687 logger.warn("interpolation failed for " + iqsi[i]);
688 failed.add(i);
665 continue; 689 continue;
666 } 690 }
667 691
668 LinearRemap remap = new LinearRemap(); 692 LinearRemap remap = new LinearRemap();
669 693
689 } 713 }
690 } 714 }
691 715
692 WQKms [] wqkms = results.toArray(new WQKms[results.size()]); 716 WQKms [] wqkms = results.toArray(new WQKms[results.size()]);
693 717
694 setDischargeLongitudinalSectionNames(wqkms, iqs, isQ() ? "Q" : "W"); 718 setDischargeLongitudinalSectionNames(
719 wqkms, iqs, isQ() ? "Q" : "W", failed);
695 720
696 return wqkms; 721 return wqkms;
697 } 722 }
698 723
699 protected static String joinDoubles(double [] x) { 724 protected static String joinDoubles(double [] x) {
722 /** 747 /**
723 * Sets the name for discharge longitudinal section curves where each WQKms 748 * Sets the name for discharge longitudinal section curves where each WQKms
724 * in <i>r</i> represents a column. 749 * in <i>r</i> represents a column.
725 */ 750 */
726 public static void setDischargeLongitudinalSectionNames( 751 public static void setDischargeLongitudinalSectionNames(
727 WQKms [] wqkms, 752 WQKms [] wqkms,
728 double [][] iqs, 753 double [][] iqs,
729 String wq 754 String wq,
755 Set<Integer> failed
730 ) { 756 ) {
731 logger.debug("WINFOArtifact.setDischargeLongitudinalSectionNames"); 757 logger.debug("WINFOArtifact.setDischargeLongitudinalSectionNames");
732 758
733 // TODO: I18N 759 // TODO: I18N
734 760
735 for (int j = 0; j < wqkms.length; ++j) { 761 int pos = 0;
762
763 for (int j = 0; j < iqs.length; ++j) {
764 if (failed.contains(j)) {
765 continue;
766 }
736 StringBuilder sb = new StringBuilder(wq) 767 StringBuilder sb = new StringBuilder(wq)
737 .append(" benutzerdefiniert ("); 768 .append(" benutzerdefiniert (");
738 769
739 double [] iqsi = iqs[j]; 770 double [] iqsi = iqs[j];
740 for (int i = 0; i < iqsi.length; i++) { 771 for (int i = 0; i < iqsi.length; i++) {
743 } 774 }
744 sb.append(iqsi[i]); 775 sb.append(iqsi[i]);
745 } 776 }
746 sb.append(")"); 777 sb.append(")");
747 778
748 wqkms[j].setName(sb.toString()); 779 wqkms[pos++].setName(sb.toString());
749 } 780 }
750 } 781 }
751 } 782 }
752 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 783 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org