Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/tools/output/generateITetrisNetworkMetrics.py
169674 views
1
#!/usr/bin/env python
2
# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
# Copyright (C) 2009-2025 German Aerospace Center (DLR) and others.
4
# This program and the accompanying materials are made available under the
5
# terms of the Eclipse Public License 2.0 which is available at
6
# https://www.eclipse.org/legal/epl-2.0/
7
# This Source Code may also be made available under the following Secondary
8
# Licenses when the conditions for such availability set forth in the Eclipse
9
# Public License 2.0 are satisfied: GNU General Public License, version 2
10
# or later which is available at
11
# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
14
# @file generateITetrisNetworkMetrics.py
15
# @author Daniel Krajzewicz
16
# @author Michael Behrisch
17
# @date 2007-10-25
18
19
from __future__ import absolute_import
20
from __future__ import print_function
21
from optparse import OptionParser
22
import os
23
import sys
24
import numpy
25
from xml.sax import make_parser, handler
26
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
27
import sumolib.net # noqa
28
29
30
def quantil(a, alpha):
31
asort = numpy.sort(a)
32
n = len(asort)
33
j = int(n * alpha)
34
if (j * alpha == n):
35
return 0.5 * (asort[j - 1] + asort[j])
36
else:
37
return asort[j]
38
39
# This class is for storing vehicle information, such as departure time,
40
# route and travel time.
41
42
43
class Vehicle:
44
45
def __init__(self, label):
46
self.label = label
47
self.depart = 0.
48
self.arrival = 0.
49
self.speed = 0.
50
self.traveltime = 0.
51
self.travellength = 0.
52
self.departdelay = 0.
53
self.waittime = 0.
54
self.fuel_consumption = 0.
55
self.co = 0.
56
self.co2 = 0.
57
self.hc = 0.
58
self.pmx = 0.
59
self.nox = 0.
60
self.vtype = None
61
62
def __repr__(self):
63
return "%s_%s_%s_%s_%s_%s" % (
64
self.label, self.depart, self.arrival, self.speed, self.traveltime, self.travellength)
65
66
67
class VehInformationReader(handler.ContentHandler):
68
69
def __init__(self, vehList):
70
self._vehList = vehList
71
self._Vehicle = None
72
73
def startElement(self, name, attrs):
74
if name == 'tripinfo':
75
self._Vehicle = Vehicle(attrs['id'])
76
self._Vehicle.vtype = attrs['vtype']
77
self._Vehicle.traveltime = float(attrs['duration'])
78
self._Vehicle.travellength = float(attrs['routeLength'])
79
self._Vehicle.departdelay = float(attrs['departDelay'])
80
self._Vehicle.waittime = float(
81
attrs['departDelay']) + float(attrs['waitingTime'])
82
self._Vehicle.depart = float(attrs['depart'])
83
self._vehList.append(self._Vehicle)
84
if name == 'emissions':
85
self._Vehicle.fuel_consumption = float(attrs['fuel_abs'])
86
self._Vehicle.co = float(attrs['CO_abs'])
87
self._Vehicle.co2 = float(attrs['CO2_abs'])
88
self._Vehicle.hc = float(attrs['HC_abs'])
89
self._Vehicle.pmx = float(attrs['PMx_abs'])
90
self._Vehicle.nox = float(attrs['NOx_abs'])
91
92
93
class VehRoutesReader(handler.ContentHandler):
94
95
def __init__(self):
96
self._routes = []
97
self._depart = 0
98
self._arrival = 0
99
100
def startElement(self, name, attrs):
101
if name == 'vehicle':
102
self._depart = int(attrs['depart'])
103
self._arrival = int(attrs['arrival'])
104
if name == 'route':
105
self._routes.append((attrs['edges'], self._arrival - self._depart))
106
107
108
def getAvgNrLanesPerStreet(netfile):
109
net = sumolib.net.readNet(netfile)
110
nrLanes = 0
111
for edge in net._edges:
112
nrLanes += len(edge._lanes)
113
114
return 1.0 * nrLanes / len(net._edges)
115
116
117
def getRouteDistributions(vehroutesFile):
118
parser = make_parser()
119
viReader = VehRoutesReader()
120
parser.setContentHandler(viReader)
121
parser.parse(vehroutesFile)
122
123
routes = viReader._routes
124
125
startEnd = {}
126
for route in routes:
127
routeSplit = route[0].split(' ')
128
if ((routeSplit[0], routeSplit[-1]) not in startEnd):
129
startEnd[routeSplit[0], routeSplit[-1]] = {}
130
if (route[0] not in startEnd[routeSplit[0], routeSplit[-1]]):
131
startEnd[routeSplit[0], routeSplit[-1]][route[0]] = [0, 0]
132
startEnd[routeSplit[0], routeSplit[-1]][route[0]][0] += 1
133
startEnd[routeSplit[0], routeSplit[-1]][route[0]][1] += route[1]
134
return startEnd
135
136
137
def getBasicStats(vehicles):
138
totalVeh = 0.
139
aTravelTime = []
140
aTravelLength = []
141
aTravelSpeed = []
142
aWaitTime = []
143
aDepartDelay = []
144
aFuelConsumption = []
145
aCO = []
146
aCO2 = []
147
aHC = []
148
aPMx = []
149
aNOx = []
150
151
for veh in vehicles:
152
totalVeh += 1
153
# unit: speed - m/s; traveltime - s; travel length - m
154
veh.speed = veh.travellength / veh.traveltime
155
aTravelTime.append(veh.traveltime)
156
aTravelLength.append(veh.travellength)
157
aWaitTime.append(veh.waittime)
158
aTravelSpeed.append(veh.speed)
159
aDepartDelay.append(veh.departdelay)
160
aFuelConsumption.append(veh.fuel_consumption)
161
aCO.append(veh.co)
162
aCO2.append(veh.co2)
163
aHC.append(veh.hc)
164
aPMx.append(veh.pmx)
165
aNOx.append(veh.nox)
166
167
assignments = {}
168
assignments['totalVeh'] = totalVeh
169
assignments['totalTravelTime'] = sum(aTravelTime)
170
assignments['totalTravelLength'] = sum(aTravelLength)
171
assignments['totalDepartDelay'] = sum(aDepartDelay)
172
assignments['totalWaitTime'] = sum(aWaitTime)
173
assignments['totalFuelConsumption'] = sum(aFuelConsumption)
174
assignments['totalCO'] = sum(aCO)
175
assignments['totalCO2'] = sum(aCO2)
176
assignments['totalHC'] = sum(aHC)
177
assignments['totalPMx'] = sum(aPMx)
178
assignments['totalNOx'] = sum(aNOx)
179
180
assignments['avgTravelTime'] = numpy.mean(aTravelTime)
181
assignments['avgTravelLength'] = numpy.mean(aTravelLength)
182
assignments['avgTravelSpeed'] = numpy.mean(aTravelSpeed)
183
assignments['avgDepartDelay'] = numpy.mean(aDepartDelay)
184
assignments['avgWaitTime'] = numpy.mean(aWaitTime)
185
assignments['avgFuelConsumption'] = numpy.mean(aFuelConsumption)
186
assignments['avgCO'] = numpy.mean(aCO)
187
assignments['avgCO2'] = numpy.mean(aCO2)
188
assignments['avgHC'] = numpy.mean(aHC)
189
assignments['avgPMx'] = numpy.mean(aPMx)
190
assignments['avgNOx'] = numpy.mean(aNOx)
191
192
assignments['SDTravelTime'] = numpy.std(aTravelTime)
193
assignments['SDLength'] = numpy.std(aTravelLength)
194
assignments['SDSpeed'] = numpy.std(aTravelSpeed)
195
assignments['SDWaitTime'] = numpy.std(aWaitTime)
196
assignments['SDFuelConsumption'] = numpy.std(aFuelConsumption)
197
assignments['SDCO'] = numpy.std(aCO)
198
assignments['SDCO2'] = numpy.std(aCO2)
199
assignments['SDHC'] = numpy.std(aHC)
200
assignments['SDPMx'] = numpy.std(aPMx)
201
assignments['SDNOx'] = numpy.std(aNOx)
202
203
assignments['quartil25TravelTime'] = quantil(aTravelTime, 0.25)
204
assignments['quartil25Length'] = quantil(aTravelLength, 0.25)
205
assignments['quartil25Speed'] = quantil(aTravelSpeed, 0.25)
206
assignments['quartil25WaitTime'] = quantil(aWaitTime, 0.25)
207
assignments['quartil25FuelConsumption'] = quantil(aFuelConsumption, 0.25)
208
assignments['quartil25CO'] = quantil(aCO, 0.25)
209
assignments['quartil25CO2'] = quantil(aCO2, 0.25)
210
assignments['quartil25HC'] = quantil(aHC, 0.25)
211
assignments['quartil25PMx'] = quantil(aPMx, 0.25)
212
assignments['quartil25NOx'] = quantil(aNOx, 0.25)
213
214
assignments['quartil75TravelTime'] = quantil(aTravelTime, 0.75)
215
assignments['quartil75Length'] = quantil(aTravelLength, 0.75)
216
assignments['quartil75Speed'] = quantil(aTravelSpeed, 0.75)
217
assignments['quartil75WaitTime'] = quantil(aWaitTime, 0.75)
218
assignments['quartil75FuelConsumption'] = quantil(aFuelConsumption, 0.75)
219
assignments['quartil75CO'] = quantil(aCO, 0.75)
220
assignments['quartil75CO2'] = quantil(aCO2, 0.75)
221
assignments['quartil75HC'] = quantil(aHC, 0.75)
222
assignments['quartil75PMx'] = quantil(aPMx, 0.75)
223
assignments['quartil75NOx'] = quantil(aNOx, 0.75)
224
225
assignments['medianTravelTime'] = quantil(aTravelTime, 0.5)
226
assignments['medianLength'] = quantil(aTravelLength, 0.5)
227
assignments['medianSpeed'] = quantil(aTravelSpeed, 0.5)
228
assignments['medianWaitTime'] = quantil(aWaitTime, 0.5)
229
assignments['medianFuelConsumption'] = quantil(aFuelConsumption, 0.5)
230
assignments['medianCO'] = quantil(aCO, 0.5)
231
assignments['medianCO2'] = quantil(aCO2, 0.5)
232
assignments['medianHC'] = quantil(aHC, 0.5)
233
assignments['medianPMx'] = quantil(aPMx, 0.5)
234
assignments['medianNOx'] = quantil(aNOx, 0.5)
235
236
return assignments
237
238
239
# output the network statistics based on the sumo-simulation results
240
def writeStatistics(assignments, out):
241
out.write('mean number of lanes per street : %f\n\n' %
242
assignments['avgNrLanes'])
243
244
out.write('total number of vehicles : %f\n\n' % assignments['totalVeh'])
245
246
out.write('travel time\n')
247
out.write('===========\n')
248
out.write('total : %f\n' % assignments['totalTravelTime'])
249
out.write('mean : %f\n' % assignments['avgTravelTime'])
250
out.write('std : %f\n' % assignments['SDTravelTime'])
251
out.write('1/4-quantil : %f\n' % assignments['quartil25TravelTime'])
252
out.write('median : %f\n' % assignments['medianTravelTime'])
253
out.write('3/4-quantil : %f\n\n' % assignments['quartil75TravelTime'])
254
255
out.write('travel speed\n')
256
out.write('============\n')
257
out.write('mean : %f\n' % assignments['avgTravelSpeed'])
258
out.write('std : %f\n' % assignments['SDSpeed'])
259
out.write('1/4-quantil : %f\n' % assignments['quartil25Speed'])
260
out.write('median : %f\n' % assignments['medianSpeed'])
261
out.write('3/4-quantil : %f\n\n' % assignments['quartil75Speed'])
262
263
out.write('waiting time\n')
264
out.write('============\n')
265
out.write('total : %f\n' % assignments['totalWaitTime'])
266
out.write('mean : %f\n' % assignments['avgWaitTime'])
267
out.write('std : %f\n' % assignments['SDWaitTime'])
268
out.write('1/4-quantil : %f\n' % assignments['quartil25WaitTime'])
269
out.write('median : %f\n' % assignments['medianWaitTime'])
270
out.write('3/4-quantil : %f\n\n' % assignments['quartil75WaitTime'])
271
272
out.write('distance travelled\n')
273
out.write('==================\n')
274
out.write('total : %f\n' % assignments['totalTravelLength'])
275
out.write('mean : %f\n' % assignments['avgTravelLength'])
276
out.write('std : %f\n' % assignments['SDLength'])
277
out.write('1/4-quantil : %f\n' % assignments['quartil25Length'])
278
out.write('median : %f\n' % assignments['medianLength'])
279
out.write('3/4-quantil : %f\n\n' % assignments['quartil75Length'])
280
281
out.write('fuel consumption\n')
282
out.write('================\n')
283
out.write('total : %f\n' % assignments['totalFuelConsumption'])
284
out.write('mean : %f\n' % assignments['avgFuelConsumption'])
285
out.write('std : %f\n' % assignments['SDFuelConsumption'])
286
out.write('1/4-quantil : %f\n' % assignments['quartil25FuelConsumption'])
287
out.write('median : %f\n' % assignments['medianFuelConsumption'])
288
out.write('3/4-quantil : %f\n\n' % assignments['quartil75FuelConsumption'])
289
290
out.write('CO emissions\n')
291
out.write('============\n')
292
out.write('total : %f\n' % assignments['totalCO'])
293
out.write('mean : %f\n' % assignments['avgCO'])
294
out.write('std : %f\n' % assignments['SDCO'])
295
out.write('1/4-quantil : %f\n' % assignments['quartil25CO'])
296
out.write('median : %f\n' % assignments['medianCO'])
297
out.write('3/4-quantil : %f\n\n' % assignments['quartil75CO'])
298
299
out.write('CO2 emissions\n')
300
out.write('=============\n')
301
out.write('total : %f\n' % assignments['totalCO2'])
302
out.write('mean : %f\n' % assignments['avgCO2'])
303
out.write('std : %f\n' % assignments['SDCO2'])
304
out.write('1/4-quantil : %f\n' % assignments['quartil25CO2'])
305
out.write('median : %f\n' % assignments['medianCO2'])
306
out.write('3/4-quantil : %f\n\n' % assignments['quartil75CO2'])
307
308
out.write('HC emissions\n')
309
out.write('============\n')
310
out.write('total : %f\n' % assignments['totalHC'])
311
out.write('mean : %f\n' % assignments['avgHC'])
312
out.write('std : %f\n' % assignments['SDHC'])
313
out.write('1/4-quantil : %f\n' % assignments['quartil25HC'])
314
out.write('median : %f\n' % assignments['medianHC'])
315
out.write('3/4-quantil : %f\n\n' % assignments['quartil75HC'])
316
317
out.write('PMx emissions\n')
318
out.write('=============\n')
319
out.write('total : %f\n' % assignments['totalPMx'])
320
out.write('mean : %f\n' % assignments['avgPMx'])
321
out.write('std : %f\n' % assignments['SDPMx'])
322
out.write('1/4-quantil : %f\n' % assignments['quartil25PMx'])
323
out.write('median : %f\n' % assignments['medianPMx'])
324
out.write('3/4-quantil : %f\n\n' % assignments['quartil75PMx'])
325
326
out.write('NOx emissions\n')
327
out.write('=============\n')
328
out.write('total : %f\n' % assignments['totalNOx'])
329
out.write('mean : %f\n' % assignments['avgNOx'])
330
out.write('std : %f\n' % assignments['SDNOx'])
331
out.write('1/4-quantil : %f\n' % assignments['quartil25NOx'])
332
out.write('median : %f\n' % assignments['medianNOx'])
333
out.write('3/4-quantil : %f\n\n' % assignments['quartil75NOx'])
334
335
336
# output the network statistics based on the sumo-simulation results
337
def getStatisticsOutput(assignments, outputfile):
338
foutveh = open(outputfile, 'w')
339
writeStatistics(assignments, foutveh)
340
foutveh.write('\n\nRoute distribution:\n')
341
foutveh.write('==================:\n')
342
startEnd = assignment['routeDistr']
343
for se in startEnd:
344
for r in startEnd[se]:
345
foutveh.write('%s: Number of vehicles: %d, Avg Travel Time: %d\n' % (
346
r, startEnd[se][r][0], 1.0 * startEnd[se][r][1] / startEnd[se][r][0]))
347
foutveh.write('\n')
348
foutveh.close()
349
writeStatistics(assignments, sys.stdout)
350
351
352
def getCSVOutput(assignments, path, veh_types, interval):
353
f_mean_travel_time = open(
354
os.path.join(options.path, 'mean_travel_time.csv'), 'w')
355
f_mean_speed = open(os.path.join(options.path, 'mean_speed.csv'), 'w')
356
f_mean_waiting_time = open(
357
os.path.join(options.path, 'mean_waiting_time.csv'), 'w')
358
f_mean_distance_travelled = open(
359
os.path.join(options.path, 'mean_distance_travelled.csv'), 'w')
360
f_mean_fuel_consumption = open(
361
os.path.join(options.path, 'mean_fuel_consumption.csv'), 'w')
362
f_mean_CO_emissions = open(
363
os.path.join(options.path, 'mean_CO_emissions.csv'), 'w')
364
f_mean_CO2_emissions = open(
365
os.path.join(options.path, 'mean_CO2_emissions.csv'), 'w')
366
f_mean_HC_emissions = open(
367
os.path.join(options.path, 'mean_HC_emissions.csv'), 'w')
368
f_mean_PMx_emissions = open(
369
os.path.join(options.path, 'mean_PMx_emissions.csv'), 'w')
370
f_mean_NOx_emissions = open(
371
os.path.join(options.path, 'mean_NOx_emissions.csv'), 'w')
372
f_abs_travel_time = open(
373
os.path.join(options.path, 'abs_travel_time.csv'), 'w')
374
f_abs_waiting_time = open(
375
os.path.join(options.path, 'abs_waiting_time.csv'), 'w')
376
f_abs_distance_travelled = open(
377
os.path.join(options.path, 'abs_distance_travelled.csv'), 'w')
378
f_abs_fuel_consumption = open(
379
os.path.join(options.path, 'abs_fuel_consumption.csv'), 'w')
380
f_abs_CO_emissions = open(
381
os.path.join(options.path, 'abs_CO_emissions.csv'), 'w')
382
f_abs_CO2_emissions = open(
383
os.path.join(options.path, 'abs_CO2_emissions.csv'), 'w')
384
f_abs_HC_emissions = open(
385
os.path.join(options.path, 'abs_HC_emissions.csv'), 'w')
386
f_abs_PMx_emissions = open(
387
os.path.join(options.path, 'abs_PMx_emissions.csv'), 'w')
388
f_abs_NOx_emissions = open(
389
os.path.join(options.path, 'abs_NOx_emissions.csv'), 'w')
390
391
files = []
392
files.append(f_mean_travel_time)
393
files.append(f_mean_speed)
394
files.append(f_mean_waiting_time)
395
files.append(f_mean_distance_travelled)
396
files.append(f_mean_fuel_consumption)
397
files.append(f_mean_CO_emissions)
398
files.append(f_mean_CO2_emissions)
399
files.append(f_mean_HC_emissions)
400
files.append(f_mean_PMx_emissions)
401
files.append(f_mean_NOx_emissions)
402
files.append(f_abs_travel_time)
403
files.append(f_abs_waiting_time)
404
files.append(f_abs_distance_travelled)
405
files.append(f_abs_fuel_consumption)
406
files.append(f_abs_CO_emissions)
407
files.append(f_abs_CO2_emissions)
408
files.append(f_abs_HC_emissions)
409
files.append(f_abs_PMx_emissions)
410
files.append(f_abs_NOx_emissions)
411
412
for f in files:
413
f.write(';')
414
415
for veh_type in veh_types:
416
head = veh_type + '(mean);' + veh_type + '(std);' + veh_type + \
417
'(1/4-quantil);' + veh_type + \
418
'(median);' + veh_type + '(3/4-quantil);'
419
f_mean_travel_time.write(head)
420
f_mean_speed.write(head)
421
f_mean_waiting_time.write(head)
422
f_mean_distance_travelled.write(head)
423
f_mean_fuel_consumption.write(head)
424
f_mean_CO_emissions.write(head)
425
f_mean_CO2_emissions.write(head)
426
f_mean_HC_emissions.write(head)
427
f_mean_PMx_emissions.write(head)
428
f_mean_NOx_emissions.write(head)
429
f_abs_travel_time.write(veh_type + ';')
430
f_abs_waiting_time.write(veh_type + ';')
431
f_abs_distance_travelled.write(veh_type + ';')
432
f_abs_fuel_consumption.write(veh_type + ';')
433
f_abs_CO_emissions.write(veh_type + ';')
434
f_abs_CO2_emissions.write(veh_type + ';')
435
f_abs_HC_emissions.write(veh_type + ';')
436
f_abs_PMx_emissions.write(veh_type + ';')
437
f_abs_NOx_emissions.write(veh_type + ';')
438
439
for f in files:
440
f.write('\n')
441
442
t = 0
443
while t in assignments:
444
for f in files:
445
f.write('[' + str(t) + ':' + str(t + interval - 1) + '];')
446
for veh_type in assignments[t].values():
447
f_mean_travel_time.write(str(veh_type['avgTravelTime']) + ";" + str(veh_type['SDTravelTime']) + ";" +
448
str(veh_type['quartil25TravelTime']) + ";" + str(veh_type['medianTravelTime']) +
449
";" + str(veh_type['quartil75TravelTime']) + ";")
450
f_mean_speed.write(str(veh_type['avgTravelSpeed']) + ";" + str(veh_type['SDSpeed']) + ";" +
451
str(veh_type['quartil25Speed']) + ";" + str(veh_type['medianSpeed']) + ";" +
452
str(veh_type['quartil75Speed']) + ";")
453
f_mean_waiting_time.write(str(veh_type['avgWaitTime']) + ";" + str(veh_type['SDWaitTime']) + ";" +
454
str(veh_type['quartil25WaitTime']) + ";" + str(veh_type['medianWaitTime']) +
455
";" + str(veh_type['quartil75WaitTime']) + ";")
456
f_mean_distance_travelled.write(str(veh_type['avgTravelLength']) + ";" + str(veh_type['SDLength']) + ";" +
457
str(veh_type['quartil25Length']) + ";" + str(veh_type['medianLength']) +
458
";" + str(veh_type['quartil75Length']) + ";")
459
f_mean_fuel_consumption.write(str(veh_type['avgFuelConsumption']) + ";" +
460
str(veh_type['SDFuelConsumption']) + ";" +
461
str(veh_type['quartil25FuelConsumption']) + ";" +
462
str(veh_type['medianFuelConsumption']) + ";" +
463
str(veh_type['quartil75FuelConsumption']) + ";")
464
f_mean_CO_emissions.write(str(veh_type['avgCO']) + ";" + str(veh_type['SDCO']) + ";" + str(
465
veh_type['quartil25CO']) + ";" + str(veh_type['medianCO']) + ";" + str(veh_type['quartil75CO']) + ";")
466
f_mean_CO2_emissions.write(str(veh_type['avgCO2']) + ";" + str(veh_type['SDCO2']) + ";" + str(
467
veh_type['quartil25CO2']) + ";" + str(veh_type['medianCO2']) + ";" + str(
468
veh_type['quartil75CO2']) + ";")
469
f_mean_HC_emissions.write(str(veh_type['avgHC']) + ";" + str(veh_type['SDHC']) + ";" + str(
470
veh_type['quartil25HC']) + ";" + str(veh_type['medianHC']) + ";" + str(veh_type['quartil75HC']) + ";")
471
f_mean_PMx_emissions.write(str(veh_type['avgPMx']) + ";" + str(veh_type['SDPMx']) + ";" + str(
472
veh_type['quartil25PMx']) + ";" + str(veh_type['medianPMx']) + ";" + str(
473
veh_type['quartil75PMx']) + ";")
474
f_mean_NOx_emissions.write(str(veh_type['avgNOx']) + ";" + str(veh_type['SDNOx']) + ";" + str(
475
veh_type['quartil25NOx']) + ";" + str(veh_type['medianNOx']) + ";" + str(
476
veh_type['quartil75NOx']) + ";")
477
f_abs_travel_time.write(str(veh_type['totalTravelTime']) + ";")
478
f_abs_waiting_time.write(str(veh_type['totalWaitTime']) + ";")
479
f_abs_distance_travelled.write(
480
str(veh_type['totalTravelLength']) + ";")
481
f_abs_fuel_consumption.write(
482
str(veh_type['totalFuelConsumption']) + ";")
483
f_abs_CO_emissions.write(str(veh_type['totalCO']) + ";")
484
f_abs_CO2_emissions.write(str(veh_type['totalCO2']) + ";")
485
f_abs_HC_emissions.write(str(veh_type['totalHC']) + ";")
486
f_abs_PMx_emissions.write(str(veh_type['totalPMx']) + ";")
487
f_abs_NOx_emissions.write(str(veh_type['totalNOx']) + ";")
488
for f in files:
489
f.write('\n')
490
t += interval
491
492
for f in files:
493
f.close()
494
495
496
# initialise
497
optParser = OptionParser()
498
optParser.add_option("-n", "--netfile", dest="netfile",
499
help="name of the netfile (f.e. 'inputs\\pasubio\\a_costa.net.xml')",
500
metavar="<FILE>", type="string")
501
optParser.add_option("-p", "--path", dest="path",
502
help="name of folder to work with (f.e. 'outputs\\a_costa\\')", metavar="<FOLDER>", type="string")
503
optParser.add_option("-t", "--vehicle-types", dest="vehicle_types",
504
help="vehicle-types for which the values shall be generated",
505
metavar="<VEHICLE_TYPE>[,<VEHICLE_TYPE>]", type="string")
506
optParser.add_option("-i", "--intervals", dest="interval",
507
help="intervals to be generated ([0:<TIME>-1], [<TIME>:2*<TIME>-1], ...)",
508
metavar="<TIME>", type="int")
509
510
optParser.set_usage('\ngenerateITetrisNetworkMetrics.py -n inputs\\a_costa\\acosta.net.xml -p outputs\\a_costa\\ -t ' +
511
'passenger2a,passenger5,passenger1,passenger2b,passenger3,passenger4 -i 500 \n' +
512
'generateITetrisNetworkMetrics.py -n inputs\\a_costa\\acosta.net.xml -p outputs\\a_costa\\ ' +
513
'-i 500\n' + 'generateITetrisNetworkMetrics.py -n inputs\\a_costa\\acosta.net.xml ' +
514
'-p outputs\\a_costa\\')
515
# parse options
516
(options, args) = optParser.parse_args()
517
if not options.netfile or not options.path:
518
print("Missing arguments")
519
optParser.print_help()
520
exit()
521
522
interval = options.interval
523
netfile = options.netfile
524
vehroutefile = os.path.join(options.path, 'vehroutes.xml')
525
526
if interval is None:
527
interval = 10000000
528
529
530
vehicles = []
531
parser = make_parser()
532
parser.setContentHandler(VehInformationReader(vehicles))
533
parser.parse(os.path.join(options.path, 'tripinfos.xml'))
534
535
if options.vehicle_types is None:
536
vehicle_types = ['all']
537
else:
538
vehicle_types = options.vehicle_types.split(',')
539
540
vehicles_of_type_interval = {}
541
for veh in vehicles:
542
t = int(veh.depart / interval) * interval
543
if (t not in vehicles_of_type_interval):
544
vehicles_of_type_interval[t] = {}
545
for veh_type in vehicle_types:
546
vehicles_of_type_interval[t][veh_type] = []
547
if vehicle_types[0] == 'all':
548
vehicles_of_type_interval[t]['all'].append(veh)
549
else:
550
if (veh.vtype in vehicle_types):
551
vehicles_of_type_interval[t][veh.vtype].append(veh)
552
assignments = {}
553
for t in vehicles_of_type_interval.keys():
554
assignments[t] = {}
555
for veh_type in vehicle_types:
556
assignments[t][veh_type] = getBasicStats(
557
vehicles_of_type_interval[t][veh_type])
558
559
getCSVOutput(assignments, options.path, vehicle_types, interval)
560
561
assignment = getBasicStats(vehicles)
562
assignment['avgNrLanes'] = getAvgNrLanesPerStreet(netfile)
563
assignment['routeDistr'] = getRouteDistributions(vehroutefile)
564
getStatisticsOutput(
565
assignment, os.path.join(options.path, "network_metrics_summary.txt"))
566
567
print('The calculation is done!')
568
569