docs: def submit_bsub_job(command, job_id=None, dependent_id=None, memory=None, requeue_code=None, logfile=None):
      """ construct a bsub job submission command
      
      Args:
          command: list of strings that forma unix command
          job_id: string for job ID for submission
          dependent_id: job ID, or list of job IDs which the current command needs
              to have finished before the current command will start. Note that
              the list can be empty, in which case there are no dependencies.
          memory: minimum memory requirements (in megabytes)
      
      Returns:
          nothing
      """
      
      if job_id is None:
          job_id = get_random_string()
      
      job = "-J \"{0}\"".format(job_id)
      
      mem = ""
      if memory is not None:
          mem = "-R 'select[mem>{0}] rusage[mem={0}]' -M {0}".format(memory)
      
      requeue = ""
      if requeue_code is not None:
          requeue = "-Q 'EXCLUDE({0})'".format(requeue_code)
      
      dependent = ""
      if dependent_id is not None:
          if type(dependent_id) == list:
              dependent_id = " && ".join(dependent_id)
          dependent = "-w '{0}'".format(dependent_id)
      
      log = "bjob_output.txt"
      if logfile is not None:
          log = logfile
      
      preamble = ["bsub", job, dependent, requeue, "-q", "normal", "-o", log, mem]
      command = ["bash", "-c", "\""] + command + ["\""]
      
      command = " ".join(preamble + command)
      subprocess.call(command, shell=True)