Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
od2trips_main.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2002-2026 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/****************************************************************************/
22// Main for OD2TRIPS
23/****************************************************************************/
24#include <config.h>
25
26#ifdef HAVE_VERSION_H
27#include <version.h>
28#endif
29
30#include <iostream>
31#include <algorithm>
32#include <cmath>
33#include <cstdlib>
34#include <string>
43#include <utils/xml/XMLSubSys.h>
45#include <od/ODDistrictCont.h>
47#include <od/ODMatrix.h>
55
56
57// ===========================================================================
58// functions
59// ===========================================================================
60void
63 oc.addCallExample("-c <CONFIGURATION>", TL("run with configuration file"));
64
65 // insert options sub-topics
66 SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
67 oc.addOptionSubTopic("Input");
68 oc.addOptionSubTopic("Output");
69 oc.addOptionSubTopic("Time");
70 oc.addOptionSubTopic("Processing");
71 oc.addOptionSubTopic("Defaults");
72 SystemFrame::addReportOptions(oc); // fill this subtopic, too
73
74
75 // register the file input options
76 oc.doRegister("taz-files", 'n', new Option_FileName());
77 oc.addSynonyme("taz-files", "taz");
78 oc.addSynonyme("taz-files", "net-file");
79 oc.addSynonyme("taz-files", "net");
80 oc.addDescription("taz-files", "Input", TL("Loads TAZ (districts; also from networks) from FILE(s)"));
81
82 oc.doRegister("od-matrix-files", 'd', new Option_FileName());
83 oc.addSynonyme("od-matrix-files", "od-files");
84 oc.addSynonyme("od-matrix-files", "od");
85 oc.addDescription("od-matrix-files", "Input", TL("Loads O/D-files from FILE(s)"));
86
87 oc.doRegister("od-amitran-files", new Option_FileName());
88 oc.addSynonyme("od-amitran-files", "amitran-files");
89 oc.addSynonyme("od-amitran-files", "amitran");
90 oc.addDescription("od-amitran-files", "Input", TL("Loads O/D-matrix in Amitran format from FILE(s)"));
91
92 oc.doRegister("tazrelation-files", 'z', new Option_FileName());
93 oc.addDescription("tazrelation-files", "Input", TL("Loads O/D-matrix in tazRelation format from FILE(s)"));
94
95 oc.doRegister("tazrelation-attribute", new Option_String("count"));
96 oc.addSynonyme("tazrelation-attribute", "attribute");
97 oc.addDescription("tazrelation-attribute", "Input", TL("Define data attribute for loading counts (default 'count')"));
98
99 // register the file output options
100 oc.doRegister("output-file", 'o', new Option_FileName());
101 oc.addSynonyme("output-file", "output", true);
102 oc.addDescription("output-file", "Output", TL("Writes trip definitions into FILE"));
103
104 oc.doRegister("flow-output", new Option_FileName());
105 oc.addDescription("flow-output", "Output", TL("Writes flow definitions into FILE"));
106
107 oc.doRegister("flow-output.probability", new Option_Bool(false));
108 oc.addDescription("flow-output.probability", "Output", TL("Writes probabilistic flow instead of evenly spaced flow"));
109
110 oc.doRegister("flow-output.poisson", new Option_Bool(false));
111 oc.addDescription("flow-output.poisson", "Output", TL("Writes poisson distributed flow instead of evenly spaced flow"));
112
113 oc.doRegister("pedestrians", new Option_Bool(false));
114 oc.addDescription("pedestrians", "Output", TL("Writes pedestrians instead of vehicles"));
115
116 oc.doRegister("persontrips", new Option_Bool(false));
117 oc.addDescription("persontrips", "Output", TL("Writes persontrips instead of vehicles"));
118
119 oc.doRegister("persontrips.modes", new Option_StringVector());
120 oc.addDescription("persontrips.modes", "Output", TL("Add modes attribute to personTrips"));
121
122 oc.doRegister("ignore-vehicle-type", new Option_Bool(false));
123 oc.addSynonyme("ignore-vehicle-type", "no-vtype", true);
124 oc.addDescription("ignore-vehicle-type", "Output", TL("Does not save vtype information"));
125
126 oc.doRegister("junctions", new Option_Bool(false));
127 oc.addDescription("junctions", "Output", TL("Writes trips between junctions"));
128
129
130 // register the time settings
131 oc.doRegister("begin", 'b', new Option_String("0", "TIME"));
132 oc.addDescription("begin", "Time", TL("Defines the begin time; Previous trips will be discarded"));
133
134 oc.doRegister("end", 'e', new Option_String("-1", "TIME"));
135 oc.addDescription("end", "Time", TL("Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent"));
136
137
138 // register the data processing options
139 oc.doRegister("scale", 's', new Option_Float(1));
140 oc.addDescription("scale", "Processing", TL("Scales the loaded flows by FLOAT"));
141
142 oc.doRegister("spread.uniform", new Option_Bool(false));
143 oc.addDescription("spread.uniform", "Processing", TL("Spreads trips uniformly over each time period"));
144
145 oc.doRegister("different-source-sink", new Option_Bool(false));
146 oc.addDescription("different-source-sink", "Processing", TL("Always choose source and sink edge which are not identical"));
147
148 oc.doRegister("vtype", new Option_String(""));
149 oc.addDescription("vtype", "Processing", TL("Defines the name of the vehicle type to use"));
150
151 oc.doRegister("prefix", new Option_String(""));
152 oc.addDescription("prefix", "Processing", TL("Defines the prefix for vehicle names"));
153
154 oc.doRegister("timeline", new Option_StringVector());
155 oc.addDescription("timeline", "Processing", TL("Uses STR[] as a timeline definition"));
156
157 oc.doRegister("timeline.day-in-hours", new Option_Bool(false));
158 oc.addDescription("timeline.day-in-hours", "Processing", TL("Uses STR as a 24h-timeline definition"));
159
160 oc.doRegister("ignore-errors", new Option_Bool(false)); // !!! describe, document
161 oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
162 oc.addDescription("ignore-errors", "Report", TL("Continue on broken input"));
163
164 oc.doRegister("no-step-log", new Option_Bool(false));
165 oc.addDescription("no-step-log", "Processing", TL("Disable console output of current time step"));
166
167
168 // register defaults options
169 oc.doRegister("departlane", new Option_String("free"));
170 oc.addDescription("departlane", "Defaults", TL("Assigns a default depart lane"));
171
172 oc.doRegister("departpos", new Option_String());
173 oc.addDescription("departpos", "Defaults", TL("Assigns a default depart position"));
174
175 oc.doRegister("departspeed", new Option_String("max"));
176 oc.addDescription("departspeed", "Defaults", TL("Assigns a default depart speed"));
177
178 oc.doRegister("arrivallane", new Option_String());
179 oc.addDescription("arrivallane", "Defaults", TL("Assigns a default arrival lane"));
180
181 oc.doRegister("arrivalpos", new Option_String());
182 oc.addDescription("arrivalpos", "Defaults", TL("Assigns a default arrival position"));
183
184 oc.doRegister("arrivalspeed", new Option_String());
185 oc.addDescription("arrivalspeed", "Defaults", TL("Assigns a default arrival speed"));
186
187 // add rand options
189}
190
191bool
194 bool ok = true;
195 if (!oc.isSet("taz-files")) {
196 WRITE_ERROR(TL("No TAZ input file (-n) specified."));
197 ok = false;
198 }
199 if (!oc.isSet("od-matrix-files") && !oc.isSet("od-amitran-files") && !oc.isSet("tazrelation-files")) {
200 WRITE_ERROR(TL("No input specified."));
201 ok = false;
202 }
203 if (!oc.isSet("output-file") && !oc.isSet("flow-output")) {
204 WRITE_ERROR(TL("No trip table output file (-o) or flow-output is specified."));
205 ok = false;
206 }
207 if (oc.getBool("flow-output.probability") && oc.getBool("flow-output.poisson")) {
208 WRITE_ERROR(TL("Only one of the options 'flow-output.probability' and 'flow-output.poisson' may be set."));
209 ok = false;
210 }
211 if (oc.getBool("pedestrians") && oc.getBool("persontrips")) {
212 WRITE_ERROR(TL("Only one of the Options 'pedestrians' and 'persontrips' may be set."));
213 ok = false;
214 }
215 //
217 std::string error;
218 if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
219 WRITE_ERROR(error);
220 ok = false;
221 }
222 if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
223 WRITE_ERROR(error);
224 ok = false;
225 }
226 if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
227 WRITE_ERROR(error);
228 ok = false;
229 }
230 if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
231 WRITE_ERROR(error);
232 ok = false;
233 }
234 if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
235 WRITE_ERROR(error);
236 ok = false;
237 }
238 if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
239 WRITE_ERROR(error);
240 ok = false;
241 }
243 return ok;
244}
245
246
247
248
249/* -------------------------------------------------------------------------
250 * main
251 * ----------------------------------------------------------------------- */
252int
253main(int argc, char** argv) {
255 oc.setApplicationDescription(TL("Importer of O/D-matrices for the microscopic, multi-modal traffic simulation SUMO."));
256 oc.setApplicationName("od2trips", "Eclipse SUMO od2trips " VERSION_STRING);
257 int ret = 0;
258 try {
259 // initialise subsystems
261 fillOptions();
262 OptionsIO::setArgs(argc, argv);
264 if (oc.processMetaOptions(argc < 2)) {
266 return 0;
267 }
268 XMLSubSys::setValidation(oc.getString("xml-validation"), "never", "never");
270 if (!checkOptions()) {
271 throw ProcessError();
272 }
274 // load the districts
275 // check whether the user gave a net filename
276 if (!oc.isSet("taz-files")) {
277 throw ProcessError(TL("You must supply a TAZ, network or districts file ('-n')."));
278 }
279 // get the file name and set it
280 ODDistrictCont districts;
281 districts.loadDistricts(oc.getStringVector("taz-files"));
282 if (districts.size() == 0) {
283 throw ProcessError(TL("No districts loaded."));
284 }
285 // load the matrix
286 ODMatrix matrix(districts, oc.getFloat("scale"));
287 matrix.loadMatrix(oc);
288 if (matrix.getNumLoaded() == 0) {
289 throw ProcessError(TL("No vehicles loaded."));
290 }
291 if (MsgHandler::getErrorInstance()->wasInformed() && !oc.getBool("ignore-errors")) {
292 throw ProcessError(TL("Loading failed."));
293 }
294 WRITE_MESSAGE(toString(matrix.getNumLoaded()) + " vehicles loaded.");
295 // apply a curve if wished
296 if (oc.isSet("timeline")) {
297 matrix.applyCurve(matrix.parseTimeLine(oc.getStringVector("timeline"), oc.getBool("timeline.day-in-hours")));
298 }
299 const std::string modes = toString(oc.getStringVector("persontrips.modes"));
300 // write
301 bool haveOutput = false;
302 const SUMOTime end = oc.isDefault("end") ? SUMOTime_MAX : string2time(oc.getString("end"));
303 if (OutputDevice::createDeviceByOption("output-file", "routes", "routes_file.xsd")) {
304 matrix.write(string2time(oc.getString("begin")), end,
305 OutputDevice::getDeviceByOption("output-file"),
306 oc.getBool("spread.uniform"), oc.getBool("different-source-sink"),
307 oc.getBool("ignore-vehicle-type"),
308 oc.getString("prefix"), !oc.getBool("no-step-log"),
309 oc.getBool("pedestrians"),
310 oc.getBool("persontrips"), modes);
311 haveOutput = true;
312 }
313 if (OutputDevice::createDeviceByOption("flow-output", "routes", "routes_file.xsd")) {
314 matrix.writeFlows(string2time(oc.getString("begin")), end,
315 OutputDevice::getDeviceByOption("flow-output"),
316 oc.getBool("ignore-vehicle-type"), oc.getString("prefix"),
317 oc.getBool("flow-output.probability"),
318 oc.getBool("flow-output.poisson"),
319 oc.getBool("pedestrians"),
320 oc.getBool("persontrips"), modes);
321 haveOutput = true;
322 }
323 if (!haveOutput) {
324 throw ProcessError(TL("No output file given."));
325 }
326 WRITE_MESSAGE(toString(matrix.getNumDiscarded()) + " vehicles discarded.");
327 WRITE_MESSAGE(toString(matrix.getNumWritten()) + " vehicles written.");
328 } catch (const ProcessError& e) {
329 if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
330 WRITE_ERROR(e.what());
331 }
332 MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
333 ret = 1;
334#ifndef _DEBUG
335 } catch (const std::exception& e) {
336 if (std::string(e.what()) != std::string("")) {
337 WRITE_ERROR(e.what());
338 }
339 MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
340 ret = 1;
341 } catch (...) {
342 MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
343 ret = 1;
344#endif
345 }
347 if (ret == 0) {
348 std::cout << "Success." << std::endl;
349 }
350 return ret;
351}
352
353
354/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_MESSAGE(msg)
Definition MsgHandler.h:288
#define WRITE_ERROR(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:304
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
#define SUMOTime_MAX
Definition SUMOTime.h:34
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
static void initOutputOptions()
init output options
int size() const
Returns the number of stored items within the container.
A container for districts.
void loadDistricts(std::vector< std::string > files)
load districts from files
An O/D (origin/destination) matrix.
Definition ODMatrix.h:68
void writeFlows(const SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool noVtype, const std::string &prefix, bool asProbability=false, bool asPoisson=false, bool pedestrians=false, bool persontrips=false, const std::string &modes="")
Writes the flows stored in the matrix.
Definition ODMatrix.cpp:343
double getNumLoaded() const
Returns the number of loaded vehicles.
Definition ODMatrix.cpp:607
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
Definition ODMatrix.cpp:641
void write(SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool uniform, const bool differSourceSink, const bool noVtype, const std::string &prefix, const bool stepLog, bool pedestrians, bool persontrips, const std::string &modes)
Writes the vehicles stored in the matrix assigning the sources and sinks.
Definition ODMatrix.cpp:233
Distribution_Points parseTimeLine(const std::vector< std::string > &def, bool timelineDayInHours)
split the given timeline
Definition ODMatrix.cpp:739
void loadMatrix(OptionsCont &oc)
read a matrix in one of several formats
Definition ODMatrix.cpp:654
double getNumWritten() const
Returns the number of written vehicles.
Definition ODMatrix.cpp:613
double getNumDiscarded() const
Returns the number of discarded vehicles.
Definition ODMatrix.cpp:619
A storage for options typed value containers)
Definition OptionsCont.h:89
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
void setApplicationName(const std::string &appName, const std::string &fullName)
Sets the application name.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
void doRegister(const std::string &name, Option *o)
Adds an option under the given name.
void setApplicationDescription(const std::string &appDesc)
Sets the application description.
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
static OptionsCont & getOptions()
Retrieves the options.
bool processMetaOptions(bool missingOptions)
Checks for help and configuration output, returns whether we should exit.
void addCallExample(const std::string &example, const std::string &desc)
Add a call example.
static void setArgs(int argc, char **argv)
Stores the command line arguments for later parsing.
Definition OptionsIO.cpp:59
static void getOptions(const bool commandLineOnly=false)
Parses the command line arguments and loads the configuration.
Definition OptionsIO.cpp:75
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
static bool createDeviceByOption(const std::string &optionName, const std::string &rootElement="", const std::string &schemaFile="", const int maximumDepth=2)
Creates the device using the output definition stored in the named option.
static void insertRandOptions(OptionsCont &oc)
Initialises the given options container with random number options.
static void initRandGlobal(SumoRNG *which=nullptr)
Reads the given random number options and initialises the random number generator in accordance.
Structure representing possible vehicle parameter.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
double departSpeed
(optional) The initial speed of the vehicle
static bool parseArrivalLane(const std::string &val, const std::string &element, const std::string &id, int &lane, ArrivalLaneDefinition &ald, std::string &error)
Validates a given arrivalLane value.
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
static bool parseDepartSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, DepartSpeedDefinition &dsd, std::string &error)
Validates a given departSpeed value.
static bool parseArrivalPos(const std::string &val, const std::string &element, const std::string &id, double &pos, ArrivalPosDefinition &apd, std::string &error)
Validates a given arrivalPos value.
static bool parseArrivalSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, ArrivalSpeedDefinition &asd, std::string &error)
Validates a given arrivalSpeed value.
double departPos
(optional) The position the vehicle shall depart from
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
double arrivalPos
(optional) The position the vehicle shall arrive on
static bool parseDepartLane(const std::string &val, const std::string &element, const std::string &id, int &lane, DepartLaneDefinition &dld, std::string &error)
Validates a given departLane value.
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
static bool parseDepartPos(const std::string &val, const std::string &element, const std::string &id, double &pos, DepartPosDefinition &dpd, std::string &error)
Validates a given departPos value.
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
static void close()
Closes all of an applications subsystems.
static bool checkOptions(OptionsCont &oc)
checks shared options and sets StdDefs
static void addConfigurationOptions(OptionsCont &oc)
Adds configuration options to the given container.
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme, const std::string &routeValidationScheme)
Enables or disables validation.
Definition XMLSubSys.cpp:88
static void init()
Initialises the xml-subsystem.
Definition XMLSubSys.cpp:61
bool checkOptions()
void fillOptions()
int main(int argc, char **argv)