code: def run_filter(vrn_file, align_bam, ref_file, data, items):
      
      if not should_filter(items) or not vcfutils.vcf_has_variants(vrn_file):
          return data
      else:
          raw_file = "%s-damage.vcf" % utils.splitext_plus(vrn_file)[0]
          out_plot_files = ["%s%s" % (utils.splitext_plus(raw_file)[0], ext)
                            for ext in ["_seq_bias_simplified.pdf", "_pcr_bias_simplified.pdf"]]
          if not utils.file_uptodate(raw_file, vrn_file) and not utils.file_uptodate(raw_file + ".gz", vrn_file):
              with file_transaction(items[0], raw_file) as tx_out_file:
                  # Does not apply --qcSummary plotting due to slow runtimes
                  cmd = ["dkfzbiasfilter.py", "--filterCycles", "1", "--passOnly",
                         "--tempFolder", os.path.dirname(tx_out_file),
                         vrn_file, align_bam, ref_file, tx_out_file]
                  do.run(cmd, "Filter low frequency variants for DNA damage and strand bias")
                  for out_plot in out_plot_files:
                      tx_plot_file = os.path.join("%s_qcSummary" % utils.splitext_plus(tx_out_file)[0], "plots",
                                                  os.path.basename(out_plot))
                      if utils.file_exists(tx_plot_file):
                          shutil.move(tx_plot_file, out_plot)
          raw_file = vcfutils.bgzip_and_index(raw_file, items[0]["config"])
          data["vrn_file"] = _filter_to_info(raw_file, items[0])
          out_plot_files = [x for x in out_plot_files if utils.file_exists(x)]
          data["damage_plots"] = out_plot_files
          return data
docs: Filter and annotate somatic VCFs with damage/bias artifacts on low frequency variants.
  
      Moves damage estimation to INFO field, instead of leaving in FILTER.