code: def batchcn(args):
      
      p = OptionParser(batchcn.__doc__)
      p.add_option("--upload", default="s3://hli-mv-data-science/htang/ccn",
                   help="Upload cn and seg results to s3")
      opts, args = p.parse_args(args)
  
      if len(args) != 2:
          sys.exit(not p.print_help())
  
      workdir, samples = args
      upload = opts.upload
      store = upload + "/{}/*.seg".format(workdir)
      computed = [op.basename(x).split(".")[0] for x in glob_s3(store)]
      computed = set(computed)
  
      # Generate a bunch of cn commands
      fp = open(samples)
      nskipped = ntotal = 0
      cmd = "python -m jcvi.variation.cnv cn --hmm --cleanup {}".format(workdir)
      for row in fp:
          samplekey, path = row.strip().split(",")
          ntotal += 1
          if samplekey in computed:
              nskipped += 1
              continue
          print(" ".join((cmd, samplekey, path)))
  
      logging.debug("Skipped: {}".format(percentage(nskipped, ntotal)))
docs: %prog batchcn workdir samples.csv
  
      Run CNV segmentation caller in batch mode. Scans a workdir.