21 package org.matsim.analysis;
37 import jakarta.inject.Inject;
39 import java.io.IOException;
40 import java.io.OutputStream;
41 import java.io.PrintStream;
42 import java.io.UncheckedIOException;
45 import java.util.TreeMap;
66 private final Map<String, DataFrame>
data =
new TreeMap<>();
74 if (population == null) {
75 this.personIds = null;
77 this.personIds = population.
getPersons().keySet();
101 this(
binSize, DEFAULT_END_TIME / binSize + 1);
109 if ((this.personIds == null || this.personIds.contains(event.
getPersonId())) &&
event.getLegMode() != null) {
110 DataFrame dataFrame = getDataForMode(event.
getLegMode());
111 dataFrame.countsDep[index]++;
118 if ((this.personIds == null || this.personIds.contains(event.
getPersonId())) &&
event.getLegMode() != null) {
119 DataFrame dataFrame = getDataForMode(event.
getLegMode());
120 dataFrame.countsArr[index]++;
127 if ((this.personIds == null || this.personIds.contains(event.
getPersonId())) &&
event.getLegMode() != null) {
128 DataFrame dataFrame = getDataForMode(event.
getLegMode());
129 dataFrame.countsStuck[index]++;
135 this.iteration = iter;
144 public void write(
final String filename) {
146 write(
new PrintStream(stream));
147 }
catch (IOException e) {
148 throw new UncheckedIOException(e);
157 public void write(
final PrintStream stream) {
158 stream.print(
"time\ttime\tdepartures_all\tarrivals_all\tstuck_all\ten-route_all");
159 for (String legMode : this.data.keySet()) {
160 stream.print(
"\tdepartures_" + legMode +
"\tarrivals_" + legMode +
"\tstuck_" + legMode +
"\ten-route_" + legMode);
164 int[] modeEnRoute =
new int[this.data.size()];
165 DataFrame allModesData = getAllModesData();
166 for (
int i = 0; i < allModesData.countsDep.length; i++) {
168 allEnRoute = allEnRoute + allModesData.countsDep[i] - allModesData.countsArr[i] - allModesData.countsStuck[i];
170 stream.print(
"\t" + allModesData.countsDep[i] +
"\t" + allModesData.countsArr[i] +
"\t" + allModesData.countsStuck[i] +
"\t" + allEnRoute);
174 for (DataFrame dataFrame : this.data.values()) {
175 modeEnRoute[mode] = modeEnRoute[mode] + dataFrame.countsDep[i] - dataFrame.countsArr[i] - dataFrame.countsStuck[i];
176 stream.print(
"\t" + dataFrame.countsDep[i] +
"\t" + dataFrame.countsArr[i] +
"\t" + dataFrame.countsStuck[i] +
"\t" + modeEnRoute[mode]);
189 return this.getAllModesData().countsDep;
196 return this.getAllModesData().countsArr;
203 return this.getAllModesData().countsStuck;
210 return this.data.keySet();
218 DataFrame dataFrame = this.data.get(legMode);
219 if (dataFrame == null) {
222 return dataFrame.countsDep.clone();
230 DataFrame dataFrame = this.data.get(legMode);
231 if (dataFrame == null) {
234 return dataFrame.countsArr.clone();
242 DataFrame dataFrame = this.data.get(legMode);
243 if (dataFrame == null) {
246 return dataFrame.countsStuck.clone();
253 DataFrame getAllModesData() {
254 DataFrame result =
new DataFrame(this.binSize, this.nofBins + 1);
255 for (DataFrame byMode : this.data.values()) {
256 for (
int i=0;i<result.countsDep.length;++i) {
257 result.countsDep[i] += byMode.countsDep[i];
259 for (
int i=0;i<result.countsArr.length;++i) {
260 result.countsArr[i] += byMode.countsArr[i];
262 for (
int i=0;i<result.countsStuck.length;++i) {
263 result.countsStuck[i] += byMode.countsStuck[i];
270 int bin = (int)(time / this.binSize);
271 if (bin >= this.nofBins) {
277 DataFrame getDataForMode(
final String legMode) {
278 DataFrame dataFrame = this.data.get(legMode);
279 if (dataFrame == null) {
280 dataFrame =
new DataFrame(this.binSize, this.nofBins + 1);
281 this.data.put(legMode, dataFrame);
286 static class DataFrame {
287 final int[] countsDep;
288 final int[] countsArr;
289 final int[] countsStuck;
292 public DataFrame(
final int binSize,
final int nofBins) {
293 this.countsDep =
new int[
nofBins];
294 this.countsArr =
new int[
nofBins];
295 this.countsStuck =
new int[
nofBins];
double orElse(double other)
void handleEvent(final PersonStuckEvent event)
Id< Person > getPersonId()
void write(final PrintStream stream)
void write(final String filename)
void handleEvent(final PersonDepartureEvent event)
Id< Person > getPersonId()
int [] getStuck(final String legMode)
static URL getFileUrl(String filename)
Set< String > getLegModes()
Set< Id< Person > > personIds
Map< Id< Person >,? extends Person > getPersons()
LegHistogram(final int binSize)
LegHistogram(final int binSize, final int nofBins)
void handleEvent(final PersonArrivalEvent event)
int [] getDepartures(final String legMode)
void addHandler(final EventHandler handler)
Id< Person > getPersonId()
int getBinIndex(final double time)
int [] getArrivals(final String legMode)
static OutputStream getOutputStream(URL url, boolean append)
static final int DEFAULT_END_TIME
final Map< String, DataFrame > data
void reset(final int iter)
static final String writeTime(final double seconds, final String timeformat)
static final int DEFAULT_BIN_SIZE
OptionalTime getEndTime()