code: def merge(args):
      
      p = OptionParser(merge.__doc__)
      p.add_option("-w", "--weightsfile", default="weights.txt",
                   help="Write weights to file")
      p.set_outfile("out.bed")
      opts, args = p.parse_args(args)
  
      if len(args) < 1:
          sys.exit(not p.print_help())
  
      maps = args
      outfile = opts.outfile
      fp = must_open(maps)
      b = Bed()
      mapnames = set()
      for row in fp:
          mapname = filename_to_mapname(fp.filename())
          mapnames.add(mapname)
          try:
              m = CSVMapLine(row, mapname=mapname)
              if m.cm < 0:
                  logging.error("Ignore marker with negative genetic distance")
                  print(row.strip(), file=sys.stderr)
              else:
                  b.append(BedLine(m.bedline))
          except (IndexError, ValueError):  # header or mal-formed line
              continue
  
      b.print_to_file(filename=outfile, sorted=True)
      logging.debug("A total of {0} markers written to `{1}`.".\
                          format(len(b), outfile))
  
      assert len(maps) == len(mapnames), "You have a collision in map names"
      write_weightsfile(mapnames, weightsfile=opts.weightsfile)
docs: %prog merge map1 map2 map3 ...
  
      Convert csv maps to bed format.
  
      Each input map is csv formatted, for example:
  
      ScaffoldID,ScaffoldPosition,LinkageGroup,GeneticPosition
      scaffold_2707,11508,1,0
      scaffold_2707,11525,1,1.2
      scaffold_759,81336,1,9.7