code: def _variant_filtration(in_file, ref_file, vrn_files, data, filter_type,
                          hard_filter_fn):
      
      # Algorithms multiplied by number of input files to check for large enough sample sizes
      algs = [data["config"]["algorithm"]] * len(data.get("vrn_files", [1]))
      if (not config_utils.use_vqsr(algs, in_file) or
            _already_cutoff_filtered(in_file, filter_type)):
          logger.info("Skipping VQSR, using cutoff-based filers: we don't have whole genome input data")
          return hard_filter_fn(in_file, data)
      elif not _have_training_data(vrn_files):
          logger.info("Skipping VQSR, using cutoff-based filers: genome build does not have sufficient training data")
          return hard_filter_fn(in_file, data)
      else:
          sensitivities = {"INDEL": "98.0", "SNP": "99.97"}
          recal_file, tranches_file = _run_vqsr(in_file, ref_file, vrn_files,
                                                sensitivities[filter_type], filter_type, data)
          if recal_file is None:  # VQSR failed
              logger.info("VQSR failed due to lack of training data. Using cutoff-based soft filtering.")
              return hard_filter_fn(in_file, data)
          else:
              return _apply_vqsr(in_file, ref_file, recal_file, tranches_file,
                                 sensitivities[filter_type], filter_type, data)
docs: Filter SNP and indel variant calls using GATK best practice recommendations.
  
      Use cutoff-based soft filters if configuration indicates too little data or
      already finished a cutoff-based filtering step, otherwise try VQSR.