<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def run_generator(product_category,obs_info):
 """ 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. """

    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)