code: def _stringtie_expression(bam, data, out_dir="."):
      
      gtf_file = dd.get_gtf_file(data)
      num_cores = dd.get_num_cores(data)
      error_message = "The %s file for %s is missing. StringTie has an error."
      stringtie = config_utils.get_program("stringtie", data, default="stringtie")
      # don't assemble transcripts unless asked
      exp_flag = ("-e" if "stringtie" not in dd.get_transcript_assembler(data)
                  else "")
      base_cmd = ("{stringtie} {exp_flag} -b {out_dir} -p {num_cores} -G {gtf_file} "
                  "-o {out_gtf} {bam}")
      transcript_file = os.path.join(out_dir, "t_data.ctab")
      exon_file = os.path.join(out_dir, "e_data.ctab")
      out_gtf = os.path.join(out_dir, "stringtie-assembly.gtf")
      if file_exists(transcript_file):
          return exon_file, transcript_file, out_gtf
      cmd = base_cmd.format(**locals())
      do.run(cmd, "Running Stringtie on %s." % bam)
      assert file_exists(exon_file), error_message % ("exon", exon_file)
      assert file_exists(transcript_file), error_message % ("transcript", transcript_file)
      return transcript_file
docs: only estimate expression the Stringtie, do not assemble new transcripts