Path: blob/main/tools/contributed/sumopy/coremodules/simulation/results.py
169689 views
# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo1# Copyright (C) 2016-2025 German Aerospace Center (DLR) and others.2# SUMOPy module3# Copyright (C) 2012-2021 University of Bologna - DICAM4# This program and the accompanying materials are made available under the5# terms of the Eclipse Public License 2.0 which is available at6# https://www.eclipse.org/legal/epl-2.0/7# This Source Code may also be made available under the following Secondary8# Licenses when the conditions for such availability set forth in the Eclipse9# Public License 2.0 are satisfied: GNU General Public License, version 210# or later which is available at11# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html12# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later1314# @file results.py15# @author Joerg Schweizer16# @date 2012171819import os20import sys21import string22import types23from xml.sax import saxutils, parse, handler # , make_parser24from collections import OrderedDict25import numpy as np262728from coremodules.modules_common import *2930import agilepy.lib_base.classman as cm31import agilepy.lib_base.arrayman as am32import agilepy.lib_base.xmlman as xm33from agilepy.lib_base.geometry import *3435from agilepy.lib_base.processes import Process, CmlMixin, ff, call, P36from coremodules.network.network import SumoIdsConf37from coremodules.demand.demandbase import RouteCounter, RouteReader383940def load_results(filepath, parent=None, logger=None):41# typically parent is the SIMULATION42results = cm.load_obj(filepath, parent=parent)43if logger is not None:44results.set_logger(logger)45return results464748class Connectionresults(am.ArrayObjman):49def __init__(self, ident, parent, trips, edges,50is_add_default=True,51name='Connection results',52info='Table with simulation results for each used connection. Consider only the finished trips',53**kwargs):5455self._init_constants()5657self._trips = trips58self._edges = edges59self._vtypes = trips.parent.vtypes6061self._init_objman(ident=ident,62parent=parent, # main results object63info=info,64name=name,65**kwargs)6667connections = edges.parent.connections68self.add_col(am.IdsArrayConf('ids_connection', connections,69groupnames=['state'],70is_index=True,71name='ID connection',72info='ID of connection.',73))7475self.add_col(am.ArrayConf('total_flows', default=0,76dtype=np.float32,77groupnames=['results'],78name='Total flows',79unit='Veich.',80info='Total flow in the connection.',81))8283self.add_col(am.ArrayConf('total_od_flows', 0,84dtype=np.float32,85groupnames=['results'],86name='Total OD flows',87unit='Veich.',88info='Total flow in the connection from OD trips.',89))9091self.add_col(am.ArrayConf('total_vp_flows', 0,92dtype=np.float32,93groupnames=['results'],94name='Total vp flows',95unit='Veich.',96info='Total flow in the connection from virtual population.',97))9899self.add_col(am.ArrayConf('total_ptline_flows', 0,100dtype=np.float32,101groupnames=['results'],102name='Total pt flows',103unit='Veich.',104info='Total public transport flow in the connection.',105))106107self.add_col(am.ArrayConf('total_car_flows', 0,108dtype=np.float32,109groupnames=['results'],110name='Total car flows',111unit='Veich.',112info='Total car flow in the connection, taking into account all the od car and iauto.',113))114115self.add_col(am.ArrayConf('total_bike_flows', 0,116dtype=np.float32,117groupnames=['results'],118name='Total bike flows',119unit='Veich.',120info='Total bike flow in the connection, taking into account all the od bike and ibike.',121))122123self.add_col(am.ArrayConf('total_moto_flows', 0,124dtype=np.float32,125groupnames=['results'],126name='Total moto flows',127unit='Veich.',128info='Total moto flow in the connection, taking into account all the od moto and imoto.',129))130131self.add_col(am.ArrayConf('total_iauto_flows', 0,132dtype=np.float32,133groupnames=['results'],134name='Total iauto flows',135unit='Veich.',136info='Total iauto flow in the connection.',137))138139self.add_col(am.ArrayConf('total_ibike_flows', 0,140dtype=np.float32,141groupnames=['results'],142name='Total ibike flows',143unit='Veich.',144info='Total ibike flow in the connection.',145))146147self.add_col(am.ArrayConf('total_imoto_flows', 0,148dtype=np.float32,149groupnames=['results'],150name='Total imoto flows',151unit='Veich.',152info='Total imoto flow in the connection.',153))154155def _init_constants(self):156self._is_keep_right_car = False157self._is_keep_right_bus = True158self._is_keep_right_bike = True159self._is_keep_right_moto = False160self._is_keep_right_taxi = False161162def evaluate_results(self, sumo, datapaths):163routeresults = self.parent.routeresults164ids_routeres = routeresults.get_ids()165# Consider warmup time166ids_routeres = ids_routeres[(routeresults.times_depart[ids_routeres] > sumo.time_warmup)]167# ids_routeres = ids_routeres[700:1000]168# print ids_routeres169ids_routeres_od = ids_routeres[(routeresults.ids_trip[ids_routeres] > 0)]170ids_od_modes = self._trips.parent.vtypes.ids_mode[self._trips.ids_vtype[routeresults.ids_trip[ids_routeres_od]]]171ids_routeres_od_auto = ids_routeres_od[(172ids_od_modes == self._edges.parent.modes.names.get_id_from_index('passenger'))]173ids_routeres_od_taxi = ids_routeres_od[(174ids_od_modes == self._edges.parent.modes.names.get_id_from_index('taxi'))]175ids_routeres_od_car = list(ids_routeres_od_auto)+list(ids_routeres_od_taxi)176ids_routeres_od_bike = ids_routeres_od[(177ids_od_modes == self._edges.parent.modes.names.get_id_from_index('bicycle'))]178ids_routeres_od_moto = ids_routeres_od[(179ids_od_modes == self._edges.parent.modes.names.get_id_from_index('motorcycle'))]180181ids_routeres_iauto = ids_routeres[(routeresults.ids_iauto[ids_routeres] > 0)]182ids_routeres_ibike = ids_routeres[(routeresults.ids_ibike[ids_routeres] > 0)]183ids_routeres_imoto = ids_routeres[(routeresults.ids_imoto[ids_routeres] > 0)]184ids_routeres_vp = list(ids_routeres_iauto) + list(ids_routeres_ibike) + list(ids_routeres_imoto)185ids_routeres_ptlines = ids_routeres[(routeresults.ids_ptline[ids_routeres] > 0)]186ids_routeres_car = list(ids_routeres_od_car) + list(ids_routeres_iauto)187ids_routeres_bike = list(ids_routeres_od_bike) + list(ids_routeres_ibike)188ids_routeres_moto = list(ids_routeres_od_moto) + list(ids_routeres_imoto)189190ids_edges = routeresults.ids_edges[ids_routeres]191ids_edges_od_car = routeresults.ids_edges[ids_routeres_od_car]192ids_edges_od = routeresults.ids_edges[ids_routeres_od]193ids_edges_iauto = routeresults.ids_edges[ids_routeres_iauto]194ids_edges_ibike = routeresults.ids_edges[ids_routeres_ibike]195ids_edges_imoto = routeresults.ids_edges[ids_routeres_imoto]196ids_edges_car = routeresults.ids_edges[ids_routeres_car]197ids_edges_bike = routeresults.ids_edges[ids_routeres_bike]198ids_edges_moto = routeresults.ids_edges[ids_routeres_moto]199ids_edges_ptline = routeresults.ids_edges[ids_routeres_ptlines]200ids_edges_vp = routeresults.ids_edges[ids_routeres_vp]201# print 'Routes:', len(ids_edges)202# print 'Car routes:', len(ids_edges_car)203# print 'OD Routes:', len(ids_edges_od)204# print 'VP routes:', len(ids_edges_vp)205# print 'iauto route:', len(ids_edges_iauto)206# print 'ibike routes:', len(ids_edges_ibike)207# print 'imoto routes:', len(ids_edges_imoto)208209modes_od = []210modes_iauto = []211modes_ibike = []212modes_imoto = []213modes_car = []214modes_bike = []215modes_moto = []216modes_ptline = []217modes_vp = []218modes_tot = []219220for trip in ids_routeres_od:221mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[self._trips.ids_vtype[routeresults.ids_trip[trip]]]]222modes_od.append(mode)223224for trip, id_iauto in zip(ids_routeres_iauto, routeresults.ids_iauto[ids_routeres_iauto]):225vtype = self._trips.parent.virtualpop.get_iautos().ids_vtype[id_iauto]226mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]227modes_iauto.append(mode)228229for trip, id_ibike in zip(ids_routeres_ibike, routeresults.ids_ibike[ids_routeres_ibike]):230vtype = self._trips.parent.virtualpop.get_ibikes().ids_vtype[id_ibike]231mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]232modes_ibike.append(mode)233234for trip, id_imoto in zip(ids_routeres_imoto, routeresults.ids_imoto[ids_routeres_imoto]):235vtype = self._trips.parent.virtualpop.get_imotos().ids_vtype[id_imoto]236mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]237modes_imoto.append(mode)238239for trip in ids_routeres_car:240if routeresults.ids_iauto[trip] > 0:241id_iauto = routeresults.ids_iauto[trip]242vtype = self._trips.parent.virtualpop.get_iautos().ids_vtype[id_iauto]243mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]244elif routeresults.ids_trip[trip] > 0:245mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[self._trips.ids_vtype[routeresults.ids_trip[trip]]]]246modes_car.append(mode)247248for trip in ids_routeres_bike:249if routeresults.ids_ibike[trip] > 0:250id_ibike = routeresults.ids_ibike[trip]251vtype = self._trips.parent.virtualpop.get_ibikes().ids_vtype[id_ibike]252mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]253elif routeresults.ids_trip[trip] > 0:254mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[self._trips.ids_vtype[routeresults.ids_trip[trip]]]]255modes_bike.append(mode)256257for trip in ids_routeres_moto:258if routeresults.ids_imoto[trip] > 0:259id_imoto = routeresults.ids_imoto[trip]260vtype = self._trips.parent.virtualpop.get_imotos().ids_vtype[id_imoto]261mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]262elif routeresults.ids_trip[trip] > 0:263mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[self._trips.ids_vtype[routeresults.ids_trip[trip]]]]264modes_moto.append(mode)265266for trip in ids_routeres_ptlines:267mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[self._trips.parent.ptlines.ids_vtype[routeresults.ids_ptline[trip]]]]268modes_ptline.append(mode)269270for trip in ids_routeres_vp:271if routeresults.ids_iauto[trip] > 0:272id_iauto = routeresults.ids_iauto[trip]273vtype = self._trips.parent.virtualpop.get_iautos().ids_vtype[id_iauto]274mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]275elif routeresults.ids_ibike[trip] > 0:276id_ibike = routeresults.ids_ibike[trip]277vtype = self._trips.parent.virtualpop.get_ibikes().ids_vtype[id_ibike]278mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]279elif routeresults.ids_imoto[trip] > 0:280id_imoto = routeresults.ids_imoto[trip]281vtype = self._trips.parent.virtualpop.get_imotos().ids_vtype[id_imoto]282mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]283284modes_vp.append(mode)285286for trip in ids_routeres:287if routeresults.ids_iauto[trip] > 0 or routeresults.ids_ibike[trip] > 0 or routeresults.ids_imoto[trip] > 0:288if routeresults.ids_iauto[trip] > 0:289id_iauto = routeresults.ids_iauto[trip]290vtype = self._trips.parent.virtualpop.get_iautos().ids_vtype[id_iauto]291mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]292elif routeresults.ids_ibike[trip] > 0:293id_ibike = routeresults.ids_ibike[trip]294vtype = self._trips.parent.virtualpop.get_ibikes().ids_vtype[id_ibike]295mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]296elif routeresults.ids_imoto[trip] > 0:297id_imoto = routeresults.ids_imoto[trip]298vtype = self._trips.parent.virtualpop.get_imotos().ids_vtype[id_imoto]299mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[vtype]]300elif routeresults.ids_trip[trip] > 0:301mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[self._trips.ids_vtype[routeresults.ids_trip[trip]]]]302elif routeresults.ids_ptline[trip] > 0:303mode = self._edges.parent.modes.names[self._trips.parent.vtypes.ids_mode[self._trips.parent.ptlines.ids_vtype[routeresults.ids_ptline[trip]]]]304else:305print 'WARNING: there is a not considered route typology'306modes_tot.append(mode)307308print 'n route', len(modes_tot)309if len(modes_tot) != len(ids_edges):310print 'WARNING: modes and ids_edges have a different length - total flow'311print 'n car routes', len(modes_car)312if len(modes_car) != len(ids_edges_car):313print 'WARNING: modes and ids_edges have a different length - car'314print 'n bike routes', len(modes_bike)315if len(modes_bike) != len(ids_edges_bike):316print 'WARNING: modes and ids_edges have a different length - bike'317print 'n moto routes', len(modes_moto)318if len(modes_moto) != len(ids_edges_moto):319print 'WARNING: modes and ids_edges have a different length - moto'320print 'n od routes', len(modes_od)321if len(modes_od) != len(ids_edges_od):322print 'WARNING: modes and ids_edges have a different length - od'323print 'n od car routes', modes_od.count('passenger')324print 'n od taxi routes', modes_od.count('taxi')325print 'n od bike routes', modes_od.count('bicycle')326print 'n od moto routes', modes_od.count('motorcycle')327print 'n vp routes', len(modes_vp)328if len(modes_vp) != len(ids_edges_vp):329print 'WARNING: modes and ids_edges have a different length - vp'330print 'n iauto routes', len(modes_iauto)331if len(modes_iauto) != len(ids_edges_iauto):332print 'WARNING: modes and ids_edges have a different length - iauto'333print 'n ibike routes', len(modes_ibike)334if len(modes_ibike) != len(ids_edges_ibike):335print 'WARNING: modes and ids_edges have a different length - ibike'336print 'n imoto routes', len(modes_imoto)337if len(modes_imoto) != len(ids_edges_imoto):338print 'WARNING: modes and ids_edges have a different length - imoto'339print 'n pt routes', len(modes_ptline)340if len(modes_ptline) != len(ids_edges_ptline):341print 'WARNING: modes and ids_edges have a different length - bus'342343ids_connections_tot, flows_tot = self.evaluate_connection_flows('tot', modes_tot, ids_edges)344self.add_rows(ids_connection=ids_connections_tot, total_flows=flows_tot)345346ids_connections_car, flows_car = self.evaluate_connection_flows('car', modes_car, ids_edges_car)347ids_connections_bike, flows_bike = self.evaluate_connection_flows('bike', modes_bike, ids_edges_bike)348ids_connections_moto, flows_moto = self.evaluate_connection_flows('moto', modes_moto, ids_edges_moto)349ids_connections_od, flows_od = self.evaluate_connection_flows('od', modes_od, ids_edges_od)350ids_connections_vp, flows_vp = self.evaluate_connection_flows('vp', modes_vp, ids_edges_vp)351ids_connections_iauto, flows_iauto = self.evaluate_connection_flows('iauto', modes_iauto, ids_edges_iauto)352ids_connections_ibike, flows_ibike = self.evaluate_connection_flows('ibike', modes_ibike, ids_edges_ibike)353ids_connections_imoto, flows_imoto = self.evaluate_connection_flows('imoto', modes_imoto, ids_edges_imoto)354ids_connections_ptline, flows_ptline = self.evaluate_connection_flows('pt', modes_ptline, ids_edges_ptline)355356for connection, flow in zip(ids_connections_car, flows_car):357self.total_car_flows[self.ids_connection.get_id_from_index(connection)] = flow358359for connection, flow in zip(ids_connections_bike, flows_bike):360self.total_bike_flows[self.ids_connection.get_id_from_index(connection)] = flow361362for connection, flow in zip(ids_connections_moto, flows_moto):363self.total_moto_flows[self.ids_connection.get_id_from_index(connection)] = flow364365for connection, flow in zip(ids_connections_od, flows_od):366self.total_od_flows[self.ids_connection.get_id_from_index(connection)] = flow367368for connection, flow in zip(ids_connections_vp, flows_vp):369self.total_vp_flows[self.ids_connection.get_id_from_index(connection)] = flow370371for connection, flow in zip(ids_connections_iauto, flows_iauto):372self.total_iauto_flows[self.ids_connection.get_id_from_index(connection)] = flow373374for connection, flow in zip(ids_connections_ibike, flows_ibike):375self.total_ibike_flows[self.ids_connection.get_id_from_index(connection)] = flow376377for connection, flow in zip(ids_connections_imoto, flows_imoto):378self.total_imoto_flows[self.ids_connection.get_id_from_index(connection)] = flow379380for connection, flow in zip(ids_connections_ptline, flows_ptline):381self.total_ptline_flows[self.ids_connection.get_id_from_index(connection)] = flow382383def evaluate_connection_flows(self, ident, modes, routes):384'''385Evaluate connection flows from a list of routes, each composed by a list of edges.386Sometimes many maneuvers connect the same couple of edges: you can387choose to either keep the rightmost lane or split homogeneously the flow in388the available maneuvers, between the connections allowed for the specific MODE.389Return both the traveled connections and the related flows390'''391print 'analyzing', ident, 'routes'392edges = self._edges393lanes = edges.parent.lanes394connections = edges.parent.connections395ids_connection = connections.get_ids()396connection_flows = np.zeros(len(ids_connection)+1, dtype=np.float32)397ids_traveled_connections = []398n_wrong_connections = 0399n_good_connections = 0400n_wrong_connections_moto = 0401n_wrong_connections_auto = 0402n_wrong_connections_bike = 0403n_wrong_connections_bus = 0404for route, mode in zip(routes, modes):405for i in range(len(route)-1):406edge_from = route[i]407edge_to = route[i+1]408ids_lane_from_all = edges.ids_lanes[edge_from]409ids_lane_to_all = edges.ids_lanes[edge_to]410ids_lane_from = []411ids_lane_to = []412# print 'ids_lane_from_all', ids_lane_from_all413# print 'ids_lane_to_all', ids_lane_to_all414for id_lane in ids_lane_from_all:415if len(edges.parent.lanes.ids_modes_allow[id_lane]) > 0:416if mode in self._edges.parent.modes.names[edges.parent.lanes.ids_modes_allow[id_lane]]:417ids_lane_from.append(id_lane)418elif len(edges.parent.lanes.ids_modes_disallow[id_lane]) > 0:419if mode not in self._edges.parent.modes.names[edges.parent.lanes.ids_modes_disallow[id_lane]]:420ids_lane_from.append(id_lane)421elif not len(edges.parent.lanes.ids_modes_allow[id_lane]) > 0 and not len(edges.parent.lanes.ids_modes_disallow[id_lane]) > 0:422ids_lane_from.append(id_lane)423# print 'allow from lane', id_lane, self._edges.parent.modes.names[edges.parent.lanes.ids_modes_allow[id_lane]]424# print 'disallow from lane', id_lane, self._edges.parent.modes.names[edges.parent.lanes.ids_modes_disallow[id_lane]]425for id_lane in ids_lane_to_all:426if len(edges.parent.lanes.ids_modes_allow[id_lane]) > 0:427if mode in self._edges.parent.modes.names[edges.parent.lanes.ids_modes_allow[id_lane]]:428ids_lane_to.append(id_lane)429elif len(edges.parent.lanes.ids_modes_disallow[id_lane]) > 0:430if mode not in self._edges.parent.modes.names[edges.parent.lanes.ids_modes_disallow[id_lane]]:431ids_lane_to.append(id_lane)432elif not len(edges.parent.lanes.ids_modes_allow[id_lane]) > 0 and not len(edges.parent.lanes.ids_modes_disallow[id_lane]) > 0:433ids_lane_to.append(id_lane)434# print 'ids_lane_from', ids_lane_from435# print 'ids_lane_to', ids_lane_to436437possible_connections_from = []438possible_connections_to = []439connections_list = []440for id_lane_from in ids_lane_from:441poss_connections_from = ids_connection[(connections.ids_fromlane[ids_connection] == id_lane_from)]442for poss_connection_from in poss_connections_from:443possible_connections_from.append(poss_connection_from)444for id_lane_to in ids_lane_to:445poss_connections_to = ids_connection[(connections.ids_tolane[ids_connection] == id_lane_to)]446for poss_connection_to in poss_connections_to:447possible_connections_to.append(poss_connection_to)448for element in possible_connections_from:449if element in possible_connections_to:450connections_list.append(element)451452if connections_list == []:453print 'Warning: no connections between a couple of successive edges for mode', mode454print 'ids_lane_from_all', ids_lane_from_all455print 'ids_lane_to_all', ids_lane_to_all456n_wrong_connections += 1457if mode == 'motorcycle':458n_wrong_connections_moto += 1459if mode == 'passenger':460n_wrong_connections_auto += 1461if mode == 'bicycle':462n_wrong_connections_bike += 1463if mode == 'bus':464n_wrong_connections_bus += 1465466else:467468if mode == 'motorcycle':469keep_right = self._is_keep_right_moto470elif mode == 'passenger':471keep_right = self._is_keep_right_car472elif mode == 'bicycle':473keep_right = self._is_keep_right_bike474elif mode == 'bus':475keep_right = self._is_keep_right_bus476elif mode == 'taxi':477keep_right = self._is_keep_right_taxi478else:479print 'WARNING - Not recognized mode'480keep_right = True481482n_good_connections += 1483if keep_right == False:484for connection in connections_list:485if connection not in ids_traveled_connections:486ids_traveled_connections.append(connection)487connection_flows[connection] += 1./len(connections_list)488489elif keep_right == True:490lane_index_connections = lanes.indexes[connections.ids_fromlane[connections_list]491] + lanes.indexes[connections.ids_tolane[connections_list]]492connection = connections_list[np.argmin(lane_index_connections)]493if connection not in ids_traveled_connections:494ids_traveled_connections.append(connection)495connection_flows[connection] += 1.496# print ids_traveled_connections, connection_flows[ids_traveled_connections]497print 'n_good_connections:', n_good_connections498print 'n_wrong_connections:', n_wrong_connections499# print 'n_wrong_connections_moto:', n_wrong_connections_moto500# print 'n_wrong_connections_auto:', n_wrong_connections_auto501# print 'n_wrong_connections_bike:', n_wrong_connections_bike502# print 'n_wrong_connections_bus:', n_wrong_connections_bus503##504return ids_traveled_connections, connection_flows[ids_traveled_connections]505506507class Routeresults(am.ArrayObjman):508def __init__(self, ident, parent, trips, edges, datapathkey='routesdatapath',509is_add_default=True,510name='Route results',511info='Table with simulation results for each route made.Consider only the finished trips',512**kwargs):513self._trips = trips514self._init_objman(ident=ident,515parent=parent, # main results object516info=info,517name=name,518**kwargs)519520self.add(cm.AttrConf('datapathkey', datapathkey,521groupnames=['_private'],522name='data pathkey',523info="key of data path",524))525526self.add_col(am.IdsArrayConf('ids_trip', trips,527groupnames=['state'],528is_index=True,529name='ID trip',530info='ID of trip.',531))532533self.add_col(am.IdsArrayConf('ids_iauto', trips.parent.virtualpop.get_iautos(),534groupnames=['state'],535is_index=True,536name='ID iauto',537info='ID of iauto trip from the virtual population.',538))539540self.add_col(am.IdsArrayConf('ids_imoto', trips.parent.virtualpop.get_imotos(),541groupnames=['state'],542is_index=True,543name='ID imoto',544info='ID of trip imoto from the virtual population.',545))546547self.add_col(am.IdsArrayConf('ids_ibike', trips.parent.virtualpop.get_ibikes(),548groupnames=['state'],549is_index=True,550name='ID ibike',551info='ID of trip ibike from the virtual population.',552))553554self.add_col(am.IdsArrayConf('ids_ptline', trips.parent.ptlines,555groupnames=['state'],556is_index=True,557name='ID ptline',558info='ID of the public transportation line.',559))560561attrinfos = OrderedDict([562563('times_depart', {'name': 'Time depart', 'xmltag': 'times_depart', 'unit': 's',564'default': 0.0, 'info': 'Depart time', 'groupnames': ['routedata']}),565566('times_arrival', {'name': 'Time arrival', 'xmltag': 'times_arrival', 'unit': 's',567'default': 0.0, 'info': 'Arrival time', 'groupnames': ['routedata']}),568569('type', {'name': 'Vehicle type', 'xmltag': 'type', 'unit': None,570'default': np.object, 'info': 'Vehicle type', 'groupnames': ['routedata']}),571572('ids_edge_depart', {'name': 'ID Edge depart', 'xmltag': 'ids_edge_depart', 'unit': None,573'default': 0, 'info': 'Depart edege', 'groupnames': ['routedata']}),574575('ids_edge_arrival', {'name': 'ID Edge arrival', 'xmltag': 'ids_edge_arrival', 'unit': None,576'default': 0, 'info': 'Arrival edge', 'groupnames': ['routedata']}),577578('inds_lane_depart', {'name': 'ID lane depart', 'xmltag': 'inds_lane_depart', 'unit': None,579'default': 0, 'info': 'Depart lane ', 'groupnames': ['routedata']}),580581('positions_depart', {'name': 'Position depart', 'xmltag': 'positions_depart', 'unit': 'm',582'default': 0.0, 'info': 'Position depart', 'groupnames': ['routedata']}),583584('speeds_depart', {'name': 'Speed depart', 'xmltag': 'speeds_depart', 'unit': 'm/s',585'default': 0.0, 'info': 'Depart speed', 'groupnames': ['routedata']}),586587('inds_lane_arrival', {'name': 'ID Lane arrival', 'xmltag': 'inds_lane_arrival', 'unit': None,588'default': 0, 'info': 'Arrival lane', 'groupnames': ['routedata']}),589590('positions_arrival', {'name': 'Position arrival', 'xmltag': 'positions_arrival', 'unit': 'm',591'default': 0.0, 'info': 'Arrival position', 'groupnames': ['routedata']}),592593('speeds_arrival', {'name': 'Speed arrival', 'xmltag': 'speeds_arrival', 'unit': 'm/s',594'default': 0.0, 'info': 'Arrival speed', 'groupnames': ['routedata']}),595])596597for attrname, kwargs in attrinfos.iteritems():598self.add_resultattr(attrname, **kwargs)599600# this is special for route info601self.add_col(am.IdlistsArrayConf('ids_edges', edges,602name='Edge IDs',603groupnames=['routedata'],604info='List of edge IDs constituting the actually taken route.',605xmltag='edges',606))607608def add_resultattr(self, attrname, **kwargs):609610# default cannot be kwarg611default = kwargs['default']612del kwargs['default']613if kwargs.has_key('groupnames'):614kwargs['groupnames'].append('results')615else:616kwargs['groupnames'] = ['results']617618self.add_col(am.ArrayConf(attrname, default, **kwargs))619620# def import_routesdata(self, filepath):621# # TODO622# pass623624# def import_tripdata(self, filepath):625# #print 'import_tripdata',filepath,self.get_group('tripdata')626# self.import_sumoxml(filepath,self.get_group('tripdata'))627628def import_xml(self, sumo, datapaths):629datapathkey = self.datapathkey.get_value()630if datapaths.has_key(datapathkey):631self.import_sumoxml(datapaths[datapathkey], sumo, self.get_group('routedata'))632633def import_sumoxml(self, filepath, sumo, attrconfigs):634element = 'route'635# print 'Tripresults.import_sumoxml',self.get_trips().ident, element,filepath636#id_type = 'edge',637#reader = 'interval',638639results = read_routeresult(filepath, sumo, self._trips, element, attrconfigs)640ids_raw = results['ids_sumo']641642# print ' ids_raw',ids_raw643# print ' results.keys()',results.keys()644# print ' results',results645646# this procedure is necessary to create new result ids only647# for trips that are not yet in the database648n = len(ids_raw[(ids_raw != '')])649# print ' number of rows',n650ind_range = np.arange(n, dtype=np.int32)651ids = np.zeros(n, dtype=np.int32)652for i in ind_range:653654id_trip = ids_raw[i]655# if self.ids_trip.has_index(id_trip):656## ids[i] = self.ids_trip.get_id_from_index(id_trip)657# else:658if 'iauto' in id_trip:659ids[i] = self.add_row(ids_iauto=int(id_trip.split('.')[1]))660# print int(id_trip.split('.')[1]), id_trip.split('.')[1], id_trip661elif 'imoto' in id_trip:662ids[i] = self.add_row(ids_imoto=int(id_trip.split('.')[1]))663elif 'ibike' in id_trip:664ids[i] = self.add_row(ids_ibike=int(id_trip.split('.')[1]))665elif 'ptline' in id_trip:666667ids[i] = self.add_row(ids_ptline=int(id_trip.split('.')[1]))668else:669# print 'WARNING:', id_trip, 'not recognized trip'670ids[i] = self.add_row(ids_trip=int(id_trip))671672for attrconfig in attrconfigs:673attrname = attrconfig.attrname674if attrname != 'ids_sumo':675default = attrconfig.get_default()676if type(default) in (types.IntType, types.LongType):677conversion = 'i' # int678values_attr = np.zeros(n, int)679elif type(default) in (types.FloatType, types.ComplexType):680conversion = 'f' # float681values_attr = np.zeros(n, dtype=np.float32)682if type(default) in (types.BooleanType,):683conversion = 'b' # str684values_attr = np.zeros(n, dtype=np.bool)685else:686conversion = 's' # str687values_attr = np.zeros(n, dtype=np.object)688689is_average = False690if hasattr(attrconfig, 'is_average'):691is_average = attrconfig.is_average692# this is a tricky way to read the data stored in693# dictionarie into array tructures as used in results694# problem is that not all dictionaries have all ids695for i in ind_range:696# print ' check',ids_raw[i],results[attrname].get(ids_raw[i],'No data')697698val = results[attrname][i]699# print val, results[attrname][i]700if conversion == 'i':701val = int(val)702else:703values_attr[i] = val704# print ' ',i,ids[i],attrname,conversion,val,type(val),is_average705values_attr[i] = val706if attrname == 'ids_edges':707for i in ind_range:708values_attr[i] = results[attrname][i]709# print ' attrname',attrname710# print ' ids',type(ids),ids711# print ' values_attr',type(values_attr),values_attr712attrconfig.set(ids, values_attr)713714715class Tripresults(am.ArrayObjman):716def __init__(self, ident, parent, trips, edges, # datapathkey = 'tripdatapath',717is_add_default=True,718name='Trip results',719info='Table with simulation results for each trip made.',720**kwargs):721722self._init_objman(ident=ident,723parent=parent, # main results object724info=info,725name=name,726**kwargs)727728# self.add(cm.AttrConf( 'datapathkey',datapathkey,729# groupnames = ['_private'],730# name = 'data pathkey',731# info = "key of data path",732# ))733734self.add_col(am.IdsArrayConf('ids_trip', trips,735groupnames=['state'],736is_index=True,737name='ID trip',738info='ID of trip.',739))740attrinfos = OrderedDict([741('duration', {'name': 'Duration', 'xmltag': 'duration', 'unit': 's',742'default': 0, 'info': 'Trip duration', 'groupnames': ['tripdata']}),743('depart', {'name': 'Dep. time', 'xmltag': 'depart', 'unit': 's', 'default': 0,744'info': 'Departure time', 'groupnames': ['tripdata'], 'is_average': True}),745('arrival', {'name': 'Arr. time', 'xmltag': 'arrival', 'unit': 's', 'default': 0,746'info': 'Arrival time', 'groupnames': ['tripdata'], 'is_average': True}),747('routeLength', {'name': 'Length', 'xmltag': 'routeLength', 'unit': 'm',748'default': 0.0, 'info': 'Route length', 'groupnames': ['tripdata']}),749('departdelays', {'name': 'Dep. delay', 'xmltag': 'departDelay', 'unit': 's', 'default': 0,750'info': 'The time the vehicle had to wait before it could start his journey', 'groupnames': ['tripdata'], 'is_average': True}),751('waittimes', {'name': 'Wait time', 'xmltag': 'waitingTime', 'unit': 's', 'default': 0,752'info': 'The time in which the vehicle speed was below 0.1m/s (scheduled stops do not count) ', 'groupnames': ['tripdata'], 'is_average': True}),753('stoptimes', {'name': 'Stop time', 'xmltag': 'stopTime', 'unit': 's', 'default': 0,754'info': 'The time in which the vehicle was taking a planned stop', 'groupnames': ['tripdata'], 'is_average': True}),755('timelosses', {'name': 'Timeloss', 'xmltag': 'timeLoss', 'unit': 's', 'default': 0,756'info': 'The time lost due to driving below the ideal speed. (ideal speed includes the individual speedFactor; slowdowns due to intersections etc. will incur timeLoss, scheduled stops do not count)', 'groupnames': ['tripdata'], 'is_average': True}),757('departPos', {'name': 'depart pos', 'xmltag': 'departPos', 'unit': 'm',758'default': 0.0, 'info': 'depart position', 'groupnames': ['tripdata'], 'is_average': True}),759('arrivalPos', {'name': 'arrival pos', 'xmltag': 'arrivalPos', 'unit': 'm',760'default': 0.0, 'info': 'arrival position', 'groupnames': ['tripdata'], 'is_average': True}),761('speedfactors', {'name': 'Speedfactor', 'xmltag': 'speedFactor', 'default': 0.0,762'info': 'The individual speed factor of the vehicle (possibly drawn from a speed distribution at the start of the simulation)', 'groupnames': ['tripdata'], }),763('are_vaporized', {'name': 'vaporized', 'xmltag': 'vaporized', 'default': False,764'info': 'Whether the vehicle was removed from the simulation before reaching its destination', 'groupnames': ['tripdata'], }),765('waitSteps', {'name': 'wait steps', 'xmltag': 'waitingCount', 'unit': None, 'default': 0,766'info': 'Count of time steps, the vehicle has been waiting during its trip', 'groupnames': ['tripdata']}),767('rerouteNo', {'name': 'reroute No', 'xmltag': 'rerouteNo', 'unit': None,768'default': 0, 'info': 'Number of re-routes', 'groupnames': ['tripdata']}),769('waitSteps', {'name': 'wait steps', 'xmltag': 'waitSteps', 'unit': None, 'default': 0,770'info': 'Time steps, the vehicle has been waiting during its trip', 'groupnames': ['tripdata']}),771('consumptions', {'name': 'Consumption', 'xmltag': 'Consum', 'unit': 'Ws',772'default': 0.0, 'info': 'Electrical energy consumption', 'groupnames': ['electricenergydata']}),773#('speeds_av', {'name':'Average speeds', 'xmltag':'speed', 'unit':'m/s', 'default':0, 'info':'Average speed','groupnames':['tripdata'],'is_average' : True}),774])775776for attrname, kwargs in attrinfos.iteritems():777self.add_resultattr(attrname, **kwargs)778779# this is special for route info780self.add_col(am.IdlistsArrayConf('ids_edges', edges,781name='Edge IDs',782groupnames=['routeinfo'],783info='List of edge IDs constituting the actually taken route.',784xmltag='edges',785))786787def get_trips(self):788return self.ids_trip.get_linktab()789790def add_resultattr(self, attrname, **kwargs):791792# default cannot be kwarg793default = kwargs['default']794del kwargs['default']795if kwargs.has_key('groupnames'):796kwargs['groupnames'].append('results')797else:798kwargs['groupnames'] = ['results']799800self.add_col(am.ArrayConf(attrname, default, **kwargs))801802# def import_routesdata(self, filepath):803# # TODO804# pass805806# def import_tripdata(self, filepath):807# #print 'import_tripdata',filepath,self.get_group('tripdata')808# self.import_sumoxml(filepath,self.get_group('tripdata'))809810def import_xml(self, sumo, datapaths):811print 'Tripresults.import_xml datapaths', datapaths812datapathkey = 'tripdatapath'813if datapaths.has_key(datapathkey):814self.import_tripdata_sumoxml(datapaths[datapathkey], sumo)815816#datapathkey = 'electricenergypath'817# if datapaths.has_key(datapathkey):818# self.import_electricenergy_sumoxml(datapaths[datapathkey],sumo)819820def import_electricenergy_sumoxml_broke(self, filepath, sumo):821element = 'vehicle'822print 'Tripresults.import_electricenergy_sumoxml', self.get_trips().ident, element, filepath823#id_type = 'edge',824#reader = 'interval',825attrconfigs = self.get_group('electricenergydata')826# print 'import_sumoxml',element827#id_type = 'edge',828#reader = 'interval',829ids_sumo, results, interval = read_interval2(830filepath, sumo, element, attrconfigs)831# print ' ids_sumo',ids_sumo832# print ' results.keys()',results.keys()833# print ' results',results834# create ids for all colums835# if fileinfo['id_type']=='edge':836837# this procedure is necessary to create new result ids only838# for edges that are not yet in the database839ids_sumotrip = self.ids_trip.get_linktab().ids_sumo840n = len(ids_sumo)841# print ' n',n842ind_range = np.arange(n, dtype=np.int32)843ids = np.zeros(n, dtype=np.int32)844for i in ind_range:845id_trip = ids_sumotrip.get_id_from_index(ids_sumo[i])846if self.ids_trip.has_index(id_trip):847ids[i] = self.ids_trip.get_id_from_index(id_edge)848else:849ids[i] = self.add_row(ids_trip=id_edge)850851# ids = self.add_row()# here the ids_sumo can be strings too852# elif fileinfo['id_type']=='trip':853# ids = self.tripresults.add_rows_keyrecycle(keys = ids_sumo)#854# print ' ids=',ids855856for attrconfig in attrconfigs:857858attrname = attrconfig.attrname859860default = attrconfig.get_default()861if type(default) in (types.IntType, types.LongType):862conversion = 'i' # int863values_attr = np.zeros(n, int)864elif type(default) in (types.FloatType, types.ComplexType):865conversion = 'f' # float866values_attr = np.zeros(n, float)867else:868conversion = 's' # str869values_attr = np.zeros(n, obj)870871is_average = False872if hasattr(attrconfig, 'is_average'):873is_average = attrconfig.is_average874# print ' copy',attrname,'is_average',is_average875# this is a tricky way to read the data stored in876# dictionarie into array tructures as used in results877# problem is that not all dictionaries have all ids878for i in ind_range:879if is_average:880valcum, num = results[attrname].get(ids_sumo[i], (default, 1))881val = valcum/float(num) # average over measurements!882else:883val = results[attrname].get(ids_sumo[i], default)884885if conversion == 'i':886val = int(val)887# else:888# values_attr[i]=val889# print ' attrname',attrname,conversion,val,is_average,type(val)890values_attr[i] = val891892# print ' attrname',attrname893# print ' ids',type(ids),ids894# print ' values_attr',type(values_attr),values_attr895attrconfig.set(ids, values_attr)896897def import_tripdata_sumoxml(self, filepath, sumo):898element = 'tripinfo'899print 'Tripresults.import_tripdata_sumoxml', self.get_trips().ident, 'element', element, filepath900#id_type = 'edge',901#reader = 'interval',902attrconfigs = self.get_group('tripdata')903ids_raw, results = read_tripresult(filepath, sumo, self.get_trips(), element, attrconfigs)904905# print ' ids_raw',ids_raw906# print ' results.keys()',results.keys()907# print ' results',results908909# this procedure is necessary to create new result ids only910# for trips that are not yet in the database911n = len(ids_raw)912# print ' number of rows',n913ind_range = np.arange(n, dtype=np.int32)914ids = np.zeros(n, dtype=np.int32)915for i in ind_range:916917id_trip = int(ids_raw[i])918if self.ids_trip.has_index(id_trip):919ids[i] = self.ids_trip.get_id_from_index(id_trip)920else:921ids[i] = self.add_row(ids_trip=id_trip)922923for attrconfig in attrconfigs:924attrname = attrconfig.attrname925default = attrconfig.get_default()926if type(default) in (types.IntType, types.LongType):927conversion = 'i' # int928values_attr = np.zeros(n, int)929elif type(default) in (types.FloatType, types.ComplexType):930conversion = 'f' # float931values_attr = np.zeros(n, dtype=np.float32)932if type(default) in (types.BooleanType,):933conversion = 'b' # str934values_attr = np.zeros(n, dtype=np.bool)935else:936conversion = 's' # str937values_attr = np.zeros(n, dtype=np.object)938939is_average = False940if hasattr(attrconfig, 'is_average'):941is_average = attrconfig.is_average942# this is a tricky way to read the data stored in943# dictionarie into array tructures as used in results944# problem is that not all dictionaries have all ids945for i in ind_range:946# print ' check',ids_raw[i],results[attrname].get(ids_raw[i],'No data')947if is_average:948valcum, num = results[attrname].get(ids_raw[i], (default, 1))949val = valcum/float(num) # average!950else:951val = results[attrname].get(ids_raw[i], default)952953if conversion == 'i':954val = int(val)955else:956values_attr[i] = val957# print ' ',i,ids[i],attrname,conversion,val,type(val),is_average958values_attr[i] = val959960# print ' attrname',attrname961# print ' ids',type(ids),ids962# print ' values_attr',type(values_attr),values_attr963attrconfig.set(ids, values_attr)964965966class Edgeresults(am.ArrayObjman):967def __init__(self, parent, edges, is_add_default=True, **kwargs):968969self._init_objman(ident='edgeresults',970parent=parent, # main results object971name='Edge results',972info='Table with simulation results for each network edge.',973#xmltag = ('vtypes','vtype','ids_sumo'),974**kwargs)975976self.add_col(am.IdsArrayConf('ids_edge', edges,977groupnames=['state'],978is_index=True,979name='ID edge',980info='ID of edge.',981))982self._init_attributes()983984def _init_attributes(self):985# print 'Edgeresults._init_attributes'986# print ' ',self,id(self),hasattr(self,'import_marouterxml')987988attrinfos = OrderedDict([989990991('detectorflows', {'name': 'Detector flows', 'unit': None, 'default': 0.,992'info': 'Flows measured by detectors', 'xmltag': 'detectorflows', 'groupnames': ['edgedata']}),993('entered', {'name': 'Entered', 'unit': None, 'default': 0,994'info': 'Entered number of vehicles', 'xmltag': 'entered', 'groupnames': ['edgedata']}),995('entered_est', {'name': 'Entered est', 'default': 0,996'info': 'Estimated number of entered vehicles.', 'groupnames': ['analysis'], }),997('left', {'name': 'Left', 'unit': None, 'default': 0,998'info': 'Left number of vehicles', 'xmltag': 'left', 'groupnames': ['edgedata']}),999('arrived', {'name': 'Arrived', 'unit': None, 'default': 0,1000'info': 'Arrived number of vehicles', 'xmltag': 'arrived', 'groupnames': ['edgedata']}),1001('departed', {'name': 'Departed', 'unit': None, 'default': 0,1002'info': 'Departed number of vehicles', 'xmltag': 'departed', 'groupnames': ['edgedata']}),1003('traveltime', {'name': 'Av. times', 'unit': 's', 'default': 0.0, 'info': 'Av. Travel times',1004'xmltag': 'traveltime', 'groupnames': ['edgedata'], 'is_average': True}),1005('density', {'name': 'Av. Densities', 'unit': 'veh/km', 'default': 0.0,1006'info': 'Av. Density in vehicles of vehicles on this Edge/Lane', 'xmltag': 'density', 'groupnames': ['edgedata'], 'is_average': True}),1007('waitingTime', {'name': 'Av. waits', 'unit': 's', 'default': 0.0, 'info': 'Av. Waiting times of vehicles on this Edge/Lane',1008'xmltag': 'waitingTime', 'groupnames': ['edgedata'], 'is_average': True}),1009('speed', {'name': 'Av. speeds', 'unit': 'm/s', 'default': 0.0,1010'info': 'Av. velocity of vehicles on this Edge/Lane', 'xmltag': 'speed', 'groupnames': ['edgedata'], 'is_average': True}),1011('fuel_abs', {'name': 'Abs. Fuel', 'unit': 'ml', 'default': 0.0,1012'info': 'Absolute fuel consumption of vehicles on this Edge/Lane', 'xmltag': 'fuel_abs', 'groupnames': ['edgeemissions']}),1013('CO_abs', {'name': 'Abs. CO', 'unit': 'mg', 'default': 0.0,1014'info': 'Absolute CO emission of vehicles on this Edge/Lane', 'xmltag': 'CO_abs', 'groupnames': ['edgeemissions']}),1015('CO2_abs', {'name': 'Abs. CO2', 'unit': 'mg', 'default': 0.0,1016'info': 'Absolute CO2 emission of vehicles on this Edge/Lane', 'xmltag': 'CO2_abs', 'groupnames': ['edgeemissions']}),1017('NOx_abs', {'name': 'Abs. NOx', 'unit': 'mg', 'default': 0.0,1018'info': 'Absolute NOx emission of vehicles on this Edge/Lane', 'xmltag': 'NOx_abs', 'groupnames': ['edgeemissions']}),1019('PMx_abs', {'name': 'Abs. PMx', 'unit': 'mg', 'default': 0.0,1020'info': 'Absolute PMx emission (Particle matter, all sizes) of vehicles on this Edge/Lane', 'xmltag': 'PMx_abs', 'groupnames': ['edgeemissions']}),1021('fuel_normed', {'name': 'Specific fuel', 'unit': 'l/km/h', 'default': 0.0,1022'info': 'Specific fuel consumption of vehicles on this Edge/Lane', 'xmltag': 'fuel_normed', 'groupnames': ['edgeemissions'], 'is_average': True}),1023('CO_normed', {'name': 'Specific CO', 'unit': 'g/km/h', 'default': 0.0,1024'info': 'Normalized CO emission of vehicles on this Edge/Lane', 'xmltag': 'CO_normed', 'groupnames': ['edgeemissions'], 'is_average': True}),1025('CO2_normed', {'name': 'Specific CO2', 'unit': 'g/km/h', 'default': 0.0,1026'info': 'Normalized CO2 emission of vehicles on this Edge/Lane', 'xmltag': 'CO2_normed', 'groupnames': ['edgeemissions'], 'is_average': True}),1027('NOx_normed', {'name': 'Specific NOx', 'unit': 'g/km/h', 'default': 0.0,1028'info': 'Normalized NOx emission of vehicles on this Edge/Lane', 'xmltag': 'NOx_normed', 'groupnames': ['edgeemissions'], 'is_average': True}),1029('PMx_normed', {'name': 'Specific PMx', 'unit': 'g/km/h', 'default': 0.0,1030'info': 'Normalized PMx emission of vehicles on this Edge/Lane', 'xmltag': 'PMx_normed', 'groupnames': ['edgeemissions'], 'is_average': True}),1031('fuel_perVeh', {'name': 'Fuel per veh.', 'unit': 'ml/veh', 'default': 0.0,1032'info': 'Absolute fuel consumption of vehicles on this Edge/Lane', 'xmltag': 'fuel_perVeh', 'groupnames': ['edgeemissions'], 'is_average': True}),1033('CO_perVeh', {'name': 'CO per veh.', 'unit': 'mg/veh', 'default': 0.0,1034'info': 'CO emission per vehicle on this Edge/Lane', 'xmltag': 'CO_perVeh', 'groupnames': ['edgeemissions'], 'is_average': True}),1035('CO2_perVeh', {'name': 'CO2 per veh.', 'unit': 'mg/veh', 'default': 0.0,1036'info': 'CO2 emission per vehicle on this Edge/Lane', 'xmltag': 'CO2_perVeh', 'groupnames': ['edgeemissions'], 'is_average': True}),1037('NOx_perVeh', {'name': 'NOx per veh.', 'unit': 'mg/veh', 'default': 0.0,1038'info': 'NOx emission per vehicle on this Edge/Lane', 'xmltag': 'NOx_perVeh', 'groupnames': ['edgeemissions'], 'is_average': True}),1039('PMx_perVeh', {'name': 'PMx per veh.', 'unit': 'mg/veh', 'default': 0.0,1040'info': 'PMx emission per vehicle on this Edge/Lane', 'xmltag': 'PMx_perVeh', 'groupnames': ['edgeemissions'], 'is_average': True}),1041('noise', {'name': 'Noise', 'unit': 'dB', 'default': 0.0,1042'info': 'Noise of vehicles on this Edge/Lane', 'xmltag': 'noise', 'groupnames': ['edgenoise'], 'is_average': True}),1043('total_flows', {'name': 'Total flows', 'unit': None, 'default': 0,1044'info': 'Total flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_flows']}),1045('total_od_flows', {'name': 'Total OD flows', 'unit': None, 'default': 0,1046'info': 'Total OD flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_od_flows']}),1047('total_vp_flows', {'name': 'Total VP flows', 'unit': None, 'default': 0,1048'info': 'Total VP flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_vp_flows']}),1049('total_ptline_flows', {'name': 'Total pt flows', 'unit': None, 'default': 0,1050'info': 'Total pt flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_ptline_flows']}),1051('total_car_flows', {'name': 'Total car flows', 'unit': None, 'default': 0,1052'info': 'Total car flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_car_flows']}),1053('total_bike_flows', {'name': 'Total bike flows', 'unit': None, 'default': 0,1054'info': 'Total bike flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_bike_flows']}),1055('total_moto_flows', {'name': 'Total moto flows', 'unit': None, 'default': 0,1056'info': 'Total moto flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_moto_flows']}),1057('total_iauto_flows', {'name': 'Total iauto flows', 'unit': None, 'default': 0,1058'info': 'Total iauto flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_iauto_flows']}),1059('total_ibike_flows', {'name': 'Total ibike flows', 'unit': None, 'default': 0,1060'info': 'Total ibike flow in the edge', 'xmltag': 'entered', 'groupnames': ['total_ibike_flows']}),1061('total_imoto_flows', {'name': 'Total imoto flows', 'unit': None, 'default': 0,1062'info': 'Total imoto flow in the edge.', 'xmltag': 'entered', 'groupnames': ['total_imoto_flows']}),10631064#1065])10661067for attrname, kwargs in attrinfos.iteritems():1068self.add_resultattr(attrname, **kwargs)10691070def add_resultattr(self, attrname, **kwargs):10711072# default cannot be kwarg1073default = kwargs['default']1074del kwargs['default']1075if kwargs.has_key('groupnames'):1076kwargs['groupnames'].append('results')1077else:1078kwargs['groupnames'] = ['results']10791080self.add_col(am.ArrayConf(attrname, default, **kwargs))10811082def add_edgelength(self):1083edges = self.parent.get_scenario().net.edges1084self.add_col(am.ArrayConf('lengths', 0.0,1085groupnames=[],1086perm='r',1087unit='m',1088name='Edge length',1089info='Edge length.'))1090ids = self.get_ids()1091self.lengths[ids] = edges.lengths[self.ids_edge[ids]]10921093def add_entered_est(self, ids_edge, entered_vec):1094self.entered_est.reset()1095ids_results = np.zeros(len(ids_edge), dtype=np.int32)1096i = 01097for id_edge, entered in zip(ids_edge, entered_vec):1098if self.ids_edge.has_index(id_edge):1099id_res = self.ids_edge.get_id_from_index(id_edge)1100self.entered_est[id_res] = entered1101else:1102id_res = self.add_row(ids_edge=id_edge, entered_est=entered)1103ids_results[i] = id_res1104i += 111051106return ids_results11071108def filter_zoneedges(self, ids_zone, is_invert=False):1109"""1110Keep only results of edges that belong to zone id_zone1111"""1112print 'filter_zoneedges', ids_zone11131114zones = self.parent.parent.parent.landuse.zones1115ids_zoneedge = set()1116for id_zone in ids_zone:1117if not (zones.ids_edges_orig[id_zone] is None):1118ids_zoneedge.update(zones.ids_edges_orig[id_zone])11191120if len(ids_zoneedge) > 0:11211122ids_res = self.get_ids()1123inds = np.zeros(len(ids_res), dtype=np.bool)1124for i, id_res, id_edge in zip(xrange(len(ids_res)), ids_res, self.ids_edge[ids_res]):1125inds[i] = id_edge in ids_zoneedge1126if not is_invert:1127inds = np.logical_not(inds)11281129self.del_rows(ids_res[inds])11301131def import_edgedata(self, sumo, filepath):1132print 'import_edgedata', filepath1133# print ' group',self.get_group('edgedata')1134#attrnames_data = ['entered','left','arrived','departed']1135#attrnames_averaged = ['traveltime','density','waitingTime','speed',]1136self.import_sumoxml(filepath, sumo, self.get_group('edgedata'))11371138def import_edgeflows(self, sumo, filepath):11391140routeresults = self.parent.routeresults1141net = self.parent.parent.parent.net1142demand = self.parent.parent.parent.demand1143ids_routeres = routeresults.get_ids()1144# Consider warmup time1145ids_routeres = ids_routeres[(routeresults.times_depart[ids_routeres] > sumo.time_warmup)]1146# ids_routeres = ids_routeres[700:1000]1147# print ids_routeres1148ids_routeres_od = ids_routeres[(routeresults.ids_trip[ids_routeres] > 0)]1149ids_od_modes = demand.vtypes.ids_mode[demand.trips.ids_vtype[routeresults.ids_trip[ids_routeres_od]]]1150ids_routeres_od_auto = ids_routeres_od[(ids_od_modes == net.modes.names.get_id_from_index('passenger'))]1151ids_routeres_od_taxi = ids_routeres_od[(ids_od_modes == net.modes.names.get_id_from_index('taxi'))]1152ids_routeres_od_car = list(ids_routeres_od_auto)+list(ids_routeres_od_taxi)1153ids_routeres_od_bike = ids_routeres_od[(ids_od_modes == net.modes.names.get_id_from_index('bicycle'))]1154ids_routeres_od_moto = ids_routeres_od[(ids_od_modes == net.modes.names.get_id_from_index('motorcycle'))]11551156ids_routeres_iauto = ids_routeres[(routeresults.ids_iauto[ids_routeres] > 0)]1157ids_routeres_ibike = ids_routeres[(routeresults.ids_ibike[ids_routeres] > 0)]1158ids_routeres_imoto = ids_routeres[(routeresults.ids_imoto[ids_routeres] > 0)]1159ids_routeres_vp = list(ids_routeres_iauto) + list(ids_routeres_ibike) + list(ids_routeres_imoto)1160ids_routeres_ptlines = ids_routeres[(routeresults.ids_ptline[ids_routeres] > 0)]1161ids_routeres_car = list(ids_routeres_od_car) + list(ids_routeres_iauto)1162ids_routeres_bike = list(ids_routeres_od_bike) + list(ids_routeres_ibike)1163ids_routeres_moto = list(ids_routeres_od_moto) + list(ids_routeres_imoto)11641165ids_edges = routeresults.ids_edges[ids_routeres]1166ids_edges_od_car = routeresults.ids_edges[ids_routeres_od_car]1167ids_edges_od = routeresults.ids_edges[ids_routeres_od]1168ids_edges_iauto = routeresults.ids_edges[ids_routeres_iauto]1169ids_edges_ibike = routeresults.ids_edges[ids_routeres_ibike]1170ids_edges_imoto = routeresults.ids_edges[ids_routeres_imoto]1171ids_edges_car = routeresults.ids_edges[ids_routeres_car]1172ids_edges_bike = routeresults.ids_edges[ids_routeres_bike]1173ids_edges_moto = routeresults.ids_edges[ids_routeres_moto]1174ids_edges_ptline = routeresults.ids_edges[ids_routeres_ptlines]1175ids_edges_vp = routeresults.ids_edges[ids_routeres_vp]11761177total_flows = np.zeros(len(net.edges.get_ids())+1, dtype=np.float32)1178total_od_flows = np.zeros(len(total_flows), dtype=np.float32)1179total_vp_flows = np.zeros(len(total_flows), dtype=np.float32)1180total_ptline_flows = np.zeros(len(total_flows), dtype=np.float32)1181total_car_flows = np.zeros(len(total_flows), dtype=np.float32)1182total_bike_flows = np.zeros(len(total_flows), dtype=np.float32)1183total_moto_flows = np.zeros(len(total_flows), dtype=np.float32)1184total_iauto_flows = np.zeros(len(total_flows), dtype=np.float32)1185total_ibike_flows = np.zeros(len(total_flows), dtype=np.float32)1186total_imoto_flows = np.zeros(len(total_flows), dtype=np.float32)11871188for ids_edge in ids_edges:1189for id_edge in ids_edge:1190total_flows[id_edge] += 111911192for ids_edge in ids_edges_od:1193for id_edge in ids_edge:1194total_od_flows[id_edge] += 111951196for ids_edge in ids_edges_iauto:1197for id_edge in ids_edge:1198total_iauto_flows[id_edge] += 111991200for ids_edge in ids_edges_ibike:1201for id_edge in ids_edge:1202total_ibike_flows[id_edge] += 112031204for ids_edge in ids_edges_imoto:1205for id_edge in ids_edge:1206total_imoto_flows[id_edge] += 112071208for ids_edge in ids_edges_car:1209for id_edge in ids_edge:1210total_car_flows[id_edge] += 112111212for ids_edge in ids_edges_bike:1213for id_edge in ids_edge:1214total_bike_flows[id_edge] += 112151216for ids_edge in ids_edges_moto:1217for id_edge in ids_edge:1218total_moto_flows[id_edge] += 112191220for ids_edge in ids_edges_ptline:1221for id_edge in ids_edge:1222total_ptline_flows[id_edge] += 112231224for ids_edge in ids_edges_vp:1225for id_edge in ids_edge:1226total_vp_flows[id_edge] += 112271228ids_edgeres = self.get_ids()12291230self.total_flows[ids_edgeres] = total_flows[self.ids_edge[ids_edgeres]]1231self.total_od_flows[ids_edgeres] = total_od_flows[self.ids_edge[ids_edgeres]]1232self.total_vp_flows[ids_edgeres] = total_vp_flows[self.ids_edge[ids_edgeres]]1233self.total_ptline_flows[ids_edgeres] = total_ptline_flows[self.ids_edge[ids_edgeres]]1234self.total_car_flows[ids_edgeres] = total_car_flows[self.ids_edge[ids_edgeres]]1235self.total_bike_flows[ids_edgeres] = total_bike_flows[self.ids_edge[ids_edgeres]]1236self.total_moto_flows[ids_edgeres] = total_moto_flows[self.ids_edge[ids_edgeres]]1237self.total_iauto_flows[ids_edgeres] = total_iauto_flows[self.ids_edge[ids_edgeres]]1238self.total_ibike_flows[ids_edgeres] = total_ibike_flows[self.ids_edge[ids_edgeres]]1239self.total_imoto_flows[ids_edgeres] = total_imoto_flows[self.ids_edge[ids_edgeres]]12401241return True12421243def import_edgenoise(self, sumo, filepath):1244print 'import_edgenoise', filepath1245self.import_sumoxml(filepath, sumo, self.get_group('edgenoise'))12461247def import_edgeemissions(self, sumo, filepath):1248print 'import_edgeemissions', filepath1249#attrnames_data = ['fuel_abs','CO_abs','CO2_abs','NOx_abs','PMx_abs']1250#attrnames_averaged = ['fuel_normed','CO_normed','CO2_normed',]1251self.import_sumoxml(filepath, sumo, self.get_group('edgeemissions'))12521253def import_sumoxml(self, filepath, sumo, attrconfigs):1254element = 'edge'1255# print 'import_sumoxml',element1256#id_type = 'edge',1257#reader = 'interval',1258ids_sumo, results, interval = read_interval2(1259filepath, sumo, element, attrconfigs)1260# print ' ids_sumo',ids_sumo1261# print ' results.keys()',results.keys()1262# print ' results',results1263# create ids for all colums1264# if fileinfo['id_type']=='edge':12651266# this procedure is necessary to create new result ids only1267# for edges that are not yet in the database1268ids_sumoedge = self.ids_edge.get_linktab().ids_sumo1269n = len(ids_sumo)1270# print ' n',n1271ind_range = np.arange(n, dtype=np.int32)1272ids = np.zeros(n, dtype=np.int32)1273for i in ind_range:1274id_edge = ids_sumoedge.get_id_from_index(ids_sumo[i])1275if self.ids_edge.has_index(id_edge):1276ids[i] = self.ids_edge.get_id_from_index(id_edge)1277else:1278ids[i] = self.add_row(ids_edge=id_edge)12791280# ids = self.add_row()# here the ids_sumo can be strings too1281# elif fileinfo['id_type']=='trip':1282# ids = self.tripresults.add_rows_keyrecycle(keys = ids_sumo)#1283# print ' ids=',ids12841285for attrconfig in attrconfigs:12861287attrname = attrconfig.attrname12881289default = attrconfig.get_default()1290if type(default) in (types.IntType, types.LongType):1291conversion = 'i' # int1292values_attr = np.zeros(n, int)1293elif type(default) in (types.FloatType, types.ComplexType):1294conversion = 'f' # float1295values_attr = np.zeros(n, float)1296else:1297conversion = 's' # str1298values_attr = np.zeros(n, obj)12991300is_average = False1301if hasattr(attrconfig, 'is_average'):1302is_average = attrconfig.is_average1303# print ' copy',attrname,'is_average',is_average1304# this is a tricky way to read the data stored in1305# dictionarie into array tructures as used in results1306# problem is that not all dictionaries have all ids1307for i in ind_range:1308if is_average:1309valcum, num = results[attrname].get(ids_sumo[i], (default, 1))1310val = valcum/float(num) # average over measurements!1311else:1312val = results[attrname].get(ids_sumo[i], default)13131314if conversion == 'i':1315val = int(val)1316# else:1317# values_attr[i]=val1318# print ' attrname',attrname,conversion,val,is_average,type(val)1319values_attr[i] = val13201321# print ' attrname',attrname1322# print ' ids',type(ids),ids1323# print ' values_attr',type(values_attr),values_attr1324attrconfig.set(ids, values_attr)13251326def import_marouterxml(self, filepath, marouter):13271328if not self.has_attrname('entered_mar'):1329# add marouter result attributes1330# traveltime="14.01" speed="5.56" entered="0.00" flowCapacityRatio="0.00"/>1331attrinfos = OrderedDict([1332('entered_mar', {'name': 'Entered Marouter',1333# 'symbol':'F_{MA}',1334'unit': None,1335'default': 0,1336'info': 'Entered number of vehicles',1337'xmltag': 'entered',1338'groupnames': ['marouter']1339}),1340('speeds_mar', {'name': 'Av. speeds Marouter',1341'unit': 'm/s',1342'default': 0.0,1343'info': 'Av. velocity of vehicles on this Edge',1344'xmltag': 'speed',1345'groupnames': ['marouter'],1346'is_average': True1347}),1348('flow_capacity_ratios', {'name': 'Saturation',1349'default': 0.0,1350'unit': '%',1351'info': 'Ratio between simulated flows and edge capacity determined by marouter.',1352'xmltag': 'flowCapacityRatio',1353'groupnames': ['marouter']1354}),1355])13561357for attrname, kwargs in attrinfos.iteritems():1358self.add_resultattr(attrname, **kwargs)13591360attrconfigs = self.get_group('marouter')13611362self.import_sumoxml(filepath, marouter, attrconfigs)136313641365class EdgeresultFilter(Process):1366def __init__(self, edgeresults, logger=None, **kwargs):1367print 'EdgeresultFilter.__init__'13681369# TODO: let this be independent, link to it or child??13701371self._init_common(ident='edgeresultfilter',1372parent=edgeresults,1373name='Edgeresult Filter',1374logger=logger,1375info='Filters the result of specific edges.',1376)13771378attrsman = self.set_attrsman(cm.Attrsman(self))1379zones = self.parent.parent.parent.parent.landuse.zones1380ids_zone = zones.get_ids()1381zonechoices = {}1382for id_zone, name_zone in zip(ids_zone, zones.ids_sumo[ids_zone]):1383zonechoices[name_zone] = id_zone1384print ' zonechoices', zonechoices1385# make for each possible pattern a field for prob1386# if len(zonechoices) > 0:1387self.ids_zone = attrsman.add(cm.ListConf('ids_zone', [],1388groupnames=['options'],1389choices=zonechoices,1390name='Zones',1391info="""Retain edge result if edge is within these zones.""",1392))1393# else:1394# self.ids_zone = []1395# self.id_zone = attrsman.add(cm.AttrConf( 'id_zone',kwargs.get('id_zone',1),1396# groupnames = ['options'],1397# perm='rw',1398# name = 'Zone ID',1399# info = """Retain edge result if edge is within this zone.""",1400# ))14011402self.is_invert = attrsman.add(cm.AttrConf('is_invert', kwargs.get('is_invert', False),1403groupnames=['options'],1404perm='rw',1405name='invert filter',1406info="""Invert filter results.""",1407))14081409def do(self):1410print 'EdgeresultFilter'1411# links1412edgeresults = self.parent1413edgeresults.filter_zoneedges(self.ids_zone, self.is_invert)1414return True14151416# TODO: generate and assign additional vehicles1417# to satisfy prescribes ownership141814191420class TrajectoryResults(am.ArrayObjman):1421"""Collects trajectories for all vehicles with a battery device."""14221423def __init__(self, parent, datapathkey='trajectorypath',1424is_add_default=True,1425name='Trajectory results',1426info='Table with trajectory and speed data of individual vehicles. Either all vehicles or vehicles with a fcd device.',1427**kwargs):14281429self._init_objman(ident='trajectory_results',1430parent=parent, # main results object1431info=info,1432name=name,1433**kwargs)14341435self.add(cm.AttrConf('datapathkey', datapathkey,1436groupnames=['_private'],1437name='data pathkey',1438info="key of data path",1439))14401441self.add(cm.AttrConf('times', np.array([], dtype=np.float32),1442groupnames=['_private'],1443name='Times',1444info="Times steps for energy measurements",1445))14461447self.add_col(am.ListArrayConf('trajectories',1448groupnames=['_private'],1449name='Trajectories',1450info="x,y,z, trajectories of all vehicles during each time step",1451))14521453self.add_col(am.ListArrayConf('angles',1454groupnames=['_private'],1455name='Angle',1456info="Angles of all vehicles during each time step",1457))14581459self.add_col(am.ListArrayConf('speeds',1460groupnames=['_private'],1461name='Speed',1462info="Speed of all vehicles during each time step",1463))14641465# self.add(cm.FuncConf( 'energy_total','on_energy_total', 0.0,1466# groupnames = ['summary'],1467# name = 'Total energy consumption',1468# unit = 'KWh',1469# info = 'Total electrical energy consumpton of all vehicles.',1470# ))14711472self.add_col(SumoIdsConf('vehicle',1473#name ='SUMO vehicle ID',1474info='SUMO vehicle ID, as used in route files.',1475perm='r'))14761477def import_xml(self, sumo, datapaths):1478datapathkey = self.datapathkey.get_value()1479print 'TrajectoryResults.import_xml datapathkey', datapathkey, datapaths.has_key(datapathkey)1480if datapaths.has_key(datapathkey):1481self.import_trajectories_sumoxml(datapaths[datapathkey], sumo)14821483def import_trajectories_sumoxml(self, filepath, sumo):1484element = 'vehicle'1485print 'TrajectoryResults.import_trajectories_sumoxml', element, filepath14861487ids_sumo, times, trajectories, angles, speeds = read_trajectories(1488filepath, sumo, element)14891490n = len(ids_sumo)1491ids_res = self.add_rows(n=n, ids_sumo=ids_sumo)1492self.times.set_value(times)1493self.trajectories[ids_res] = trajectories1494self.angles[ids_res] = angles1495self.speeds[ids_res] = speeds1496# self.print_trajectories()14971498def print_trajectories(self):1499ids_res = self.get_ids()1500times = self.times.get_value()1501for i, t in zip(xrange(len(times)), times):1502print 79*'-'1503print 'time=', t, 's', len(times)1504for id_res, id_sumo_veh, traj, a, v in zip(ids_res, self.ids_sumo[ids_res], self.trajectories[ids_res], self.angles[ids_res], self.speeds[ids_res]):1505# print ' id_sumo_veh',id_sumo_veh,id_res1506# print ' v',v[i]1507# print ' traj',traj[i]1508# print ' a',a[i]1509print ' id_sumo_veh', id_sumo_veh, ': (x,y)', traj[i], 'a=%.2f', a[i], ' v=%.2fm/s' % v[i], len(a), len(v), len(traj)151015111512class ElectricEnergyVehicleResults(am.ArrayObjman):1513"""Collects electric energy results for all vehicles with a battery device."""15141515def __init__(self, parent, datapathkey='electricenergypath',1516is_add_default=True,1517name='Electric energy vehicle results',1518info='Table with electric energy consumption data for each vehicle with a battery device.',1519**kwargs):15201521self._init_objman(ident='electricenergy_vehicleresults',1522parent=parent, # main results object1523info=info,1524name=name,1525**kwargs)15261527self.add(cm.AttrConf('datapathkey', datapathkey,1528groupnames=['_private'],1529name='data pathkey',1530info="key of data path",1531))15321533self.add(cm.AttrConf('times', np.array([], dtype=np.float32),1534groupnames=['_private'],1535name='Times',1536info="Times steps for energy measurements",1537))15381539self.add(cm.AttrConf('energies', np.array([], dtype=np.float32),1540groupnames=['_private'],1541name='Energies',1542info="Energy consumptions of all vehicles during each time step",1543))15441545self.add(cm.FuncConf('energy_total', 'on_energy_total', 0.0,1546groupnames=['summary'],1547name='Total energy consumption',1548unit='KWh',1549info='Total electrical energy consumpton of all vehicles.',1550))15511552self.add_col(SumoIdsConf('vehicle',1553#name ='SUMO vehicle ID',1554info='SUMO vehicle ID, as used in route files.',1555perm='r'))15561557attrinfos = OrderedDict([1558('consumptions', {'name': 'Consumption', 'xmltag': 'energyConsumed', 'unit': 'Ws',1559'default': 0.0, 'info': 'Total electrical energy consumption.', 'groupnames': ['electricenergydata']}),1560('charges_station', {'name': 'Charged at station', 'xmltag': 'energyCharged', 'unit': 'Ws', 'default': 0.0,1561'info': 'Total electrical energy charged at charging stations.', 'groupnames': ['electricenergydata']}),1562('charges_av', {'name': 'Average charge', 'xmltag': 'actualBatteryCapacity', 'unit': 'Ws', 'default': 0.0,1563'info': 'Average level of battery charge', 'groupnames': ['electricenergydata'], 'is_average': True}),1564('speeds_av', {'name': 'Average speeds', 'xmltag': 'speed', 'unit': 'm/s', 'default': 0.0,1565'info': 'Average speed', 'groupnames': ['electricenergydata'], 'is_average': True}),1566])15671568for attrname, kwargs in attrinfos.iteritems():1569self.add_resultattr(attrname, **kwargs)15701571def on_energy_total(self):1572"""Returns total energy consumption"""1573return np.sum(self.consumptions.get_value())/10.0**315741575def add_resultattr(self, attrname, **kwargs):15761577# default cannot be kwarg1578default = kwargs['default']1579del kwargs['default']1580if kwargs.has_key('groupnames'):1581kwargs['groupnames'].append('results')1582else:1583kwargs['groupnames'] = ['results']15841585self.add_col(am.ArrayConf(attrname, default, **kwargs))15861587# def import_routesdata(self, filepath):1588# # TODO1589# pass15901591# def import_tripdata(self, filepath):1592# #print 'import_tripdata',filepath,self.get_group('tripdata')1593# self.import_sumoxml(filepath,self.get_group('tripdata'))15941595def import_xml(self, sumo, datapaths):1596datapathkey = self.datapathkey.get_value()1597if datapaths.has_key(datapathkey):1598self.import_electricenergy_sumoxml(datapaths[datapathkey], sumo)15991600def import_electricenergy_sumoxml(self, filepath, sumo):1601element = 'vehicle'1602print 'ElectricEnergyresults.import_electricenergy_sumoxml', element, filepath1603#id_type = 'edge',1604#reader = 'interval',1605attrconfigs = self.get_group('electricenergydata')1606# print 'import_sumoxml',element1607#id_type = 'edge',1608#reader = 'interval',1609ids_sumo, results, interval, times, energies = read_electrical_energy(1610filepath, sumo, element, attrconfigs)16111612self.times.set_value(times)1613self.energies.set_value(energies)16141615print ' times=\n', self.times.get_value()1616print ' energies=\n', self.energies.get_value()16171618# print ' ids_sumo',ids_sumo1619# print ' results.keys()',results.keys()1620# print ' results',results1621# create ids for all colums1622# if fileinfo['id_type']=='edge':16231624# this procedure is necessary to create new result ids only1625# for edges that are not yet in the database1626#ids_sumotrip = self.ids_trip.get_linktab().ids_sumo1627n = len(ids_sumo)1628ids = self.add_rows(n=n, ids_sumo=ids_sumo)1629print ' n', n1630ind_range = np.arange(n, dtype=np.int32)16311632#ids = np.zeros(n, dtype=np.int32)1633# for i in ind_range:1634# id_trip = ids_sumotrip.get_id_from_index(ids_sumo[i])1635# if self.ids_trip.has_index(id_trip):1636# ids[i] = self.ids_trip.get_id_from_index(id_edge)1637# else:1638# ids[i] = self.add_row(ids_trip = id_edge)16391640# ids = self.add_row()# here the ids_sumo can be strings too1641# elif fileinfo['id_type']=='trip':1642# ids = self.tripresults.add_rows_keyrecycle(keys = ids_sumo)#1643# print ' ids=',ids16441645for attrconfig in attrconfigs:16461647attrname = attrconfig.attrname16481649default = attrconfig.get_default()1650if type(default) in (types.IntType, types.LongType):1651conversion = 'i' # int1652values_attr = np.zeros(n, int)1653elif type(default) in (types.FloatType, types.ComplexType):1654conversion = 'f' # float1655values_attr = np.zeros(n, float)1656else:1657conversion = 's' # str1658values_attr = np.zeros(n, obj)16591660is_average = False1661if hasattr(attrconfig, 'is_average'):1662is_average = attrconfig.is_average1663# print ' copy',attrname,'is_average',is_average1664# this is a tricky way to read the data stored in1665# dictionarie into array tructures as used in results1666# problem is that not all dictionaries have all ids1667for i in ind_range:1668if is_average:1669valcum, num = results[attrname].get(ids_sumo[i], (default, 1))1670val = valcum/float(num) # average over measurements!1671else:1672val = results[attrname].get(ids_sumo[i], default)16731674if conversion == 'i':1675val = int(val)1676# else:1677# values_attr[i]=val1678# print ' attrname',attrname,conversion,val,is_average,type(val)1679values_attr[i] = val16801681# print ' attrname',attrname1682# print ' ids',type(ids),ids1683# print ' values_attr',type(values_attr),values_attr1684attrconfig.set(ids, values_attr)168516861687class Simresults(cm.BaseObjman):1688def __init__(self, ident='simresults', parent=None,1689name='Simulation results',1690info='Results of SUMO simulation run.',1691outfile_prefix='out',1692scenario=None,1693**kwargs):16941695# either scenario must be provided or1696# parent must provide method get_scenario1697if scenario is None:1698scenario = parent.get_scenario()1699# print 'Network.__init__',name,kwargs1700rootname = scenario.get_rootfilename()1701rootdirpath = scenario.get_workdirpath()17021703self._init_objman(ident=ident, parent=parent, name=name,1704info=info, **kwargs)1705attrsman = self.set_attrsman(cm.Attrsman(self))17061707self._init_attributes()17081709def _init_attributes(self):1710attrsman = self.get_attrsman()1711scenario = self.get_scenario()1712self.edgeresults = attrsman.add(cm.ObjConf(Edgeresults(self, scenario.net.edges),1713groupnames=['Edge results'],1714))1715self.connectionresults = attrsman.add(cm.ObjConf(Connectionresults('connectionresults', self, scenario.demand.trips,1716scenario.net.edges), groupnames=['Connection results']))17171718self.routeresults = attrsman.add(cm.ObjConf(Routeresults('routeresults', self, scenario.demand.trips,1719scenario.net.edges), groupnames=['Route results']))1720# add trip results from all demand objects1721print 'Simresults._init_attributes'1722print ' scenario.demand.get_demandobjects()', scenario.demand.get_demandobjects()1723for demandobj in scenario.demand.get_demandobjects():1724demandobj.config_results(self)17251726for simobj in self.parent.get_simobjects():1727simobj.config_simresults(self)17281729self.electricenergy_vehicleresults = attrsman.add(cm.ObjConf(ElectricEnergyVehicleResults(self),1730groupnames=['Results'],1731))17321733self.trajectory_results = attrsman.add(cm.ObjConf(TrajectoryResults(self),1734groupnames=['Results'],1735))17361737def clear_results(self):1738for resultobj in self.get_attrsman().get_group('Results'):1739resultobj.clear()1740self.connectionresults.clear_rows()1741self.routeresults.clear_rows()1742self.edgeresults.clear_rows()17431744def get_resultobj(self, ident):1745# print 'get_resultobj',hasattr(self,ident)1746if hasattr(self, ident):1747return getattr(self, ident)17481749else:1750return None17511752def add_resultobj(self, resultobj, **kwargs):1753# print 'RESULTS:add_resultobj',resultobj.ident1754# attention: need to check whether already set1755# because setattr is set explicitely after add1756if hasattr(self, resultobj.get_ident()):1757# self.get_attrsman().delete(resultobj.get_ident())1758getattr(self, resultobj.get_ident()).clear()17591760if not hasattr(self, resultobj.get_ident()):1761if kwargs.has_key('groupnames'):1762kwargs['groupnames'].append('Results')1763else:1764kwargs['groupnames'] = ['Results']1765attrsman = self.get_attrsman()1766attrsman.add(cm.ObjConf(resultobj, **kwargs))1767setattr(self, resultobj.get_ident(), resultobj)17681769# for resultobj in self.get_attrsman().get_group_attrs('Results').values():1770# print ' check resultobject',resultobj.get_ident_abs()17711772# def import_xml(self, edgedatapath=None, edgenoisepath=None, edgeemissionspath = None, routesdatapath=None, tripdatapath=None):17731774# def get_path(self, datapath):1775# #edgedatapath=None, edgenoisepath=None, edgeemissionspath = None, routesdatapath=None, tripdatapath=None17761777def import_xml(self, sumo, **datapaths):1778print 'Simresults.import_xml', self.get_ident_abs()1779# print ' datapaths',datapaths1780# import first all edge oriented results for the whole net1781if datapaths.has_key('edgedatapath'):1782print 'import edge data'1783self.edgeresults.import_edgedata(sumo, datapaths['edgedatapath'])17841785if datapaths.has_key('edgenoisepath'):1786print 'import edge noise'1787self.edgeresults.import_edgenoise(sumo, datapaths['edgenoisepath'])17881789if datapaths.has_key('edgeemissionspath'):1790print 'import edge emissons'1791self.edgeresults.import_edgeemissions(sumo, datapaths['edgeemissionspath'])17921793# import all other resultobjects1794for resultobj in self.get_attrsman().get_group_attrs('Results').values():1795print ' import other resultobject', resultobj.ident1796resultobj.import_xml(sumo, datapaths)17971798if datapaths.has_key('routesdatapath'):1799print 'import route results'1800self.routeresults.import_xml(sumo, datapaths)1801print 'importedge flows'1802self.edgeresults.import_edgeflows(sumo, datapaths['edgedatapath'])1803print 'import connection flows'1804self.connectionresults.evaluate_results(sumo, datapaths)18051806# def process(self, process = None):1807# print 'Simresults.process'1808# for demandobj in self.parent.demand.get_demandobjects():1809# print ' process_results',demandobj1810# demandobj.process_results(self, process)18111812def get_tripresults(self):1813return self.get_attrsman().get_group_attrs('Trip results').values()18141815# def import_routesdata(self, routesdatapath):1816# for tripresult in self.get_tripresults():1817# tripresult.import_routesdata(routesdatapath)18181819# def import_tripdata(self, tripdatapath):1820# for tripresult in self.get_tripresults():1821# tripresult.import_tripdata(tripdatapath)18221823def save(self, filepath=None, is_not_save_parent=True):1824if filepath is None:1825self.get_scenario().get_rootfilepath()+'.res.obj'1826cm.save_obj(self, filepath, is_not_save_parent=is_not_save_parent)18271828def get_scenario(self):1829return self.parent.parent183018311832class MarouterLoadReader(handler.ContentHandler):1833"""1834Reads edge based load results of Marouter.18351836"""18371838def __init__(self, marouter, attrsconfigs_cumulative, attrsconfigs_average):1839self._marouter = marouter1840self._attrconfigs = attrconfigs1841self._element = 'edge'1842self._time_begin = None1843self._time_inter_begin = 0.01844self._time_inter_end = 0.01845self._time_tot = 0.01846self._n_inter = 01847self._values = {}1848self._ids = []18491850def startElement(self, name, attrs):1851# <edge id="-120634989" traveltime="6.74" speed="13.89" entered="0.00" flowCapacityRatio="0.00"/>1852# if attrs.has_key('id'):1853# print 'startElement',name,name == self._element,self._element1854if name == 'interval':1855time_inter_begin = float(attrs['begin'])1856# print 79*'-'1857# print 'startElement interval',self.is_inter_valid,' time_inter_begin',time_inter_begin,'is_valid',time_inter_begin >= self._sumo.time_warmup1858self.is_inter_valid = True1859time_inter_end = float(attrs['end'])18601861self._time_inter = int(time_inter_end)-int(time_inter_begin)1862# here we just take the start and end time ofthe whole1863# measurement period1864if self._time_begin is None: # take very first time only1865self._time_begin = int(time_inter_begin)1866self._time_end = int(time_inter_end)1867self._time_tot += self._time_inter1868self._n_inter += 118691870if name == self._element:1871if not self.is_inter_valid:1872return # no interval initialized18731874id_elem = attrs.get('id', None)1875# print 'startElement ---id_elem',id_elem1876if id_elem is None:1877return # id did not fit requested trip type18781879if id_elem not in self._ids:1880self._ids.append(id_elem)18811882# no arrival data availlable if trip has not been finished!!1883for attrsconfig in self._attrsconfigs_cumulative:1884xmltag = attrsconfig.xmltag1885attrname = attrsconfig.attrname18861887if attrs.has_key(xmltag):1888# print ' attrname cum',attrname,attrs.has_key(attrname),'*'+attrs[attrname]+'*'1889a = attrs[xmltag]18901891if a.strip() != '':1892if self._values[attrname].has_key(id_elem):1893self._values[attrname][id_elem] += float(a)1894# print ' added val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)1895else:1896self._values[attrname][id_elem] = float(a)1897# print ' set val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)18981899# if (id in ('1/0to1/1','1/0to2/0')) & (attrname == 'entered'):1900# self.n_test+=int(attrs[attrname])1901# print ' -read ',id,attrname,attrs[attrname],self.n_test,self._values[attrname][id]1902#1903# if (id in ('0/0to1/0')) & (attrname == 'left'):1904# self.n_test2+=int(attrs[attrname])1905# print ' +read ',id,attrname,attrs[attrname],self.n_test2,self._values[attrname][id]19061907for attrsconfig in self._attrsconfigs_average:1908xmltag = attrsconfig.xmltag1909attrname = attrsconfig.attrname1910if attrs.has_key(xmltag):1911# print ' attrname',attrname,attrs.has_key(attrname),'*'+attrs[attrname]+'*'1912# n=float(self.n_inter)1913a = attrs[xmltag]1914if a.strip() != '':1915if self._values[attrname].has_key(id_elem):1916valcum, n = self._values[attrname][id_elem]1917valcum += float(a)1918n += 11919#self._values[attrname][id_elem] = ( (n-1)*self._values[attrname][id_elem] + float(a))/n1920#self._values[attrname][id] += float(a)/self._time_inter1921#self._n_values[attrname][id] += 11922else:1923valcum = float(a)1924n = 11925#self._values[attrname][id_elem] = float(a)1926#self._values[attrname][id_elem] = float(a)/self._time_inter1927#self._n_values[attrname][id] = 11928# print ' added cumval',xmltag,attrname,valcum,'val',float(a)1929self._values[attrname][id_elem] = (valcum, n)193019311932class IntervalAvReader2(handler.ContentHandler):1933"""1934Reads edge or lane based intervals1935and returns time averaged values for each attribute name.19361937"""19381939def __init__(self, element, sumo, attrsconfigs_cumulative, attrsconfigs_average):1940"""1941element is "lane" or "edge" or "tripinfo"1942attrnames is a list of attribute names to read.1943"""1944print 'IntervalAvReader2', element1945# print ' attrsconfigs_cumulative'1946# for attrconfig in attrsconfigs_cumulative: print ' ',attrconfig.attrname19471948# print ' attrsconfigs_average'1949# for attrconfig in attrsconfigs_average: print ' ',attrconfig.attrname1950self._element = element1951self._sumo = sumo # the sumo process generating the data1952self._time_start_recording = sumo.simtime_start + sumo.time_warmup1953self._attrsconfigs_cumulative = attrsconfigs_cumulative1954self._attrsconfigs_average = attrsconfigs_average1955self._time_begin = None1956self._time_end = None1957self._values = {}1958self._ids = []1959#self._n_values= {}1960self.is_inter_valid = False1961self.n_inter = 01962self.n_test = 01963self.n_test2 = 019641965# TODO: if we knew here all ids then we1966# could create a numeric array per attribute1967# idea: pass ids as input arg1968for attrsconfig in attrsconfigs_cumulative+attrsconfigs_average:1969self._values[attrsconfig.attrname] = {}1970# print ' init',attrsconfig.attrname1971#self._n_values= {}19721973def get_id_elem(self, attrs):1974"""1975Returns the trip ID as integer if the desired trip type has been read.1976Otherwise -1 is returned.1977"""1978return attrs['id']19791980def startElement(self, name, attrs):1981# if attrs.has_key('id'):1982# print ' parse',name,self._element,name == self._element,self.is_inter_valid, 'id=',attrs.get('id','-')1983# print 'startElement',name,name == self._element,self._element19841985# if name == 'timestep':19861987if name == 'interval':1988time_inter_begin = float(attrs['begin'])1989# print 79*'-'1990# print 'startElement interval',self.is_inter_valid,' time_inter_begin',time_inter_begin,'is_valid',time_inter_begin >= self._sumo.time_warmup1991if time_inter_begin >= self._sumo.time_warmup:1992self.is_inter_valid = True1993time_inter_end = float(attrs['end'])19941995self._time_inter = int(time_inter_end)-int(time_inter_begin)1996# here we just take the start and end time ofthe whole1997# measurement period1998if self._time_begin is None: # take very first time only1999self._time_begin = int(time_inter_begin)2000self._time_end = int(time_inter_end)2001self.n_inter += 12002else:2003self.is_inter_valid = False20042005if name == self._element:2006if not self.is_inter_valid:2007return # no interval initialized20082009id_elem = self.get_id_elem(attrs)2010# print 'startElement ---id_elem',id_elem2011if id_elem == -1:2012return # id did not fit requested trip type20132014if id_elem not in self._ids:2015self._ids.append(id_elem)20162017# no arrival data availlable if trip has not been finished!!2018for attrsconfig in self._attrsconfigs_cumulative:2019xmltag = attrsconfig.xmltag2020attrname = attrsconfig.attrname20212022if attrs.has_key(xmltag):2023# print ' attrname cum',attrname,attrs.has_key(attrname),'*'+attrs[attrname]+'*'2024a = attrs[xmltag]20252026if a.strip() != '':2027if self._values[attrname].has_key(id_elem):2028self._values[attrname][id_elem] += float(a)2029# print ' added val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)2030else:2031self._values[attrname][id_elem] = float(a)2032# print ' set val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)20332034# if (id in ('1/0to1/1','1/0to2/0')) & (attrname == 'entered'):2035# self.n_test+=int(attrs[attrname])2036# print ' -read ',id,attrname,attrs[attrname],self.n_test,self._values[attrname][id]2037#2038# if (id in ('0/0to1/0')) & (attrname == 'left'):2039# self.n_test2+=int(attrs[attrname])2040# print ' +read ',id,attrname,attrs[attrname],self.n_test2,self._values[attrname][id]20412042for attrsconfig in self._attrsconfigs_average:2043xmltag = attrsconfig.xmltag2044attrname = attrsconfig.attrname2045if attrs.has_key(xmltag):2046# print ' attrname',attrname,attrs.has_key(attrname),'*'+attrs[attrname]+'*'2047# n=float(self.n_inter)2048a = attrs[xmltag]2049if a.strip() != '':2050if self._values[attrname].has_key(id_elem):2051valcum, n = self._values[attrname][id_elem]2052valcum += float(a)2053n += 12054#self._values[attrname][id_elem] = ( (n-1)*self._values[attrname][id_elem] + float(a))/n2055#self._values[attrname][id] += float(a)/self._time_inter2056#self._n_values[attrname][id] += 12057else:2058valcum = float(a)2059n = 12060#self._values[attrname][id_elem] = float(a)2061#self._values[attrname][id_elem] = float(a)/self._time_inter2062#self._n_values[attrname][id] = 12063# print ' added cumval',xmltag,attrname,valcum,'val',float(a)2064self._values[attrname][id_elem] = (valcum, n)20652066def get_data(self):2067return self._values20682069def get_interval(self):2070# returns time interval between first and last measurement2071return (self._time_begin, self._time_end)20722073def get_ids(self):2074return self._ids207520762077class ElectricalEnergyReader(IntervalAvReader2):2078"""2079Reads intervals of the electrcal energy file and cumulates data.2080"""20812082def __init__(self, element, sumo, attrsconfigs_cumulative, attrsconfigs_average):2083"""2084element is "lane" or "edge" or "tripinfo"2085attrnames is a list of attribute names to read.2086"""2087print 'ElectricalEnergyReader', element2088# print ' attrsconfigs_cumulative',attrsconfigs_cumulative2089# print ' attrsconfigs_average',attrsconfigs_average2090IntervalAvReader2.__init__(self, element, sumo, attrsconfigs_cumulative, attrsconfigs_average)2091self.time_lastint = -1.020922093self.times = []2094self.energies = []2095self._energy_step = 0.0 # energy os all vehicles during last step2096self._consumptionsname = "consumptions"20972098def startElement(self, name, attrs):2099# print 'startElement',name,name == self._element,'time_lastint', self.time_lastint,'is_inter_valid',self.is_inter_valid,'e=',self._energy_step21002101if name == 'timestep':2102if self.time_lastint < 0:2103# print ' set time_lastint to ',float(attrs['time'])2104self.time_lastint = float(attrs['time'])2105self.is_inter_valid = False2106else:21072108time_inter_begin = self.time_lastint2109# print 79*'-'2110# print ' time_inter_begin',time_inter_begin,'is_valid',time_inter_begin >= self._sumo.time_warmup2111if time_inter_begin >= self._sumo.time_warmup:2112self.is_inter_valid = True2113time_inter_end = float(attrs['time'])2114self.times.append(time_inter_end)2115self.energies.append(self._energy_step)2116self._energy_step = 0.021172118self._time_inter = int(time_inter_end)-int(time_inter_begin)2119# here we just take the start and end time ofthe whole2120# measurement period2121if self._time_begin is None: # take very first time only2122self._time_begin = int(time_inter_begin)2123self._time_end = int(time_inter_end)2124self.n_inter += 12125else:2126self.is_inter_valid = False21272128if name == self._element:2129if not self.is_inter_valid:2130return # no interval initialized21312132id_elem = self.get_id_elem(attrs)2133# print ' ---id_veh_sumo',id_elem2134if id_elem == -1:2135return # id did not fit requested trip type21362137if id_elem not in self._ids:2138self._ids.append(id_elem)21392140for attrsconfig in self._attrsconfigs_cumulative:2141xmltag = attrsconfig.xmltag2142attrname = attrsconfig.attrname2143# print ' attrname (cum)',attrname,xmltag,attrs.has_key(xmltag)2144if attrs.has_key(xmltag):21452146a = attrs[xmltag]21472148if a.strip() != '':2149a = float(a)2150if self._values[attrname].has_key(id_elem):2151self._values[attrname][id_elem] += a2152# print ' added val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)2153else:2154self._values[attrname][id_elem] = a2155# print ' set val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)21562157if attrname == self._consumptionsname:2158self._energy_step += a21592160for attrsconfig in self._attrsconfigs_average:2161xmltag = attrsconfig.xmltag2162attrname = attrsconfig.attrname2163# print ' attrname (av)',attrname,xmltag,attrs.has_key(xmltag)2164if attrs.has_key(xmltag):21652166a = attrs[xmltag]2167if a.strip() != '':2168a = float(a)2169if self._values[attrname].has_key(id_elem):2170valcum, n = self._values[attrname][id_elem]2171# print ' add val', float(a),'to',valcum2172valcum += a2173n += 12174else:2175valcum = a2176n = 12177# print ' set val',valcum2178# print ' added cumval',xmltag,attrname,valcum,'val',float(a)2179self._values[attrname][id_elem] = (valcum, n)21802181def get_times(self):2182return np.array(self.times, dtype=np.float32)21832184def get_energies(self):2185return np.array(self.energies, dtype=np.float32)218621872188class TripresultReader(IntervalAvReader2):2189def __init__(self, trips, element, sumo, attrsconfigs_cumulative, attrsconfigs_average):2190"""2191element is "lane" or "edge" or "tripinfo" or "personinfo"2192attrnames is a list of attribute names to read.21932194"""2195self._trips = trips2196#IntervalAvReader2.__init__(self, element,sumo, attrsconfigs_cumulative, attrsconfigs_average)2197self._element = element2198self._sumo = sumo # the sumo process generating the data2199self._attrsconfigs_cumulative = attrsconfigs_cumulative2200self._attrsconfigs_average = attrsconfigs_average2201#self._time_begin = None2202#self._time_end = None2203self._values = {}2204self._ids = []2205#self._n_values= {}2206#self.is_inter_valid = False2207#self.n_inter = 02208#self.n_test = 02209#self.n_test2 = 022102211# TODO: if we knew here all ids then we2212# could create a numeric array per attribute2213# idea: pass ids as input arg2214for attrsconfig in attrsconfigs_cumulative+attrsconfigs_average:2215self._values[attrsconfig.attrname] = {}2216# print ' init',attrsconfig.attrname2217#self._n_values= {}22182219def get_id_elem(self, attrs):2220"""2221Returns the trip ID as integer if the desired trip type has been read.2222Otherwise -1 is returned.2223"""2224# print 'get_id_elem check id=',attrs['id'],self._trips,id(self._trips)2225return self._trips.get_id_from_id_sumo(attrs['id'])22262227def startElement(self, name, attrs):2228# if attrs.has_key('id'):2229# print ' parse',name,self._element,name == self._element,'id=',attrs.get('id','-')22302231if name == self._element:22322233id_elem = self.get_id_elem(attrs)2234# print ' ---id_elem',id_elem2235if id_elem == -1:2236return # id did not fit requested trip type22372238if id_elem not in self._ids:2239self._ids.append(id_elem)22402241# no arrival data availlable if trip has not been finished!!2242for attrsconfig in self._attrsconfigs_cumulative:2243xmltag = attrsconfig.xmltag2244attrname = attrsconfig.attrname22452246if attrs.has_key(xmltag):2247# print ' attrname',attrname,attrs.has_key(attrname)2248if attrs.has_key(attrname):22492250# print ' val *'+attrs[xmltag]+'*'2251a = attrs[xmltag]22522253if a.strip() != '':2254if self._values[attrname].has_key(id_elem):2255self._values[attrname][id_elem] += float(a)2256else:2257self._values[attrname][id_elem] = float(a)22582259# if (id in ('1/0to1/1','1/0to2/0')) & (attrname == 'entered'):2260# self.n_test+=int(attrs[attrname])2261# print ' -read ',id,attrname,attrs[attrname],self.n_test,self._values[attrname][id]2262#2263# if (id in ('0/0to1/0')) & (attrname == 'left'):2264# self.n_test2+=int(attrs[attrname])2265# print ' +read ',id,attrname,attrs[attrname],self.n_test2,self._values[attrname][id]22662267for attrsconfig in self._attrsconfigs_average:2268xmltag = attrsconfig.xmltag2269attrname = attrsconfig.attrname2270if attrs.has_key(xmltag):2271# n=float(self.n_inter)2272a = attrs[xmltag]2273if a.strip() != '':2274if self._values[attrname].has_key(id_elem):2275valcum, n = self._values[attrname][id_elem]2276valcum += float(a)2277n += 12278#self._values[attrname][id_elem] = ( (n-1)*self._values[attrname][id_elem] + float(a))/n2279#self._values[attrname][id] += float(a)/self._time_inter2280#self._n_values[attrname][id] += 12281else:2282valcum = float(a)2283n = 12284#self._values[attrname][id_elem] = float(a)2285#self._values[attrname][id_elem] = float(a)/self._time_inter2286#self._n_values[attrname][id] = 12287self._values[attrname][id_elem] = (valcum, n)22882289def get_data(self):2290return self._values22912292def get_ids(self):2293return self._ids229422952296def read_electrical_energy(filepath, sumo, element, attrsconfigs):2297print 'read_electrical_energy'2298attrsconfigs_cumulative = []2299attrsconfigs_average = []2300for attrsconfig in attrsconfigs:2301# print ' check',attrsconfig.attrname2302if hasattr(attrsconfig, 'is_average'):2303if attrsconfig.is_average:2304attrsconfigs_average.append(attrsconfig)2305else:2306attrsconfigs_cumulative.append(attrsconfig)2307else:2308attrsconfigs_cumulative.append(attrsconfig)23092310reader = ElectricalEnergyReader(element, sumo, attrsconfigs_cumulative, attrsconfigs_average)2311parse(filepath, reader)2312return reader.get_ids(), reader.get_data(), reader.get_interval(), reader.get_times(), reader.get_energies()231323142315class ElectricalEnergyReader(IntervalAvReader2):2316"""2317Reads intervals of the electrcal energy file and cumulates data.2318"""23192320def __init__(self, element, sumo, attrsconfigs_cumulative, attrsconfigs_average):2321"""2322element is "lane" or "edge" or "tripinfo"2323attrnames is a list of attribute names to read.2324"""2325print 'ElectricalEnergyReader', element2326# print ' attrsconfigs_cumulative',attrsconfigs_cumulative2327# print ' attrsconfigs_average',attrsconfigs_average2328IntervalAvReader2.__init__(self, element, sumo, attrsconfigs_cumulative, attrsconfigs_average)2329self.time_lastint = -1.023302331self.times = []2332self.energies = []2333self._energy_step = 0.0 # energy os all vehicles during last step2334self._consumptionsname = "consumptions"23352336def startElement(self, name, attrs):2337# print 'startElement',name,name == self._element,'time_lastint', self.time_lastint,'is_inter_valid',self.is_inter_valid,'e=',self._energy_step23382339if name == 'timestep':2340if self.time_lastint < 0:2341# print ' set time_lastint to ',float(attrs['time'])2342self.time_lastint = float(attrs['time'])2343self.is_inter_valid = False2344else:23452346time_inter_begin = self.time_lastint2347# print 79*'-'2348# print ' time_inter_begin',time_inter_begin,'is_valid',time_inter_begin >= self._sumo.time_warmup2349if time_inter_begin >= self._sumo.time_warmup:2350self.is_inter_valid = True2351time_inter_end = float(attrs['time'])2352self.times.append(time_inter_end)2353self.energies.append(self._energy_step)2354self._energy_step = 0.023552356self._time_inter = int(time_inter_end)-int(time_inter_begin)2357# here we just take the start and end time ofthe whole2358# measurement period2359if self._time_begin is None: # take very first time only2360self._time_begin = int(time_inter_begin)2361self._time_end = int(time_inter_end)2362self.n_inter += 12363else:2364self.is_inter_valid = False23652366if name == self._element:2367if not self.is_inter_valid:2368return # no interval initialized23692370id_elem = self.get_id_elem(attrs)2371# print ' ---id_veh_sumo',id_elem2372if id_elem == -1:2373return # id did not fit requested trip type23742375if id_elem not in self._ids:2376self._ids.append(id_elem)23772378for attrsconfig in self._attrsconfigs_cumulative:2379xmltag = attrsconfig.xmltag2380attrname = attrsconfig.attrname2381# print ' attrname (cum)',attrname,xmltag,attrs.has_key(xmltag)2382if attrs.has_key(xmltag):23832384a = attrs[xmltag]23852386if a.strip() != '':2387a = float(a)2388if self._values[attrname].has_key(id_elem):2389self._values[attrname][id_elem] += a2390# print ' added val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)2391else:2392self._values[attrname][id_elem] = a2393# print ' set val',xmltag,attrname,self._values[attrname][id_elem],'val',float(a)23942395if attrname == self._consumptionsname:2396self._energy_step += a23972398for attrsconfig in self._attrsconfigs_average:2399xmltag = attrsconfig.xmltag2400attrname = attrsconfig.attrname2401# print ' attrname (av)',attrname,xmltag,attrs.has_key(xmltag)2402if attrs.has_key(xmltag):24032404a = attrs[xmltag]2405if a.strip() != '':2406a = float(a)2407if self._values[attrname].has_key(id_elem):2408valcum, n = self._values[attrname][id_elem]2409# print ' add val', float(a),'to',valcum2410valcum += a2411n += 12412else:2413valcum = a2414n = 12415# print ' set val',valcum2416# print ' added cumval',xmltag,attrname,valcum,'val',float(a)2417self._values[attrname][id_elem] = (valcum, n)24182419def get_times(self):2420return np.array(self.times, dtype=np.float32)24212422def get_energies(self):2423return np.array(self.energies, dtype=np.float32)242424252426class TrajectoryReader(IntervalAvReader2):2427"""2428Read trajectories, angles and speeds from a FCD XLM file24292430"""24312432def __init__(self, element, sumo):2433"""2434element is "lane" or "edge" or "tripinfo"2435attrnames is a list of attribute names to read.2436"""2437print 'TrajectoryReader', element2438# print ' attrsconfigs_cumulative',attrsconfigs_cumulative2439# print ' attrsconfigs_average',attrsconfigs_average2440IntervalAvReader2.__init__(self, element, sumo, [], [])2441#self.time_lastint = -1.02442self.n_inter = 02443self.times = []2444self.trajectories = {}2445self.angles = {}2446self.speeds = {}24472448#self._attrnames = ()2449self._xname = "x"2450self._yname = "y"2451self._anglename = "angle"2452self._speedname = "speed"24532454def startElement(self, name, attrs):2455# print 'startElement',name,name == self._element,'is_inter',self.n_inter24562457# <vehicle id="<VEHICLE_ID>" x="<VEHICLE_POS_X>" y="<VEHICLE_POS_Y>" angle="<VEHICLE_ANGLE>" type="<VEHICLE_TYPE>" speed="<VEHICLE_SPEED>"/>2458if name == 'timestep':2459# if self.time_lastint < 0:2460# #print ' set time_lastint to ',float(attrs['time'])2461# self.time_lastint = float(attrs['time'])2462# self.is_inter_valid = False2463# else:24642465#time_inter_begin = self.time_lastint2466# print 79*'-'2467# print ' time_inter_begin',time_inter_begin,'is_valid',time_inter_begin >= self._sumo.time_warmup2468# if time_inter_begin >= self._sumo.time_warmup:2469#self.is_inter_valid = True2470time_inter_end = float(attrs['time'])2471self.times.append(time_inter_end)2472# self.energies.append(self._energy_step)2473#self._energy_step = 0.024742475#self._time_inter = int(time_inter_end)-int(time_inter_begin)2476# here we just take the start and end time ofthe whole2477# measurement period2478# if self._time_begin is None:# take very first time only2479# self._time_begin = int(time_inter_begin)2480#self._time_end = int(time_inter_end)2481self.n_inter += 12482# else:2483# self.is_inter_valid = False24842485if name == self._element:2486# if not self.is_inter_valid: return # no interval initialized24872488id_elem = self.get_id_elem(attrs) # id_sumo2489# print ' ---id_veh_sumo',id_elem2490if id_elem == -1:2491return # id did not fit requested trip type24922493if id_elem not in self._ids:2494self._ids.append(id_elem)24952496self.trajectories[id_elem] = (self.n_inter-1)*[(np.nan, np.nan)]2497self.angles[id_elem] = (self.n_inter-1)*[np.nan]2498self.speeds[id_elem] = (self.n_inter-1)*[np.nan]24992500self.trajectories[id_elem].append([float(attrs[self._xname].strip()), float(attrs[self._yname].strip())])2501self.angles[id_elem].append(float(attrs[self._anglename].strip()))2502self.speeds[id_elem].append(float(attrs[self._speedname].strip()))2503# print ' trajectories',[float(attrs[self._xname].strip()),float(attrs[self._yname].strip())]2504# print ' id_sumo_veh',id_elem,'n_inter',self.n_inter,'len(angles)',len(self.angles[id_elem]),'len(traj)',len(self.trajectories[id_elem])25052506def endElement(self, name):2507if name == 'timestep':2508# print 'endElement',self.times[-1],len(self.times)2509for id_sumo_veh in self._ids:2510# print ' id_sumo_veh',id_sumo_veh,'n_inter',self.n_inter,'len(angles)',len(self.angles[id_sumo_veh]),'len(traj)',len(self.trajectories[id_sumo_veh])2511if len(self.trajectories[id_sumo_veh]) < self.n_inter:2512self.trajectories[id_sumo_veh].append((np.nan, np.nan))2513if len(self.angles[id_sumo_veh]) < self.n_inter:2514self.angles[id_sumo_veh].append(np.nan)2515if len(self.speeds[id_sumo_veh]) < self.n_inter:2516self.speeds[id_sumo_veh].append(np.nan)251725182519def read_trajectories(filepath, sumo, element):2520print 'read_trajectories', element25212522reader = TrajectoryReader(element, sumo)2523parse(filepath, reader)2524ids_sumo = reader.get_ids()2525times = np.array(reader.times, dtype=np.float32)2526n_veh = len(ids_sumo)2527trajectories = np.ones(n_veh, dtype=np.object)2528angles = np.ones(n_veh, dtype=np.object)2529speeds = np.ones(n_veh, dtype=np.object)25302531for i, id_sumo in zip(xrange(n_veh), ids_sumo):2532trajectories[i] = reader.trajectories[id_sumo]2533angles[i] = reader.angles[id_sumo]2534speeds[i] = reader.speeds[id_sumo]25352536return ids_sumo, times, trajectories, angles, speeds253725382539def read_interval2(filepath, sumo, element, attrsconfigs):2540# print 'read_interval2'2541attrsconfigs_cumulative = []2542attrsconfigs_average = []2543for attrsconfig in attrsconfigs:2544# print ' check',attrsconfig.attrname2545if hasattr(attrsconfig, 'is_average'):2546if attrsconfig.is_average:2547attrsconfigs_average.append(attrsconfig)2548else:2549attrsconfigs_cumulative.append(attrsconfig)2550else:2551attrsconfigs_cumulative.append(attrsconfig)25522553reader = IntervalAvReader2(element, sumo, attrsconfigs_cumulative, attrsconfigs_average)2554#parser = make_parser()2555# parser.setContentHandler(reader)2556#fn = '"'+filepath+'"'2557# print 'read_interval >'+fn+'<'2558# print ' >'+filepath+'<'2559# parser.parse(filepath)2560parse(filepath, reader)2561return reader.get_ids(), reader.get_data(), reader.get_interval()256225632564def read_tripresult(filepath, sumo, trips, element, attrsconfigs):2565print 'read_tripresult', filepath, trips.ident, 'element', element2566attrsconfigs_cumulative = []2567attrsconfigs_average = []2568for attrsconfig in attrsconfigs:2569# print ' check',attrsconfig.attrname2570if hasattr(attrsconfig, 'is_average'):2571if attrsconfig.is_average:2572attrsconfigs_average.append(attrsconfig)2573else:2574attrsconfigs_cumulative.append(attrsconfig)2575else:2576attrsconfigs_cumulative.append(attrsconfig)25772578reader = TripresultReader(trips, element, sumo, attrsconfigs_cumulative, attrsconfigs_average)2579#parser = make_parser()2580# parser.setContentHandler(reader)2581#fn = '"'+filepath+'"'2582# print 'read_interval >'+fn+'<'2583# print ' start parse >'+filepath+'<'2584# parser.parse(filepath)2585parse(filepath, reader)2586# print ' end',len(reader._ids)2587return reader.get_ids(), reader.get_data()258825892590def read_routeresult(filepath, sumo, trips, element, attrsconfigs):2591# print 'read_tripresult',filepath,trips.ident2592attrsconfigs_cumulative = []2593attrsconfigs_average = []2594for attrsconfig in attrsconfigs:2595# print ' check',attrsconfig.attrname2596if hasattr(attrsconfig, 'is_average'):2597if attrsconfig.is_average:2598attrsconfigs_average.append(attrsconfig)2599else:2600attrsconfigs_cumulative.append(attrsconfig)2601else:2602attrsconfigs_cumulative.append(attrsconfig)26032604counter = RouteCounter()2605parse(filepath, counter)2606reader = RouteReader(trips, counter) # parser = make_parser()2607# parser.setContentHandler(reader)2608#fn = '"'+filepath+'"'2609# print 'read_interval >'+fn+'<'2610# print ' start parse >'+filepath+'<'2611# parser.parse(filepath)2612parse(filepath, reader)2613# print ' end',len(reader._ids)2614return reader._get_kwargs()261526162617