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-2020 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<?>; road sampler
51 * @param path GraphPath<KpiLaneDirection>; 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<TrajectoryGroup>; 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<KpiLaneDirection>; 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<?>; sampler.
114 */
115 protected final Sampler<?> getSampler()
116 {
117 return this.sampler;
118 }
119
120 }