code: def parse_config_file(job, config_file):
      job.fileStore.logToMaster('Parsing config file')
      config_file = os.path.abspath(config_file)
      if not os.path.exists(config_file):
          raise ParameterError('The config file was not found at specified location. Please verify ' +
                               'and retry.')
      sample_set = defaultdict()
      univ_options = defaultdict()
      tool_options = defaultdict()
      with open(config_file, 'r') as conf:
          for line in conf:
              line = line.strip()
              if line.startswith('
                  continue
              if line.startswith('BEGIN'):
                  break
          for groupname, group_params in tool_specific_param_generator(job, conf):
              if groupname == 'patient':
                  if 'patient_id' not in group_params.keys():
                      raise ParameterError('A patient group is missing the patient_id flag.')
                  sample_set[group_params['patient_id']] = group_params
              elif groupname == 'Universal_Options':
                  univ_options = group_params
                  required_options = {'java_Xmx', 'output_folder', 'storage_location'}
                  missing_opts = required_options.difference(set(univ_options.keys()))
                  if len(missing_opts) > 0:
                      raise ParameterError(' The following options have no arguments in the config '
                                           'file :\n' + '\n'.join(missing_opts))
                  if univ_options['sse_key_is_master']:
                      assert univ_options['sse_key_is_master'] in ('True', 'true', 'False', 'false')
                      univ_options['sse_key_is_master'] = \
                          univ_options['sse_key_is_master'] in ('True', 'true')
              else:
                  tool_options[groupname] = group_params
      required_tools = {'cutadapt', 'bwa', 'star', 'phlat', 'transgene', 'mut_callers', 'rsem',
                        'mhci', 'mhcii', 'snpeff', 'rank_boost'}
      missing_tools = required_tools.difference(set(tool_options.keys()))
      if len(missing_tools) > 0:
          raise ParameterError(' The following tools have no arguments in the config file : \n' +
                               '\n'.join(missing_tools))
      for patient_id in sample_set.keys():
          job.addFollowOnJobFn(pipeline_launchpad, sample_set[patient_id], univ_options, tool_options)
      return None