code: def _set_align_split_size(data):
      
      if cwlutils.is_cwl_run(data):
          target_size = 20  # Gb
          target_size_reads = 80  # million reads
      else:
          target_size = 5  # Gb
          target_size_reads = 20  # million reads
      max_splits = 100  # Avoid too many pieces, causing merge memory problems
      val = dd.get_align_split_size(data)
      umi_consensus = dd.get_umi_consensus(data)
      if val is None:
          if not umi_consensus:
              total_size = 0  # Gb
              # Use original files if we might have reduced the size of our prepped files
              input_files = data.get("files_orig", []) if dd.get_save_diskspace(data) else data.get("files", [])
              for fname in input_files:
                  if os.path.exists(fname):
                      total_size += os.path.getsize(fname) / (1024.0 * 1024.0 * 1024.0)
              # Only set if we have files and are bigger than the target size
              if total_size > target_size:
                  data["config"]["algorithm"]["align_split_size"] = \
                    int(1e6 * _pick_align_split_size(total_size, target_size,
                                                     target_size_reads, max_splits))
      elif val:
          assert not umi_consensus, "Cannot set align_split_size to %s with UMI conensus specified" % val
      return data
docs: Set useful align_split_size, generating an estimate if it doesn't exist.
  
      We try to split on larger inputs and avoid too many pieces, aiming for size
      chunks of 5Gb or at most 50 maximum splits.
  
      The size estimate used in calculations is 20 million reads for ~5Gb.
  
      For UMI calculations we skip splitting since we're going to align and
      re-align after consensus.
  
      For CWL runs, we pick larger split sizes to avoid overhead of staging each chunk.