<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def record_trace(self, selectors=None):
 """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. """


        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)