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  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  public abstract class AbstractSamplerPlot extends AbstractSpaceTimePlot
31  {
32  
33      
34      private static final long serialVersionUID = 20181004L;
35  
36      
37      private final Sampler<?> sampler;
38  
39      
40      private final GraphPath<KpiLaneDirection> path;
41  
42      
43      private List<Time> lastUpdateTime = new ArrayList<>();
44  
45      
46      private List<List<TrajectoryGroup<?>>> trajectoriesCache = new ArrayList<>();
47  
48      
49  
50  
51  
52  
53  
54  
55  
56  
57      public AbstractSamplerPlot(final String caption, final Duration updateInterval, final OTSSimulatorInterface simulator,
58              final Sampler<?> sampler, final GraphPath<KpiLaneDirection> path, final Duration delay)
59      {
60          super(caption, updateInterval, simulator, delay, DEFAULT_INITIAL_UPPER_TIME_BOUND);
61          this.sampler = sampler;
62          this.path = path;
63          for (Section<KpiLaneDirection> section : path.getSections())
64          {
65              for (KpiLaneDirection kpiLaneDirection : section)
66              {
67                  sampler.registerSpaceTimeRegion(new SpaceTimeRegion(kpiLaneDirection, Length.ZERO,
68                          kpiLaneDirection.getLaneData().getLength(), Time.ZERO, Time.createSI(Double.MAX_VALUE)));
69              }
70          }
71          for (int i = 0; i < path.getNumberOfSeries(); i++)
72          {
73              this.trajectoriesCache.add(new ArrayList<>());
74              this.lastUpdateTime.add(null);
75          }
76      }
77  
78      
79  
80  
81  
82  
83      protected List<TrajectoryGroup<?>> getTrajectories(final int series)
84      {
85          if (this.lastUpdateTime.get(series) == null || this.lastUpdateTime.get(series).lt(getUpdateTime()))
86          {
87              List<TrajectoryGroup<?>> cache = new ArrayList<>();
88              for (Section<KpiLaneDirection> section : getPath().getSections())
89              {
90                  cache.add(this.sampler.getTrajectoryGroup(section.getSource(series)));
91              }
92              this.trajectoriesCache.set(series, cache);
93              this.lastUpdateTime.set(series, getUpdateTime());
94          }
95          return this.trajectoriesCache.get(series);
96      }
97  
98      
99  
100 
101 
102     protected final GraphPath<KpiLaneDirection> getPath()
103     {
104         return this.path;
105     }
106 
107     
108     @Override
109     protected final Length getEndLocation()
110     {
111         return getPath().getTotalLength();
112     }
113 
114     
115 
116 
117 
118     protected final Sampler<?> getSampler()
119     {
120         return this.sampler;
121     }
122 
123 }