code: def run_cluster(*data):
      
      sample = data[0][0]
      tools = dd.get_expression_caller(data[0][0])
      work_dir = dd.get_work_dir(sample)
      out_dir = op.join(work_dir, "seqcluster", "cluster")
      out_dir = op.abspath(safe_makedir(out_dir))
      prepare_dir = op.join(work_dir, "seqcluster", "prepare")
      bam_file = data[0][0]["cluster_bam"]
      if "seqcluster" in tools:
          gtf_file = dd.get_transcriptome_gtf(sample) if dd.get_transcriptome_gtf(sample) else dd.get_srna_gtf_file(sample)
          sample["seqcluster"] = _cluster(bam_file, data[0][0]["seqcluster_prepare_ma"],
                                          out_dir, dd.get_ref_file(sample),
                                          gtf_file)
          sample["report"] = _report(sample, dd.get_ref_file(sample))
  
      if "mirge" in tools:
          sample["mirge"] = mirge.run(data)
  
      out_mirna = _make_isomir_counts(data, out_dir=op.join(work_dir, "mirbase"))
      if out_mirna:
          sample = dd.set_mirna_counts(sample, out_mirna[0])
          sample = dd.set_isomir_counts(sample, out_mirna[1])
  
      out_novel = _make_isomir_counts(data, "seqbuster_novel", op.join(work_dir, "mirdeep2"), "_novel")
      if out_novel:
          sample = dd.set_novel_mirna_counts(sample, out_novel[0])
          sample = dd.set_novel_isomir_counts(sample, out_novel[1])
      data[0][0] = sample
      data = spikein.combine_spikein(data)
      return data
docs: Run seqcluster cluster to detect smallRNA clusters