code: def batch(samples):
      
      samples = [utils.to_single_data(x) for x in samples]
      sample_order = [dd.get_sample_name(x) for x in samples]
      batch_groups = collections.defaultdict(list)
      for data in samples:
          batch_samples = tuple(data.get("batch_samples", [dd.get_sample_name(data)]))
          batch_groups[(batch_samples, dd.get_phenotype(data))].append(data)
  
      out = []
      for (batch_samples, phenotype), gsamples in batch_groups.items():
          if len(gsamples) > 1:
              batches = set([])
              for d in gsamples:
                  batches |= set(dd.get_batches(d))
              gsamples.sort(key=dd.get_variantcaller_order)
              cur = copy.deepcopy(gsamples[0])
              cur.update({"batch_id": sorted(list(batches))[0] if batches else "_".join(batch_samples),
                          "batch_samples": batch_samples,
                          "variants": {"variantcallers": [dd.get_variantcaller(d) for d in gsamples],
                                       "calls": [d.get("vrn_file") for d in gsamples]}})
              out.append(cur)
  
      def by_original_order(d):
          return min([sample_order.index(s) for s in d["batch_samples"] if s in sample_order])
      return sorted(out, key=by_original_order)
docs: CWL: batch together per sample, joint and germline calls for ensemble combination.
  
      Sets up groups of same sample/batch variant calls for ensemble calling, as
      long as we have more than one caller per group.