code: def fixrg(in_bam, names, ref_file, dirs, data):
      
      work_dir = utils.safe_makedir(os.path.join(dd.get_work_dir(data), "bamclean", dd.get_sample_name(data)))
      out_file = os.path.join(work_dir, "%s-fixrg.bam" % utils.splitext_plus(os.path.basename(in_bam))[0])
      if not utils.file_exists(out_file):
          out_file = os.path.join(work_dir, "%s-fixrg.bam" % dd.get_sample_name(data))
      if not utils.file_uptodate(out_file, in_bam):
          with file_transaction(data, out_file) as tx_out_file:
              rg_info = novoalign.get_rg_info(names)
              new_header = "%s-header.txt" % os.path.splitext(out_file)[0]
              cores = dd.get_cores(data)
              do.run("samtools view -H {in_bam} | grep -v ^@RG > {new_header}".format(**locals()),
                     "Create empty RG header: %s" % dd.get_sample_name(data))
              cmd = ("samtools reheader {new_header} {in_bam} | "
                     "samtools addreplacerg -@ {cores} -r '{rg_info}' -m overwrite_all -O bam -o {tx_out_file} -")
              do.run(cmd.format(**locals()), "Fix read groups: %s" % dd.get_sample_name(data))
      return out_file
docs: Fix read group in a file, using samtools addreplacerg.
  
      addreplacerg does not remove the old read group, causing confusion when
      checking. We use reheader to work around this