def do_run(self):
if self.broadcast_commands:  <EOL><INDENT>if self.threaded_scan:<EOL><INDENT>with ExitStack() as restore_config_stack:<EOL><INDENT>for module_id in itertools.chain(self._tx_module_groups, self._modules):<EOL><INDENT>if self.abort_run.is_set():<EOL><INDENT>break<EOL><DEDENT>with self.access_module(module_id=module_id):<EOL><INDENT>if module_id in self._modules:<EOL><INDENT>module_id_str = "<STR_LIT>" + module_id<EOL><DEDENT>else:<EOL><INDENT>module_id_str = module_id.split('<STR_LIT:=>', <NUM_LIT:1>)<EOL>module_id_str[<NUM_LIT:0>] = module_id_str[<NUM_LIT:0>].replace("<STR_LIT:_>", "<STR_LIT:U+0020>")<EOL>module_id_str = "<STR_LIT:=>".join(module_id_str)<EOL><DEDENT>logging.info('<STR_LIT>', module_id_str, '<STR_LIT:U+002CU+0020>'.join(['<STR_LIT>' % (key, value) for (key, value) in list(self.scan_parameters._asdict().items())]) if self.scan_parameters else '<STR_LIT:None>')<EOL>restore_config_stack.enter_context(self.register.restored(name=self.run_number))<EOL>self.configure()<EOL><DEDENT><DEDENT>for module_id in self._tx_module_groups:<EOL><INDENT>if self.abort_run.is_set():<EOL><INDENT>break<EOL><DEDENT>with self.access_module(module_id=module_id):<EOL><INDENT>self.register_utils.set_run_mode()<EOL><DEDENT><DEDENT>with self.access_module(module_id=None):<EOL><INDENT>self.fifo_readout.reset_rx()<EOL>self.fifo_readout.reset_fifo(self._selected_fifos)<EOL>self.fifo_readout.print_fei4_rx_status()<EOL>with self.access_files():<EOL><INDENT>self._scan_threads = []<EOL>for module_id in self._tx_module_groups:<EOL><INDENT>if self.abort_run.is_set():<EOL><INDENT>break<EOL><DEDENT>t = ExcThread(target=self.scan, name=module_id)<EOL>t.daemon = True  <EOL>self._scan_threads.append(t)<EOL><DEDENT>for t in self._scan_threads:<EOL><INDENT>t.start()<EOL><DEDENT>while any([t.is_alive() for t in self._scan_threads]):<EOL><INDENT>if self.abort_run.is_set():<EOL><INDENT>break<EOL>
Start runs on all modules sequentially.

        Sets properties to access current module properties.