code: def generate_parallel(samples, run_parallel):
      
      to_analyze, extras = _split_samples_by_qc(samples)
      qced = run_parallel("pipeline_summary", to_analyze)
      samples = _combine_qc_samples(qced) + extras
      qsign_info = run_parallel("qsignature_summary", [samples])
      metadata_file = _merge_metadata([samples])
      summary_file = write_project_summary(samples, qsign_info)
      out = []
      for data in samples:
          if "summary" not in data[0]:
              data[0]["summary"] = {}
          data[0]["summary"]["project"] = summary_file
          data[0]["summary"]["metadata"] = metadata_file
          if qsign_info:
              data[0]["summary"]["mixup_check"] = qsign_info[0]["out_dir"]
          out.append(data)
      out = _add_researcher_summary(out, summary_file)
      # MultiQC must be run after all file outputs are set:
      return [[utils.to_single_data(d)] for d in run_parallel("multiqc_summary", [out])]
docs: Provide parallel preparation of summary information for alignment and variant calling.