Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingCalculation.java @ 5831:bd047b71ab37
Repaired internal references
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:06:39 +0200 |
parents | flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java@345f3bba6f15 |
children |
comparison
equal
deleted
inserted
replaced
5830:160f53ee0870 | 5831:bd047b71ab37 |
---|---|
1 package org.dive4elements.river.artifacts.model.fixings; | |
2 | |
3 import org.dive4elements.river.artifacts.access.FixRealizingAccess; | |
4 | |
5 import org.dive4elements.river.artifacts.math.fitting.Function; | |
6 | |
7 import org.dive4elements.river.artifacts.model.CalculationResult; | |
8 import org.dive4elements.river.artifacts.model.FixingsOverview; | |
9 import org.dive4elements.river.artifacts.model.RiverFactory; | |
10 import org.dive4elements.river.artifacts.model.Segment; | |
11 import org.dive4elements.river.artifacts.model.WQKms; | |
12 import org.dive4elements.river.artifacts.model.Parameters; | |
13 | |
14 import org.dive4elements.river.model.River; | |
15 | |
16 import java.util.List; | |
17 | |
18 import org.apache.log4j.Logger; | |
19 | |
20 /** Calculation for FixRealize (german: ausgel. WSPL). */ | |
21 public class FixRealizingCalculation | |
22 extends FixCalculation | |
23 { | |
24 private static Logger log = | |
25 Logger.getLogger(FixRealizingCalculation.class); | |
26 | |
27 protected boolean isQ; | |
28 protected List<Segment> segments; | |
29 | |
30 public FixRealizingCalculation() { | |
31 } | |
32 | |
33 public FixRealizingCalculation(FixRealizingAccess access) { | |
34 super(access); | |
35 | |
36 Boolean isQ = access.isQ(); | |
37 List<Segment> segments = access.getSegments(); | |
38 | |
39 if (isQ == null) { | |
40 // TODO: i18n | |
41 addProblem("fix.realize.missing.is.q"); | |
42 } | |
43 | |
44 if (segments == null || segments.isEmpty()) { | |
45 // TODO: i18n | |
46 addProblem("fix.realize.missing.segments"); | |
47 } | |
48 | |
49 River r = RiverFactory.getRiver(river); | |
50 | |
51 if (r == null) { | |
52 // TODO: i18n | |
53 addProblem("fix.no.such.river"); | |
54 } | |
55 | |
56 if (!hasProblems()) { | |
57 this.isQ = isQ; | |
58 this.segments = segments; | |
59 | |
60 // Convert from W to Q | |
61 Segment.setReferencePointConvertQ(segments, r, isQ, this); | |
62 } | |
63 } | |
64 | |
65 @Override | |
66 protected CalculationResult innerCalculate( | |
67 FixingsOverview overview, | |
68 Function func | |
69 ) { | |
70 ColumnCache cc = new ColumnCache(); | |
71 FitResult fitResult = doFitting(overview, cc, func); | |
72 | |
73 if (fitResult == null) { | |
74 return new CalculationResult(this); | |
75 } | |
76 | |
77 Segment segment = segments.get(0); | |
78 int numResults = segment.numValues(); | |
79 | |
80 WQKms [] results = new WQKms[numResults]; | |
81 for (int i = 0; i < results.length; ++i) { | |
82 results[i] = new WQKms(); | |
83 } | |
84 | |
85 Parameters parameters = fitResult.getParameters(); | |
86 | |
87 int kmIndex = parameters.columnIndex("km"); | |
88 int [] parameterIndices = | |
89 parameters.columnIndices(func.getParameterNames()); | |
90 | |
91 double [] parameterValues = new double[parameterIndices.length]; | |
92 | |
93 for (int row = 0, R = parameters.size(); row < R; ++row) { | |
94 double km = parameters.get(row, kmIndex); | |
95 | |
96 if (!segment.inside(km)) { | |
97 Segment nextSeg = null; | |
98 for (Segment seg: segments) { | |
99 if (seg.inside(km)) { | |
100 nextSeg = seg; | |
101 break; | |
102 } | |
103 } | |
104 if (nextSeg == null) { | |
105 // TODO: i18n | |
106 addProblem(km, "fix.cannot.find.segment"); | |
107 continue; | |
108 } | |
109 segment = nextSeg; | |
110 } | |
111 | |
112 parameters.get(row, parameterIndices, parameterValues); | |
113 | |
114 org.dive4elements.river.artifacts.math.Function instance = | |
115 func.instantiate(parameterValues); | |
116 | |
117 double [] values = segment.getValues(); | |
118 for (int i = 0; i < numResults; ++i) { | |
119 double q = values[i]; | |
120 double w = instance.value(q); | |
121 | |
122 if (Double.isNaN(w)) { | |
123 // TODO: i18n | |
124 addProblem(km, "fix.cannot.calculate.function", q); | |
125 } | |
126 else { | |
127 results[i].add(w, q, km); | |
128 } | |
129 } | |
130 } | |
131 | |
132 // Name the curves. | |
133 for (int i = 0; i < results.length; ++i) { | |
134 results[i].setName(createName(i)); | |
135 } | |
136 | |
137 FixRealizingResult frr = new FixRealizingResult( | |
138 parameters, | |
139 fitResult.getReferenced(), | |
140 fitResult.getOutliers(), | |
141 results); | |
142 | |
143 return new CalculationResult(frr, this); | |
144 } | |
145 | |
146 // TODO: issue1109/2 | |
147 protected String createName(int index) { | |
148 // TODO: i18n | |
149 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); | |
150 sb.append(" benutzerdefiniert ("); | |
151 for (int i = 0, N = segments.size(); i < N; ++i) { | |
152 if (i > 0) { | |
153 sb.append("; "); | |
154 } | |
155 Segment segment = segments.get(i); | |
156 double [] backup = segment.getBackup(); | |
157 double [] values = segment.getValues(); | |
158 sb.append((backup != null ? backup : values)[index]); | |
159 } | |
160 sb.append(')'); | |
161 return sb.toString(); | |
162 } | |
163 } | |
164 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |