Mercurial > dive4elements > river
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 : |