code: def record_trace(self, selectors=None):
          
  
          if selectors is None:
              selectors = [x.selector for x in self.sensor_graph.streamers]
  
          self.trace = SimulationTrace(selectors=selectors)
  
          for sel in selectors:
              self.sensor_graph.sensor_log.watch(sel, self._on_trace_callback)
docs: Record a trace of readings produced by this simulator.
  
          This causes the property `self.trace` to be populated with a
          SimulationTrace object that contains all of the readings that
          are produced during the course of the simulation.  Only readings
          that respond to specific selectors are given.
  
          You can pass whatever selectors you want in the optional selectors
          argument.  If you pass None, then the default behavior to trace
          all of the output streams of the sensor graph, which are defined
          as the streams that are selected by a DataStreamer object in the
          sensor graph.  This is typically what is meant by sensor graph
          output.
  
          You can inspect the current trace by looking at the trace
          property.  It will initially be an empty list and will be updated
          with each call to step() or run() that results in new readings
          responsive to the selectors you pick (or the graph streamers if
          you did not explicitly pass a list of DataStreamSelector objects).
  
          Args:
              selectors (list of DataStreamSelector): The selectors to add watch
                  statements on to produce this trace. This is optional.
                  If it is not specified, a the streamers of the sensor
                  graph are used.