code: def calc_trees(self, indices=None, task_interface=None, jobhandler=default_jobhandler, batchsize=1,
                     show_progress=True, **kwargs):
          
          if indices is None:
              indices = list(range(len(self)))
  
          if task_interface is None:
              task_interface = tasks.RaxmlTaskInterface()
  
          records = [self[i] for i in indices]
  
          # Scrape args from records
          args, to_delete = task_interface.scrape_args(records, **kwargs)
  
          # Dispatch work
          msg = '{} Tree estimation'.format(task_interface.name) if show_progress else ''
          map_result = jobhandler(task_interface.get_task(), args, msg, batchsize)
  
          # Process results
          with fileIO.TempFileList(to_delete):
              for rec, result in zip(records, map_result):
                  #logger.debug('Result - {}'.format(result))
                  rec.parameters.construct_from_dict(result)
docs: Infer phylogenetic trees for the loaded Alignments
  
          :param indices: Only run inference on the alignments at these given indices
          :param task_interface: Inference tool specified via TaskInterface (default RaxmlTaskInterface)
          :param jobhandler: Launch jobs via this JobHandler (default SequentialJobHandler; also available are
              ThreadpoolJobHandler and ProcesspoolJobHandler for running inference in parallel)
          :param batchsize: Batch size for Thread- or ProcesspoolJobHandlers)
          :param kwargs: Remaining arguments to pass to the TaskInterface
          :return: None