View Javadoc
1   package org.opentrafficsim.draw.graphs;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import org.djunits.value.vdouble.scalar.Duration;
7   import org.djunits.value.vdouble.scalar.Length;
8   import org.djunits.value.vdouble.scalar.Time;
9   import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
10  import org.opentrafficsim.draw.graphs.GraphPath.Section;
11  import org.opentrafficsim.kpi.sampling.KpiLaneDirection;
12  import org.opentrafficsim.kpi.sampling.Sampler;
13  import org.opentrafficsim.kpi.sampling.SpaceTimeRegion;
14  import org.opentrafficsim.kpi.sampling.TrajectoryGroup;
15  
16  /**
17   * Super class for plots that use sampler data. Sub classes may obtain trajectories using {@code getTrajectories()}, or
18   * alternatively maintain some other -possibly more efficient- connection to the sampler. This class also connects the plot to a
19   * path, consisting of a list of lanes. Start distance along the path for each lane is provided to sub classes using
20   * {@code getStartDistance(KpiLaneDirection)}. Total length is obtained using {@code getEndLocation()}.
21   * <p>
22   * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
23   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
24   * <p>
25   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 4 okt. 2018 <br>
26   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
27   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
28   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
29   */
30  public abstract class AbstractSamplerPlot extends AbstractSpaceTimePlot
31  {
32  
33      /** Sampler. */
34      private final Sampler<?> sampler;
35  
36      /** KPI lane directions registered in the sampler. */
37      private final GraphPath<KpiLaneDirection> path;
38  
39      /** Time when trajectories were last updated per series in the path. */
40      private List<Time> lastUpdateTime = new ArrayList<>();
41  
42      /** Cached trajectories per series in the path. */
43      private List<List<TrajectoryGroup<?>>> trajectoriesCache = new ArrayList<>();
44  
45      /**
46       * Constructor.
47       * @param caption String; caption
48       * @param updateInterval Duration; regular update interval (simulation time)
49       * @param simulator OTSSimulatorInterface; simulator
50       * @param sampler Sampler&lt;?&gt;; road sampler
51       * @param path GraphPath&lt;KpiLaneDirection&gt;; path
52       * @param delay Duration; amount of time that chart runs behind simulation to prevent gaps in the charted data
53       */
54      public AbstractSamplerPlot(final String caption, final Duration updateInterval, final OTSSimulatorInterface simulator,
55              final Sampler<?> sampler, final GraphPath<KpiLaneDirection> path, final Duration delay)
56      {
57          super(caption, updateInterval, simulator, delay, DEFAULT_INITIAL_UPPER_TIME_BOUND);
58          this.sampler = sampler;
59          this.path = path;
60          for (Section<KpiLaneDirection> section : path.getSections())
61          {
62              for (KpiLaneDirection kpiLaneDirection : section)
63              {
64                  sampler.registerSpaceTimeRegion(new SpaceTimeRegion(kpiLaneDirection, Length.ZERO,
65                          kpiLaneDirection.getLaneData().getLength(), Time.ZERO, Time.instantiateSI(Double.MAX_VALUE)));
66              }
67          }
68          for (int i = 0; i < path.getNumberOfSeries(); i++)
69          {
70              this.trajectoriesCache.add(new ArrayList<>());
71              this.lastUpdateTime.add(null);
72          }
73      }
74  
75      /**
76       * Returns all trajectories for the series, in order of the path.
77       * @param series int; series number
78       * @return List&lt;TrajectoryGroup&gt;; the trajectories
79       */
80      protected List<TrajectoryGroup<?>> getTrajectories(final int series)
81      {
82          if (this.lastUpdateTime.get(series) == null || this.lastUpdateTime.get(series).lt(getUpdateTime()))
83          {
84              List<TrajectoryGroup<?>> cache = new ArrayList<>();
85              for (Section<KpiLaneDirection> section : getPath().getSections())
86              {
87                  cache.add(this.sampler.getTrajectoryGroup(section.getSource(series)));
88              }
89              this.trajectoriesCache.set(series, cache);
90              this.lastUpdateTime.set(series, getUpdateTime());
91          }
92          return this.trajectoriesCache.get(series);
93      }
94  
95      /**
96       * Returns the path.
97       * @return GraphPath&lt;KpiLaneDirection&gt;; the path
98       */
99      public final GraphPath<KpiLaneDirection> getPath()
100     {
101         return this.path;
102     }
103 
104     /** {@inheritDoc} */
105     @Override
106     protected final Length getEndLocation()
107     {
108         return getPath().getTotalLength();
109     }
110 
111     /**
112      * Returns the sampler.
113      * @return Sampler&lt;?&gt;; sampler.
114      */
115     protected final Sampler<?> getSampler()
116     {
117         return this.sampler;
118     }
119 
120 }