MATSIM
LegHistogram.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * LegHistogram.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2007 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.analysis;
22 
23 import org.matsim.api.core.v01.Id;
33 import org.matsim.core.config.Config;
34 import org.matsim.core.utils.io.IOUtils;
35 import org.matsim.core.utils.misc.Time;
36 
37 import jakarta.inject.Inject;
38 
39 import java.io.IOException;
40 import java.io.OutputStream;
41 import java.io.PrintStream;
42 import java.io.UncheckedIOException;
43 import java.util.Map;
44 import java.util.Set;
45 import java.util.TreeMap;
46 
58 
59  public static final int DEFAULT_END_TIME = 30 * 3600;
60  public static final int DEFAULT_BIN_SIZE = 300;
61 
62  private Set<Id<Person>> personIds;
63  private int iteration = 0;
64  private final int binSize;
65  private final int nofBins;
66  private final Map<String, DataFrame> data = new TreeMap<>();
67 
68  @Inject
69  LegHistogram(Population population, EventsManager eventsManager, Config config) {
70  super();
71  this.binSize = DEFAULT_BIN_SIZE;
72  this.nofBins = ((int) config.qsim().getEndTime().orElse(DEFAULT_END_TIME) ) / this.binSize + 1;
73  reset(0);
74  if (population == null) {
75  this.personIds = null;
76  } else {
77  this.personIds = population.getPersons().keySet();
78  }
79  eventsManager.addHandler(this);
80  }
81 
88  public LegHistogram(final int binSize, final int nofBins) {
89  super();
90  this.binSize = binSize;
91  this.nofBins = nofBins;
92  reset(0);
93  }
94 
100  public LegHistogram(final int binSize) {
101  this(binSize, DEFAULT_END_TIME / binSize + 1);
102  }
103 
104  /* Implementation of EventHandler-Interfaces */
105 
106  @Override
107  public void handleEvent(final PersonDepartureEvent event) {
108  int index = getBinIndex(event.getTime());
109  if ((this.personIds == null || this.personIds.contains(event.getPersonId())) && event.getLegMode() != null) {
110  DataFrame dataFrame = getDataForMode(event.getLegMode());
111  dataFrame.countsDep[index]++;
112  }
113  }
114 
115  @Override
116  public void handleEvent(final PersonArrivalEvent event) {
117  int index = getBinIndex(event.getTime());
118  if ((this.personIds == null || this.personIds.contains(event.getPersonId())) && event.getLegMode() != null) {
119  DataFrame dataFrame = getDataForMode(event.getLegMode());
120  dataFrame.countsArr[index]++;
121  }
122  }
123 
124  @Override
125  public void handleEvent(final PersonStuckEvent event) {
126  int index = getBinIndex(event.getTime());
127  if ((this.personIds == null || this.personIds.contains(event.getPersonId())) && event.getLegMode() != null) {
128  DataFrame dataFrame = getDataForMode(event.getLegMode());
129  dataFrame.countsStuck[index]++;
130  }
131  }
132 
133  @Override
134  public void reset(final int iter) {
135  this.iteration = iter;
136  this.data.clear();
137  }
138 
144  public void write(final String filename) {
145  try (OutputStream stream = IOUtils.getOutputStream(IOUtils.getFileUrl(filename), false)) {
146  write(new PrintStream(stream));
147  } catch (IOException e) {
148  throw new UncheckedIOException(e);
149  }
150  }
151 
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);
161  }
162  stream.print("\n");
163  int allEnRoute = 0;
164  int[] modeEnRoute = new int[this.data.size()];
165  DataFrame allModesData = getAllModesData();
166  for (int i = 0; i < allModesData.countsDep.length; i++) {
167  // data about all modes
168  allEnRoute = allEnRoute + allModesData.countsDep[i] - allModesData.countsArr[i] - allModesData.countsStuck[i];
169  stream.print(Time.writeTime(i*this.binSize) + "\t" + i*this.binSize);
170  stream.print("\t" + allModesData.countsDep[i] + "\t" + allModesData.countsArr[i] + "\t" + allModesData.countsStuck[i] + "\t" + allEnRoute);
171 
172  // data about single modes
173  int mode = 0;
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]);
177  mode++;
178  }
179 
180  // new line
181  stream.print("\n");
182  }
183  }
184 
188  public int[] getDepartures() {
189  return this.getAllModesData().countsDep;
190  }
191 
195  public int[] getArrivals() {
196  return this.getAllModesData().countsArr;
197  }
198 
202  public int[] getStuck() {
203  return this.getAllModesData().countsStuck;
204  }
205 
209  public Set<String> getLegModes() {
210  return this.data.keySet();
211  }
212 
217  public int[] getDepartures(final String legMode) {
218  DataFrame dataFrame = this.data.get(legMode);
219  if (dataFrame == null) {
220  return new int[0];
221  }
222  return dataFrame.countsDep.clone();
223  }
224 
229  public int[] getArrivals(final String legMode) {
230  DataFrame dataFrame = this.data.get(legMode);
231  if (dataFrame == null) {
232  return new int[0];
233  }
234  return dataFrame.countsArr.clone();
235  }
236 
241  public int[] getStuck(final String legMode) {
242  DataFrame dataFrame = this.data.get(legMode);
243  if (dataFrame == null) {
244  return new int[0];
245  }
246  return dataFrame.countsStuck.clone();
247  }
248 
249  int getIteration() {
250  return this.iteration;
251  }
252 
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];
258  }
259  for (int i=0;i<result.countsArr.length;++i) {
260  result.countsArr[i] += byMode.countsArr[i];
261  }
262  for (int i=0;i<result.countsStuck.length;++i) {
263  result.countsStuck[i] += byMode.countsStuck[i];
264  }
265  }
266  return result;
267  }
268 
269  private int getBinIndex(final double time) {
270  int bin = (int)(time / this.binSize);
271  if (bin >= this.nofBins) {
272  return this.nofBins;
273  }
274  return bin;
275  }
276 
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); // +1 for all times out of our range
281  this.data.put(legMode, dataFrame);
282  }
283  return dataFrame;
284  }
285 
286  static class DataFrame {
287  final int[] countsDep;
288  final int[] countsArr;
289  final int[] countsStuck;
290  final int binSize;
291 
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];
296  this.binSize = binSize;
297  }
298  }
299 
300 }
void handleEvent(final PersonStuckEvent event)
void write(final PrintStream stream)
void write(final String filename)
void handleEvent(final PersonDepartureEvent event)
int [] getStuck(final String legMode)
static URL getFileUrl(String filename)
Definition: IOUtils.java:501
Map< Id< Person >,? extends Person > getPersons()
LegHistogram(final int binSize, final int nofBins)
void handleEvent(final PersonArrivalEvent event)
int [] getDepartures(final String legMode)
void addHandler(final EventHandler handler)
int getBinIndex(final double time)
int [] getArrivals(final String legMode)
static OutputStream getOutputStream(URL url, boolean append)
Definition: IOUtils.java:344
final Map< String, DataFrame > data
QSimConfigGroup qsim()
Definition: Config.java:447
static final String writeTime(final double seconds, final String timeformat)
Definition: Time.java:80