diff 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
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java	Fri Jul 13 10:54:56 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java	Fri Jul 13 11:12:35 2012 +0000
@@ -2,12 +2,18 @@
 
 import de.intevation.flys.artifacts.access.SQRelationAccess;
 
+import de.intevation.flys.artifacts.math.fitting.Function;
+import de.intevation.flys.artifacts.math.fitting.FunctionFactory;
+
 import de.intevation.flys.artifacts.model.Calculation;
 import de.intevation.flys.artifacts.model.CalculationResult;
 import de.intevation.flys.artifacts.model.DateRange;
+import de.intevation.flys.artifacts.model.Parameters;
 
 import de.intevation.flys.backend.SedDBSessionHolder;
 
+import java.util.List;
+
 import org.apache.log4j.Logger;
 
 public class SQRelationCalculation extends Calculation {
@@ -15,11 +21,13 @@
     private static final Logger log =
         Logger.getLogger(SQRelationCalculation.class);
 
+    public static final String SQ_FUNCTION_NAME = "sq-pow";
+
     protected String       river;
     protected double       location;
     protected DateRange [] periods;
     protected double       outliers;
-
+    
     public SQRelationCalculation() {
     }
 
@@ -79,6 +87,16 @@
 
         boolean debug = log.isDebugEnabled();
 
+        Function function = FunctionFactory
+            .getInstance()
+            .getFunction(SQ_FUNCTION_NAME);
+
+        if (function == null) {
+            log.error("No '" + SQ_FUNCTION_NAME + "' function found.");
+            // TODO: i18n
+            addProblem("sq.missing.sq.function");
+        }
+
         // XXX: We can only produce one SQResult.
         DateRange period = periods[0];
 
@@ -92,11 +110,50 @@
         SQFractionResult [] fractionResults =
             new SQFractionResult[SQResult.NUMBER_FRACTIONS];
 
+        String [] parameterNames = function.getParameterNames();
+
+        Fitting fitting = new Fitting(function, outliers);
         for (int i = 0; i < fractionResults.length; ++i) {
-            // TODO: Implement me!
+            List<SQ> sqs = measurements.getSQs(i);
+
+            SQFractionResult fractionResult;
+
+            if (!fitting.fit(sqs)) {
+                // TODO: i18n
+                addProblem("sq.fitting.failed." + i);
+                fractionResult = new SQFractionResult();
+            }
+            else {
+                Parameters parameters = createParameters(parameterNames);
+                int row = parameters.newRow();
+                double [] coeffs = fitting.getParameters();
+                for (int j = 0; j < parameterNames.length; ++j) {
+                    parameters.set(row, parameterNames[j], coeffs[j]);
+                }
+                parameters.set(row, "chi_sqr", fitting.getChiSqr());
+                parameters.set(row, "std_dev", fitting.getStandardDeviation());
+
+                fractionResult = new SQFractionResult(
+                    parameters,
+                    fitting.getRemaining(),
+                    fitting.getOutliers());
+            }
+
+            fractionResults[i] = fractionResult;
+
+            fitting.reset();
         }
 
         return new CalculationResult(new SQResult(fractionResults), this);
     }
+
+    public static final Parameters createParameters(String [] names) {
+
+        String [] columns = new String[names.length + 2];
+        columns[0] = "chi_sqr";
+        columns[1] = "std_dev";
+        System.arraycopy(names, 0, columns, 2, names.length);
+        return new Parameters(columns);
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org