diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java @ 3035:b388d888330d

Implemented facets and splitted up the event facet.Implemented facets and splitted up the event facet. flys-artifacts/trunk@4604 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Wed, 06 Jun 2012 11:35:32 +0000
parents 77b5f5a26700
children 1fbf8462f808
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java	Wed Jun 06 10:26:28 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixWQCurveFacet.java	Wed Jun 06 11:35:32 2012 +0000
@@ -5,9 +5,18 @@
 import de.intevation.artifacts.Artifact;
 import de.intevation.artifacts.CallContext;
 
+import de.intevation.flys.utils.KMIndex;
+
 import de.intevation.flys.artifacts.FLYSArtifact;
+import de.intevation.flys.artifacts.FixationArtifactAccess;
+
 import de.intevation.flys.artifacts.model.FacetTypes;
 import de.intevation.flys.artifacts.model.DataFacet;
+import de.intevation.flys.artifacts.model.CalculationResult;
+import de.intevation.flys.artifacts.model.Parameters;
+
+import de.intevation.flys.artifacts.math.fitting.FunctionFactory;
+import de.intevation.flys.artifacts.math.fitting.Function;
 
 import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
 
@@ -48,10 +57,81 @@
     @Override
     public Object getData(Artifact artifact, CallContext context) {
         logger.debug("FixWQCurveFacet.getData");
-        return null;
+        if (artifact instanceof FLYSArtifact) {
+            FLYSArtifact flys = (FLYSArtifact)artifact;
+            FixationArtifactAccess access = new FixationArtifactAccess(flys);
+
+            CalculationResult res =
+                (CalculationResult) flys.compute(context,
+                                                 ComputeType.ADVANCE,
+                                                 false);
+
+            FixResult result = (FixResult) res.getData();
+
+            double km = access.getCurrentKm();
+
+            String function = access.getFunction();
+            Function ff = FunctionFactory.getInstance().getFunction(function);
+
+            Parameters params = result.getParameters();
+            int row = params.binarySearch("km", km, Math.pow(10, -4));
+            String[] paramNames = ff.getParameterNames();
+            int[] paramInd = params.columnIndices(paramNames);
+            double[] coeffs = new double[paramNames.length];
+            params.get(row, paramInd, coeffs);
+
+            de.intevation.flys.artifacts.math.Function mf =
+                ff.instantiate(coeffs);
+
+            double maxQ = getMaxQ(result, km);
+
+            FixFunction fix = new FixFunction(
+                ff.getName(),
+                ff.getDescription(),
+                mf,
+                maxQ);
+
+            return fix;
+        }
+        else {
+            logger.debug("Not an instance of FixationArtifact.");
+            return null;
+        }
     }
 
 
+    protected double getMaxQ(FixResult result, double km) {
+        double maxQ = 0;
+
+        KMIndex<QW []> kmQWRef = result.getReferenced();
+
+        QW[] qwRef = kmQWRef.binarySearch(km).getValue();
+        if (qwRef != null) {
+            for (int i = 0; i < qwRef.length; i++) {
+                if (qwRef[i].getQ() > maxQ) {
+                    maxQ = qwRef[i].getQ();
+                }
+            }
+        }
+
+        KMIndex<AnalysisPeriod []> kmQWDAna = result.getAnalysisPeriods();
+        AnalysisPeriod[] periods = kmQWDAna.binarySearch(km).getValue();
+
+        if(periods != null) {
+            for (int i = 0; i < periods.length; i++) {
+                QWD[] qwdAna = periods[i].getQWDs();
+                if (qwdAna != null) {
+                    for (int j = 0; j < qwdAna.length; j++) {
+                        if (qwdAna[j].getQ() > maxQ) {
+                            maxQ = qwdAna[j].getQ();
+                        }
+                    }
+                }
+            }
+        }
+        return maxQ;
+    }
+
     /**
      * Create a deep copy of this Facet.
      * @return a deep copy.

http://dive4elements.wald.intevation.org