comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingCalculation.java @ 9415:9744ce3c3853

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

http://dive4elements.wald.intevation.org