SUMO - Simulation of Urban MObility
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
od2trips_main.cpp
Go to the documentation of this file.
1
/****************************************************************************/
10
// Main for OD2TRIPS
11
/****************************************************************************/
12
// SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
13
// Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
14
/****************************************************************************/
15
//
16
// This file is part of SUMO.
17
// SUMO is free software: you can redistribute it and/or modify
18
// it under the terms of the GNU General Public License as published by
19
// the Free Software Foundation, either version 3 of the License, or
20
// (at your option) any later version.
21
//
22
/****************************************************************************/
23
24
25
// ===========================================================================
26
// included modules
27
// ===========================================================================
28
#ifdef _MSC_VER
29
#include <
windows_config.h
>
30
#else
31
#include <
config.h
>
32
#endif
33
34
#ifdef HAVE_VERSION_H
35
#include <version.h>
36
#endif
37
38
#include <iostream>
39
#include <algorithm>
40
#include <math.h>
41
#include <cstdlib>
42
#include <string>
43
#include <xercesc/parsers/SAXParser.hpp>
44
#include <xercesc/sax2/SAX2XMLReader.hpp>
45
#include <
utils/options/Option.h
>
46
#include <
utils/options/OptionsCont.h
>
47
#include <
utils/options/OptionsIO.h
>
48
#include <
utils/common/MsgHandler.h
>
49
#include <
utils/common/UtilExceptions.h
>
50
#include <
utils/common/SystemFrame.h
>
51
#include <
utils/common/RandHelper.h
>
52
#include <
utils/common/ToString.h
>
53
#include <
utils/xml/XMLSubSys.h
>
54
#include <
utils/common/StringUtils.h
>
55
#include <
od2trips/ODDistrictCont.h
>
56
#include <
od2trips/ODDistrictHandler.h
>
57
#include <
od2trips/ODMatrix.h
>
58
#include <
utils/common/TplConvert.h
>
59
#include <
utils/common/SUMOTime.h
>
60
#include <
utils/common/StringTokenizer.h
>
61
#include <
utils/common/FileHelpers.h
>
62
#include <
utils/common/SUMOVehicleParameter.h
>
63
#include <
utils/importio/LineReader.h
>
64
#include <
utils/iodevices/OutputDevice.h
>
65
66
#ifdef CHECK_MEMORY_LEAKS
67
#include <
foreign/nvwa/debug_new.h
>
68
#endif // CHECK_MEMORY_LEAKS
69
70
71
// ===========================================================================
72
// functions
73
// ===========================================================================
74
void
75
fillOptions
() {
76
OptionsCont
& oc =
OptionsCont::getOptions
();
77
oc.
addCallExample
(
"-c <CONFIGURATION>"
,
"run with configuration file"
);
78
79
// insert options sub-topics
80
SystemFrame::addConfigurationOptions
(oc);
// fill this subtopic, too
81
oc.
addOptionSubTopic
(
"Input"
);
82
oc.
addOptionSubTopic
(
"Output"
);
83
oc.
addOptionSubTopic
(
"Time"
);
84
oc.
addOptionSubTopic
(
"Processing"
);
85
oc.
addOptionSubTopic
(
"Defaults"
);
86
SystemFrame::addReportOptions
(oc);
// fill this subtopic, too
87
88
89
// register the file input options
90
oc.
doRegister
(
"net-file"
,
'n'
,
new
Option_FileName
());
91
oc.
addSynonyme
(
"net-file"
,
"net"
);
92
oc.
addDescription
(
"net-file"
,
"Input"
,
"Loads network (districts) from FILE"
);
93
94
oc.
doRegister
(
"od-matrix-files"
,
'd'
,
new
Option_FileName
());
95
oc.
addSynonyme
(
"od-matrix-files"
,
"od-files"
);
96
oc.
addSynonyme
(
"od-matrix-files"
,
"od"
);
97
oc.
addDescription
(
"od-matrix-files"
,
"Input"
,
"Loads O/D-files from FILE(s)"
);
98
99
100
// register the file output options
101
oc.
doRegister
(
"output-file"
,
'o'
,
new
Option_FileName
());
102
oc.
addSynonyme
(
"output-file"
,
"output"
,
true
);
103
oc.
addDescription
(
"output-file"
,
"Output"
,
"Writes trip definitions into FILE"
);
104
105
oc.
doRegister
(
"flow-output"
,
new
Option_FileName
());
106
oc.
addDescription
(
"flow-output"
,
"Output"
,
"Writes flow definitions into FILE"
);
107
108
oc.
doRegister
(
"ignore-vehicle-type"
,
new
Option_Bool
(
false
));
109
oc.
addSynonyme
(
"ignore-vehicle-type"
,
"no-vtype"
,
true
);
110
oc.
addDescription
(
"ignore-vehicle-type"
,
"Output"
,
"Does not save vtype information"
);
111
112
113
// register the time settings
114
oc.
doRegister
(
"begin"
,
'b'
,
new
Option_String
(
"0"
,
"TIME"
));
115
oc.
addDescription
(
"begin"
,
"Time"
,
"Defines the begin time; Previous trips will be discarded"
);
116
117
oc.
doRegister
(
"end"
,
'e'
,
new
Option_String
(
SUMOTIME_MAXSTRING
,
"TIME"
));
118
oc.
addDescription
(
"end"
,
"Time"
,
"Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent"
);
119
120
121
// register the data processing options
122
oc.
doRegister
(
"scale"
,
's'
,
new
Option_Float
(1));
123
oc.
addDescription
(
"scale"
,
"Processing"
,
"Scales the loaded flows by FLOAT"
);
124
125
oc.
doRegister
(
"spread.uniform"
,
new
Option_Bool
(
false
));
126
oc.
addDescription
(
"spread.uniform"
,
"Processing"
,
"Spreads trips uniformly over each time period"
);
127
128
oc.
doRegister
(
"vtype"
,
new
Option_String
(
""
));
129
oc.
addDescription
(
"vtype"
,
"Processing"
,
"Defines the name of the vehicle type to use"
);
130
131
oc.
doRegister
(
"prefix"
,
new
Option_String
(
""
));
132
oc.
addDescription
(
"prefix"
,
"Processing"
,
"Defines the prefix for vehicle names"
);
133
134
oc.
doRegister
(
"timeline"
,
new
Option_String
());
135
oc.
addDescription
(
"timeline"
,
"Processing"
,
"Uses STR as a timeline definition"
);
136
137
oc.
doRegister
(
"timeline.day-in-hours"
,
new
Option_Bool
(
false
));
138
oc.
addDescription
(
"timeline.day-in-hours"
,
"Processing"
,
"Uses STR as a 24h-timeline definition"
);
139
140
oc.
doRegister
(
"ignore-errors"
,
new
Option_Bool
(
false
));
// !!! describe, document
141
oc.
addSynonyme
(
"ignore-errors"
,
"dismiss-loading-errors"
,
true
);
142
oc.
addDescription
(
"ignore-errors"
,
"Processing"
,
"Continue on broken input"
);
143
144
oc.
doRegister
(
"no-step-log"
,
new
Option_Bool
(
false
));
145
oc.
addDescription
(
"no-step-log"
,
"Processing"
,
"Disable console output of current time step"
);
146
147
148
// register defaults options
149
oc.
doRegister
(
"departlane"
,
new
Option_String
(
"free"
));
150
oc.
addDescription
(
"departlane"
,
"Defaults"
,
"Assigns a default depart lane"
);
151
152
oc.
doRegister
(
"departpos"
,
new
Option_String
());
153
oc.
addDescription
(
"departpos"
,
"Defaults"
,
"Assigns a default depart position"
);
154
155
oc.
doRegister
(
"departspeed"
,
new
Option_String
(
"max"
));
156
oc.
addDescription
(
"departspeed"
,
"Defaults"
,
"Assigns a default depart speed"
);
157
158
oc.
doRegister
(
"arrivallane"
,
new
Option_String
());
159
oc.
addDescription
(
"arrivallane"
,
"Defaults"
,
"Assigns a default arrival lane"
);
160
161
oc.
doRegister
(
"arrivalpos"
,
new
Option_String
());
162
oc.
addDescription
(
"arrivalpos"
,
"Defaults"
,
"Assigns a default arrival position"
);
163
164
oc.
doRegister
(
"arrivalspeed"
,
new
Option_String
());
165
oc.
addDescription
(
"arrivalspeed"
,
"Defaults"
,
"Assigns a default arrival speed"
);
166
167
// add rand options
168
RandHelper::insertRandOptions
();
169
}
170
171
bool
172
checkOptions
() {
173
OptionsCont
& oc =
OptionsCont::getOptions
();
174
bool
ok =
true
;
175
if
(!oc.
isSet
(
"net-file"
)) {
176
WRITE_ERROR
(
"No net input file (-n) specified."
);
177
ok =
false
;
178
}
179
if
(!oc.
isSet
(
"od-matrix-files"
)) {
180
WRITE_ERROR
(
"No input specified."
);
181
ok =
false
;
182
}
183
if
(!oc.
isSet
(
"output-file"
)) {
184
WRITE_ERROR
(
"No trip table output file (-o) specified."
);
185
ok =
false
;
186
}
187
//
188
SUMOVehicleParameter
p;
189
std::string error;
190
if
(oc.
isSet
(
"departlane"
) && !
SUMOVehicleParameter::parseDepartLane
(oc.
getString
(
"departlane"
),
"option"
,
"departlane"
, p.
departLane
, p.
departLaneProcedure
, error)) {
191
WRITE_ERROR
(error);
192
ok =
false
;
193
}
194
if
(oc.
isSet
(
"departpos"
) && !
SUMOVehicleParameter::parseDepartPos
(oc.
getString
(
"departpos"
),
"option"
,
"departpos"
, p.
departPos
, p.
departPosProcedure
, error)) {
195
WRITE_ERROR
(error);
196
ok =
false
;
197
}
198
if
(oc.
isSet
(
"departspeed"
) && !
SUMOVehicleParameter::parseDepartSpeed
(oc.
getString
(
"departspeed"
),
"option"
,
"departspeed"
, p.
departSpeed
, p.
departSpeedProcedure
, error)) {
199
WRITE_ERROR
(error);
200
ok =
false
;
201
}
202
if
(oc.
isSet
(
"arrivallane"
) && !
SUMOVehicleParameter::parseArrivalLane
(oc.
getString
(
"arrivallane"
),
"option"
,
"arrivallane"
, p.
arrivalLane
, p.
arrivalLaneProcedure
, error)) {
203
WRITE_ERROR
(error);
204
ok =
false
;
205
}
206
if
(oc.
isSet
(
"arrivalpos"
) && !
SUMOVehicleParameter::parseArrivalPos
(oc.
getString
(
"arrivalpos"
),
"option"
,
"arrivalpos"
, p.
arrivalPos
, p.
arrivalPosProcedure
, error)) {
207
WRITE_ERROR
(error);
208
ok =
false
;
209
}
210
if
(oc.
isSet
(
"arrivalspeed"
) && !
SUMOVehicleParameter::parseArrivalSpeed
(oc.
getString
(
"arrivalspeed"
),
"option"
,
"arrivalspeed"
, p.
arrivalSpeed
, p.
arrivalSpeedProcedure
, error)) {
211
WRITE_ERROR
(error);
212
ok =
false
;
213
}
214
return
ok;
215
}
216
217
218
219
220
/* -------------------------------------------------------------------------
221
* main
222
* ----------------------------------------------------------------------- */
223
int
224
main
(
int
argc,
char
** argv) {
225
OptionsCont
& oc =
OptionsCont::getOptions
();
226
// give some application descriptions
227
oc.
setApplicationDescription
(
"Importer of O/D-matrices for the road traffic simulation SUMO."
);
228
oc.
setApplicationName
(
"od2trips"
,
"SUMO od2trips Version "
+ (std::string)
VERSION_STRING
);
229
int
ret = 0;
230
try
{
231
// initialise subsystems
232
XMLSubSys::init
();
233
fillOptions
();
234
OptionsIO::getOptions
(
true
, argc, argv);
235
if
(oc.
processMetaOptions
(argc < 2)) {
236
SystemFrame::close
();
237
return
0;
238
}
239
XMLSubSys::setValidation
(oc.
getBool
(
"xml-validation"
));
240
MsgHandler::initOutputOptions
();
241
if
(!
checkOptions
()) {
242
throw
ProcessError
();
243
}
244
RandHelper::initRandGlobal
();
245
// load the districts
246
// check whether the user gave a net filename
247
if
(!oc.
isSet
(
"net-file"
)) {
248
throw
ProcessError
(
"You must supply a network or districts file ('-n')."
);
249
}
250
// get the file name and set it
251
ODDistrictCont
districts;
252
districts.
loadDistricts
(oc.
getString
(
"net-file"
));
253
if
(districts.
size
() == 0) {
254
throw
ProcessError
(
"No districts loaded."
);
255
}
256
// load the matrix
257
ODMatrix
matrix(districts);
258
matrix.
loadMatrix
(oc);
259
if
(matrix.
getNoLoaded
() == 0) {
260
throw
ProcessError
(
"No vehicles loaded."
);
261
}
262
if
(
MsgHandler::getErrorInstance
()->wasInformed() && !oc.
getBool
(
"ignore-errors"
)) {
263
throw
ProcessError
(
"Loading failed."
);
264
}
265
WRITE_MESSAGE
(
toString
(matrix.
getNoLoaded
()) +
" vehicles loaded."
);
266
// apply a curve if wished
267
if
(oc.
isSet
(
"timeline"
)) {
268
matrix.
applyCurve
(matrix.
parseTimeLine
(oc.
getStringVector
(
"timeline"
), oc.
getBool
(
"timeline.day-in-hours"
)));
269
}
270
// write
271
bool
haveOutput =
false
;
272
if
(
OutputDevice::createDeviceByOption
(
"output-file"
,
"routes"
)) {
273
matrix.
write
(
string2time
(oc.
getString
(
"begin"
)),
string2time
(oc.
getString
(
"end"
)),
274
OutputDevice::getDeviceByOption
(
"output-file"
),
275
oc.
getBool
(
"spread.uniform"
), oc.
getBool
(
"ignore-vehicle-type"
),
276
oc.
getString
(
"prefix"
), !oc.
getBool
(
"no-step-log"
));
277
haveOutput =
true
;
278
}
279
if
(
OutputDevice::createDeviceByOption
(
"flow-output"
,
"routes"
)) {
280
matrix.
writeFlows
(
string2time
(oc.
getString
(
"begin"
)),
string2time
(oc.
getString
(
"end"
)),
281
OutputDevice::getDeviceByOption
(
"flow-output"
),
282
oc.
getBool
(
"ignore-vehicle-type"
), oc.
getString
(
"prefix"
));
283
haveOutput =
true
;
284
}
285
if
(!haveOutput) {
286
throw
ProcessError
(
"No output file given."
);
287
}
288
WRITE_MESSAGE
(
toString
(matrix.
getNoDiscarded
()) +
" vehicles discarded."
);
289
WRITE_MESSAGE
(
toString
(matrix.
getNoWritten
()) +
" vehicles written."
);
290
}
catch
(
const
ProcessError
& e) {
291
if
(std::string(e.what()) != std::string(
"Process Error"
) && std::string(e.what()) != std::string(
""
)) {
292
WRITE_ERROR
(e.what());
293
}
294
MsgHandler::getErrorInstance
()->
inform
(
"Quitting (on error)."
,
false
);
295
ret = 1;
296
#ifndef _DEBUG
297
}
catch
(
const
std::exception& e) {
298
if
(std::string(e.what()) != std::string(
""
)) {
299
WRITE_ERROR
(e.what());
300
}
301
MsgHandler::getErrorInstance
()->
inform
(
"Quitting (on error)."
,
false
);
302
ret = 1;
303
}
catch
(...) {
304
MsgHandler::getErrorInstance
()->
inform
(
"Quitting (on unknown error)."
,
false
);
305
ret = 1;
306
#endif
307
}
308
SystemFrame::close
();
309
if
(ret == 0) {
310
std::cout <<
"Success."
<< std::endl;
311
}
312
return
ret;
313
}
314
315
316
317
/****************************************************************************/
318
build
buildd
sumo-0.17.1~dfsg
src
od2trips
od2trips_main.cpp
Generated on Sun Jun 16 2013 17:30:18 for SUMO - Simulation of Urban MObility by
1.8.3.1