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