raimund@3887: package de.intevation.flys.artifacts.model.minfo; raimund@3887: raimund@3887: import gnu.trove.TDoubleArrayList; raimund@3887: raimund@3887: import java.util.LinkedList; raimund@3887: import java.util.List; raimund@3887: raimund@3887: import org.apache.log4j.Logger; raimund@3887: raimund@3887: import de.intevation.flys.artifacts.FLYSArtifact; raimund@3887: import de.intevation.flys.artifacts.access.BedDifferencesAccess; raimund@3887: import de.intevation.flys.artifacts.model.Calculation; raimund@3887: import de.intevation.flys.artifacts.model.CalculationResult; raimund@3887: raimund@3887: raimund@3887: public class BedDiffCalculation raimund@3887: extends Calculation raimund@3887: { raimund@3887: raimund@3887: private static final Logger logger = Logger raimund@3887: .getLogger(BedQualityCalculation.class); raimund@3887: raimund@3887: protected String river; raimund@3887: protected String yearEpoch; raimund@3887: protected FLYSArtifact[][] artifacts; raimund@3887: raimund@3887: public BedDiffCalculation() { raimund@3887: } raimund@3887: raimund@3887: public CalculationResult calculate(BedDifferencesAccess access) { raimund@3887: logger.info("BedQualityCalculation.calculate"); raimund@3887: raimund@3887: String river = access.getRiver(); raimund@3887: String yearEpoch = access.getYearEpoch(); raimund@3887: FLYSArtifact[][] artifacts = access.getDifferenceArtifacts(); raimund@3887: raimund@3887: if (river == null) { raimund@3887: // TODO: i18n raimund@3887: addProblem("minfo.missing.river"); raimund@3887: } raimund@3887: raimund@3887: if (yearEpoch == null) { raimund@3887: addProblem("minfo.missing.year_epoch"); raimund@3887: } raimund@3887: raimund@3887: if (artifacts == null) { raimund@3887: addProblem("minfo.missing.differences"); raimund@3887: } raimund@3887: raimund@3887: if (!hasProblems()) { raimund@3887: this.river = river; raimund@3887: this.yearEpoch = yearEpoch; raimund@3887: this.artifacts = artifacts; raimund@3887: return internalCalculate(); raimund@3887: } raimund@3887: raimund@3887: return new CalculationResult(); raimund@3887: } raimund@3887: raimund@3887: private CalculationResult internalCalculate() { raimund@3887: List results = raimund@3887: new LinkedList(); raimund@3887: raimund@3887: if (yearEpoch.equals("year")) { raimund@3887: for (int i = 0; i < artifacts.length; i++) { raimund@3887: BedHeight[] pair = raimund@3887: getHeightPair(artifacts[i][0], artifacts[i][1], "single"); raimund@3887: BedDifferencesResult res = calculateYearDifference(pair); raimund@3887: results.add(res); raimund@3887: } raimund@3887: } raimund@3887: if (yearEpoch.equals("epoch")) { raimund@3887: for (int i = 0; i < artifacts.length; i++) { raimund@3887: BedHeight[] pair = raimund@3887: getHeightPair(artifacts[i][0], artifacts[i][1], "epoch"); raimund@3887: BedDifferencesResult res = calculateEpochDifference(pair); raimund@3887: results.add(res); raimund@3887: } raimund@3887: } raimund@3887: raimund@3887: return new CalculationResult( raimund@3887: results.toArray(new BedDifferencesResult[results.size()]), this); raimund@3887: } raimund@3887: raimund@3887: private BedHeight[] getHeightPair( raimund@3887: FLYSArtifact art1, raimund@3887: FLYSArtifact art2, raimund@3887: String type raimund@3887: ) { raimund@3887: int id1 = BedDifferencesAccess.getHeightId(art1); raimund@3887: int id2 = BedDifferencesAccess.getHeightId(art2); raimund@3887: raimund@3887: BedHeight[] heights = new BedHeight[2]; raimund@3887: heights[0] = BedHeightFactory.getHeight(type, id1, 0); raimund@3887: heights[1] = BedHeightFactory.getHeight(type, id2, 0); raimund@3887: return heights; raimund@3887: } raimund@3887: raimund@3887: private BedDiffEpochResult calculateEpochDifference(BedHeight[] pair) { raimund@3887: raimund@3887: TDoubleArrayList stations = pair[0].getStations(); raimund@3887: TDoubleArrayList diffRes = new TDoubleArrayList(); raimund@3887: TDoubleArrayList kms = new TDoubleArrayList(); raimund@3887: TDoubleArrayList morphs = new TDoubleArrayList(); raimund@3887: for (int i = 0; i < stations.size(); i++) { raimund@3887: if (!Double.isNaN(pair[0].getHeight(stations.get(i))) && raimund@3887: !Double.isNaN(pair[1].getHeight(stations.get(i)))) { raimund@3887: double hDiff = raimund@3887: pair[0].getHeight(stations.get(i)) - raimund@3887: pair[1].getHeight(stations.get(i)); raimund@3887: diffRes.add(hDiff); raimund@3887: kms.add(stations.get(i)); raimund@3887: if (pair[0].getMorphWidth(i) > pair[1].getMorphWidth(i)) { raimund@3887: morphs.add(pair[0].getMorphWidth(i)); raimund@3887: } raimund@3887: else { raimund@3887: morphs.add(pair[1].getMorphWidth(i)); raimund@3887: } raimund@3887: } raimund@3887: } raimund@3887: return new BedDiffEpochResult(kms, diffRes, morphs); raimund@3887: } raimund@3887: raimund@3887: private BedDiffYearResult calculateYearDifference(BedHeight[] pair) { raimund@3887: raimund@3887: TDoubleArrayList stations = pair[0].getStations(); raimund@3887: TDoubleArrayList diffRes = new TDoubleArrayList(); raimund@3887: TDoubleArrayList kms = new TDoubleArrayList(); raimund@3887: TDoubleArrayList morphs = new TDoubleArrayList(); raimund@3887: TDoubleArrayList heights = new TDoubleArrayList(); raimund@3887: TDoubleArrayList gap = new TDoubleArrayList(); raimund@3887: BedHeightSingle s1 = (BedHeightSingle)pair[0]; raimund@3887: BedHeightSingle s2 = (BedHeightSingle)pair[1]; raimund@3887: int range = s1.getYear() - s2.getYear(); raimund@3887: if (range < 0) { raimund@3887: range = range * -1; raimund@3887: } raimund@3887: for (int i = 0; i < stations.size(); i++) { raimund@3887: if (!Double.isNaN(pair[0].getHeight(stations.get(i))) && raimund@3887: !Double.isNaN(pair[1].getHeight(stations.get(i)))) { raimund@3887: double hDiff = raimund@3887: pair[0].getHeight(stations.get(i)) - raimund@3887: pair[1].getHeight(stations.get(i)); raimund@3887: diffRes.add(hDiff); raimund@3887: kms.add(stations.get(i)); raimund@3887: if (pair[0].getMorphWidth(i) > pair[1].getMorphWidth(i)) { raimund@3887: morphs.add(pair[0].getMorphWidth(i)); raimund@3887: } raimund@3887: else { raimund@3887: morphs.add(pair[1].getMorphWidth(i)); raimund@3887: } raimund@3887: if (pair[0].getDataGap(i) > pair[1].getDataGap(i)) { raimund@3887: gap.add(pair[0].getDataGap(i)); raimund@3887: } raimund@3887: else { raimund@3887: gap.add(pair[1].getDataGap(i)); raimund@3887: } raimund@3887: heights.add(hDiff / range); raimund@3887: } raimund@3887: } raimund@3887: return new BedDiffYearResult(kms, diffRes, morphs, heights, gap); raimund@3887: } raimund@3887: }