code: def report_on_jobs(self):
          
          hasChildren = []
          readyToRun = []
          zombies = []
          hasLogFile = []
          hasServices = []
          services = []
          properties = set()
  
          for job in self.jobsToReport:
              if job.logJobStoreFileID is not None:
                  hasLogFile.append(job)
  
              childNumber = reduce(lambda x, y: x + y, map(len, job.stack) + [0])
              if childNumber > 0:  # Total number of successors > 0
                  hasChildren.append(job)
                  properties.add("HAS_CHILDREN")
              elif job.command is not None:
                  # Job has no children and a command to run. Indicates job could be run.
                  readyToRun.append(job)
                  properties.add("READY_TO_RUN")
              else:
                  # Job has no successors and no command, so is a zombie job.
                  zombies.append(job)
                  properties.add("IS_ZOMBIE")
              if job.services:
                  hasServices.append(job)
                  properties.add("HAS_SERVICES")
              if job.startJobStoreID or job.terminateJobStoreID or job.errorJobStoreID:
                  # These attributes are only set in service jobs
                  services.append(job)
                  properties.add("IS_SERVICE")
  
          jobStats = {'hasChildren': hasChildren,
                      'readyToRun': readyToRun,
                      'zombies': zombies,
                      'hasServices': hasServices,
                      'services': services,
                      'hasLogFile': hasLogFile,
                      'properties': properties,
                      'childNumber': childNumber}
          return jobStats
docs: Gathers information about jobs such as its child jobs and status.
  
          :returns jobStats: Pairings of a useful category and a list of jobs which fall into it.
          :rtype dict: