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-sim.org/
14 // Copyright (C) 2002-2014 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>
58 #include <od2trips/ODMatrix.h>
60 #include <utils/common/SUMOTime.h>
66 
67 #ifdef CHECK_MEMORY_LEAKS
68 #include <foreign/nvwa/debug_new.h>
69 #endif // CHECK_MEMORY_LEAKS
70 
71 
72 // ===========================================================================
73 // functions
74 // ===========================================================================
75 void
78  oc.addCallExample("-c <CONFIGURATION>", "run with configuration file");
79 
80  // insert options sub-topics
81  SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
82  oc.addOptionSubTopic("Input");
83  oc.addOptionSubTopic("Output");
84  oc.addOptionSubTopic("Time");
85  oc.addOptionSubTopic("Processing");
86  oc.addOptionSubTopic("Defaults");
87  SystemFrame::addReportOptions(oc); // fill this subtopic, too
88 
89 
90  // register the file input options
91  oc.doRegister("net-file", 'n', new Option_FileName());
92  oc.addSynonyme("net-file", "net");
93  oc.addDescription("net-file", "Input", "Loads network (districts) from FILE");
94 
95  oc.doRegister("od-matrix-files", 'd', new Option_FileName());
96  oc.addSynonyme("od-matrix-files", "od-files");
97  oc.addSynonyme("od-matrix-files", "od");
98  oc.addDescription("od-matrix-files", "Input", "Loads O/D-files from FILE(s)");
99 
100  oc.doRegister("od-amitran-files", new Option_FileName());
101  oc.addSynonyme("od-amitran-files", "amitran-files");
102  oc.addSynonyme("od-amitran-files", "amitran");
103  oc.addDescription("od-amitran-files", "Input", "Loads O/D-matrix in Amitran format from FILE(s)");
104 
105 
106  // register the file output options
107  oc.doRegister("output-file", 'o', new Option_FileName());
108  oc.addSynonyme("output-file", "output", true);
109  oc.addDescription("output-file", "Output", "Writes trip definitions into FILE");
110 
111  oc.doRegister("flow-output", new Option_FileName());
112  oc.addDescription("flow-output", "Output", "Writes flow definitions into FILE");
113 
114  oc.doRegister("ignore-vehicle-type", new Option_Bool(false));
115  oc.addSynonyme("ignore-vehicle-type", "no-vtype", true);
116  oc.addDescription("ignore-vehicle-type", "Output", "Does not save vtype information");
117 
118 
119  // register the time settings
120  oc.doRegister("begin", 'b', new Option_String("0", "TIME"));
121  oc.addDescription("begin", "Time", "Defines the begin time; Previous trips will be discarded");
122 
123  oc.doRegister("end", 'e', new Option_String(SUMOTIME_MAXSTRING, "TIME"));
124  oc.addDescription("end", "Time", "Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent");
125 
126 
127  // register the data processing options
128  oc.doRegister("scale", 's', new Option_Float(1));
129  oc.addDescription("scale", "Processing", "Scales the loaded flows by FLOAT");
130 
131  oc.doRegister("spread.uniform", new Option_Bool(false));
132  oc.addDescription("spread.uniform", "Processing", "Spreads trips uniformly over each time period");
133 
134  oc.doRegister("vtype", new Option_String(""));
135  oc.addDescription("vtype", "Processing", "Defines the name of the vehicle type to use");
136 
137  oc.doRegister("prefix", new Option_String(""));
138  oc.addDescription("prefix", "Processing", "Defines the prefix for vehicle names");
139 
140  oc.doRegister("timeline", new Option_String());
141  oc.addDescription("timeline", "Processing", "Uses STR as a timeline definition");
142 
143  oc.doRegister("timeline.day-in-hours", new Option_Bool(false));
144  oc.addDescription("timeline.day-in-hours", "Processing", "Uses STR as a 24h-timeline definition");
145 
146  oc.doRegister("ignore-errors", new Option_Bool(false)); // !!! describe, document
147  oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
148  oc.addDescription("ignore-errors", "Processing", "Continue on broken input");
149 
150  oc.doRegister("no-step-log", new Option_Bool(false));
151  oc.addDescription("no-step-log", "Processing", "Disable console output of current time step");
152 
153 
154  // register defaults options
155  oc.doRegister("departlane", new Option_String("free"));
156  oc.addDescription("departlane", "Defaults", "Assigns a default depart lane");
157 
158  oc.doRegister("departpos", new Option_String());
159  oc.addDescription("departpos", "Defaults", "Assigns a default depart position");
160 
161  oc.doRegister("departspeed", new Option_String("max"));
162  oc.addDescription("departspeed", "Defaults", "Assigns a default depart speed");
163 
164  oc.doRegister("arrivallane", new Option_String());
165  oc.addDescription("arrivallane", "Defaults", "Assigns a default arrival lane");
166 
167  oc.doRegister("arrivalpos", new Option_String());
168  oc.addDescription("arrivalpos", "Defaults", "Assigns a default arrival position");
169 
170  oc.doRegister("arrivalspeed", new Option_String());
171  oc.addDescription("arrivalspeed", "Defaults", "Assigns a default arrival speed");
172 
173  // add rand options
175 }
176 
177 bool
180  bool ok = true;
181  if (!oc.isSet("net-file")) {
182  WRITE_ERROR("No net input file (-n) specified.");
183  ok = false;
184  }
185  if (!oc.isSet("od-matrix-files") && !oc.isSet("od-amitran-files")) {
186  WRITE_ERROR("No input specified.");
187  ok = false;
188  }
189  if (!oc.isSet("output-file")) {
190  WRITE_ERROR("No trip table output file (-o) specified.");
191  ok = false;
192  }
193  //
195  std::string error;
196  if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
197  WRITE_ERROR(error);
198  ok = false;
199  }
200  if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
201  WRITE_ERROR(error);
202  ok = false;
203  }
204  if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
205  WRITE_ERROR(error);
206  ok = false;
207  }
208  if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
209  WRITE_ERROR(error);
210  ok = false;
211  }
212  if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
213  WRITE_ERROR(error);
214  ok = false;
215  }
216  if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
217  WRITE_ERROR(error);
218  ok = false;
219  }
220  return ok;
221 }
222 
223 
224 
225 
226 /* -------------------------------------------------------------------------
227  * main
228  * ----------------------------------------------------------------------- */
229 int
230 main(int argc, char** argv) {
232  // give some application descriptions
233  oc.setApplicationDescription("Importer of O/D-matrices for the road traffic simulation SUMO.");
234  oc.setApplicationName("od2trips", "SUMO od2trips Version " + (std::string)VERSION_STRING);
235  int ret = 0;
236  try {
237  // initialise subsystems
238  XMLSubSys::init();
239  fillOptions();
240  OptionsIO::getOptions(true, argc, argv);
241  if (oc.processMetaOptions(argc < 2)) {
243  return 0;
244  }
245  XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"));
247  if (!checkOptions()) {
248  throw ProcessError();
249  }
251  // load the districts
252  // check whether the user gave a net filename
253  if (!oc.isSet("net-file")) {
254  throw ProcessError("You must supply a network or districts file ('-n').");
255  }
256  // get the file name and set it
257  ODDistrictCont districts;
258  districts.loadDistricts(oc.getString("net-file"));
259  if (districts.size() == 0) {
260  throw ProcessError("No districts loaded.");
261  }
262  // load the matrix
263  ODMatrix matrix(districts);
264  matrix.loadMatrix(oc);
265  if (matrix.getNoLoaded() == 0) {
266  throw ProcessError("No vehicles loaded.");
267  }
268  if (MsgHandler::getErrorInstance()->wasInformed() && !oc.getBool("ignore-errors")) {
269  throw ProcessError("Loading failed.");
270  }
271  WRITE_MESSAGE(toString(matrix.getNoLoaded()) + " vehicles loaded.");
272  // apply a curve if wished
273  if (oc.isSet("timeline")) {
274  matrix.applyCurve(matrix.parseTimeLine(oc.getStringVector("timeline"), oc.getBool("timeline.day-in-hours")));
275  }
276  // write
277  bool haveOutput = false;
278  if (OutputDevice::createDeviceByOption("output-file", "routes", "routes_file.xsd")) {
279  matrix.write(string2time(oc.getString("begin")), string2time(oc.getString("end")),
280  OutputDevice::getDeviceByOption("output-file"),
281  oc.getBool("spread.uniform"), oc.getBool("ignore-vehicle-type"),
282  oc.getString("prefix"), !oc.getBool("no-step-log"));
283  haveOutput = true;
284  }
285  if (OutputDevice::createDeviceByOption("flow-output", "routes", "routes_file.xsd")) {
286  matrix.writeFlows(string2time(oc.getString("begin")), string2time(oc.getString("end")),
287  OutputDevice::getDeviceByOption("flow-output"),
288  oc.getBool("ignore-vehicle-type"), oc.getString("prefix"));
289  haveOutput = true;
290  }
291  if (!haveOutput) {
292  throw ProcessError("No output file given.");
293  }
294  WRITE_MESSAGE(toString(matrix.getNoDiscarded()) + " vehicles discarded.");
295  WRITE_MESSAGE(toString(matrix.getNoWritten()) + " vehicles written.");
296  } catch (const ProcessError& e) {
297  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
298  WRITE_ERROR(e.what());
299  }
300  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
301  ret = 1;
302 #ifndef _DEBUG
303  } catch (const std::exception& e) {
304  if (std::string(e.what()) != std::string("")) {
305  WRITE_ERROR(e.what());
306  }
307  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
308  ret = 1;
309  } catch (...) {
310  MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
311  ret = 1;
312 #endif
313  }
315  if (ret == 0) {
316  std::cout << "Success." << std::endl;
317  }
318  return ret;
319 }
320 
321 
322 
323 /****************************************************************************/
324 
SUMOReal getNoLoaded() const
Returns the number of loaded vehicles.
Definition: ODMatrix.cpp:432
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:84
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:58
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:80
bool checkOptions()
static void insertRandOptions()
Initialises the given options container with random number options.
Definition: RandHelper.cpp:53
static bool parseDepartSpeed(const std::string &val, const std::string &element, const std::string &id, SUMOReal &speed, DepartSpeedDefinition &dsd, std::string &error)
Validates a given departSpeed value.
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
Definition: SystemFrame.cpp:74
static bool parseArrivalPos(const std::string &val, const std::string &element, const std::string &id, SUMOReal &pos, ArrivalPosDefinition &apd, std::string &error)
Validates a given arrivalPos value.
static void getOptions(bool loadConfig, int argc=0, char **argv=0)
Parses the command line arguments and loads the configuration optionally.
Definition: OptionsIO.cpp:64
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
void write(SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool uniform, 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:170
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:69
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.
SUMOReal departSpeed
(optional) The initial speed of the vehicle
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)
SUMOReal arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
SUMOReal arrivalPos
(optional) The position the vehicle shall arrive on
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle'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:50
void loadDistricts(std::string districtfile)
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:67
static void initRandGlobal(MTRand *which=0)
Reads the given random number options and initialises the random number generator in accordance...
Definition: RandHelper.cpp:68
void loadMatrix(OptionsCont &oc)
read a VISUM-matrix with the V Format
Definition: ODMatrix.cpp:477
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)
SUMOReal getNoDiscarded() const
Returns the number of discarded vehicles.
Definition: ODMatrix.cpp:444
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
An O/D (origin/destination) matrix.
Definition: ODMatrix.h:74
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:48
unsigned int size() const
Returns the number of items within the container.
A container for districts.
SUMOReal getNoWritten() const
Returns the number of written vehicles.
Definition: ODMatrix.cpp:438
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:46
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
Definition: ToString.h:53
static bool parseDepartPos(const std::string &val, const std::string &element, const std::string &id, SUMOReal &pos, DepartPosDefinition &dpd, std::string &error)
Validates a given departPos value.
void writeFlows(const SUMOTime begin, const SUMOTime end, OutputDevice &dev, const bool noVtype, const std::string &prefix)
Writes the flows stored in the matrix.
Definition: ODMatrix.cpp:237
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
#define VERSION_STRING
Definition: config.h:227
static bool parseArrivalSpeed(const std::string &val, const std::string &element, const std::string &id, SUMOReal &speed, ArrivalSpeedDefinition &asd, std::string &error)
Validates a given arrivalSpeed value.
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:205
int main(int argc, char **argv)
Structure representing possible vehicle parameter.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:89
A storage for options typed value containers)
Definition: OptionsCont.h:108
void applyCurve(const Distribution_Points &ps)
Splits the stored cells dividing them on the given time line.
Definition: ODMatrix.cpp:465
SUMOReal departPos
(optional) The position the vehicle shall depart from
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.
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:197
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:523
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
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.