code: def cluster(args):
      
      p = OptionParser(cluster.__doc__)
      add_consensus_options(p)
      p.set_align(pctid=95)
      p.set_outdir()
      p.set_cpus()
      opts, args = p.parse_args(args)
  
      if len(args) < 2:
          sys.exit(not p.print_help())
  
      prefix = args[0]
      fastqfiles = args[1:]
      cpus = opts.cpus
      pctid = opts.pctid
      mindepth = opts.mindepth
      minlength = opts.minlength
      fastafile, qualfile = fasta(fastqfiles + ["--seqtk",
                                  "--outdir={0}".format(opts.outdir),
                                  "--outfile={0}".format(prefix + ".fasta")])
  
      prefix = op.join(opts.outdir, prefix)
      pf = prefix + ".P{0}".format(pctid)
      derepfile = prefix + ".derep"
      if need_update(fastafile, derepfile):
          derep(fastafile, derepfile, minlength, cpus)
  
      userfile = pf + ".u"
      notmatchedfile = pf + ".notmatched"
      if need_update(derepfile, userfile):
          cluster_smallmem(derepfile, userfile, notmatchedfile,
                           minlength, pctid, cpus)
  
      clustfile = pf + ".clust"
      if need_update((derepfile, userfile, notmatchedfile), clustfile):
          makeclust(derepfile, userfile, notmatchedfile, clustfile,
                    mindepth=mindepth)
  
      clustSfile = pf + ".clustS"
      if need_update(clustfile, clustSfile):
          parallel_musclewrap(clustfile, cpus)
  
      statsfile = pf + ".stats"
      if need_update(clustSfile, statsfile):
          makestats(clustSfile, statsfile, mindepth=mindepth)
docs: %prog cluster prefix fastqfiles
  
      Use `vsearch` to remove duplicate reads. This routine is heavily influenced
      by PyRAD: <https://github.com/dereneaton/pyrad>.