class_docstr: This object holds the topology of a sumo net. Internally, the information is structured as
  follows:
  
      - topology: {
          (road_id, lane_id): [(successor_road_id, succesor_lane_id), ...], ...}
      - paths: {
          (road_id, lane_id): [
              ((in_road_id, in_lane_id), (out_road_id, out_lane_id)), ...
          ], ...}
      - odr2sumo_ids: {
          (odr_road_id, odr_lane_id): [(sumo_edge_id, sumo_lane_id), ...], ...}
class_docstr_tok: ["This","object","holds","the","topology","of","a","sumo","net",".","Internally",",","the","information","is","structured","as","follows",":","-","topology",":","{","(","road_id",",","lane_id",")",":","[","(","successor_road_id",",","succesor_lane_id",")",",","...","]",",","...","}","-","paths",":","{","(","road_id",",","lane_id",")",":","[","(","(","in_road_id",",","in_lane_id",")",",","(","out_road_id",",","out_lane_id",")",")",",","...","]",",","...","}","-","odr2sumo_ids",":","{","(","odr_road_id",",","odr_lane_id",")",":","[","(","sumo_edge_id",",","sumo_lane_id",")",",","...","]",",","...","}"]
docstr: Returns the pair (sumo_edge_id, sumo_lane index) corresponding to the provided odr pair. The
  argument 's' allows selecting the better sumo edge when it has been split into different
  edges due to different odr lane sections.
docstr_tok: ["Returns","the","pair","(","sumo_edge_id",",","sumo_lane","index",")","corresponding","to","the","provided","odr","pair",".","The","argument","'s","'","allows","selecting","the","better","sumo","edge","when","it","has","been","split","into","different","edges","due","to","different","odr","lane","sections","."]
code: def get_sumo_id(self, odr_road_id, odr_lane_id, s=0):
      """
      Returns the pair (sumo_edge_id, sumo_lane index) corresponding to the provided odr pair. The
      argument 's' allows selecting the better sumo edge when it has been split into different
      edges due to different odr lane sections.
      """
      if (odr_road_id, odr_lane_id) not in self._odr2sumo_ids:
          return None
  
      sumo_ids = list(self._odr2sumo_ids[(odr_road_id, odr_lane_id)])
  
      if (len(sumo_ids)) == 1:
          return sumo_ids[0]
  
      # The edge is split into different lane sections. We return the nearest edge based on the
      # s coordinate of the provided landmark.
      else:
          # Ensures that all the related sumo edges belongs to the same opendrive road but to
          # different lane sections.
          assert (
              set(
                  [
                      edge.split(".", 1)[0]
                      for edge, lane_index in sumo_ids
                  ]
              )
              == 1
          )
  
          s_coords = [
              float(edge.split(".", 1)[1])
              for edge, lane_index in sumo_ids
          ]
  
          s_coords, sumo_ids = zip(*sorted(zip(s_coords, sumo_ids)))
          index = bisect.bisect_left(s_coords, s, lo=1) - 1
          return sumo_ids[index]
  
imports: import argparse
  import bisect
  import collections
  import logging
  import shutil
  import subprocess
  import tempfile
  import lxml.etree
  import glob
  import os
  import sys
  import carla
  import sumolib
label_desc: Use image node_id 2 for calling the SumoTopology obj's underlying member method code with example usage: obj.get_sumo_id(odr_road_id, odr_lane_id, s) and returns: None, sumo_ids, sumo_ids