From: Ryan Dale <dalerr@niddk.nih.gov>
Date: Wed, 8 Nov 2017 15:35:02 -0500
Subject: [PATCH] address #227

---
 pybedtools/contrib/bigwig.py | 62 +++++++++++++++++++++++++++++++++++++-------
 pybedtools/test/test1.py     | 36 ++++++++++++++-----------
 2 files changed, 73 insertions(+), 25 deletions(-)

--- a/pybedtools/contrib/bigwig.py
+++ b/pybedtools/contrib/bigwig.py
@@ -48,8 +48,17 @@ def bedgraph_to_bigwig(bedgraph, genome,
         bedgraph.fn,
         genome_file,
         output]
-    p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    stdout, stderr = p.communicate()
+    try:
+        p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        stdout, stderr = p.communicate()
+    except FileNotFoundError:
+        raise FileNotFoundError(
+            "bedGraphToBigWig was not found on the path. This is an external "
+            "tool from UCSC which can be downloaded from "
+            "http://hgdownload.soe.ucsc.edu/admin/exe/. Alternatatively, use "
+            "`conda install ucsc-bedgraphtobigwig`"
+        )
+
     if p.returncode:
         raise ValueError("cmds: %s\nstderr:%s\nstdout:%s"
                          % (" ".join(cmds), stderr, stdout))
@@ -72,8 +81,16 @@ def bigwig_to_bedgraph(fn, chrom=None, s
     outfn = pybedtools.BedTool._tmp()
     cmds.append(outfn)
 
-    p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    stdout, stderr = p.communicate()
+    try:
+        p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        stdout, stderr = p.communicate()
+    except FileNotFoundError:
+        raise FileNotFoundError(
+            "bigWigToBedGraph was not found on the path. This is an external "
+            "tool from UCSC which can be downloaded from "
+            "http://hgdownload.soe.ucsc.edu/admin/exe/. Alternatatively, use "
+            "`conda install ucsc-bedgraphtobigwig`"
+        )
     if p.returncode:
         raise ValueError("cmds: %s\nstderr:%s\nstdout:%s"
                          % (" ".join(cmds), stderr, stdout))
@@ -87,8 +104,17 @@ def wig_to_bigwig(wig, genome, output):
         wig.fn,
         genome_file,
         output]
-    subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    stdout, stderr = p.communicate()
+
+    try:
+        p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        stdout, stderr = p.communicate()
+    except FileNotFoundError:
+        raise FileNotFoundError(
+            "bigWigToBedGraph was not found on the path. This is an external "
+            "tool from UCSC which can be downloaded from "
+            "http://hgdownload.soe.ucsc.edu/admin/exe/. Alternatatively, use "
+            "`conda install ucsc-bedgraphtobigwig`"
+        )
     if p.returncode:
         raise ValueError('cmds: %s\nstderr:%s\nstdout:%s'
                          % (' '.join(cmds), stderr, stdout))
@@ -120,15 +146,31 @@ def bam_to_bigwig(bam, genome, output, s
         x.fn,
         genome_file,
         output]
-    p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
-    stdout, stderr = p.communicate()
+    try:
+        p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
+        stdout, stderr = p.communicate()
+    except FileNotFoundError:
+        raise FileNotFoundError(
+            "bedGraphToBigWig was not found on the path. This is an external "
+            "tool from UCSC which can be downloaded from "
+            "http://hgdownload.soe.ucsc.edu/admin/exe/. Alternatatively, use "
+            "`conda install ucsc-bedgraphtobigwig`"
+        )
 
     if p.returncode and  'bedSort' in stderr:
         print('BAM header was not sorted; sorting bedGraph')
         y = x.sort()
         cmds[1] = y.fn
-        p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
-        stdout, stderr = p.communicate()
+        try:
+            p = subprocess.Popen(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
+            stdout, stderr = p.communicate()
+        except FileNotFoundError:
+            raise FileNotFoundError(
+                "bedSort was not found on the path. This is an external "
+                "tool from UCSC which can be downloaded from "
+                "http://hgdownload.soe.ucsc.edu/admin/exe/. Alternatatively, use "
+                "`conda install ucsc-bedgraphtobigwig`"
+            )
 
     if p.returncode:
         raise ValueError('cmds: %s\nstderr: %s\nstdout: %s'
--- a/pybedtools/test/test1.py
+++ b/pybedtools/test/test1.py
@@ -2104,21 +2104,27 @@ def test_issue_196():
 
 
 def test_issue_178():
-    fn = pybedtools.example_filename('gdc.othersort.bam')
-    pybedtools.contrib.bigwig.bam_to_bigwig(fn, genome='dm3', output='tmp.bw')
-    x = pybedtools.contrib.bigwig.bigwig_to_bedgraph('tmp.bw')
-    assert x == fix(
-        '''
-        chr2L   70      75      1
-        chr2L   140     145     1
-        chr2L   150     155     1
-        chr2L   160     165     1
-        chr2L   210     215     1
-        chrX    10      15      1
-        chrX    70      75      1
-        chrX    140     145     1
-        ''')
-    os.unlink('tmp.bw')
+    try:
+        fn = pybedtools.example_filename('gdc.othersort.bam')
+        pybedtools.contrib.bigwig.bam_to_bigwig(fn, genome='dm3', output='tmp.bw')
+        x = pybedtools.contrib.bigwig.bigwig_to_bedgraph('tmp.bw')
+        assert x == fix(
+            '''
+            chr2L   70      75      1
+            chr2L   140     145     1
+            chr2L   150     155     1
+            chr2L   160     165     1
+            chr2L   210     215     1
+            chrX    10      15      1
+            chrX    70      75      1
+            chrX    140     145     1
+            ''')
+        os.unlink('tmp.bw')
+
+    # If bedGraphToBigWig is not on the path, see
+    # https://github.com/daler/pybedtools/issues/227
+    except FileNotFoundError:
+        pass
 
 def test_issue_203():
     x = pybedtools.example_bedtool('x.bed')
