code: def gc3(args):
      
      p = OptionParser(gc3.__doc__)
      p.add_option("--plot", default=False, action="store_true",
                   help="Also plot the GC3 histogram [default: %default]")
      p.set_outfile()
  
      opts, args = p.parse_args(args)
  
      outfile = opts.outfile
      plot = opts.plot
  
      if not 1 < len(args) < 4:
          sys.exit(not p.print_help())
  
      ks_file, cdsfile = args[:2]
      GC3 = get_GC3(cdsfile)
      if plot:
          plot_GC3(GC3, cdsfile, fill="green")
  
      if len(args) == 3:
          cdsfile2 = args[2]
          GC3_2 = get_GC3(cdsfile2)
          GC3.update(GC3_2)
          if plot:
              plot_GC3(GC3_2, cdsfile2, fill="lightgreen")
  
      data = KsFile(ks_file)
      noriginals = len(data)
  
      fw = must_open(outfile, "w")
      writer = csv.writer(fw)
      writer.writerow(fields.split(","))
      nlines = 0
      cutoff = .75
      for d in data:
          a, b = d.name.split(";")
          aratio, bratio = GC3[a], GC3[b]
          if (aratio + bratio) / 2 > cutoff:
              continue
          writer.writerow(d)
          nlines += 1
      logging.debug("{0} records written (from {1}).".format(nlines, noriginals))
docs: %prog gc3 ksfile cdsfile [cdsfile2] -o newksfile
  
      Filter the Ks results to remove high GC3 genes. High GC3 genes are
      problematic in Ks calculation - see Tang et al. 2010 PNAS. Specifically, the
      two calculation methods produce drastically different results for these
      pairs. Therefore we advise to remoeve these high GC3 genes. This is often
      the case for studying cereal genes.
  
      If 2 genomes are involved, the cdsfile of the 2nd genome can be provided
      concatenated or separated.