code: def _group_events(catalog, process_len, template_length, data_pad):
      
      # case for catalog only containing one event
      if len(catalog) == 1:
          return [catalog]
      sub_catalogs = []
      # Sort catalog by date
      catalog.events = sorted(
          catalog.events,
          key=lambda e: (e.preferred_origin() or e.origins[0]).time)
      sub_catalog = Catalog([catalog[0]])
      for event in catalog[1:]:
          origin_time = (event.preferred_origin() or event.origins[0]).time
          last_pick = sorted(event.picks, key=lambda p: p.time)[-1]
          max_diff = (
              process_len - (last_pick.time - origin_time) - template_length)
          max_diff -= 2 * data_pad
          if origin_time - sub_catalog[0].origins[0].time < max_diff:
              sub_catalog.append(event)
          else:
              sub_catalogs.append(sub_catalog)
              sub_catalog = Catalog([event])
      sub_catalogs.append(sub_catalog)
      return sub_catalogs
docs: Internal function to group events into sub-catalogs based on process_len.
  
      :param catalog: Catalog to groups into sub-catalogs
      :type catalog: obspy.core.event.Catalog
      :param process_len: Length in seconds that data will be processed in
      :type process_len: int
  
      :return: List of catalogs
      :rtype: list