Eclipse SUMO - Simulation of Urban MObility
od2trips_main.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2002-2020 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>
35 #include <utils/options/Option.h>
42 #include <utils/common/ToString.h>
43 #include <utils/xml/XMLSubSys.h>
45 #include <od/ODDistrictCont.h>
46 #include <od/ODDistrictHandler.h>
47 #include <od/ODMatrix.h>
49 #include <utils/common/SUMOTime.h>
55 
56 
57 // ===========================================================================
58 // functions
59 // ===========================================================================
60 void
63  oc.addCallExample("-c <CONFIGURATION>", "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", "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", "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", "Loads O/D-matrix in Amitran format from FILE(s)");
91 
92 
93  // register the file output options
94  oc.doRegister("output-file", 'o', new Option_FileName());
95  oc.addSynonyme("output-file", "output", true);
96  oc.addDescription("output-file", "Output", "Writes trip definitions into FILE");
97 
98  oc.doRegister("flow-output", new Option_FileName());
99  oc.addDescription("flow-output", "Output", "Writes flow definitions into FILE");
100 
101  oc.doRegister("flow-output.probability", new Option_Bool(false));
102  oc.addDescription("flow-output.probability", "Output", "Writes probabilistic flow instead of evenly spaced flow");
103 
104  oc.doRegister("pedestrians", new Option_Bool(false));
105  oc.addDescription("pedestrians", "Output", "Writes pedestrians instead of vehicles");
106 
107  oc.doRegister("persontrips", new Option_Bool(false));
108  oc.addDescription("persontrips", "Output", "Writes persontrips instead of vehicles");
109 
110  oc.doRegister("persontrips.modes", new Option_StringVector());
111  oc.addDescription("persontrips.modes", "Output", "Add modes attribute to personTrips");
112 
113  oc.doRegister("ignore-vehicle-type", new Option_Bool(false));
114  oc.addSynonyme("ignore-vehicle-type", "no-vtype", true);
115  oc.addDescription("ignore-vehicle-type", "Output", "Does not save vtype information");
116 
117 
118  // register the time settings
119  oc.doRegister("begin", 'b', new Option_String("0", "TIME"));
120  oc.addDescription("begin", "Time", "Defines the begin time; Previous trips will be discarded");
121 
122  oc.doRegister("end", 'e', new Option_String(SUMOTIME_MAXSTRING, "TIME"));
123  oc.addDescription("end", "Time", "Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent");
124 
125 
126  // register the data processing options
127  oc.doRegister("scale", 's', new Option_Float(1));
128  oc.addDescription("scale", "Processing", "Scales the loaded flows by FLOAT");
129 
130  oc.doRegister("spread.uniform", new Option_Bool(false));
131  oc.addDescription("spread.uniform", "Processing", "Spreads trips uniformly over each time period");
132 
133  oc.doRegister("different-source-sink", new Option_Bool(false));
134  oc.addDescription("different-source-sink", "Processing", "Always choose source and sink edge which are not identical");
135 
136  oc.doRegister("vtype", new Option_String(""));
137  oc.addDescription("vtype", "Processing", "Defines the name of the vehicle type to use");
138 
139  oc.doRegister("prefix", new Option_String(""));
140  oc.addDescription("prefix", "Processing", "Defines the prefix for vehicle names");
141 
142  oc.doRegister("timeline", new Option_StringVector());
143  oc.addDescription("timeline", "Processing", "Uses STR[] as a timeline definition");
144 
145  oc.doRegister("timeline.day-in-hours", new Option_Bool(false));
146  oc.addDescription("timeline.day-in-hours", "Processing", "Uses STR as a 24h-timeline definition");
147 
148  oc.doRegister("ignore-errors", new Option_Bool(false)); // !!! describe, document
149  oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
150  oc.addDescription("ignore-errors", "Report", "Continue on broken input");
151 
152  oc.doRegister("no-step-log", new Option_Bool(false));
153  oc.addDescription("no-step-log", "Processing", "Disable console output of current time step");
154 
155 
156  // register defaults options
157  oc.doRegister("departlane", new Option_String("free"));
158  oc.addDescription("departlane", "Defaults", "Assigns a default depart lane");
159 
160  oc.doRegister("departpos", new Option_String());
161  oc.addDescription("departpos", "Defaults", "Assigns a default depart position");
162 
163  oc.doRegister("departspeed", new Option_String("max"));
164  oc.addDescription("departspeed", "Defaults", "Assigns a default depart speed");
165 
166  oc.doRegister("arrivallane", new Option_String());
167  oc.addDescription("arrivallane", "Defaults", "Assigns a default arrival lane");
168 
169  oc.doRegister("arrivalpos", new Option_String());
170  oc.addDescription("arrivalpos", "Defaults", "Assigns a default arrival position");
171 
172  oc.doRegister("arrivalspeed", new Option_String());
173  oc.addDescription("arrivalspeed", "Defaults", "Assigns a default arrival speed");
174 
175  // add rand options
177 }
178 
179 bool
182  bool ok = true;
183  if (!oc.isSet("taz-files")) {
184  WRITE_ERROR("No TAZ input file (-n) specified.");
185  ok = false;
186  }
187  if (!oc.isSet("od-matrix-files") && !oc.isSet("od-amitran-files")) {
188  WRITE_ERROR("No input specified.");
189  ok = false;
190  }
191  if (!oc.isSet("output-file") && !oc.isSet("flow-output")) {
192  WRITE_ERROR("No trip table output file (-o) or flow-output is specified.");
193  ok = false;
194  }
195  if (oc.getBool("pedestrians") && oc.getBool("persontrips")) {
196  WRITE_ERROR("Only one of the the options 'pedestrians' and 'persontrips' may be set.");
197  ok = false;
198  }
199  //
201  std::string error;
202  if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
203  WRITE_ERROR(error);
204  ok = false;
205  }
206  if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
207  WRITE_ERROR(error);
208  ok = false;
209  }
210  if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
211  WRITE_ERROR(error);
212  ok = false;
213  }
214  if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
215  WRITE_ERROR(error);
216  ok = false;
217  }
218  if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
219  WRITE_ERROR(error);
220  ok = false;
221  }
222  if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
223  WRITE_ERROR(error);
224  ok = false;
225  }
227  return ok;
228 }
229 
230 
231 
232 
233 /* -------------------------------------------------------------------------
234  * main
235  * ----------------------------------------------------------------------- */
236 int
237 main(int argc, char** argv) {
239  // give some application descriptions
240  oc.setApplicationDescription("Importer of O/D-matrices for the microscopic, multi-modal traffic simulation SUMO.");
241  oc.setApplicationName("od2trips", "Eclipse SUMO od2trips Version " VERSION_STRING);
242  int ret = 0;
243  try {
244  // initialise subsystems
245  XMLSubSys::init();
246  fillOptions();
247  OptionsIO::setArgs(argc, argv);
249  if (oc.processMetaOptions(argc < 2)) {
251  return 0;
252  }
253  XMLSubSys::setValidation(oc.getString("xml-validation"), "never", "never");
255  if (!checkOptions()) {
256  throw ProcessError();
257  }
259  // load the districts
260  // check whether the user gave a net filename
261  if (!oc.isSet("taz-files")) {
262  throw ProcessError("You must supply a TAZ, network or districts file ('-n').");
263  }
264  // get the file name and set it
265  ODDistrictCont districts;
266  districts.loadDistricts(oc.getStringVector("taz-files"));
267  if (districts.size() == 0) {
268  throw ProcessError("No districts loaded.");
269  }
270  // load the matrix
271  ODMatrix matrix(districts);
272  matrix.loadMatrix(oc);
273  if (matrix.getNumLoaded() == 0) {
274  throw ProcessError("No vehicles loaded.");
275  }
276  if (MsgHandler::getErrorInstance()->wasInformed() && !oc.getBool("ignore-errors")) {
277  throw ProcessError("Loading failed.");
278  }
279  WRITE_MESSAGE(toString(matrix.getNumLoaded()) + " vehicles loaded.");
280  // apply a curve if wished
281  if (oc.isSet("timeline")) {
282  matrix.applyCurve(matrix.parseTimeLine(oc.getStringVector("timeline"), oc.getBool("timeline.day-in-hours")));
283  }
284  const std::string modes = toString(oc.getStringVector("persontrips.modes"));
285  // write
286  bool haveOutput = false;
287  if (OutputDevice::createDeviceByOption("output-file", "routes", "routes_file.xsd")) {
288  matrix.write(string2time(oc.getString("begin")), string2time(oc.getString("end")),
289  OutputDevice::getDeviceByOption("output-file"),
290  oc.getBool("spread.uniform"), oc.getBool("different-source-sink"),
291  oc.getBool("ignore-vehicle-type"),
292  oc.getString("prefix"), !oc.getBool("no-step-log"),
293  oc.getBool("pedestrians"),
294  oc.getBool("persontrips"), modes);
295  haveOutput = true;
296  }
297  if (OutputDevice::createDeviceByOption("flow-output", "routes", "routes_file.xsd")) {
298  matrix.writeFlows(string2time(oc.getString("begin")), string2time(oc.getString("end")),
299  OutputDevice::getDeviceByOption("flow-output"),
300  oc.getBool("ignore-vehicle-type"), oc.getString("prefix"),
301  oc.getBool("flow-output.probability"), oc.getBool("pedestrians"),
302  oc.getBool("persontrips"), modes);
303  haveOutput = true;
304  }
305  if (!haveOutput) {
306  throw ProcessError("No output file given.");
307  }
308  WRITE_MESSAGE(toString(matrix.getNumDiscarded()) + " vehicles discarded.");
309  WRITE_MESSAGE(toString(matrix.getNumWritten()) + " vehicles written.");
310  } catch (const ProcessError& e) {
311  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
312  WRITE_ERROR(e.what());
313  }
314  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
315  ret = 1;
316 #ifndef _DEBUG
317  } catch (const std::exception& e) {
318  if (std::string(e.what()) != std::string("")) {
319  WRITE_ERROR(e.what());
320  }
321  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
322  ret = 1;
323  } catch (...) {
324  MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
325  ret = 1;
326 #endif
327  }
329  if (ret == 0) {
330  std::cout << "Success." << std::endl;
331  }
332  return ret;
333 }
334 
335 
336 /****************************************************************************/
#define WRITE_MESSAGE(msg)
Definition: MsgHandler.h:278
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:284
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition: SUMOTime.cpp:45
#define SUMOTIME_MAXSTRING
Definition: SUMOTime.h:34
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:44
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:80
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:117
static void initOutputOptions()
init output options
Definition: MsgHandler.cpp:217
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:67
double getNumLoaded() const
Returns the number of loaded vehicles.
Definition: ODMatrix.cpp:582
void writeFlows(const SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool noVtype, const std::string &prefix, bool asProbability=false, bool pedestrians=false, bool persontrips=false, const std::string &modes="")
Writes the flows stored in the matrix.
Definition: ODMatrix.cpp:315
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
Definition: ODMatrix.cpp:616
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:216
Distribution_Points parseTimeLine(const std::vector< std::string > &def, bool timelineDayInHours)
split the given timeline
Definition: ODMatrix.cpp:692
void loadMatrix(OptionsCont &oc)
read a matrix in one of several formats
Definition: ODMatrix.cpp:629
double getNumWritten() const
Returns the number of written vehicles.
Definition: ODMatrix.cpp:588
double getNumDiscarded() const
Returns the number of discarded vehicles.
Definition: ODMatrix.cpp:594
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.
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:75
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
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)
Definition: OptionsCont.cpp:96
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.
Definition: OptionsCont.cpp:58
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:58
static void getOptions(const bool commandLineOnly=false)
Parses the command line arguments and loads the configuration.
Definition: OptionsIO.cpp:79
static bool createDeviceByOption(const std::string &optionName, const std::string &rootElement="", const std::string &schemaFile="")
Creates the device using the output definition stored in the named option.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
static void initRandGlobal(std::mt19937 *which=nullptr)
Reads the given random number options and initialises the random number generator in accordance.
Definition: RandHelper.cpp:76
static void insertRandOptions()
Initialises the given options container with random number options.
Definition: RandHelper.cpp:44
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 void addConfigurationOptions(OptionsCont &oc)
Adds configuration options to the given container.
Definition: SystemFrame.cpp:38
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
Definition: SystemFrame.cpp:63
static bool checkOptions()
checks shared options and sets StdDefs
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme, const std::string &routeValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:65
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:54
bool checkOptions()
void fillOptions()
int main(int argc, char **argv)