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 :

http://dive4elements.wald.intevation.org