view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/W.java @ 4380:19754e5227c8

Add facets for fixanalysis data from the datacage Add facets for fixanalysis data from the datacage to the bed difference height year, bed difference year and bed difference epoch output modes.
author Björn Ricks <bjoern.ricks@intevation.de>
date Fri, 02 Nov 2012 15:54:41 +0100
parents 53d954973610
children bcf25d8c183e
line wrap: on
line source
package de.intevation.flys.artifacts.model;

import de.intevation.flys.utils.DataUtil;

import gnu.trove.TDoubleArrayList;

import org.apache.log4j.Logger;

public class W
extends      NamedObjectImpl
{
    private static Logger log = Logger.getLogger(W.class);

    protected TDoubleArrayList ws;

    public W() {
        ws = new TDoubleArrayList();
    }

    public W(String name) {
        super(name);
        ws = new TDoubleArrayList();
    }

    public W(int capacity) {
        this(capacity, "");
    }

    public W(int capacity, String name) {
        super(name);
        ws = new TDoubleArrayList(capacity);
    }

    public void add(double value) {
        ws.add(value);
    }

    public int size() {
        return ws.size();
    }

    public double getW(int idx) {
        return ws.getQuick(idx);
    }

    public double [] getWs() {
        return ws.toNativeArray();
    }

    public double [] get(int idx) {
        return get(idx, new double [1]);
    }

    public double [] get(int idx, double [] dst) {
        dst[0] = ws.getQuick(idx);
        return dst;
    }

    public double minWs() {
        return ws.min();
    }

    public static void removeNaNs(TDoubleArrayList [] arrays) {

        int dest = 0;

        int A = arrays.length;
        int N = arrays[0].size();

        OUTER: for (int i = 0; i < N; ++i) {
            for (int j = 0; j < A; ++j) {
                TDoubleArrayList a = arrays[j];
                double v = a.getQuick(i);
                if (Double.isNaN(v)) {
                    continue OUTER;
                }
                a.setQuick(dest, v);
            }
            ++dest;
        }

        if (dest < N) {
            for (int i = 0; i < A; ++i) {
                arrays[i].remove(dest, N-dest);
            }
        }
    }

    public void removeNaNs() {
        removeNaNs(new TDoubleArrayList [] { ws });
    }

    public boolean guessWaterIncreasing() {
        return guessWaterIncreasing(0.05f);
    }

    public boolean guessWaterIncreasing(float factor) {
        return DataUtil.guessWaterIncreasing(ws, factor);
    }

    public int [] longestIncreasingWRangeIndices() {
        return longestIncreasingWRangeIndices(new int[2]);
    }

    public int [] longestIncreasingWRangeIndices(int [] bounds) {

        int N = size();
        int start = 0;
        int stop  = 0;

        double lastW = Double.MAX_VALUE;

        for (int i = 0; i < N; ++i) {
            double v = ws.getQuick(i);
            if (v <= lastW) {
                if (stop-start > bounds[1]-bounds[0]) {
                    bounds[0] = start;
                    bounds[1] = stop;
                    if (log.isDebugEnabled()) {
                        log.debug("new range: " +
                            bounds[0] + " - " + bounds[1] + " (" +
                            ws.getQuick(bounds[0]) + ", " +
                            ws.getQuick(bounds[1]) + ")");

                    }
                }
                start = stop = i;
            }
            else {
                stop = i;
            }
            lastW = v;
        }

        if (stop-start > bounds[1]-bounds[0]) {
            bounds[0] = start;
            bounds[1] = stop;
            if (log.isDebugEnabled()) {
                log.debug("new range @end: " +
                    bounds[0] + " - " + bounds[1] + " (" +
                    ws.getQuick(bounds[0]) + ", " +
                    ws.getQuick(bounds[1]) + ")");
            }
        }

        return bounds;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org