# Source code for pybedtools.contrib.bigbed

    import os
    import subprocess
    import six
    import pybedtools

    def bigbed(x, genome, output, blockSize=256, itemsPerSlot=512, bedtype=None, _as=None, unc=False, tab=False):
        """
        Converts a BedTool object to a bigBed format and returns the new filename.

        `x` is a BedTool object

        `genome` is an assembly string

        `output` is the name of the bigBed file to create.

        Other args are passed to bedToBigBed.  In particular, `bedtype` (which
        becomes the "-type=" argument) is automatically handled for you if it is
        kept as the default None.

        Assumes that a recent version of bedToBigBed from UCSC is on the path.
        """
        if isinstance(x, six.string_types):
            x = pybedtools.BedTool(x)
        if not isinstance(x.fn, six.string_types):
            x = x.saveas()
        chromsizes = pybedtools.chromsizes_to_file(pybedtools.chromsizes(genome))
        if bedtype is None:
            bedtype = 'bed%s' % x.field_count()
        cmds = [
            'bedToBigBed',
            x.fn,
            chromsizes,
            output,
            '-blockSize=%s' % blockSize,
            '-itemsPerSlot=%s' % itemsPerSlot,
            '-type=%s' % bedtype
        ]
        if unc:
            cmds.append('-unc')
        if tab:
            cmds.append('-tab')
        if _as:
            cmds.append('-as=%s' % _as)
        p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = p.communicate()
        if p.returncode:
            raise ValueError("cmds: %s\nstderr:%s\nstdout:%s"
                             % (" ".join(cmds), stderr, stdout))

        return output

    def bigbed_to_bed(fn, chrom=None, start=None, end=None, maxItems=None):
        cmds = [
            'bigBedToBed',
            fn]
        if chrom is not None:
            cmds.extend(['-chrom', chrom])
        if start is not None:
            cmds.extend(['-start', start])
        if end is not None:
            cmds.extend(['-end', end])
        if maxItems is not None:
            cmds.extend(['-maxItems', maxItems])

        outfn = pybedtools.BedTool._tmp()
        cmds.append(outfn)

        p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = p.communicate()
        if p.returncode:
            raise ValueError("cmds: %s\nstderr:%s\nstdout:%s"
                             % (" ".join(cmds), stderr, stdout))
        return pybedtools.BedTool(outfn)