docs: def run_needle_alignment_on_files(id_a, faa_a, id_b, faa_b, gapopen=10, gapextend=0.5,
                                    outdir='', outfile='', force_rerun=False):
      """Run the needle alignment program for two fasta files and return the raw alignment result.
  
      More info:
      EMBOSS needle: http://www.bioinformatics.nl/cgi-bin/emboss/help/needle
      Biopython wrapper: http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc84
  
      Args:
          id_a: ID of reference sequence
          faa_a: File path to reference sequence
          id_b: ID of sequence to be aligned
          faa_b: File path to sequence to be aligned
          gapopen: Gap open penalty is the score taken away when a gap is created
          gapextend: Gap extension penalty is added to the standard gap penalty for each base or residue in the gap
          outdir (str, optional): Path to output directory. Default is the current directory.
          outfile (str, optional): Name of output file. If not set, is {id_a}_{id_b}_align.txt
          force_rerun (bool): Default False, set to True if you want to rerun the alignment if outfile exists.
  
      Returns:
          str: Raw alignment result of the needle alignment in srspair format.
  
      """
  
      # TODO: rewrite using utils functions so we can check for needle installation
      # # If you don't want to save the output file, just run the alignment and return the raw results
      # if not outfile and not outdir:
      #     needle_cline = NeedleCommandline(asequence=faa_a, bsequence=faa_b,
      #                                      gapopen=gapopen, gapextend=gapextend,
      #                                      stdout=True, auto=True)
      #     stdout, stderr = needle_cline()
      #     raw_alignment_text = stdout.decode('utf-8')
  
      # Make a default name if no outfile is set
      if not outfile:
          outfile = op.join(outdir, '{}_{}.needle'.format(id_a, id_b))
      else:
          outfile = op.join(outdir, outfile)
  
      # Check if the outfile already exists
      if op.exists(outfile) and not force_rerun:
          return outfile
      # If it doesn't exist, or force_rerun=True, run the alignment
      else:
          cmd = 'needle -outfile="{}" -asequence="{}" -bsequence="{}" -gapopen={} -gapextend={}'.format(outfile,
                                                                                                        faa_a,
                                                                                                        faa_b,
                                                                                                        gapopen,
                                                                                                        gapextend)
          command = subprocess.Popen(cmd,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE,
                                     shell=True)
          out, err = command.communicate()
  
      return outfile