comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Segment.java @ 3441:bfbd478bd607

FixA: Moved Q -> W conversion code into segments to be reusable. flys-artifacts/trunk@5104 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 23 Jul 2012 14:19:07 +0000
parents cb11919cccf9
children fc351f12b906
comparison
equal deleted inserted replaced
3440:fed6685692d2 3441:bfbd478bd607
1 package de.intevation.flys.artifacts.model; 1 package de.intevation.flys.artifacts.model;
2 2
3 import de.intevation.flys.model.DischargeTable;
4 import de.intevation.flys.model.Gauge;
5 import de.intevation.flys.model.River;
6
3 import de.intevation.flys.utils.DoubleUtil; 7 import de.intevation.flys.utils.DoubleUtil;
4 8
5 import gnu.trove.TDoubleArrayList; 9 import gnu.trove.TDoubleArrayList;
6 10
7 import java.io.Serializable; 11 import java.io.Serializable;
8 12
9 import java.util.ArrayList; 13 import java.util.ArrayList;
14 import java.util.Collections;
10 import java.util.Comparator; 15 import java.util.Comparator;
11 import java.util.List; 16 import java.util.List;
12 17
13 import org.apache.log4j.Logger; 18 import org.apache.log4j.Logger;
14 19
15 public class Segment 20 public class Segment
16 implements Serializable 21 implements Serializable
17 { 22 {
18 private static Logger logger = Logger.getLogger(Segment.class); 23 private static Logger log = Logger.getLogger(Segment.class);
19 24
20 public static final Comparator<Segment> REF_CMP = 25 public static final Comparator<Segment> REF_CMP =
21 new Comparator<Segment>() { 26 new Comparator<Segment>() {
22 @Override 27 @Override
23 public int compare(Segment a, Segment b) { 28 public int compare(Segment a, Segment b) {
110 TDoubleArrayList vs = new TDoubleArrayList(); 115 TDoubleArrayList vs = new TDoubleArrayList();
111 116
112 for (String segmentStr: input.split(":")) { 117 for (String segmentStr: input.split(":")) {
113 String [] parts = segmentStr.split(";"); 118 String [] parts = segmentStr.split(";");
114 if (parts.length < 3) { 119 if (parts.length < 3) {
115 logger.warn("invalid segment: '" + segmentStr + "'"); 120 log.warn("invalid segment: '" + segmentStr + "'");
116 continue; 121 continue;
117 } 122 }
118 try { 123 try {
119 double from = Double.parseDouble(parts[0].trim()); 124 double from = Double.parseDouble(parts[0].trim());
120 double to = Double.parseDouble(parts[1].trim()); 125 double to = Double.parseDouble(parts[1].trim());
128 133
129 double [] values = vs.toNativeArray(); 134 double [] values = vs.toNativeArray();
130 segments.add(new Segment(from, to, values)); 135 segments.add(new Segment(from, to, values));
131 } 136 }
132 catch (NumberFormatException nfe) { 137 catch (NumberFormatException nfe) {
133 logger.warn("invalid segment: '" + segmentStr + "'"); 138 log.warn("invalid segment: '" + segmentStr + "'");
134 } 139 }
135 } 140 }
136 141
137 return segments; 142 return segments;
143 }
144
145 public static boolean setReferencePointConvertQ(
146 List<Segment> segments,
147 River river,
148 boolean isQ,
149 Calculation report
150 ) {
151 int numResults = -1;
152
153 boolean success = true;
154
155 // assign reference points
156 for (Segment segment: segments) {
157 Gauge gauge = river.maxOverlap(segment.getFrom(), segment.getTo());
158
159 if (gauge == null) {
160 log.warn("no gauge found. Defaults to mid point.");
161 segment.setReferencePoint(
162 0.5*(segment.getFrom()+segment.getTo()));
163 }
164 else {
165 double ref = gauge.getStation().doubleValue();
166 log.debug(
167 "reference gauge: " + gauge.getName() +
168 " (km " + ref + ")");
169 segment.setReferencePoint(ref);
170 }
171
172 double [] values = segment.values;
173
174 if (numResults == -1) {
175 numResults = values.length;
176 }
177 else if (numResults != values.length) {
178 log.warn("wrong length of values");
179 return false;
180 }
181
182 // convert to Q if needed
183 if (!isQ && gauge != null) {
184
185 DischargeTable dt = gauge.fetchMasterDischargeTable();
186
187 double [][] table =
188 DischargeTables.loadDischargeTableValues(dt, 1);
189
190 // need the original values for naming
191 segment.backup();
192
193 for (int i = 0; i < values.length; ++i) {
194 double w = values[i] / 100.0;
195 double [] qs = DischargeTables.getQsForW(table, w);
196 if (qs.length == 0) {
197 log.warn("No Qs found for W = " + values[i]);
198 report.addProblem("cannot.find.w.for.q", values[i]);
199 values[i] = Double.NaN;
200 success = false;
201 }
202 else {
203 values[i] = qs[0];
204 if (qs.length > 1) {
205 log.warn(
206 "More than one Q found for W = " + values[i]);
207 }
208 }
209 }
210 }
211 } // for all segments
212
213 Collections.sort(segments, Segment.REF_CMP);
214
215 return success;
138 } 216 }
139 } 217 }
140 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 218 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org