Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java @ 8433:706668b19b04
Antiprogramming (in german: 'Softwareabwicklung')
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Fri, 17 Oct 2014 19:21:45 +0200 |
parents | 96bf5135cd0e |
children | 76113b975829 |
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde * Software engineering by Intevation GmbH * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.artifacts.model.minfo; import gnu.trove.TDoubleArrayList; import org.apache.log4j.Logger; import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.access.BedDifferencesAccess; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; /** * Perform calculation of differences of bed height (german Sohlhoehe). * The input are either single year data or epochs. */ public class BedDiffCalculation extends Calculation { private static final Logger log = Logger.getLogger(BedDiffCalculation.class); protected String river; protected int [][] heightIds; public BedDiffCalculation() { } public CalculationResult calculate(BedDifferencesAccess access, CallContext context) { log.info("BedDiffCalculation.calculate"); this.river = access.getRiverName(); this.heightIds = access.extractHeightIds(context); BedDiffYearResult [] results = new BedDiffYearResult[heightIds.length]; for (int i = 0; i < heightIds.length; i++) { BedHeightSingleData [] pair = getHeightPair(heightIds[i]); if (pair[0].getYear() == null || pair[1].getYear() == null) { addProblem("beddiff.missing.year"); } results[i] = calculateYearDifference(pair, heightIds[i]); } return new CalculationResult(results, this); } /** Get two BedHeights from factory. */ private static BedHeightSingleData [] getHeightPair(int [] ids) { return new BedHeightSingleData [] { (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[0]), (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[1]) }; } private BedDiffYearResult calculateYearDifference( BedHeightSingleData[] pair, int[] ids ) { log.debug("BedDiffCalculation.calculateYearDifference"); BedHeightSingleData s1 = pair[0]; BedHeightSingleData s2 = pair[1]; TDoubleArrayList stations = s1.getStations(); int size = stations.size(); TDoubleArrayList diffRes = new TDoubleArrayList(size); TDoubleArrayList kms = new TDoubleArrayList(size); TDoubleArrayList soundings1 = new TDoubleArrayList(size); TDoubleArrayList soundings2 = new TDoubleArrayList(size); TDoubleArrayList absolute = new TDoubleArrayList(size); TDoubleArrayList gap1 = new TDoubleArrayList(size); TDoubleArrayList gap2 = new TDoubleArrayList(size); TDoubleArrayList heights1 = new TDoubleArrayList(size); TDoubleArrayList heights2 = new TDoubleArrayList(size); Integer range = null; if (s1.getYear() != null && s2.getYear() != null) { range = Math.abs(s1.getYear() - s2.getYear()); } for (int i = 0; i < size; i++) { double station = stations.getQuick(i); double h1 = s1.getHeight(station); double h2 = s2.getHeight(station); double hDiff = h1 - h2; if (!Double.isNaN(hDiff)) { diffRes.add(hDiff); kms.add(station); soundings1.add(s1.getSoundingWidth(station)); soundings2.add(s2.getSoundingWidth(station)); gap1.add(s1.getDataGap(station)); gap2.add(s2.getDataGap(station)); if (range != null) { absolute.add((hDiff / range) * 100d); } heights1.add(h1); heights2.add(h2); } } return new BedDiffYearResult( kms, diffRes, heights1, heights2, soundings1, soundings2, absolute, gap1, gap2, s1.getYear(), s2.getYear(), s1.getName(), s2.getName(), ids[0], ids[1]); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :