docs: def multiple_sequence_alignment(seqs_fp, threads=1):
      """Perform multiple sequence alignment on FASTA file using MAFFT.
  
      Parameters
      ----------
      seqs_fp: string
          filepath to FASTA file for multiple sequence alignment
      threads: integer, optional
          number of threads to use. 0 to use all threads
  
      Returns
      -------
      msa_fp : str
          name of output alignment file or None if error encountered
      """
      logger = logging.getLogger(__name__)
      logger.info('multiple_sequence_alignment seqs file %s' % seqs_fp)
  
      # for mafft we use -1 to denote all threads and not 0
      if threads == 0:
          threads = -1
  
      if stat(seqs_fp).st_size == 0:
          logger.warning('msa failed. file %s has no reads' % seqs_fp)
          return None
      msa_fp = seqs_fp + '.msa'
      params = ['mafft', '--quiet', '--preservecase', '--parttree', '--auto',
                '--thread', str(threads), seqs_fp]
      sout, serr, res = _system_call(params, stdoutfilename=msa_fp)
      if not res == 0:
          logger.info('msa failed for file %s (maybe only 1 read?)' % seqs_fp)
          logger.debug('stderr : %s' % serr)
          return None
      return msa_fp