/usr/share/sumo/tools/output/generateMeanDataDefinitions.py is in sumo-tools 0.15.0~dfsg-2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | #!/usr/bin/python
#-*- encoding: utf-8 -*-
""" Generates mean data files for given detectors. """
import xml.dom.minidom
import logging
import optparse
import sys
def generate_mean_data_xml(detectors_xml,
detectors_type,
detectors_frequency,
detectors_suffix,
detectors_output_type):
""" Generates mean data definitions in XML format.
- detectors_xml is the detectors XML read by xml.dom.minidom.
- detectors_type is one of the supported detectors: 'e1', 'e2' or 'e3'
- detectors_frequency is either an empty string or a positive integer.
- detectors_suffix is the suffix appended to each detector id to form
a detector's aggregated results filename. It's appended with .xml
string.
"""
meandata_xml = xml.dom.minidom.getDOMImplementation().createDocument(
None, 'additional', None)
for detector_xml in detectors_xml.getElementsByTagName(
detectors_type + "Detector"):
detector_id = detector_xml.getAttribute('id')
meandata_element = meandata_xml.createElement(detectors_output_type)
meandata_element.setAttribute("id", detector_id)
meandata_element.setAttribute("freq", str(detectors_frequency))
meandata_element.setAttribute("file", detector_id
+ detectors_suffix + ".xml")
meandata_xml.documentElement.appendChild(meandata_element)
return meandata_xml
if __name__ == "__main__":
# pylint: disable-msg=C0103
def get_detector_file(provided_options):
""" Returns validated detector file name located in
provided_options. Exits, if the provided
detector file is invalid (None or empty). """
if (provided_options.detector_file is None or
provided_options.detector_file is ""):
logging.fatal("Invalid input file. \n"
+ option_parser.format_help())
exit()
return xml.dom.minidom.parse(provided_options.detector_file)
def get_detector_type(provided_options):
""" Returns validated detector type located in provided_options.
Checks if the detector type is one of e1, e2 or e3. """
if provided_options.detector_type not in ('e1', 'e2', 'e3'):
logging.fatal("Invalid detector type.\n"
+ option_parser.format_help())
exit()
return provided_options.detector_type
def get_detector_frequency(provided_options):
""" Returns validated detector frequency located in provided_options.
Validated frequency is either an empty string or is a positive
integer. """
if provided_options.frequency is not "":
try:
frequency = int(provided_options.frequency)
if frequency < 0:
raise ValueError
return frequency
except ValueError:
logging.fatal("Invalid time range length specified.\n" +
option_parser.format_help())
exit()
return ""
def get_detector_suffix(provided_options):
""" Returns detector suffix located in provided_options. """
return provided_options.output_suffix
def get_detector_output_type(provided_options):
"""If provided_options indicated that edge-based traffic should be
created, then returns \"edgeData\"; returns \"laneData\" otherwise.
"""
if provided_options.edge_based_dump:
return "edgeData"
else:
return "laneData"
logging.basicConfig()
option_parser = optparse.OptionParser()
option_parser.add_option("-d", "--detector-file",
help="Input detector FILE",
dest="detector_file",
type="string")
option_parser.add_option("-t", "--detector-type",
help="Type of detectors defined in the input. "
"Allowed values: e1, e2, e3. Mandatory.",
dest="detector_type",
type="string")
option_parser.add_option("-f", "--frequency",
help="The aggregation period the values the "
"detector collects shall be summed up. "
"If not given, the whole time interval "
"from begin to end is aggregated, which is "
"the default. If specified, must be a "
"positive integer (seconds) representing "
"time range length.",
dest="frequency",
type="string",
default="")
option_parser.add_option("-l", "--lane-based-dump",
help="Generate lane based dump instead of "
"edge-based dump.",
dest="edge_based_dump",
action="store_false")
option_parser.add_option("-e", "--edge-based-dump",
help="Generate edge-based dump instead of "
"lane-based dump. This is the default.",
dest="edge_based_dump",
action="store_true",
default=True)
option_parser.add_option("-p", "--output-suffix",
help="Suffix to append to aggregated detector "
"output. For each detector, the detector's "
"aggregated results file with have the name "
"build from the detector's ID and this "
"suffix, with '.xml' extension. Defaults "
"to -results-aggregated.",
dest="output_suffix",
default="-results-aggregated")
option_parser.add_option("-o", "--output",
help="Output to write the mean data definition "
"to. Defaults to stdout.",
dest="output",
type="string")
(options, args) = option_parser.parse_args()
output = sys.stdout
if options.output is not None:
output = open(options.output, "w")
output.write(
generate_mean_data_xml(
get_detector_file(options),
get_detector_type(options),
get_detector_frequency(options),
get_detector_suffix(options),
get_detector_output_type(options)).toprettyxml())
output.close()
|