21 package org.matsim.analysis;
23 import org.apache.logging.log4j.LogManager;
24 import org.apache.logging.log4j.Logger;
36 import jakarta.inject.Inject;
37 import java.util.HashMap;
40 import java.util.TreeSet;
62 this(3600, 24 * 3600 - 1, network);
73 this.maxSlotIndex = (this.maxTime / this.
timeBinSize) + 1;
77 if (this.observeModes) {
81 this.enRouteModes = null;
82 this.linksPerMode = null;
88 if (this.observeModes) {
96 if (volumes == null) {
97 volumes =
new int[this.maxSlotIndex + 1];
103 if (this.observeModes) {
104 Map<String, int[]> modeVolumes = this.linksPerMode.
get(event.
getLinkId());
105 if (modeVolumes == null) {
106 modeVolumes =
new HashMap<>();
110 volumes = modeVolumes.get(mode);
111 if (volumes == null) {
112 volumes =
new int[this.maxSlotIndex + 1];
113 modeVolumes.put(mode, volumes);
120 if (time > this.maxTime) {
123 return ((
int) time / this.timeBinSize);
132 return this.links.
get(linkId);
143 Map<String, int[]> modeVolumes = this.linksPerMode.
get(linkId);
144 if (modeVolumes != null)
return modeVolumes.get(mode);
154 return this.maxSlotIndex + 1;
178 if (3600.0 % this.timeBinSize != 0) log.error(
"Volumes per hour and per link probably not correct!");
180 double[] volumes =
new double[24];
183 if (volumesForLink == null)
return volumes;
185 int slotsPerHour = (int) (3600.0 / this.timeBinSize);
186 for (
int hour = 0; hour < 24; hour++) {
187 double time = hour * 3600.0;
188 for (
int i = 0; i < slotsPerHour; i++) {
198 if (3600.0 % this.timeBinSize != 0) log.error(
"Volumes per hour and per link probably not correct!");
200 double[] volumes =
new double[24];
201 for (
int hour = 0; hour < 24; hour++) {
206 if (volumesForLink == null)
return volumes;
208 int slotsPerHour = (int) (3600.0 / this.timeBinSize);
209 for (
int hour = 0; hour < 24; hour++) {
210 double time = hour * 3600.0;
211 for (
int i = 0; i < slotsPerHour; i++) {
225 Set<String> modes =
new TreeSet<>();
227 for (Map<String,
int[]> map : this.linksPerMode.
values()) {
229 modes.addAll(map.keySet());
230 }
catch (NullPointerException ex) {
243 return this.links.
keySet();
247 public void reset(
final int iteration) {
250 this.linksPerMode.
clear();
251 this.enRouteModes.
clear();
int [] getVolumesForLink(final Id< Link > linkId)
VolumesAnalyzer(final int timeBinSize, final int maxTime, final Network network, boolean observeModes)
double [] getVolumesPerHourForLink(final Id< Link > linkId)
double [] getVolumesPerHourForLink(final Id< Link > linkId, String mode)
void reset(final int iteration)
void handleEvent(final LinkLeaveEvent event)
final IdMap< Link, Map< String, int[]> > linksPerMode
void handleEvent(VehicleEntersTrafficEvent event)
void addHandler(final EventHandler handler)
final IdMap< Vehicle, String > enRouteModes
Id< Vehicle > getVehicleId()
int getVolumesArraySize()
int getTimeSlotIndex(final double time)
Set< Id< Link > > getLinkIds()
Id< Vehicle > getVehicleId()
V put(Id< T > key, V value)
final IdMap< Link, int[]> links
final boolean observeModes
VolumesAnalyzer(final int timeBinSize, final int maxTime, final Network network)
int [] getVolumesForLink(final Id< Link > linkId, String mode)