raimund@3043: package de.intevation.flys.artifacts.model.fixings;
raimund@3043:
raimund@3043: import org.apache.log4j.Logger;
raimund@3043:
raimund@3043: import de.intevation.artifacts.Artifact;
raimund@3043: import de.intevation.artifacts.CallContext;
raimund@3043:
raimund@3043: import de.intevation.flys.utils.KMIndex;
raimund@3043:
raimund@3043: import de.intevation.flys.artifacts.FLYSArtifact;
raimund@3043: import de.intevation.flys.artifacts.FixationArtifactAccess;
raimund@3043:
raimund@3043: import de.intevation.flys.artifacts.model.FacetTypes;
raimund@3043: import de.intevation.flys.artifacts.model.DataFacet;
raimund@3043: import de.intevation.flys.artifacts.model.CalculationResult;
raimund@3043: import de.intevation.flys.artifacts.model.Parameters;
raimund@3043:
raimund@3043: import de.intevation.flys.artifacts.math.fitting.FunctionFactory;
raimund@3043: import de.intevation.flys.artifacts.math.fitting.Function;
raimund@3043:
raimund@3043: import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
raimund@3043:
raimund@3043:
raimund@3043: /**
raimund@3043: * Facet to show the W|Q values.
raimund@3043: *
raimund@3043: * @author Raimund Renkert
raimund@3043: */
raimund@3043: public class FixDerivateFacet
raimund@3043: extends DataFacet
raimund@3043: implements FacetTypes {
raimund@3043:
raimund@3043: /** House logger. */
raimund@3043: private static Logger logger = Logger.getLogger(FixDerivateFacet.class);
raimund@3043:
raimund@3080: private double currentKm;
raimund@3080:
raimund@3043: /** Trivial Constructor. */
raimund@3043: public FixDerivateFacet() {
raimund@3043: }
raimund@3043:
raimund@3043:
raimund@3043: /**
raimund@3043: * @param name
raimund@3043: */
raimund@3043: public FixDerivateFacet(String name, String description) {
raimund@3043: super(0, name, description, ComputeType.ADVANCE, null, null);
raimund@3043: }
raimund@3043:
raimund@3043:
raimund@3080: public Object getData(Artifact artifact, CallContext context, double km) {
raimund@3080: this.currentKm = km;
raimund@3080: return getData(artifact, context);
raimund@3080: }
raimund@3080:
raimund@3080:
raimund@3043: /**
raimund@3043: * Returns the data this facet requires.
raimund@3043: *
raimund@3043: * @param artifact the owner artifact.
raimund@3043: * @param context the CallContext (ignored).
raimund@3043: *
raimund@3043: * @return the data.
raimund@3043: */
raimund@3043: @Override
raimund@3043: public Object getData(Artifact artifact, CallContext context) {
raimund@3043: logger.debug("FixDerivateFacet.getData");
raimund@3043: if (artifact instanceof FLYSArtifact) {
raimund@3043: FLYSArtifact flys = (FLYSArtifact)artifact;
raimund@3043: FixationArtifactAccess access = new FixationArtifactAccess(flys);
raimund@3043:
raimund@3043: CalculationResult res =
raimund@3043: (CalculationResult) flys.compute(context,
raimund@3043: ComputeType.ADVANCE,
raimund@3043: false);
raimund@3043:
raimund@3043: FixResult result = (FixResult) res.getData();
raimund@3043:
raimund@3043: String function = access.getFunction();
raimund@3043: Function ff = FunctionFactory.getInstance().getFunction(function);
raimund@3043: Function.Derivative fd = ff.getDerivative();
raimund@3043:
raimund@3043: Parameters params = result.getParameters();
raimund@3080: int row = params.binarySearch("km", currentKm, Math.pow(10, -4));
christian@3067: if(row < 0) {
christian@3067: row = -row - 1;
christian@3067: logger.debug("getData: no direct hit in params.binarySearch");
christian@3067: }
raimund@3043: String[] paramNames = ff.getParameterNames();
raimund@3043: int[] paramInd = params.columnIndices(paramNames);
raimund@3043: double[] coeffs = new double[paramNames.length];
raimund@3043: params.get(row, paramInd, coeffs);
raimund@3043:
raimund@3043: de.intevation.flys.artifacts.math.Function mf =
raimund@3043: fd.instantiate(coeffs);
raimund@3043:
raimund@3080: double maxQ = getMaxQ(result, currentKm);
raimund@3043:
raimund@3043: FixFunction fix = new FixFunction(
raimund@3043: "",
raimund@3043: ff.getDescription(),
raimund@3043: mf,
raimund@3043: maxQ);
raimund@3043:
raimund@3043: return fix;
raimund@3043: }
raimund@3043: else {
raimund@3043: logger.debug("Not an instance of FixationArtifact.");
raimund@3043: return null;
raimund@3043: }
raimund@3043: }
raimund@3043:
raimund@3043:
raimund@3043: protected double getMaxQ(FixResult result, double km) {
raimund@3043: double maxQ = 0;
raimund@3043:
raimund@3043: KMIndex kmQWRef = result.getReferenced();
raimund@3043:
raimund@3043: QW[] qwRef = kmQWRef.binarySearch(km).getValue();
raimund@3043: if (qwRef != null) {
raimund@3043: for (int i = 0; i < qwRef.length; i++) {
raimund@3043: if (qwRef[i].getQ() > maxQ) {
raimund@3043: maxQ = qwRef[i].getQ();
raimund@3043: }
raimund@3043: }
raimund@3043: }
raimund@3043:
raimund@3043: KMIndex kmQWDAna = result.getAnalysisPeriods();
raimund@3043: AnalysisPeriod[] periods = kmQWDAna.binarySearch(km).getValue();
raimund@3043:
raimund@3043: if(periods != null) {
raimund@3043: for (int i = 0; i < periods.length; i++) {
raimund@3043: QWD[] qwdAna = periods[i].getQWDs();
raimund@3043: if (qwdAna != null) {
raimund@3043: for (int j = 0; j < qwdAna.length; j++) {
raimund@3043: if (qwdAna[j].getQ() > maxQ) {
raimund@3043: maxQ = qwdAna[j].getQ();
raimund@3043: }
raimund@3043: }
raimund@3043: }
raimund@3043: }
raimund@3043: }
raimund@3043: return maxQ;
raimund@3043: }
raimund@3043:
raimund@3043: /**
raimund@3043: * Create a deep copy of this Facet.
raimund@3043: * @return a deep copy.
raimund@3043: */
raimund@3043: @Override
raimund@3043: public FixDerivateFacet deepCopy() {
raimund@3043: FixDerivateFacet copy = new FixDerivateFacet();
raimund@3043: copy.set(this);
raimund@3043: return copy;
raimund@3043: }
raimund@3043: }
raimund@3043: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :