code: def annotate(args):
      
      from jcvi.assembly.goldenpath import Cutoff, Overlap, Overlap_types
  
      p = OptionParser(annotate.__doc__)
      p.set_align(pctid=94, hitlen=500)
      p.add_option("--hang", default=500, type="int",
                   help="Maximum overhang length")
      opts, args = p.parse_args(args)
  
      if len(args) != 3:
          sys.exit(not p.print_help())
  
      blastfile, afasta, bfasta = args
      fp = must_open(blastfile)
      asizes = Sizes(afasta).mapping
      bsizes = Sizes(bfasta).mapping
      cutoff = Cutoff(opts.pctid, opts.hitlen, opts.hang)
      logging.debug(str(cutoff))
      for row in fp:
          b = BlastLine(row)
          asize = asizes[b.query]
          bsize = bsizes[b.subject]
          if b.query == b.subject:
              continue
          ov = Overlap(b, asize, bsize, cutoff)
          if ov.otype:
              ov.print_graphic()
              print("{0}\t{1}".format(b, Overlap_types[ov.otype]))
docs: %prog annotate blastfile query.fasta subject.fasta
  
      Annotate overlap types (dovetail, contained, etc) in BLAST tabular file.