SUMO - Simulation of Urban MObility
od2trips_main.cpp
Go to the documentation of this file.
1 /****************************************************************************/
11 // Main for OD2TRIPS
12 /****************************************************************************/
13 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
14 // Copyright (C) 2002-2017 DLR (http://www.dlr.de/) and contributors
15 /****************************************************************************/
16 //
17 // This file is part of SUMO.
18 // SUMO is free software: you can redistribute it and/or modify
19 // it under the terms of the GNU General Public License as published by
20 // the Free Software Foundation, either version 3 of the License, or
21 // (at your option) any later version.
22 //
23 /****************************************************************************/
24 
25 
26 // ===========================================================================
27 // included modules
28 // ===========================================================================
29 #ifdef _MSC_VER
30 #include <windows_config.h>
31 #else
32 #include <config.h>
33 #endif
34 
35 #ifdef HAVE_VERSION_H
36 #include <version.h>
37 #endif
38 
39 #include <iostream>
40 #include <algorithm>
41 #include <math.h>
42 #include <cstdlib>
43 #include <string>
44 #include <xercesc/parsers/SAXParser.hpp>
45 #include <xercesc/sax2/SAX2XMLReader.hpp>
46 #include <utils/options/Option.h>
53 #include <utils/common/ToString.h>
54 #include <utils/xml/XMLSubSys.h>
56 #include <od/ODDistrictCont.h>
57 #include <od/ODDistrictHandler.h>
58 #include <od/ODMatrix.h>
60 #include <utils/common/SUMOTime.h>
66 
67 
68 // ===========================================================================
69 // functions
70 // ===========================================================================
71 void
74  oc.addCallExample("-c <CONFIGURATION>", "run with configuration file");
75 
76  // insert options sub-topics
77  SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
78  oc.addOptionSubTopic("Input");
79  oc.addOptionSubTopic("Output");
80  oc.addOptionSubTopic("Time");
81  oc.addOptionSubTopic("Processing");
82  oc.addOptionSubTopic("Defaults");
83  SystemFrame::addReportOptions(oc); // fill this subtopic, too
84 
85 
86  // register the file input options
87  oc.doRegister("taz-files", 'n', new Option_FileName());
88  oc.addSynonyme("taz-files", "taz");
89  oc.addSynonyme("taz-files", "net-file");
90  oc.addSynonyme("taz-files", "net");
91  oc.addDescription("taz-files", "Input", "Loads TAZ (districts; also from networks) from FILE(s)");
92 
93  oc.doRegister("od-matrix-files", 'd', new Option_FileName());
94  oc.addSynonyme("od-matrix-files", "od-files");
95  oc.addSynonyme("od-matrix-files", "od");
96  oc.addDescription("od-matrix-files", "Input", "Loads O/D-files from FILE(s)");
97 
98  oc.doRegister("od-amitran-files", new Option_FileName());
99  oc.addSynonyme("od-amitran-files", "amitran-files");
100  oc.addSynonyme("od-amitran-files", "amitran");
101  oc.addDescription("od-amitran-files", "Input", "Loads O/D-matrix in Amitran format from FILE(s)");
102 
103 
104  // register the file output options
105  oc.doRegister("output-file", 'o', new Option_FileName());
106  oc.addSynonyme("output-file", "output", true);
107  oc.addDescription("output-file", "Output", "Writes trip definitions into FILE");
108 
109  oc.doRegister("flow-output", new Option_FileName());
110  oc.addDescription("flow-output", "Output", "Writes flow definitions into FILE");
111 
112  oc.doRegister("flow-output.probability", new Option_Bool(false));
113  oc.addDescription("flow-output.probability", "Output", "Writes probabilistic flow instead of evenly spaced flow");
114 
115  oc.doRegister("ignore-vehicle-type", new Option_Bool(false));
116  oc.addSynonyme("ignore-vehicle-type", "no-vtype", true);
117  oc.addDescription("ignore-vehicle-type", "Output", "Does not save vtype information");
118 
119 
120  // register the time settings
121  oc.doRegister("begin", 'b', new Option_String("0", "TIME"));
122  oc.addDescription("begin", "Time", "Defines the begin time; Previous trips will be discarded");
123 
124  oc.doRegister("end", 'e', new Option_String(SUMOTIME_MAXSTRING, "TIME"));
125  oc.addDescription("end", "Time", "Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent");
126 
127 
128  // register the data processing options
129  oc.doRegister("scale", 's', new Option_Float(1));
130  oc.addDescription("scale", "Processing", "Scales the loaded flows by FLOAT");
131 
132  oc.doRegister("spread.uniform", new Option_Bool(false));
133  oc.addDescription("spread.uniform", "Processing", "Spreads trips uniformly over each time period");
134 
135  oc.doRegister("different-source-sink", new Option_Bool(false));
136  oc.addDescription("different-source-sink", "Processing", "Always choose source and sink edge which are not identical");
137 
138  oc.doRegister("vtype", new Option_String(""));
139  oc.addDescription("vtype", "Processing", "Defines the name of the vehicle type to use");
140 
141  oc.doRegister("prefix", new Option_String(""));
142  oc.addDescription("prefix", "Processing", "Defines the prefix for vehicle names");
143 
144  oc.doRegister("timeline", new Option_String());
145  oc.addDescription("timeline", "Processing", "Uses STR as a timeline definition");
146 
147  oc.doRegister("timeline.day-in-hours", new Option_Bool(false));
148  oc.addDescription("timeline.day-in-hours", "Processing", "Uses STR as a 24h-timeline definition");
149 
150  oc.doRegister("ignore-errors", new Option_Bool(false)); // !!! describe, document
151  oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
152  oc.addDescription("ignore-errors", "Processing", "Continue on broken input");
153 
154  oc.doRegister("no-step-log", new Option_Bool(false));
155  oc.addDescription("no-step-log", "Processing", "Disable console output of current time step");
156 
157 
158  // register defaults options
159  oc.doRegister("departlane", new Option_String("free"));
160  oc.addDescription("departlane", "Defaults", "Assigns a default depart lane");
161 
162  oc.doRegister("departpos", new Option_String());
163  oc.addDescription("departpos", "Defaults", "Assigns a default depart position");
164 
165  oc.doRegister("departspeed", new Option_String("max"));
166  oc.addDescription("departspeed", "Defaults", "Assigns a default depart speed");
167 
168  oc.doRegister("arrivallane", new Option_String());
169  oc.addDescription("arrivallane", "Defaults", "Assigns a default arrival lane");
170 
171  oc.doRegister("arrivalpos", new Option_String());
172  oc.addDescription("arrivalpos", "Defaults", "Assigns a default arrival position");
173 
174  oc.doRegister("arrivalspeed", new Option_String());
175  oc.addDescription("arrivalspeed", "Defaults", "Assigns a default arrival speed");
176 
177  // add rand options
179 }
180 
181 bool
184  bool ok = true;
185  if (!oc.isSet("taz-files")) {
186  WRITE_ERROR("No TAZ input file (-n) specified.");
187  ok = false;
188  }
189  if (!oc.isSet("od-matrix-files") && !oc.isSet("od-amitran-files")) {
190  WRITE_ERROR("No input specified.");
191  ok = false;
192  }
193  if (!oc.isSet("output-file")) {
194  WRITE_ERROR("No trip table output file (-o) specified.");
195  ok = false;
196  }
197  //
199  std::string error;
200  if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
201  WRITE_ERROR(error);
202  ok = false;
203  }
204  if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
205  WRITE_ERROR(error);
206  ok = false;
207  }
208  if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
209  WRITE_ERROR(error);
210  ok = false;
211  }
212  if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
213  WRITE_ERROR(error);
214  ok = false;
215  }
216  if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
217  WRITE_ERROR(error);
218  ok = false;
219  }
220  if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
221  WRITE_ERROR(error);
222  ok = false;
223  }
224  return ok;
225 }
226 
227 
228 
229 
230 /* -------------------------------------------------------------------------
231  * main
232  * ----------------------------------------------------------------------- */
233 int
234 main(int argc, char** argv) {
236  // give some application descriptions
237  oc.setApplicationDescription("Importer of O/D-matrices for the road traffic simulation SUMO.");
238  oc.setApplicationName("od2trips", "SUMO od2trips Version " VERSION_STRING);
239  int ret = 0;
240  try {
241  // initialise subsystems
242  XMLSubSys::init();
243  fillOptions();
244  OptionsIO::setArgs(argc, argv);
246  if (oc.processMetaOptions(argc < 2)) {
248  return 0;
249  }
250  XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"));
252  if (!checkOptions()) {
253  throw ProcessError();
254  }
256  // load the districts
257  // check whether the user gave a net filename
258  if (!oc.isSet("taz-files")) {
259  throw ProcessError("You must supply a TAZ, network or districts file ('-n').");
260  }
261  // get the file name and set it
262  ODDistrictCont districts;
263  districts.loadDistricts(oc.getStringVector("taz-files"));
264  if (districts.size() == 0) {
265  throw ProcessError("No districts loaded.");
266  }
267  // load the matrix
268  ODMatrix matrix(districts);
269  matrix.loadMatrix(oc);
270  if (matrix.getNumLoaded() == 0) {
271  throw ProcessError("No vehicles loaded.");
272  }
273  if (MsgHandler::getErrorInstance()->wasInformed() && !oc.getBool("ignore-errors")) {
274  throw ProcessError("Loading failed.");
275  }
276  WRITE_MESSAGE(toString(matrix.getNumLoaded()) + " vehicles loaded.");
277  // apply a curve if wished
278  if (oc.isSet("timeline")) {
279  matrix.applyCurve(matrix.parseTimeLine(oc.getStringVector("timeline"), oc.getBool("timeline.day-in-hours")));
280  }
281  // write
282  bool haveOutput = false;
283  if (OutputDevice::createDeviceByOption("output-file", "routes", "routes_file.xsd")) {
284  matrix.write(string2time(oc.getString("begin")), string2time(oc.getString("end")),
285  OutputDevice::getDeviceByOption("output-file"),
286  oc.getBool("spread.uniform"), oc.getBool("different-source-sink"),
287  oc.getBool("ignore-vehicle-type"),
288  oc.getString("prefix"), !oc.getBool("no-step-log"));
289  haveOutput = true;
290  }
291  if (OutputDevice::createDeviceByOption("flow-output", "routes", "routes_file.xsd")) {
292  matrix.writeFlows(string2time(oc.getString("begin")), string2time(oc.getString("end")),
293  OutputDevice::getDeviceByOption("flow-output"),
294  oc.getBool("ignore-vehicle-type"), oc.getString("prefix"),
295  oc.getBool("flow-output.probability"));
296  haveOutput = true;
297  }
298  if (!haveOutput) {
299  throw ProcessError("No output file given.");
300  }
301  WRITE_MESSAGE(toString(matrix.getNumDiscarded()) + " vehicles discarded.");
302  WRITE_MESSAGE(toString(matrix.getNumWritten()) + " vehicles written.");
303  } catch (const ProcessError& e) {
304  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
305  WRITE_ERROR(e.what());
306  }
307  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
308  ret = 1;
309 #ifndef _DEBUG
310  } catch (const std::exception& e) {
311  if (std::string(e.what()) != std::string("")) {
312  WRITE_ERROR(e.what());
313  }
314  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
315  ret = 1;
316  } catch (...) {
317  MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
318  ret = 1;
319 #endif
320  }
322  if (ret == 0) {
323  std::cout << "Success." << std::endl;
324  }
325  return ret;
326 }
327 
328 
329 
330 /****************************************************************************/
331 
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:82
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) ...
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:54
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:49
static void getOptions(const bool commandLineOnly=false)
Parses the command line arguments and loads the configuration.
Definition: OptionsIO.cpp:82
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
Definition: SystemFrame.cpp:72
double getNumWritten() const
Returns the number of written vehicles.
Definition: ODMatrix.cpp:502
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:65
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)
double getNumDiscarded() const
Returns the number of discarded vehicles.
Definition: ODMatrix.cpp:508
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:47
static void setArgs(int argc, char **argv)
Stores the command line arguments for later parsing.
Definition: OptionsIO.cpp:62
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:65
static void initRandGlobal(MTRand *which=0)
Reads the given random number options and initialises the random number generator in accordance...
Definition: RandHelper.cpp:64
void loadMatrix(OptionsCont &oc)
read a matrix in one of several formats
Definition: ODMatrix.cpp:543
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
double departSpeed
(optional) The initial speed of the vehicle
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:56
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
An O/D (origin/destination) matrix.
Definition: ODMatrix.h:76
void fillOptions()
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:47
A container for districts.
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 VERSION_STRING
Definition: version.h:1
#define SUMOTIME_MAXSTRING
Definition: SUMOTime.h:46
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 WRITE_ERROR(msg)
Definition: MsgHandler.h:206
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:85
A storage for options typed value containers)
Definition: OptionsCont.h:99
double getNumLoaded() const
Returns the number of loaded vehicles.
Definition: ODMatrix.cpp:496
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.
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
Definition: ODMatrix.cpp:530
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 arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
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)
Writes the vehicles stored in the matrix assigning the sources and sinks.
Definition: ODMatrix.cpp:217
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:201
static void initOutputOptions()
Definition: MsgHandler.cpp:193
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:287
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:606
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
int size() const
Returns the number of items within the container.
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.