Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/handlers/MeanDataHandler.cpp
169678 views
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
MeanDataHandler::MeanDataHandler(const std::string& filename) :
34
CommonHandler(filename) {
35
}
36
37
38
MeanDataHandler::~MeanDataHandler() {}
39
40
41
bool
42
MeanDataHandler::beginParseAttributes(SumoXMLTag tag, const SUMOSAXAttributes& attrs) {
43
// open SUMOBaseOBject
44
myCommonXMLStructure.openSUMOBaseOBject();
45
// check tag
46
try {
47
switch (tag) {
48
case SUMO_TAG_MEANDATA_EDGE:
49
parseEdgeMeanData(attrs);
50
break;
51
case SUMO_TAG_MEANDATA_LANE:
52
parseLaneMeanData(attrs);
53
break;
54
case SUMO_TAG_PARAM:
55
WRITE_WARNING(TL("MeanData elements cannot load attributes as params"));
56
break;
57
default:
58
// tag cannot be parsed in MeanDataHandler
59
myCommonXMLStructure.abortSUMOBaseOBject();
60
return false;
61
}
62
} catch (InvalidArgument& e) {
63
writeError(e.what());
64
}
65
return true;
66
}
67
68
69
void
70
MeanDataHandler::endParseAttributes() {
71
// get last inserted object
72
CommonXMLStructure::SumoBaseObject* obj = myCommonXMLStructure.getCurrentSumoBaseObject();
73
// close SUMOBaseOBject
74
if (obj) {
75
myCommonXMLStructure.closeSUMOBaseOBject();
76
// check tag
77
switch (obj->getTag()) {
78
case SUMO_TAG_MEANDATA_EDGE:
79
case SUMO_TAG_MEANDATA_LANE:
80
parseSumoBaseObject(obj);
81
// delete object
82
delete obj;
83
break;
84
default:
85
break;
86
}
87
}
88
}
89
90
91
void
92
MeanDataHandler::parseSumoBaseObject(CommonXMLStructure::SumoBaseObject* obj) {
93
// check if loading was aborted
94
if (!myAbortLoading) {
95
// switch tag
96
switch (obj->getTag()) {
97
case SUMO_TAG_MEANDATA_EDGE:
98
if (buildEdgeMeanData(obj,
99
obj->getStringAttribute(SUMO_ATTR_ID),
100
obj->getStringAttribute(SUMO_ATTR_FILE),
101
obj->getTimeAttribute(SUMO_ATTR_PERIOD),
102
obj->getTimeAttribute(SUMO_ATTR_BEGIN),
103
obj->getTimeAttribute(SUMO_ATTR_END),
104
obj->getBoolAttribute(SUMO_ATTR_TRACK_VEHICLES),
105
obj->getStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES),
106
obj->getBoolAttribute(SUMO_ATTR_AGGREGATE),
107
obj->getStringListAttribute(SUMO_ATTR_EDGES),
108
obj->getStringAttribute(SUMO_ATTR_EDGESFILE),
109
obj->getStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY),
110
obj->getBoolAttribute(SUMO_ATTR_WITH_INTERNAL),
111
obj->getStringListAttribute(SUMO_ATTR_DETECT_PERSONS),
112
obj->getDoubleAttribute(SUMO_ATTR_MIN_SAMPLES),
113
obj->getDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME),
114
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
115
obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD))) {
116
obj->markAsCreated();
117
};
118
break;
119
case SUMO_TAG_MEANDATA_LANE:
120
if (buildLaneMeanData(obj,
121
obj->getStringAttribute(SUMO_ATTR_ID),
122
obj->getStringAttribute(SUMO_ATTR_FILE),
123
obj->getTimeAttribute(SUMO_ATTR_PERIOD),
124
obj->getTimeAttribute(SUMO_ATTR_BEGIN),
125
obj->getTimeAttribute(SUMO_ATTR_END),
126
obj->getBoolAttribute(SUMO_ATTR_TRACK_VEHICLES),
127
obj->getStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES),
128
obj->getBoolAttribute(SUMO_ATTR_AGGREGATE),
129
obj->getStringListAttribute(SUMO_ATTR_EDGES),
130
obj->getStringAttribute(SUMO_ATTR_EDGESFILE),
131
obj->getStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY),
132
obj->getBoolAttribute(SUMO_ATTR_WITH_INTERNAL),
133
obj->getStringListAttribute(SUMO_ATTR_DETECT_PERSONS),
134
obj->getDoubleAttribute(SUMO_ATTR_MIN_SAMPLES),
135
obj->getDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME),
136
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
137
obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD))) {
138
obj->markAsCreated();
139
}
140
break;
141
default:
142
break;
143
}
144
// now iterate over childrens
145
for (const auto& child : obj->getSumoBaseObjectChildren()) {
146
// call this function recursively
147
parseSumoBaseObject(child);
148
}
149
}
150
}
151
152
153
void
154
MeanDataHandler::parseEdgeMeanData(const SUMOSAXAttributes& attrs) {
155
// declare Ok Flag
156
bool parsedOk = true;
157
// needed attributes
158
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
159
const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
160
// optional attributes
161
const SUMOTime period = attrs.getOptSUMOTimeReporting(SUMO_ATTR_PERIOD, id.c_str(), parsedOk, TIME2STEPS(-1));
162
const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, TIME2STEPS(-1));
163
const SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, id.c_str(), parsedOk, TIME2STEPS(-1));
164
const bool trackVehicles = attrs.getOpt<bool>(SUMO_ATTR_TRACK_VEHICLES, id.c_str(), parsedOk, false);
165
const std::vector<std::string> writeAttributes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_WRITE_ATTRIBUTES, id.c_str(), parsedOk, {});
166
const bool aggregate = attrs.getOpt<bool>(SUMO_ATTR_AGGREGATE, id.c_str(), parsedOk, false);
167
const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, {});
168
const std::string edgeFile = attrs.getOpt<std::string>(SUMO_ATTR_EDGESFILE, id.c_str(), parsedOk, "");
169
const std::string excludeEmpty = attrs.getOpt<std::string>(SUMO_ATTR_EXCLUDE_EMPTY, id.c_str(), parsedOk, SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES));
170
const bool withInternal = attrs.getOpt<bool>(SUMO_ATTR_WITH_INTERNAL, id.c_str(), parsedOk, false);
171
const std::vector<std::string> detectPersons = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_DETECT_PERSONS, id.c_str(), parsedOk, {});
172
const double minSamples = attrs.getOpt<double>(SUMO_ATTR_MIN_SAMPLES, id.c_str(), parsedOk, 0);
173
const double maxTravel = attrs.getOpt<double>(SUMO_ATTR_MAX_TRAVELTIME, id.c_str(), parsedOk, 100000);
174
const std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, {});
175
const double speedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 0.1);
176
// continue if flag is ok
177
if (parsedOk) {
178
// set tag
179
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_MEANDATA_EDGE);
180
// add all attributes
181
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
182
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
183
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
184
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
185
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
186
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_TRACK_VEHICLES, trackVehicles);
187
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES, writeAttributes);
188
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_AGGREGATE, aggregate);
189
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
190
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGESFILE, edgeFile);
191
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY, excludeEmpty);
192
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_WITH_INTERNAL, withInternal);
193
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
194
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MIN_SAMPLES, minSamples);
195
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel);
196
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes);
197
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold);
198
} else {
199
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
200
}
201
}
202
203
204
void
205
MeanDataHandler::parseLaneMeanData(const SUMOSAXAttributes& attrs) {
206
// declare Ok Flag
207
bool parsedOk = true;
208
// needed attributes
209
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
210
const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
211
// optional attributes
212
const SUMOTime period = attrs.getOptSUMOTimeReporting(SUMO_ATTR_PERIOD, id.c_str(), parsedOk, TIME2STEPS(-1));
213
const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, TIME2STEPS(-1));
214
const SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, id.c_str(), parsedOk, TIME2STEPS(-1));
215
const bool trackVehicles = attrs.getOpt<bool>(SUMO_ATTR_TRACK_VEHICLES, id.c_str(), parsedOk, false);
216
const std::vector<std::string> writeAttributes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_WRITE_ATTRIBUTES, id.c_str(), parsedOk, {});
217
const bool aggregate = attrs.getOpt<bool>(SUMO_ATTR_AGGREGATE, id.c_str(), parsedOk, false);
218
const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, {});
219
const std::string edgeFile = attrs.getOpt<std::string>(SUMO_ATTR_EDGESFILE, id.c_str(), parsedOk, "");
220
const std::string excludeEmpty = attrs.getOpt<std::string>(SUMO_ATTR_EXCLUDE_EMPTY, id.c_str(), parsedOk, SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES));
221
const bool withInternal = attrs.getOpt<bool>(SUMO_ATTR_WITH_INTERNAL, id.c_str(), parsedOk, false);
222
const std::vector<std::string> detectPersons = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_DETECT_PERSONS, id.c_str(), parsedOk, {});
223
const double minSamples = attrs.getOpt<double>(SUMO_ATTR_MIN_SAMPLES, id.c_str(), parsedOk, 0);
224
const double maxTravel = attrs.getOpt<double>(SUMO_ATTR_MAX_TRAVELTIME, id.c_str(), parsedOk, 100000);
225
const std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, {});
226
const double speedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 0.1);
227
// continue if flag is ok
228
if (parsedOk) {
229
// set tag
230
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_MEANDATA_LANE);
231
// add all attributes
232
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
233
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
234
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
235
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
236
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
237
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_TRACK_VEHICLES, trackVehicles);
238
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_WRITE_ATTRIBUTES, writeAttributes);
239
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_AGGREGATE, aggregate);
240
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
241
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGESFILE, edgeFile);
242
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EXCLUDE_EMPTY, excludeEmpty);
243
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_WITH_INTERNAL, withInternal);
244
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
245
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MIN_SAMPLES, minSamples);
246
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_MAX_TRAVELTIME, maxTravel);
247
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes);
248
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, speedThreshold);
249
} else {
250
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
251
}
252
}
253
254
/****************************************************************************/
255
256