rrenkert@7983: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde rrenkert@7983: * Software engineering by Intevation GmbH rrenkert@7983: * rrenkert@7983: * This file is Free Software under the GNU AGPL (>=v3) rrenkert@7983: * and comes with ABSOLUTELY NO WARRANTY! Check out the rrenkert@7983: * documentation coming with Dive4Elements River for details. rrenkert@7983: */ rrenkert@7983: rrenkert@7983: package org.dive4elements.river.artifacts.model.minfo; rrenkert@7983: rrenkert@7983: import java.util.ArrayList; rrenkert@7983: import java.util.List; rrenkert@7983: rrenkert@7983: import org.apache.log4j.Logger; rrenkert@7983: rrenkert@7983: import org.dive4elements.artifacts.Artifact; rrenkert@7983: import org.dive4elements.river.model.BedHeightSingle; rrenkert@7983: import org.dive4elements.river.model.BedHeightSingleValue; rrenkert@7983: import org.dive4elements.river.artifacts.access.BedHeightAccess; rrenkert@7983: import org.dive4elements.river.artifacts.model.Calculation; rrenkert@7983: import org.dive4elements.river.artifacts.model.CalculationResult; rrenkert@7983: import org.dive4elements.river.artifacts.model.minfo.MiddleBedHeightData; rrenkert@7983: rrenkert@7983: rrenkert@7983: public class MiddleBedHeightCalculation extends Calculation { rrenkert@7983: rrenkert@7983: private static final Logger logger = rrenkert@7983: Logger.getLogger(MiddleBedHeightCalculation.class); rrenkert@7983: rrenkert@7983: rrenkert@7983: public CalculationResult calculate(BedHeightAccess access) { rrenkert@7983: logger.info("MiddleBedHeightCalculation.calculate"); rrenkert@7983: rrenkert@7983: int[] singleIds = access.getBedHeightSingleIDs(); rrenkert@7983: rrenkert@7983: rrenkert@7983: if (logger.isDebugEnabled()) { rrenkert@7983: Artifact artifact = access.getArtifact(); rrenkert@7983: rrenkert@7983: logger.debug("Artifact '" + artifact.identifier() + "' contains:"); rrenkert@7983: if (singleIds != null) { rrenkert@7983: logger.debug(" " + singleIds.length + " single bedheight ids"); rrenkert@7983: } rrenkert@7983: } rrenkert@7983: rrenkert@7983: List singles = getSingles(access, singleIds); rrenkert@7983: rrenkert@7983: return buildCalculationResult(access, singles); rrenkert@7983: } rrenkert@7983: rrenkert@7983: rrenkert@7983: protected List getSingles( rrenkert@7983: BedHeightAccess access, rrenkert@7983: int[] ids rrenkert@7983: ) { rrenkert@7983: List singles = new ArrayList(); rrenkert@7983: rrenkert@7983: for (int id: ids) { rrenkert@7983: BedHeightSingle s = BedHeightSingle.getBedHeightSingleById(id); rrenkert@7983: rrenkert@7983: if (s != null) { rrenkert@7983: singles.add(s); rrenkert@7983: } rrenkert@7983: else { rrenkert@7983: logger.warn("Cannot find Single by id: " + id); rrenkert@7983: // TODO ADD WARNING rrenkert@7983: } rrenkert@7983: } rrenkert@7983: rrenkert@7983: return singles; rrenkert@7983: } rrenkert@7983: rrenkert@7983: rrenkert@7983: protected CalculationResult buildCalculationResult( rrenkert@7983: BedHeightAccess access, rrenkert@7983: List singles rrenkert@7983: ) { rrenkert@7983: logger.info("MiddleBedHeightCalculation.buildCalculationResult"); rrenkert@7983: rrenkert@7983: double kmLo = access.getLowerKM(); rrenkert@7983: double kmHi = access.getUpperKM(); rrenkert@7983: rrenkert@7983: List data = new ArrayList(); rrenkert@7983: rrenkert@7983: for (BedHeightSingle single: singles) { rrenkert@7983: MiddleBedHeightData d = prepareSingleData(single, kmLo, kmHi); rrenkert@7983: rrenkert@7983: if (d != null) { rrenkert@7983: data.add(d); rrenkert@7983: } rrenkert@7983: } rrenkert@7983: rrenkert@7983: logger.debug("Calculation results in " + data.size() + " data objects."); rrenkert@7983: rrenkert@7983: return new CalculationResult((MiddleBedHeightData[]) rrenkert@7983: data.toArray(new MiddleBedHeightData[data.size()]), this); rrenkert@7983: } rrenkert@7983: rrenkert@7983: rrenkert@7983: protected MiddleBedHeightData prepareSingleData( rrenkert@7983: BedHeightSingle single, rrenkert@7983: double kmLo, rrenkert@7983: double kmHi rrenkert@7983: ) { rrenkert@7983: logger.debug("Prepare data for single: " + single.getDescription()); rrenkert@7983: rrenkert@7983: List values = rrenkert@7983: BedHeightSingleValue.getBedHeightSingleValues(single, kmLo, kmHi); rrenkert@7983: rrenkert@7983: int year = single.getYear() != null ? single.getYear() : 0; rrenkert@7983: rrenkert@8006: String curElevModel = single.getCurElevationModel() != null ? rrenkert@8006: single.getCurElevationModel().getName() : ""; rrenkert@8006: String oldElevModel = single.getOldElevationModel() != null ? rrenkert@8006: single.getOldElevationModel().getName() : ""; rrenkert@8006: String riverElevModel = single.getRiver().getWstUnit() != null ? rrenkert@8006: single.getRiver().getWstUnit().getName() : ""; rrenkert@8006: String type = single.getType() != null ? rrenkert@8006: single.getType().getName() : ""; rrenkert@8006: String locationSystem = single.getLocationSystem() != null ? rrenkert@8006: single.getLocationSystem().getName() : ""; rrenkert@7983: MiddleBedHeightData data = new MiddleBedHeightData( rrenkert@7983: year, rrenkert@7983: year, rrenkert@7983: single.getEvaluationBy(), rrenkert@7989: single.getDescription(), rrenkert@8006: curElevModel, rrenkert@8006: oldElevModel, rrenkert@8006: riverElevModel, rrenkert@8006: type, rrenkert@8006: locationSystem, rrenkert@7993: single.getSoundingWidth()); rrenkert@7983: rrenkert@7983: for (BedHeightSingleValue value: values) { rrenkert@7983: if (value.getHeight() != null) { rrenkert@7983: double uncert = value.getUncertainty() != null ? rrenkert@7983: value.getUncertainty().doubleValue() : Double.NaN; rrenkert@7983: double sounding = value.getSoundingWidth() != null ? rrenkert@7983: value.getSoundingWidth().doubleValue() : Double.NaN; rrenkert@7983: double gap = value.getDataGap() != null ? rrenkert@7983: value.getDataGap().doubleValue() : Double.NaN; rrenkert@7983: data.addAll(value.getStation().doubleValue(), rrenkert@7983: value.getHeight().doubleValue(), rrenkert@7983: uncert, rrenkert@7983: sounding, rrenkert@7983: gap, rrenkert@7983: value.getWidth().doubleValue(), rrenkert@7983: false); rrenkert@7983: } rrenkert@7983: else { rrenkert@7983: data.addAll(value.getStation().doubleValue(), rrenkert@7983: 0, rrenkert@7983: 0, rrenkert@7983: 0, rrenkert@7983: 0, rrenkert@7983: 0, rrenkert@7983: true); rrenkert@7983: } rrenkert@7983: } rrenkert@7983: rrenkert@7983: logger.debug("Single contains " + values.size() + " values"); rrenkert@7983: rrenkert@7983: return data; rrenkert@7983: } rrenkert@7983: } rrenkert@7983: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :