Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java @ 3304:02d5731b43a2
SQ relation: Build a valid SQResult.
flys-artifacts/trunk@4989 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Fri, 13 Jul 2012 11:12:35 +0000 |
parents | 79c8e0d9fdea |
children | b24920235944 |
comparison
equal
deleted
inserted
replaced
3303:96daa8a4c48f | 3304:02d5731b43a2 |
---|---|
1 package de.intevation.flys.artifacts.model.sq; | 1 package de.intevation.flys.artifacts.model.sq; |
2 | 2 |
3 import de.intevation.flys.artifacts.access.SQRelationAccess; | 3 import de.intevation.flys.artifacts.access.SQRelationAccess; |
4 | 4 |
5 import de.intevation.flys.artifacts.math.fitting.Function; | |
6 import de.intevation.flys.artifacts.math.fitting.FunctionFactory; | |
7 | |
5 import de.intevation.flys.artifacts.model.Calculation; | 8 import de.intevation.flys.artifacts.model.Calculation; |
6 import de.intevation.flys.artifacts.model.CalculationResult; | 9 import de.intevation.flys.artifacts.model.CalculationResult; |
7 import de.intevation.flys.artifacts.model.DateRange; | 10 import de.intevation.flys.artifacts.model.DateRange; |
11 import de.intevation.flys.artifacts.model.Parameters; | |
8 | 12 |
9 import de.intevation.flys.backend.SedDBSessionHolder; | 13 import de.intevation.flys.backend.SedDBSessionHolder; |
14 | |
15 import java.util.List; | |
10 | 16 |
11 import org.apache.log4j.Logger; | 17 import org.apache.log4j.Logger; |
12 | 18 |
13 public class SQRelationCalculation extends Calculation { | 19 public class SQRelationCalculation extends Calculation { |
14 | 20 |
15 private static final Logger log = | 21 private static final Logger log = |
16 Logger.getLogger(SQRelationCalculation.class); | 22 Logger.getLogger(SQRelationCalculation.class); |
17 | 23 |
24 public static final String SQ_FUNCTION_NAME = "sq-pow"; | |
25 | |
18 protected String river; | 26 protected String river; |
19 protected double location; | 27 protected double location; |
20 protected DateRange [] periods; | 28 protected DateRange [] periods; |
21 protected double outliers; | 29 protected double outliers; |
22 | 30 |
23 public SQRelationCalculation() { | 31 public SQRelationCalculation() { |
24 } | 32 } |
25 | 33 |
26 public SQRelationCalculation(SQRelationAccess access) { | 34 public SQRelationCalculation(SQRelationAccess access) { |
27 | 35 |
77 | 85 |
78 protected CalculationResult internalCalculate() { | 86 protected CalculationResult internalCalculate() { |
79 | 87 |
80 boolean debug = log.isDebugEnabled(); | 88 boolean debug = log.isDebugEnabled(); |
81 | 89 |
90 Function function = FunctionFactory | |
91 .getInstance() | |
92 .getFunction(SQ_FUNCTION_NAME); | |
93 | |
94 if (function == null) { | |
95 log.error("No '" + SQ_FUNCTION_NAME + "' function found."); | |
96 // TODO: i18n | |
97 addProblem("sq.missing.sq.function"); | |
98 } | |
99 | |
82 // XXX: We can only produce one SQResult. | 100 // XXX: We can only produce one SQResult. |
83 DateRange period = periods[0]; | 101 DateRange period = periods[0]; |
84 | 102 |
85 Measurements measurements = | 103 Measurements measurements = |
86 MeasurementFactory.getMeasurements(river, location, period); | 104 MeasurementFactory.getMeasurements(river, location, period); |
90 } | 108 } |
91 | 109 |
92 SQFractionResult [] fractionResults = | 110 SQFractionResult [] fractionResults = |
93 new SQFractionResult[SQResult.NUMBER_FRACTIONS]; | 111 new SQFractionResult[SQResult.NUMBER_FRACTIONS]; |
94 | 112 |
113 String [] parameterNames = function.getParameterNames(); | |
114 | |
115 Fitting fitting = new Fitting(function, outliers); | |
95 for (int i = 0; i < fractionResults.length; ++i) { | 116 for (int i = 0; i < fractionResults.length; ++i) { |
96 // TODO: Implement me! | 117 List<SQ> sqs = measurements.getSQs(i); |
118 | |
119 SQFractionResult fractionResult; | |
120 | |
121 if (!fitting.fit(sqs)) { | |
122 // TODO: i18n | |
123 addProblem("sq.fitting.failed." + i); | |
124 fractionResult = new SQFractionResult(); | |
125 } | |
126 else { | |
127 Parameters parameters = createParameters(parameterNames); | |
128 int row = parameters.newRow(); | |
129 double [] coeffs = fitting.getParameters(); | |
130 for (int j = 0; j < parameterNames.length; ++j) { | |
131 parameters.set(row, parameterNames[j], coeffs[j]); | |
132 } | |
133 parameters.set(row, "chi_sqr", fitting.getChiSqr()); | |
134 parameters.set(row, "std_dev", fitting.getStandardDeviation()); | |
135 | |
136 fractionResult = new SQFractionResult( | |
137 parameters, | |
138 fitting.getRemaining(), | |
139 fitting.getOutliers()); | |
140 } | |
141 | |
142 fractionResults[i] = fractionResult; | |
143 | |
144 fitting.reset(); | |
97 } | 145 } |
98 | 146 |
99 return new CalculationResult(new SQResult(fractionResults), this); | 147 return new CalculationResult(new SQResult(fractionResults), this); |
100 } | 148 } |
149 | |
150 public static final Parameters createParameters(String [] names) { | |
151 | |
152 String [] columns = new String[names.length + 2]; | |
153 columns[0] = "chi_sqr"; | |
154 columns[1] = "std_dev"; | |
155 System.arraycopy(names, 0, columns, 2, names.length); | |
156 return new Parameters(columns); | |
157 } | |
101 } | 158 } |
102 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : | 159 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : |