code: def run_generator(product_category,obs_info):
      
      category_generator_mapping = {'single exposure product': single_exposure_product_filename_generator,
                                    'filter product': filter_product_filename_generator,
                                    'total detection product': total_detection_product_filename_generator,
                                    'multivisit mosaic product': multivisit_mosaic_product_filename_generator}
  
      # Determine which name generator to use based on input product_category
      for key in category_generator_mapping.keys():
          if product_category.startswith(key):
              generator_name = category_generator_mapping[key]
              category_num = product_category.replace(key+" ","")
              break
  
      # parse out obs_info into a list
      obs_info = obs_info.split(" ")
  
      # pad 4-character proposal_id values with leading 0s so that proposal_id is
      # a 5-character sting.
      if key != "multivisit mosaic product": # pad
          obs_info[0] = "{}{}".format("0"*(5-len(obs_info[0])),obs_info[0])
  
      # generate and return filenames
      product_filename_dict=generator_name(obs_info,category_num)
      return(product_filename_dict)
docs: This is the main calling subroutine. It decides which filename generation subroutine should be run based on the
      input product_category, and then passes the information stored in input obs_info to the subroutine so that the
      appropriate filenames can be generated.
  
      Parameters
      ----------
      product_category : string
          The type of final output product which filenames will be generated for
      obs_info : string
          A string containing space-separated items that will be used to
          generate the filenames.
  
      Returns
      --------
      product_filename_dict : dictionary
          A dictionary containing the generated filenames.