docs: def write_sub_file(self):
      """
      Write a submit file for this Condor job.
      """
      if not self.__log_file:
        raise CondorSubmitError, "Log file not specified."
      if not self.__err_file:
        raise CondorSubmitError, "Error file not specified."
      if not self.__out_file:
        raise CondorSubmitError, "Output file not specified."
  
      if not self.__sub_file_path:
        raise CondorSubmitError, 'No path for submit file.'
      try:
        subfile = open(self.__sub_file_path, 'w')
      except:
        raise CondorSubmitError, "Cannot open file " + self.__sub_file_path
  
      if self.__universe == 'grid':
        if self.__grid_type == None:
          raise CondorSubmitError, 'No grid type specified.'
        elif self.__grid_type == 'gt2':
          if self.__grid_server == None:
            raise CondorSubmitError, 'No server specified for grid resource.'
        elif self.__grid_type == 'gt4':
          if self.__grid_server == None:
            raise CondorSubmitError, 'No server specified for grid resource.'
          if self.__grid_scheduler == None:
            raise CondorSubmitError, 'No scheduler specified for grid resource.'
        else:
          raise CondorSubmitError, 'Unsupported grid resource.'
  
      subfile.write( 'universe = ' + self.__universe + '\n' )
      subfile.write( 'executable = ' + self.__executable + '\n' )
  
      if self.__universe == 'grid':
        if self.__grid_type == 'gt2':
          subfile.write('grid_resource = %s %s\n' % (self.__grid_type,
            self.__grid_server))
        if self.__grid_type == 'gt4':
          subfile.write('grid_resource = %s %s %s\n' % (self.__grid_type,
            self.__grid_server, self.__grid_scheduler))
  
      if self.__universe == 'grid':
        subfile.write('when_to_transfer_output = ON_EXIT\n')
        subfile.write('transfer_output_files = $(macrooutput)\n')
        subfile.write('transfer_input_files = $(macroinput)\n')
  
      if self.__options.keys() or self.__short_options.keys() or self.__arguments:
        subfile.write( 'arguments = "' )
        for c in self.__options.keys():
          if self.__options[c]:
            subfile.write( ' --' + c + ' ' + self.__options[c] )
          else:
            subfile.write( ' --' + c )
        for c in self.__short_options.keys():
          if self.__short_options[c]:
            subfile.write( ' -' + c + ' ' + self.__short_options[c] )
          else:
            subfile.write( ' -' + c )
        for c in self.__arguments:
          subfile.write( ' ' + c )
        subfile.write( ' "\n' )
  
      for cmd in self.__condor_cmds.keys():
        subfile.write( str(cmd) + " = " + str(self.__condor_cmds[cmd]) + '\n' )
  
      subfile.write( 'log = ' + self.__log_file + '\n' )
      if self.__in_file is not None:
        subfile.write( 'input = ' + self.__in_file + '\n' )
      subfile.write( 'error = ' + self.__err_file + '\n' )
      subfile.write( 'output = ' + self.__out_file + '\n' )
      if self.__notification:
        subfile.write( 'notification = ' + self.__notification + '\n' )
      subfile.write( 'queue ' + str(self.__queue) + '\n' )
  
      subfile.close()