code: def make_job_graph(infiles, fragfiles, blastcmds):
      
      joblist = []  # Holds list of job dependency graphs
  
      # Get dictionary of database-building jobs
      dbjobdict = build_db_jobs(infiles, blastcmds)
  
      # Create list of BLAST executable jobs, with dependencies
      jobnum = len(dbjobdict)
      for idx, fname1 in enumerate(fragfiles[:-1]):
          for fname2 in fragfiles[idx + 1 :]:
              jobnum += 1
              jobs = [
                  pyani_jobs.Job(
                      "%s_exe_%06d_a" % (blastcmds.prefix, jobnum),
                      blastcmds.build_blast_cmd(fname1, fname2.replace("-fragments", "")),
                  ),
                  pyani_jobs.Job(
                      "%s_exe_%06d_b" % (blastcmds.prefix, jobnum),
                      blastcmds.build_blast_cmd(fname2, fname1.replace("-fragments", "")),
                  ),
              ]
              jobs[0].add_dependency(dbjobdict[fname1.replace("-fragments", "")])
              jobs[1].add_dependency(dbjobdict[fname2.replace("-fragments", "")])
              joblist.extend(jobs)
  
      # Return the dependency graph
      return joblist
docs: Return a job dependency graph, based on the passed input sequence files.
  
      - infiles - a list of paths to input FASTA files
      - fragfiles - a list of paths to fragmented input FASTA files
  
      By default, will run ANIb - it *is* possible to make a mess of passing the
      wrong executable for the mode you're using.
  
      All items in the returned graph list are BLAST executable jobs that must
      be run *after* the corresponding database creation. The Job objects
      corresponding to the database creation are contained as dependencies.
      How those jobs are scheduled depends on the scheduler (see
      run_multiprocessing.py, run_sge.py)