code: def filter_by_background(in_vcf, full_vcf, background, data):
      
      Filter = collections.namedtuple('Filter', ['id', 'desc'])
      back_filter = Filter(id='InBackground',
                           desc='Rejected due to presence in background sample')
      out_file = "%s-filter.vcf" % utils.splitext_plus(in_vcf)[0]
      if not utils.file_uptodate(out_file, in_vcf) and not utils.file_uptodate(out_file + ".vcf.gz", in_vcf):
          with file_transaction(data, out_file) as tx_out_file:
              with open(tx_out_file, "w") as out_handle:
                  reader = vcf.VCFReader(filename=in_vcf)
                  reader.filters["InBackground"] = back_filter
                  full_reader = vcf.VCFReader(filename=full_vcf)
                  writer = vcf.VCFWriter(out_handle, template=reader)
                  for out_rec, rec in zip(reader, full_reader):
                      rec_type = rec.genotype(dd.get_sample_name(data)).gt_type
                      if rec_type == 0 or any(rec_type == rec.genotype(dd.get_sample_name(x)).gt_type
                                              for x in background):
                          out_rec.add_filter("InBackground")
                      writer.write_record(out_rec)
      return vcfutils.bgzip_and_index(out_file, data["config"])
docs: Filter SV calls also present in background samples.
  
      Skips filtering of inversions, which are not characterized differently
      between cases and controls in test datasets.