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-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
19 // Main for OD2TRIPS
20 /****************************************************************************/
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #include <config.h>
27 
28 #ifdef HAVE_VERSION_H
29 #include <version.h>
30 #endif
31 
32 #include <iostream>
33 #include <algorithm>
34 #include <cmath>
35 #include <cstdlib>
36 #include <string>
37 #include <utils/options/Option.h>
44 #include <utils/common/ToString.h>
45 #include <utils/xml/XMLSubSys.h>
47 #include <od/ODDistrictCont.h>
48 #include <od/ODDistrictHandler.h>
49 #include <od/ODMatrix.h>
51 #include <utils/common/SUMOTime.h>
57 
58 
59 // ===========================================================================
60 // functions
61 // ===========================================================================
62 void
65  oc.addCallExample("-c <CONFIGURATION>", "run with configuration file");
66 
67  // insert options sub-topics
68  SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
69  oc.addOptionSubTopic("Input");
70  oc.addOptionSubTopic("Output");
71  oc.addOptionSubTopic("Time");
72  oc.addOptionSubTopic("Processing");
73  oc.addOptionSubTopic("Defaults");
74  SystemFrame::addReportOptions(oc); // fill this subtopic, too
75 
76 
77  // register the file input options
78  oc.doRegister("taz-files", 'n', new Option_FileName());
79  oc.addSynonyme("taz-files", "taz");
80  oc.addSynonyme("taz-files", "net-file");
81  oc.addSynonyme("taz-files", "net");
82  oc.addDescription("taz-files", "Input", "Loads TAZ (districts; also from networks) from FILE(s)");
83 
84  oc.doRegister("od-matrix-files", 'd', new Option_FileName());
85  oc.addSynonyme("od-matrix-files", "od-files");
86  oc.addSynonyme("od-matrix-files", "od");
87  oc.addDescription("od-matrix-files", "Input", "Loads O/D-files from FILE(s)");
88 
89  oc.doRegister("od-amitran-files", new Option_FileName());
90  oc.addSynonyme("od-amitran-files", "amitran-files");
91  oc.addSynonyme("od-amitran-files", "amitran");
92  oc.addDescription("od-amitran-files", "Input", "Loads O/D-matrix in Amitran format from FILE(s)");
93 
94 
95  // register the file output options
96  oc.doRegister("output-file", 'o', new Option_FileName());
97  oc.addSynonyme("output-file", "output", true);
98  oc.addDescription("output-file", "Output", "Writes trip definitions into FILE");
99 
100  oc.doRegister("flow-output", new Option_FileName());
101  oc.addDescription("flow-output", "Output", "Writes flow definitions into FILE");
102 
103  oc.doRegister("flow-output.probability", new Option_Bool(false));
104  oc.addDescription("flow-output.probability", "Output", "Writes probabilistic flow instead of evenly spaced flow");
105 
106  oc.doRegister("pedestrians", new Option_Bool(false));
107  oc.addDescription("pedestrians", "Output", "Writes pedestrians instead of vehicles");
108 
109  oc.doRegister("persontrips", new Option_Bool(false));
110  oc.addDescription("persontrips", "Output", "Writes persontrips instead of vehicles");
111 
112  oc.doRegister("ignore-vehicle-type", new Option_Bool(false));
113  oc.addSynonyme("ignore-vehicle-type", "no-vtype", true);
114  oc.addDescription("ignore-vehicle-type", "Output", "Does not save vtype information");
115 
116 
117  // register the time settings
118  oc.doRegister("begin", 'b', new Option_String("0", "TIME"));
119  oc.addDescription("begin", "Time", "Defines the begin time; Previous trips will be discarded");
120 
121  oc.doRegister("end", 'e', new Option_String(SUMOTIME_MAXSTRING, "TIME"));
122  oc.addDescription("end", "Time", "Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent");
123 
124 
125  // register the data processing options
126  oc.doRegister("scale", 's', new Option_Float(1));
127  oc.addDescription("scale", "Processing", "Scales the loaded flows by FLOAT");
128 
129  oc.doRegister("spread.uniform", new Option_Bool(false));
130  oc.addDescription("spread.uniform", "Processing", "Spreads trips uniformly over each time period");
131 
132  oc.doRegister("different-source-sink", new Option_Bool(false));
133  oc.addDescription("different-source-sink", "Processing", "Always choose source and sink edge which are not identical");
134 
135  oc.doRegister("vtype", new Option_String(""));
136  oc.addDescription("vtype", "Processing", "Defines the name of the vehicle type to use");
137 
138  oc.doRegister("prefix", new Option_String(""));
139  oc.addDescription("prefix", "Processing", "Defines the prefix for vehicle names");
140 
141  oc.doRegister("timeline", new Option_String());
142  oc.addDescription("timeline", "Processing", "Uses STR as a timeline definition");
143 
144  oc.doRegister("timeline.day-in-hours", new Option_Bool(false));
145  oc.addDescription("timeline.day-in-hours", "Processing", "Uses STR as a 24h-timeline definition");
146 
147  oc.doRegister("ignore-errors", new Option_Bool(false)); // !!! describe, document
148  oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
149  oc.addDescription("ignore-errors", "Report", "Continue on broken input");
150 
151  oc.doRegister("no-step-log", new Option_Bool(false));
152  oc.addDescription("no-step-log", "Processing", "Disable console output of current time step");
153 
154 
155  // register defaults options
156  oc.doRegister("departlane", new Option_String("free"));
157  oc.addDescription("departlane", "Defaults", "Assigns a default depart lane");
158 
159  oc.doRegister("departpos", new Option_String());
160  oc.addDescription("departpos", "Defaults", "Assigns a default depart position");
161 
162  oc.doRegister("departspeed", new Option_String("max"));
163  oc.addDescription("departspeed", "Defaults", "Assigns a default depart speed");
164 
165  oc.doRegister("arrivallane", new Option_String());
166  oc.addDescription("arrivallane", "Defaults", "Assigns a default arrival lane");
167 
168  oc.doRegister("arrivalpos", new Option_String());
169  oc.addDescription("arrivalpos", "Defaults", "Assigns a default arrival position");
170 
171  oc.doRegister("arrivalspeed", new Option_String());
172  oc.addDescription("arrivalspeed", "Defaults", "Assigns a default arrival speed");
173 
174  // add rand options
176 }
177 
178 bool
181  bool ok = true;
182  if (!oc.isSet("taz-files")) {
183  WRITE_ERROR("No TAZ input file (-n) specified.");
184  ok = false;
185  }
186  if (!oc.isSet("od-matrix-files") && !oc.isSet("od-amitran-files")) {
187  WRITE_ERROR("No input specified.");
188  ok = false;
189  }
190  if (!oc.isSet("output-file")) {
191  WRITE_ERROR("No trip table output file (-o) specified.");
192  ok = false;
193  }
194  if (oc.getBool("pedestrians") && oc.getBool("persontrips")) {
195  WRITE_ERROR("Only of the the options 'pedestrians' and 'persontrips' may be set.");
196  ok = false;
197  }
198  //
200  std::string error;
201  if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
202  WRITE_ERROR(error);
203  ok = false;
204  }
205  if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
206  WRITE_ERROR(error);
207  ok = false;
208  }
209  if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
210  WRITE_ERROR(error);
211  ok = false;
212  }
213  if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
214  WRITE_ERROR(error);
215  ok = false;
216  }
217  if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
218  WRITE_ERROR(error);
219  ok = false;
220  }
221  if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
222  WRITE_ERROR(error);
223  ok = false;
224  }
225  return ok;
226 }
227 
228 
229 
230 
231 /* -------------------------------------------------------------------------
232  * main
233  * ----------------------------------------------------------------------- */
234 int
235 main(int argc, char** argv) {
237  // give some application descriptions
238  oc.setApplicationDescription("Importer of O/D-matrices for the microscopic, multi-modal traffic simulation SUMO.");
239  oc.setApplicationName("od2trips", "Eclipse SUMO od2trips Version " VERSION_STRING);
240  int ret = 0;
241  try {
242  // initialise subsystems
243  XMLSubSys::init();
244  fillOptions();
245  OptionsIO::setArgs(argc, argv);
247  if (oc.processMetaOptions(argc < 2)) {
249  return 0;
250  }
251  XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"));
253  if (!checkOptions()) {
254  throw ProcessError();
255  }
257  // load the districts
258  // check whether the user gave a net filename
259  if (!oc.isSet("taz-files")) {
260  throw ProcessError("You must supply a TAZ, network or districts file ('-n').");
261  }
262  // get the file name and set it
263  ODDistrictCont districts;
264  districts.loadDistricts(oc.getStringVector("taz-files"));
265  if (districts.size() == 0) {
266  throw ProcessError("No districts loaded.");
267  }
268  // load the matrix
269  ODMatrix matrix(districts);
270  matrix.loadMatrix(oc);
271  if (matrix.getNumLoaded() == 0) {
272  throw ProcessError("No vehicles loaded.");
273  }
274  if (MsgHandler::getErrorInstance()->wasInformed() && !oc.getBool("ignore-errors")) {
275  throw ProcessError("Loading failed.");
276  }
277  WRITE_MESSAGE(toString(matrix.getNumLoaded()) + " vehicles loaded.");
278  // apply a curve if wished
279  if (oc.isSet("timeline")) {
280  matrix.applyCurve(matrix.parseTimeLine(oc.getStringVector("timeline"), oc.getBool("timeline.day-in-hours")));
281  }
282  // write
283  bool haveOutput = false;
284  if (OutputDevice::createDeviceByOption("output-file", "routes", "routes_file.xsd")) {
285  matrix.write(string2time(oc.getString("begin")), string2time(oc.getString("end")),
286  OutputDevice::getDeviceByOption("output-file"),
287  oc.getBool("spread.uniform"), oc.getBool("different-source-sink"),
288  oc.getBool("ignore-vehicle-type"),
289  oc.getString("prefix"), !oc.getBool("no-step-log"),
290  oc.getBool("pedestrians"),
291  oc.getBool("persontrips"));
292  haveOutput = true;
293  }
294  if (OutputDevice::createDeviceByOption("flow-output", "routes", "routes_file.xsd")) {
295  matrix.writeFlows(string2time(oc.getString("begin")), string2time(oc.getString("end")),
296  OutputDevice::getDeviceByOption("flow-output"),
297  oc.getBool("ignore-vehicle-type"), oc.getString("prefix"),
298  oc.getBool("flow-output.probability"));
299  haveOutput = true;
300  }
301  if (!haveOutput) {
302  throw ProcessError("No output file given.");
303  }
304  WRITE_MESSAGE(toString(matrix.getNumDiscarded()) + " vehicles discarded.");
305  WRITE_MESSAGE(toString(matrix.getNumWritten()) + " vehicles written.");
306  } catch (const ProcessError& e) {
307  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
308  WRITE_ERROR(e.what());
309  }
310  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
311  ret = 1;
312 #ifndef _DEBUG
313  } catch (const std::exception& e) {
314  if (std::string(e.what()) != std::string("")) {
315  WRITE_ERROR(e.what());
316  }
317  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
318  ret = 1;
319  } catch (...) {
320  MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
321  ret = 1;
322 #endif
323  }
325  if (ret == 0) {
326  std::cout << "Success." << std::endl;
327  }
328  return ret;
329 }
330 
331 
332 
333 /****************************************************************************/
334 
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)
Writes the vehicles stored in the matrix assigning the sources and sinks.
Definition: ODMatrix.cpp:210
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:75
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:48
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:76
bool checkOptions()
static void insertRandOptions()
Initialises the given options container with random number options.
Definition: RandHelper.cpp:43
static void getOptions(const bool commandLineOnly=false)
Parses the command line arguments and loads the configuration.
Definition: OptionsIO.cpp:76
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
Definition: SystemFrame.cpp:65
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:59
int size() const
Returns the number of stored items within the container.
void addCallExample(const std::string &example, const std::string &desc)
Add a call example.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
void setApplicationDescription(const std::string &appDesc)
Sets the application description.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle&#39;s end speed shall be chosen.
static void close()
Closes all of an applications subsystems.
static void addConfigurationOptions(OptionsCont &oc)
Adds configuration options to the given container.
Definition: SystemFrame.cpp:40
static void setArgs(int argc, char **argv)
Stores the command line arguments for later parsing.
Definition: OptionsIO.cpp:55
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:58
void loadMatrix(OptionsCont &oc)
read a matrix in one of several formats
Definition: ODMatrix.cpp:557
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
double departSpeed
(optional) The initial speed of the vehicle
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle&#39;s initial speed shall be chosen.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:49
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
An O/D (origin/destination) matrix.
Definition: ODMatrix.h:69
void fillOptions()
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool processMetaOptions(bool missingOptions)
Checks for help and configuration output, returns whether we should exit.
int arrivalLane
(optional) The lane the vehicle shall arrive on (not used yet)
SUMOTime string2time(const std::string &r)
Definition: SUMOTime.cpp:42
A container for districts.
std::vector< std::string > getStringVector(const std::string &name) const
Returns the list of string-vector-value of the named option (only for Option_String) ...
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
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.
#define SUMOTIME_MAXSTRING
Definition: SUMOTime.h:39
double getNumLoaded() const
Returns the number of loaded vehicles.
Definition: ODMatrix.cpp:510
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
void loadDistricts(std::vector< std::string > files)
load districts from files
double arrivalPos
(optional) The position the vehicle shall arrive on
#define VERSION_STRING
Definition: config.h:207
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:247
double getNumWritten() const
Returns the number of written vehicles.
Definition: ODMatrix.cpp:516
double departPos
(optional) The position the vehicle shall depart from
int main(int argc, char **argv)
Structure representing possible vehicle parameter.
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.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
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.
void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:113
A storage for options typed value containers)
Definition: OptionsCont.h:92
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 void initRandGlobal(std::mt19937 *which=0)
Reads the given random number options and initialises the random number generator in accordance...
Definition: RandHelper.cpp:72
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
Definition: ODMatrix.cpp:544
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 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.
double getNumDiscarded() const
Returns the number of discarded vehicles.
Definition: ODMatrix.cpp:522
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
#define WRITE_MESSAGE(msg)
Definition: MsgHandler.h:242
static void initOutputOptions()
init output options
Definition: MsgHandler.cpp:239
void writeFlows(const SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool noVtype, const std::string &prefix, bool asProbability=false)
Writes the flows stored in the matrix.
Definition: ODMatrix.cpp:299
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
Distribution_Points parseTimeLine(const std::vector< std::string > &def, bool timelineDayInHours)
split the given timeline
Definition: ODMatrix.cpp:620
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.
void setApplicationName(const std::string &appName, const std::string &fullName)
Sets the application name.