felix@1085: package de.intevation.flys.artifacts.model;
felix@1085: 
ingo@1679: import java.util.ArrayList;
ingo@1679: import java.util.List;
ingo@1679: 
felix@2775: import org.apache.log4j.Logger;
felix@2775: 
felix@1085: import de.intevation.artifacts.Artifact;
felix@1085: import de.intevation.artifacts.CallContext;
felix@2775: import de.intevation.artifacts.DataProvider;
ingo@1679: 
felix@1085: import de.intevation.artifactdatabase.state.DefaultFacet;
ingo@1679: 
ingo@1679: import de.intevation.flys.artifacts.MainValuesArtifact;
felix@2775: import de.intevation.flys.artifacts.math.Linear;
ingo@1679: import de.intevation.flys.jfree.FLYSAnnotation;
ingo@1679: import de.intevation.flys.jfree.StickyAxisAnnotation;
felix@1085: 
felix@2161: 
felix@1085: /**
felix@1085:  * Facet to show Main W Values.
felix@1085:  */
felix@1085: public class MainValuesWFacet
felix@1085: extends      DefaultFacet
felix@1085: implements   FacetTypes {
felix@1085: 
felix@2775:     /** Own logger. */
sascha@3778:     private static Logger logger = Logger.getLogger(MainValuesWFacet.class);
felix@2775: 
felix@1957:     /** Do we want MainValues at Gauge (not interpolated)? */
felix@1957:     protected boolean isAtGauge;
felix@1957: 
felix@1085:     /** Trivial Constructor. */
felix@1957:     public MainValuesWFacet(String name, String description, boolean atGauge) {
felix@1112:         this.description = description;
felix@1809:         this.name = name;
felix@1957:         this.index = 0;
felix@1957:         this.isAtGauge = atGauge;
felix@1085:     }
felix@1085: 
felix@1085: 
felix@1085:     /**
felix@2775:      * Set the hit-point in W where a line drawn from the axis would hit the
felix@2775:      * curve in WQDay (if hit).
felix@2775:      * Employ linear interpolation.
felix@2775:      */
felix@2775:     protected static void setHitPoint(WQDay wqday, StickyAxisAnnotation annotation) {
felix@2775:         int idx = 0;
felix@2775:         float w = annotation.getPos();
felix@2775:         boolean wIncreases = wqday.getW(0) < wqday.getW(wqday.size()-1);
felix@2775:         if (wIncreases) {
felix@2775:             while (idx < wqday.size() && wqday.getW(idx) < w) {
felix@2775:                 idx++;
felix@2775:             }
felix@2775:         }
felix@2775:         else {
felix@2775:             idx = wqday.size() -1;
felix@2775:             while (idx > 0 && wqday.getW(idx) > w) {
felix@2775:                 idx--;
felix@2775:             }
felix@2775:         }
felix@2775: 
felix@2775:         double day = 0d;
felix@2775:         int mod = (wIncreases) ? -1 : +1;
felix@2780:         if (idx != 0 && idx < wqday.size()-1-mod) {
felix@2775:             day = Linear.linear(w, wqday.getW(idx +mod), wqday.getW(idx),
felix@2775:                 wqday.getDay(idx+mod), wqday.getDay(idx));
felix@2775:             annotation.setHitPoint((float)day);
felix@2775:         }
felix@2775:         else {
felix@2775:             logger.debug("StickyAnnotation does not hit wqday curve");
felix@2775:         }
felix@2775:     }
felix@2775: 
felix@2775: 
felix@2775:     /**
felix@4235:      * Returns the data this facet provides.
felix@1085:      *
felix@1085:      * @param artifact the owner artifact.
felix@1085:      * @param context  the CallContext (ignored).
felix@1085:      *
felix@1085:      * @return the data.
felix@1085:      */
felix@1085:     @Override
felix@1085:     public Object getData(Artifact artifact, CallContext context) {
felix@1085:         MainValuesArtifact mvArtifact = (MainValuesArtifact) artifact;
ingo@1679: 
felix@4235:         List<NamedDouble> ws = mvArtifact.getMainValuesW(isAtGauge);
felix@2161:         List<StickyAxisAnnotation> xy = new ArrayList<StickyAxisAnnotation>();
ingo@1679: 
felix@2780:         // Find whether a duration curve is on the blackboard.
felix@2775:         WQDay wqdays = null;
felix@2775:         List<DataProvider> providers = context.
felix@2775:             getDataProvider(DurationCurveFacet.BB_DURATIONCURVE);
felix@2775:         if (providers.size() < 1) {
felix@2775:             logger.warn("Could not find durationcurve data provider.");
felix@2775:         }
felix@2775:         else {
felix@2775:             wqdays = (WQDay) providers.get(0).provideData(
felix@2775:                 DurationCurveFacet.BB_DURATIONCURVE,
felix@2775:                 null,
felix@2775:                 context);
felix@2775:         }
felix@2775: 
ingo@1679:         for (NamedDouble w: ws) {
felix@2775:             StickyAxisAnnotation annotation =
felix@2775:                 new StickyAxisAnnotation(
felix@2775:                     w.getName(),
felix@2775:                     (float) w.getValue(),
felix@2775:                     StickyAxisAnnotation.SimpleAxis.Y_AXIS);
felix@2775:             xy.add(annotation);
felix@2775:             if (wqdays != null) {
felix@2775:                 setHitPoint(wqdays, annotation);
felix@2775:             }
ingo@1679:         }
ingo@1679: 
ingo@1679:         return new FLYSAnnotation(description, xy);
felix@1085:     }
felix@1085: 
felix@1085: 
felix@1085:     /**
felix@1085:      * Create a deep copy of this Facet.
felix@1085:      * @return a deep copy.
felix@1085:      */
felix@1085:     @Override
felix@1085:     public MainValuesWFacet deepCopy() {
felix@1957:         MainValuesWFacet copy = new MainValuesWFacet(this.name,
felix@1957:             description, this.isAtGauge);
felix@1085:         copy.set(this);
felix@1085:         return copy;
felix@1085:     }
felix@1085: }
felix@1809: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :