Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file MeanDataHandler.cpp
15 : /// @author Pablo Alvarez Lopez
16 : /// @date Nov 2022
17 : ///
18 : // The XML-Handler for meanMeanData elements loading
19 : /****************************************************************************/
20 : #include <config.h>
21 :
22 : #include <utils/common/MsgHandler.h>
23 : #include <utils/common/StringUtils.h>
24 : #include <utils/xml/XMLSubSys.h>
25 :
26 : #include "MeanDataHandler.h"
27 :
28 :
29 : // ===========================================================================
30 : // method definitions
31 : // ===========================================================================
32 :
33 0 : MeanDataHandler::MeanDataHandler(const std::string& filename) :
34 0 : CommonHandler(filename) {
35 0 : }
36 :
37 :
38 0 : MeanDataHandler::~MeanDataHandler() {}
39 :
40 :
41 : bool
42 0 : MeanDataHandler::beginParseAttributes(SumoXMLTag tag, const SUMOSAXAttributes& attrs) {
43 : // open SUMOBaseOBject
44 0 : myCommonXMLStructure.openSUMOBaseOBject();
45 : // check tag
46 : try {
47 0 : switch (tag) {
48 0 : case SUMO_TAG_MEANDATA_EDGE:
49 0 : parseEdgeMeanData(attrs);
50 : break;
51 0 : case SUMO_TAG_MEANDATA_LANE:
52 0 : parseLaneMeanData(attrs);
53 : break;
54 0 : case SUMO_TAG_PARAM:
55 0 : WRITE_WARNING(TL("MeanData elements cannot load attributes as params"));
56 0 : break;
57 0 : default:
58 : // tag cannot be parsed in MeanDataHandler
59 0 : myCommonXMLStructure.abortSUMOBaseOBject();
60 : return false;
61 : }
62 0 : } catch (InvalidArgument& e) {
63 0 : writeError(e.what());
64 0 : }
65 : return true;
66 : }
67 :
68 :
69 : void
70 0 : MeanDataHandler::endParseAttributes() {
71 : // get last inserted object
72 0 : CommonXMLStructure::SumoBaseObject* obj = myCommonXMLStructure.getCurrentSumoBaseObject();
73 : // close SUMOBaseOBject
74 0 : if (obj) {
75 0 : myCommonXMLStructure.closeSUMOBaseOBject();
76 : // check tag
77 0 : switch (obj->getTag()) {
78 0 : case SUMO_TAG_MEANDATA_EDGE:
79 : case SUMO_TAG_MEANDATA_LANE:
80 0 : parseSumoBaseObject(obj);
81 : // delete object
82 0 : delete obj;
83 : break;
84 : default:
85 : break;
86 : }
87 : }
88 0 : }
89 :
90 :
91 : void
92 0 : MeanDataHandler::parseSumoBaseObject(CommonXMLStructure::SumoBaseObject* obj) {
93 : // check if loading was aborted
94 0 : if (!myAbortLoading) {
95 : // switch tag
96 0 : switch (obj->getTag()) {
97 0 : case SUMO_TAG_MEANDATA_EDGE:
98 0 : if (buildEdgeMeanData(obj,
99 : obj->getStringAttribute(SUMO_ATTR_ID),
100 : obj->getStringAttribute(SUMO_ATTR_FILE),
101 : obj->getStringAttribute(SUMO_ATTR_TYPE),
102 : obj->getTimeAttribute(SUMO_ATTR_PERIOD),
103 : obj->getTimeAttribute(SUMO_ATTR_BEGIN),
104 : obj->getTimeAttribute(SUMO_ATTR_END),
105 0 : obj->getBoolAttribute(SUMO_ATTR_TRACK_VEHICLES),
106 : obj->getStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES),
107 0 : obj->getBoolAttribute(SUMO_ATTR_AGGREGATE),
108 : obj->getStringListAttribute(SUMO_ATTR_EDGES),
109 : obj->getStringAttribute(SUMO_ATTR_EDGESFILE),
110 : obj->getStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY),
111 0 : obj->getBoolAttribute(SUMO_ATTR_WITH_INTERNAL),
112 : obj->getStringListAttribute(SUMO_ATTR_DETECT_PERSONS),
113 : obj->getDoubleAttribute(SUMO_ATTR_MIN_SAMPLES),
114 : obj->getDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME),
115 : obj->getStringListAttribute(SUMO_ATTR_VTYPES),
116 : obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD))) {
117 0 : obj->markAsCreated();
118 : };
119 : break;
120 0 : case SUMO_TAG_MEANDATA_LANE:
121 0 : if (buildLaneMeanData(obj,
122 : obj->getStringAttribute(SUMO_ATTR_ID),
123 : obj->getStringAttribute(SUMO_ATTR_FILE),
124 : obj->getStringAttribute(SUMO_ATTR_TYPE),
125 : obj->getTimeAttribute(SUMO_ATTR_PERIOD),
126 : obj->getTimeAttribute(SUMO_ATTR_BEGIN),
127 : obj->getTimeAttribute(SUMO_ATTR_END),
128 0 : obj->getBoolAttribute(SUMO_ATTR_TRACK_VEHICLES),
129 : obj->getStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES),
130 0 : obj->getBoolAttribute(SUMO_ATTR_AGGREGATE),
131 : obj->getStringListAttribute(SUMO_ATTR_EDGES),
132 : obj->getStringAttribute(SUMO_ATTR_EDGESFILE),
133 : obj->getStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY),
134 0 : obj->getBoolAttribute(SUMO_ATTR_WITH_INTERNAL),
135 : obj->getStringListAttribute(SUMO_ATTR_DETECT_PERSONS),
136 : obj->getDoubleAttribute(SUMO_ATTR_MIN_SAMPLES),
137 : obj->getDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME),
138 : obj->getStringListAttribute(SUMO_ATTR_VTYPES),
139 : obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD))) {
140 0 : obj->markAsCreated();
141 : }
142 : break;
143 : default:
144 : break;
145 : }
146 : // now iterate over childrens
147 0 : for (const auto& child : obj->getSumoBaseObjectChildren()) {
148 : // call this function recursively
149 0 : parseSumoBaseObject(child);
150 : }
151 : }
152 0 : }
153 :
154 :
155 : void
156 0 : MeanDataHandler::parseEdgeMeanData(const SUMOSAXAttributes& attrs) {
157 : // declare Ok Flag
158 0 : bool parsedOk = true;
159 : // needed attributes
160 0 : const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
161 0 : const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
162 : // optional attributes
163 0 : std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), parsedOk, "");
164 0 : const SUMOTime period = attrs.getOptSUMOTimeReporting(SUMO_ATTR_PERIOD, id.c_str(), parsedOk, TIME2STEPS(-1));
165 0 : const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, TIME2STEPS(-1));
166 0 : const SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, id.c_str(), parsedOk, TIME2STEPS(-1));
167 0 : const bool trackVehicles = attrs.getOpt<bool>(SUMO_ATTR_TRACK_VEHICLES, id.c_str(), parsedOk, false);
168 0 : const std::vector<std::string> writeAttributes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_WRITE_ATTRIBUTES, id.c_str(), parsedOk, {});
169 0 : const bool aggregate = attrs.getOpt<bool>(SUMO_ATTR_AGGREGATE, id.c_str(), parsedOk, false);
170 0 : const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, {});
171 0 : const std::string edgeFile = attrs.getOpt<std::string>(SUMO_ATTR_EDGESFILE, id.c_str(), parsedOk, "");
172 0 : const std::string excludeEmpty = attrs.getOpt<std::string>(SUMO_ATTR_EXCLUDE_EMPTY, id.c_str(), parsedOk, SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES));
173 0 : const bool withInternal = attrs.getOpt<bool>(SUMO_ATTR_WITH_INTERNAL, id.c_str(), parsedOk, false);
174 0 : const std::vector<std::string> detectPersons = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_DETECT_PERSONS, id.c_str(), parsedOk, {});
175 0 : const double minSamples = attrs.getOpt<double>(SUMO_ATTR_MIN_SAMPLES, id.c_str(), parsedOk, 0);
176 0 : const double maxTravel = attrs.getOpt<double>(SUMO_ATTR_MAX_TRAVELTIME, id.c_str(), parsedOk, 100000);
177 0 : const std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, {});
178 0 : const double speedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 0.1);
179 : // adjust type
180 0 : if (type == "performance") {
181 : type = "";
182 0 : } else if (type == "hbefa") {
183 0 : WRITE_WARNING(TL("The netstate type 'hbefa' is deprecated. Using 'emissions' instead."));
184 : type = "emissions";
185 : }
186 : // continue if flag is ok
187 0 : if (parsedOk && checkType(SUMO_TAG_MEANDATA_EDGE, id, type)) {
188 : // set tag
189 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_MEANDATA_EDGE);
190 : // add all attributes
191 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
192 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
193 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
194 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
195 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
196 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
197 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_TRACK_VEHICLES, trackVehicles);
198 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES, writeAttributes);
199 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_AGGREGATE, aggregate);
200 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
201 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGESFILE, edgeFile);
202 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY, excludeEmpty);
203 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_WITH_INTERNAL, withInternal);
204 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
205 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MIN_SAMPLES, minSamples);
206 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel);
207 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes);
208 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold);
209 : } else {
210 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
211 : }
212 0 : }
213 :
214 :
215 : void
216 0 : MeanDataHandler::parseLaneMeanData(const SUMOSAXAttributes& attrs) {
217 : // declare Ok Flag
218 0 : bool parsedOk = true;
219 : // needed attributes
220 0 : const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
221 0 : const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
222 : // optional attributes
223 0 : const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), parsedOk, "");
224 0 : const SUMOTime period = attrs.getOptSUMOTimeReporting(SUMO_ATTR_PERIOD, id.c_str(), parsedOk, TIME2STEPS(-1));
225 0 : const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, TIME2STEPS(-1));
226 0 : const SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, id.c_str(), parsedOk, TIME2STEPS(-1));
227 0 : const bool trackVehicles = attrs.getOpt<bool>(SUMO_ATTR_TRACK_VEHICLES, id.c_str(), parsedOk, false);
228 0 : const std::vector<std::string> writeAttributes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_WRITE_ATTRIBUTES, id.c_str(), parsedOk, {});
229 0 : const bool aggregate = attrs.getOpt<bool>(SUMO_ATTR_AGGREGATE, id.c_str(), parsedOk, false);
230 0 : const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, {});
231 0 : const std::string edgeFile = attrs.getOpt<std::string>(SUMO_ATTR_EDGESFILE, id.c_str(), parsedOk, "");
232 0 : const std::string excludeEmpty = attrs.getOpt<std::string>(SUMO_ATTR_EXCLUDE_EMPTY, id.c_str(), parsedOk, SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES));
233 0 : const bool withInternal = attrs.getOpt<bool>(SUMO_ATTR_WITH_INTERNAL, id.c_str(), parsedOk, false);
234 0 : const std::vector<std::string> detectPersons = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_DETECT_PERSONS, id.c_str(), parsedOk, {});
235 0 : const double minSamples = attrs.getOpt<double>(SUMO_ATTR_MIN_SAMPLES, id.c_str(), parsedOk, 0);
236 0 : const double maxTravel = attrs.getOpt<double>(SUMO_ATTR_MAX_TRAVELTIME, id.c_str(), parsedOk, 100000);
237 0 : const std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, {});
238 0 : const double speedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 0.1);
239 : // continue if flag is ok
240 0 : if (parsedOk && checkType(SUMO_TAG_MEANDATA_LANE, id, type)) {
241 : // set tag
242 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_MEANDATA_LANE);
243 : // add all attributes
244 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
245 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
246 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
247 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
248 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
249 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
250 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_TRACK_VEHICLES, trackVehicles);
251 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES, writeAttributes);
252 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_AGGREGATE, aggregate);
253 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
254 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGESFILE, edgeFile);
255 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY, excludeEmpty);
256 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_WITH_INTERNAL, withInternal);
257 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
258 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MIN_SAMPLES, minSamples);
259 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel);
260 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes);
261 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold);
262 : } else {
263 0 : myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
264 : }
265 0 : }
266 :
267 :
268 : bool
269 0 : MeanDataHandler::checkType(const SumoXMLTag currentTag, const std::string& id, const std::string& type) {
270 : if (SUMOXMLDefinitions::MeanDataTypes.hasString(type)) {
271 0 : return true;
272 : } else {
273 0 : writeError(TLF("Attribute '%' defined in % with id '%' doesn't have a valid value (given '%').", toString(SUMO_ATTR_TYPE), toString(currentTag), id, type));
274 0 : return false;
275 : }
276 : }
277 :
278 : /****************************************************************************/
|