teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model.fixings; sascha@3450: teichmann@6877: import org.apache.log4j.Logger; teichmann@5831: import org.dive4elements.river.artifacts.model.Parameters; sascha@3450: teichmann@5831: import org.dive4elements.river.utils.KMIndex; sascha@3450: teichmann@6877: import gnu.trove.TIntIntHashMap; teichmann@6877: sascha@3450: import java.io.Serializable; teichmann@6877: import java.util.Collection; teichmann@6877: import java.util.Date; teichmann@6877: import java.util.TreeMap; teichmann@6877: import java.util.TreeSet; sascha@3450: sascha@3450: public class FixResult sascha@3450: implements Serializable sascha@3450: { teichmann@6877: private static Logger log = teichmann@6877: Logger.getLogger(FixResult.class); teichmann@6877: sascha@3450: protected Parameters parameters; sascha@3450: protected KMIndex referenced; sascha@3729: protected KMIndex outliers; sascha@3450: sascha@3450: public FixResult() { sascha@3450: } sascha@3450: sascha@3450: public FixResult( sascha@3450: Parameters parameters, sascha@3450: KMIndex referenced, sascha@3729: KMIndex outliers sascha@3450: ) { sascha@3450: this.parameters = parameters; sascha@3450: this.referenced = referenced; sascha@3450: this.outliers = outliers; sascha@3450: } sascha@3450: sascha@3450: public KMIndex getReferenced() { sascha@3450: return referenced; sascha@3450: } sascha@3450: sascha@3450: public void setReferenced(KMIndex referenced) { sascha@3450: this.referenced = referenced; sascha@3450: } sascha@3450: teichmann@6877: public void makeReferenceEventsDatesUnique() { teichmann@6877: DateUniqueMaker dum = new DateUniqueMaker(); teichmann@6877: for (KMIndex.Entry entry: referenced) { teichmann@6877: for (QWD ref: entry.getValue()) { teichmann@6877: dum.makeUnique(ref); teichmann@6877: } teichmann@6877: } teichmann@6877: } teichmann@6877: teichmann@6877: public Collection getReferenceEventsIndices() { teichmann@6877: TreeMap dates = new TreeMap(); teichmann@6877: for (KMIndex.Entry entry: referenced) { teichmann@6877: for (QWD value: entry.getValue()) { teichmann@6877: dates.put(value.date, value.index); teichmann@6877: } teichmann@6877: } teichmann@6877: return dates.values(); teichmann@6877: } teichmann@6877: teichmann@6877: public void remapReferenceIndicesToRank() { teichmann@6877: Collection referenceIndices = getReferenceEventsIndices(); teichmann@6877: int index = 0; teichmann@6877: TIntIntHashMap map = new TIntIntHashMap(); teichmann@6877: boolean debug = log.isDebugEnabled(); teichmann@6877: for (Integer refId: referenceIndices) { teichmann@6877: if (debug) { teichmann@6877: log.debug("map " + refId + " -> " + index); teichmann@6877: } teichmann@6877: map.put(refId, index); teichmann@6877: ++index; teichmann@6877: } teichmann@6877: teichmann@6877: // Two passes: If there are shared references do not teichmann@6877: // remap them twice. In the first pass all indices are teichmann@6877: // mapped to negative values (assuming the original data teichmann@6877: // is all positive). If a negative value is found ignore teichmann@6877: // it because it was remapped before. teichmann@6877: teichmann@6877: for (KMIndex.Entry entry: referenced) { teichmann@6877: for (QWD value: entry.getValue()) { teichmann@6877: if (value.index >= 0) { teichmann@6877: if (map.containsKey(value.index)) { teichmann@6877: value.index = -(map.get(value.index) + 1); teichmann@6877: } teichmann@6877: else { teichmann@6877: log.warn("Could not remap index: " + value.index); teichmann@6877: } teichmann@6877: } teichmann@6877: } teichmann@6877: } teichmann@6877: teichmann@6877: // In the second pass all indices are turned to positive teichmann@6877: // values again. teichmann@6877: for (KMIndex.Entry entry: referenced) { teichmann@6877: for (QWD value: entry.getValue()) { teichmann@6877: if (value.index < 0) { teichmann@6877: value.index = -(value.index + 1); teichmann@6877: } teichmann@6877: } teichmann@6877: } teichmann@6877: } teichmann@6877: teichmann@6877: public Collection getReferenceEventsDates() { teichmann@6877: TreeSet dates = new TreeSet(); teichmann@6877: for (KMIndex.Entry entry: referenced) { teichmann@6877: for (QWD qwd: entry.getValue()) { teichmann@6877: dates.add(qwd.date); teichmann@6877: } teichmann@6877: } teichmann@6877: return dates; teichmann@6877: } teichmann@6877: teichmann@6877: sascha@3729: public KMIndex getOutliers() { sascha@3450: return outliers; sascha@3450: } sascha@3450: sascha@3729: public void setOutliers(KMIndex outliers) { sascha@3450: this.outliers = outliers; sascha@3450: } sascha@3450: sascha@3450: public Parameters getParameters() { sascha@3450: return parameters; sascha@3450: } sascha@3450: sascha@3450: public void setParameters(Parameters parameters) { sascha@3450: this.parameters = parameters; sascha@3450: } sascha@3450: } sascha@3450: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :