From 7b220d3390d157c2381a34e44c82ddd169f357b4 Mon Sep 17 00:00:00 2001 From: gerikson Date: Wed, 22 Jan 2025 11:53:03 +0100 Subject: [PATCH 1/7] Added pytests for bamCoverage and bamCompare --- .../deeptools/test/test_r_bamCompare.py | 88 +++++++++++++++++++ .../deeptools/test/test_r_bamCoverage.py | 88 +++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 pydeeptools/deeptools/test/test_r_bamCompare.py create mode 100644 pydeeptools/deeptools/test/test_r_bamCoverage.py diff --git a/pydeeptools/deeptools/test/test_r_bamCompare.py b/pydeeptools/deeptools/test/test_r_bamCompare.py new file mode 100644 index 0000000000..8749669614 --- /dev/null +++ b/pydeeptools/deeptools/test/test_r_bamCompare.py @@ -0,0 +1,88 @@ +import pytest +from deeptools.bamCompare2 import r_bamcompare +import os.path +import filecmp +from os import unlink + +ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" +BAMFILE_A = ROOT + "test1.bam" +BAMFILE_B = ROOT + "test2.bam" + + +def test_r_bamcompare(): + bamifile1 = BAMFILE_A + bamifile2 = BAMFILE_B + ofile = ROOT + "r_bamcompare_output.bedgraph" + ofiletype = "bedgraph" + norm = "None" + effective_genome_size = 0 + scalefactorsmethod = "None" + operation = "ratio" + pseudocount = 0 + # filtering options + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + _ignorechr = [] + binsize = 500 + regions = [] + verbose = False + + # Call the Rust function + r_bamcompare( + bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, + pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, + _ignorechr, binsize, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t500\t0.6213592\n', + '3R\t500\t1000\t0.8252427\n', + '3R\t1000\t1500\t0.2\n',] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) + +def test_r_bamcompare_RPKM(): + bamifile1 = BAMFILE_A + bamifile2 = BAMFILE_B + ofile = ROOT + "r_bamcompare_output.bedgraph" + ofiletype = "bedgraph" + norm = "RPKM" + effective_genome_size = 0 + scalefactorsmethod = "None" + operation = "ratio" + pseudocount = 0 + # filtering options + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + _ignorechr = [] + binsize = 500 + regions = [] + verbose = False + + # Call the Rust function + r_bamcompare( + bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, + pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, + _ignorechr, binsize, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t500\t0.6213592\n', + '3R\t500\t1000\t0.8252427\n', + '3R\t1000\t1500\t0.2\n',] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) \ No newline at end of file diff --git a/pydeeptools/deeptools/test/test_r_bamCoverage.py b/pydeeptools/deeptools/test/test_r_bamCoverage.py new file mode 100644 index 0000000000..8749669614 --- /dev/null +++ b/pydeeptools/deeptools/test/test_r_bamCoverage.py @@ -0,0 +1,88 @@ +import pytest +from deeptools.bamCompare2 import r_bamcompare +import os.path +import filecmp +from os import unlink + +ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" +BAMFILE_A = ROOT + "test1.bam" +BAMFILE_B = ROOT + "test2.bam" + + +def test_r_bamcompare(): + bamifile1 = BAMFILE_A + bamifile2 = BAMFILE_B + ofile = ROOT + "r_bamcompare_output.bedgraph" + ofiletype = "bedgraph" + norm = "None" + effective_genome_size = 0 + scalefactorsmethod = "None" + operation = "ratio" + pseudocount = 0 + # filtering options + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + _ignorechr = [] + binsize = 500 + regions = [] + verbose = False + + # Call the Rust function + r_bamcompare( + bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, + pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, + _ignorechr, binsize, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t500\t0.6213592\n', + '3R\t500\t1000\t0.8252427\n', + '3R\t1000\t1500\t0.2\n',] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) + +def test_r_bamcompare_RPKM(): + bamifile1 = BAMFILE_A + bamifile2 = BAMFILE_B + ofile = ROOT + "r_bamcompare_output.bedgraph" + ofiletype = "bedgraph" + norm = "RPKM" + effective_genome_size = 0 + scalefactorsmethod = "None" + operation = "ratio" + pseudocount = 0 + # filtering options + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + _ignorechr = [] + binsize = 500 + regions = [] + verbose = False + + # Call the Rust function + r_bamcompare( + bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, + pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, + _ignorechr, binsize, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t500\t0.6213592\n', + '3R\t500\t1000\t0.8252427\n', + '3R\t1000\t1500\t0.2\n',] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) \ No newline at end of file From f0ab442436ddd503dd63c938d1711025b05ef700 Mon Sep 17 00:00:00 2001 From: gerikson Date: Wed, 22 Jan 2025 15:11:28 +0100 Subject: [PATCH 2/7] Some tests for r_computeMatrix --- .../test/test_data/filtered_out_reads.bam | 0 .../deeptools/test/test_data/log2ratio.bed | 3 + .../deeptools/test/test_data/test2.bam | Bin 33925 -> 3157 bytes .../deeptools/test/test_data/test2.bam.bai | Bin 96 -> 96 bytes .../deeptools/test/test_data/test4.bam | Bin 0 -> 25326 bytes .../deeptools/test/test_data/test4.bam.bai | Bin 0 -> 96 bytes .../deeptools/test/test_data/test5.bam | Bin 0 -> 3157 bytes .../deeptools/test/test_data/test5.bam.bai | Bin 0 -> 96 bytes .../deeptools/test/test_data/testB.bam.bai | Bin 96 -> 96 bytes .../deeptools/test/test_data/testC.bam | Bin 0 -> 838 bytes .../deeptools/test/test_data/testC.bam.bai | Bin 0 -> 96 bytes .../deeptools/test/test_data/test_paired2.bam | Bin 2257 -> 1412 bytes .../deeptools/test/test_r_computeMatrix.py | 109 ++++++++++++++++++ 13 files changed, 112 insertions(+) create mode 100644 pydeeptools/deeptools/test/test_data/filtered_out_reads.bam create mode 100644 pydeeptools/deeptools/test/test_data/log2ratio.bed create mode 100644 pydeeptools/deeptools/test/test_data/test4.bam create mode 100644 pydeeptools/deeptools/test/test_data/test4.bam.bai create mode 100644 pydeeptools/deeptools/test/test_data/test5.bam create mode 100644 pydeeptools/deeptools/test/test_data/test5.bam.bai create mode 100644 pydeeptools/deeptools/test/test_data/testC.bam create mode 100644 pydeeptools/deeptools/test/test_data/testC.bam.bai create mode 100644 pydeeptools/deeptools/test/test_r_computeMatrix.py diff --git a/pydeeptools/deeptools/test/test_data/filtered_out_reads.bam b/pydeeptools/deeptools/test/test_data/filtered_out_reads.bam new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pydeeptools/deeptools/test/test_data/log2ratio.bed b/pydeeptools/deeptools/test/test_data/log2ratio.bed new file mode 100644 index 0000000000..45e37e23af --- /dev/null +++ b/pydeeptools/deeptools/test/test_data/log2ratio.bed @@ -0,0 +1,3 @@ +3R 0 500 2.1154773 +3R 500 1000 1.4720684 +3R 1000 1500 0 diff --git a/pydeeptools/deeptools/test/test_data/test2.bam b/pydeeptools/deeptools/test/test_data/test2.bam index c53dc3b90c2d2a2bcf180414d8b4b8fc45be8546..036aa29a5e20736c6e1a188f4a021ed1fda0a2f8 100644 GIT binary patch literal 3157 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 HuXz4HE6sg& diff --git a/pydeeptools/deeptools/test/test_data/test2.bam.bai b/pydeeptools/deeptools/test/test_data/test2.bam.bai index 6c98b7fd1a3993b859f994df9f62dd62b6b34f15..1bf8fc654137dff44b6d339bbc11532025ffec46 100644 GIT binary patch literal 96 wcmZ>A^kigYU|?VZVoxCk1`wNpAp%S?Fj(?{7+#Yg^628)P*pGrRWC#o0P&Io$p8QV literal 96 wcmZ>A^kigYU|?VZVoxCk1`wNpAs$RJFtoOS7+#Yg^626Rp{igMs$PgF09-!>`~Uy| diff --git a/pydeeptools/deeptools/test/test_data/test4.bam b/pydeeptools/deeptools/test/test_data/test4.bam new file mode 100644 index 0000000000000000000000000000000000000000..ba9f13eb1ee708445621faf1903fb3b384811811 GIT binary patch literal 25326 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 literal 0 HcmV?d00001 diff --git a/pydeeptools/deeptools/test/test_data/testB.bam.bai b/pydeeptools/deeptools/test/test_data/testB.bam.bai index 3510ccc8191fbb5a17e1b8f6e3a8336f209570fa..4d683328b6d54b0622fef1b2df763283701a03b1 100644 GIT binary patch delta 14 UcmYdDm>|cfHBnw1NSJE^034nJeE|dKHc?(2NSJE^03HehwEzGB diff --git a/pydeeptools/deeptools/test/test_data/testC.bam b/pydeeptools/deeptools/test/test_data/testC.bam new file mode 100644 index 0000000000000000000000000000000000000000..f1ac616b78a326e440766be98e7810b17976a2f2 GIT binary patch literal 838 zcmb7?y^hmB5XaX6A)Ja>E-b7h=e764DbTJR+wnGcc8p|nBtRme2#M~X1PSgQz)^}w z^gIF|#k~XNNjw1$gTky6iUSJnFO6qscD4Tb?-_o$dmCx(?x1qoK`)VUjK1y4VrFpY zp4653e6HjJVJ@Gji#PAzzB_+));(E1GnaD}FU-et6$#Nb;Os4kc!91UU5PKRk0B5L zxcz&_xa=%`eugcr2x8QIWEtpQyWSn7_o^zDtJAquQb<*aho?`A>1w5*mSUo0o{uLg zmsv7KNAP0DUh}$F;-=|&&8G31s;RKu@P;u)d>)1@2oK^R^q|8zr6H%Bkv=8FgL7IK zuZk&}RWA~O=CdjKs#!p15F=Zo?y>(1HIgC%{xnTgk|lZEqBb_>PS0|j+H&mLF1^~? z+8bVZ7~>Yf*C>p-0ig_I7sEQBH1HV3CMK9t=9>c_K7k%k$8nKqSmTo>1$~4F2RDb! zRGfmjnTWG|&stlX(sIgx7wgT|Zi=mgoh{~TVD&XDSjkwZ?bL?qCxryHHdvQ?L4DoU z-xHuoNBoAQG7@7oNoA&FCWOpd)PHl@0lx3LKB!MTLi~XF{Q>-I<`9=qOvw>-{XV6{ dqc9Gf^Wl*A*HJIdf25b4zh~KP2VUEa&@b2`uP6Wj literal 0 HcmV?d00001 diff --git a/pydeeptools/deeptools/test/test_data/testC.bam.bai b/pydeeptools/deeptools/test/test_data/testC.bam.bai new file mode 100644 index 0000000000000000000000000000000000000000..4d683328b6d54b0622fef1b2df763283701a03b1 GIT binary patch literal 96 wcmZ>A^kigYU|?VZVoxCk1`wNpAr4G3FlaG@7+#Yg^626$P*pGrRWC#o0Odpjga7~l literal 0 HcmV?d00001 diff --git a/pydeeptools/deeptools/test/test_data/test_paired2.bam b/pydeeptools/deeptools/test/test_data/test_paired2.bam index 443fc8a3373d535de71efed9d31e6fc549c7a5c3..2a2d896974d0947cadc9a9df6e0ba7331d3e7895 100644 GIT binary patch delta 1320 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 XpT=?`%l}iC{{ZAJLzti$lV$}T;w~qO diff --git a/pydeeptools/deeptools/test/test_r_computeMatrix.py b/pydeeptools/deeptools/test/test_r_computeMatrix.py new file mode 100644 index 0000000000..a1dddb64f0 --- /dev/null +++ b/pydeeptools/deeptools/test/test_r_computeMatrix.py @@ -0,0 +1,109 @@ +import pytest +from deeptools.computeMatrix2 import r_computematrix # Adjust the import to your actual module +import os.path +import gzip +import hashlib + +root = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" +matrix = root + "computeMatrixOperations.mat.gz" +bed = root + "computeMatrixOperations.bed" +rbindMatrix1 = root + "somegenes.txt.gz" +rbindMatrix2 = root + "othergenes.txt.gz" +bigwig = root + "testA.bw" +outnpz = root + "output.mat.npz.gz" + +def test_r_computematrix_referencePoint(): + mode = "reference-point" + regionlis = [bed] + bwlis = [bigwig] + sampleslabel = ["sample1"] + upstream = 1000 + downstream = 1000 + unscaled5prime = 0 + unscaled3prime = 0 + regionbodylength = 0 + binsize = 50 + missingdatazero = False + metagene = False + txnid = "" + exonid = "" + txniddesignator = "" + scale = 1.0 + nanafterend = False + skipzeros = False + minthresh = 0.0 + maxthresh = 0.0 + averagetypebins = "mean" + sortregions = "keep" + sortusing = "mean" + ortusingsamples = [] + referencepoint = "TSS" + nproc = 1 + verbose = False + ofile = outnpz + + result = r_computematrix( + mode, regionlis, bwlis, sampleslabel, upstream, downstream, unscaled5prime, unscaled3prime, + regionbodylength, binsize, missingdatazero, metagene, txnid, exonid, txniddesignator, scale, + nanafterend, skipzeros, minthresh, maxthresh, averagetypebins, sortregions, sortusing, + ortusingsamples, referencepoint, nproc, verbose, ofile + ) + + + + with gzip.open(ofile, 'rb') as f: + file_content = f.read() + h = hashlib.md5(file_content).hexdigest() + + expectedh = '4f1a2ce422d5b74fb6b75a81916929db' + assert h == expectedh + + os.remove(ofile) + +def test_r_computematrix_scale(): + mode = "scale-regions" + regionlis = [bed] + bwlis = [bigwig] + sampleslabel = ["sample1"] + upstream = 1000 + downstream = 1000 + unscaled5prime = 0 + unscaled3prime = 0 + regionbodylength = 0 + binsize = 50 + missingdatazero = False + metagene = False + txnid = "" + exonid = "" + txniddesignator = "" + scale = 1.0 + nanafterend = False + skipzeros = False + minthresh = 0.0 + maxthresh = 0.0 + averagetypebins = "mean" + sortregions = "keep" + sortusing = "mean" + ortusingsamples = [] + referencepoint = "TSS" + nproc = 1 + verbose = False + ofile = outnpz + + result = r_computematrix( + mode, regionlis, bwlis, sampleslabel, upstream, downstream, unscaled5prime, unscaled3prime, + regionbodylength, binsize, missingdatazero, metagene, txnid, exonid, txniddesignator, scale, + nanafterend, skipzeros, minthresh, maxthresh, averagetypebins, sortregions, sortusing, + ortusingsamples, referencepoint, nproc, verbose, ofile + ) + + with gzip.open(ofile, 'rb') as f: + file_content = f.read() + h = hashlib.md5(file_content).hexdigest() + + + expectedh = '4f1a2ce422d5b74fb6b75a81916929db' + assert h == expectedh + + os.remove(ofile) + From 6fa2bd39ee27992610233a3cd1c5c54e2d8fac4f Mon Sep 17 00:00:00 2001 From: gerikson Date: Wed, 22 Jan 2025 15:17:12 +0100 Subject: [PATCH 3/7] Revert "Added pytests for bamCoverage and bamCompare" This reverts commit 7b220d3390d157c2381a34e44c82ddd169f357b4. --- .../deeptools/test/test_r_bamCompare.py | 88 ------------------- .../deeptools/test/test_r_bamCoverage.py | 88 ------------------- 2 files changed, 176 deletions(-) delete mode 100644 pydeeptools/deeptools/test/test_r_bamCompare.py delete mode 100644 pydeeptools/deeptools/test/test_r_bamCoverage.py diff --git a/pydeeptools/deeptools/test/test_r_bamCompare.py b/pydeeptools/deeptools/test/test_r_bamCompare.py deleted file mode 100644 index 8749669614..0000000000 --- a/pydeeptools/deeptools/test/test_r_bamCompare.py +++ /dev/null @@ -1,88 +0,0 @@ -import pytest -from deeptools.bamCompare2 import r_bamcompare -import os.path -import filecmp -from os import unlink - -ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" -BAMFILE_A = ROOT + "test1.bam" -BAMFILE_B = ROOT + "test2.bam" - - -def test_r_bamcompare(): - bamifile1 = BAMFILE_A - bamifile2 = BAMFILE_B - ofile = ROOT + "r_bamcompare_output.bedgraph" - ofiletype = "bedgraph" - norm = "None" - effective_genome_size = 0 - scalefactorsmethod = "None" - operation = "ratio" - pseudocount = 0 - # filtering options - ignoreduplicates = False - minmappingquality = 0 - samflaginclude = 0 - samflagexclude = 0 - minfraglen = 0 - maxfraglen = 0 - nproc = 1 - _ignorechr = [] - binsize = 500 - regions = [] - verbose = False - - # Call the Rust function - r_bamcompare( - bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, - pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, - _ignorechr, binsize, regions, verbose - ) - # Add assertions to verify the expected behavior - expected = ['3R\t0\t500\t0.6213592\n', - '3R\t500\t1000\t0.8252427\n', - '3R\t1000\t1500\t0.2\n',] - _foo = open(ofile, 'r') - resp = _foo.readlines() - _foo.close() - assert f"{resp}" == f"{expected}", f"{resp} != {expected}" - unlink(ofile) - -def test_r_bamcompare_RPKM(): - bamifile1 = BAMFILE_A - bamifile2 = BAMFILE_B - ofile = ROOT + "r_bamcompare_output.bedgraph" - ofiletype = "bedgraph" - norm = "RPKM" - effective_genome_size = 0 - scalefactorsmethod = "None" - operation = "ratio" - pseudocount = 0 - # filtering options - ignoreduplicates = False - minmappingquality = 0 - samflaginclude = 0 - samflagexclude = 0 - minfraglen = 0 - maxfraglen = 0 - nproc = 1 - _ignorechr = [] - binsize = 500 - regions = [] - verbose = False - - # Call the Rust function - r_bamcompare( - bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, - pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, - _ignorechr, binsize, regions, verbose - ) - # Add assertions to verify the expected behavior - expected = ['3R\t0\t500\t0.6213592\n', - '3R\t500\t1000\t0.8252427\n', - '3R\t1000\t1500\t0.2\n',] - _foo = open(ofile, 'r') - resp = _foo.readlines() - _foo.close() - assert f"{resp}" == f"{expected}", f"{resp} != {expected}" - unlink(ofile) \ No newline at end of file diff --git a/pydeeptools/deeptools/test/test_r_bamCoverage.py b/pydeeptools/deeptools/test/test_r_bamCoverage.py deleted file mode 100644 index 8749669614..0000000000 --- a/pydeeptools/deeptools/test/test_r_bamCoverage.py +++ /dev/null @@ -1,88 +0,0 @@ -import pytest -from deeptools.bamCompare2 import r_bamcompare -import os.path -import filecmp -from os import unlink - -ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" -BAMFILE_A = ROOT + "test1.bam" -BAMFILE_B = ROOT + "test2.bam" - - -def test_r_bamcompare(): - bamifile1 = BAMFILE_A - bamifile2 = BAMFILE_B - ofile = ROOT + "r_bamcompare_output.bedgraph" - ofiletype = "bedgraph" - norm = "None" - effective_genome_size = 0 - scalefactorsmethod = "None" - operation = "ratio" - pseudocount = 0 - # filtering options - ignoreduplicates = False - minmappingquality = 0 - samflaginclude = 0 - samflagexclude = 0 - minfraglen = 0 - maxfraglen = 0 - nproc = 1 - _ignorechr = [] - binsize = 500 - regions = [] - verbose = False - - # Call the Rust function - r_bamcompare( - bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, - pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, - _ignorechr, binsize, regions, verbose - ) - # Add assertions to verify the expected behavior - expected = ['3R\t0\t500\t0.6213592\n', - '3R\t500\t1000\t0.8252427\n', - '3R\t1000\t1500\t0.2\n',] - _foo = open(ofile, 'r') - resp = _foo.readlines() - _foo.close() - assert f"{resp}" == f"{expected}", f"{resp} != {expected}" - unlink(ofile) - -def test_r_bamcompare_RPKM(): - bamifile1 = BAMFILE_A - bamifile2 = BAMFILE_B - ofile = ROOT + "r_bamcompare_output.bedgraph" - ofiletype = "bedgraph" - norm = "RPKM" - effective_genome_size = 0 - scalefactorsmethod = "None" - operation = "ratio" - pseudocount = 0 - # filtering options - ignoreduplicates = False - minmappingquality = 0 - samflaginclude = 0 - samflagexclude = 0 - minfraglen = 0 - maxfraglen = 0 - nproc = 1 - _ignorechr = [] - binsize = 500 - regions = [] - verbose = False - - # Call the Rust function - r_bamcompare( - bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, - pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, - _ignorechr, binsize, regions, verbose - ) - # Add assertions to verify the expected behavior - expected = ['3R\t0\t500\t0.6213592\n', - '3R\t500\t1000\t0.8252427\n', - '3R\t1000\t1500\t0.2\n',] - _foo = open(ofile, 'r') - resp = _foo.readlines() - _foo.close() - assert f"{resp}" == f"{expected}", f"{resp} != {expected}" - unlink(ofile) \ No newline at end of file From 167bc6298624f3937b0d9c616b14d68713ec7422 Mon Sep 17 00:00:00 2001 From: gerikson Date: Wed, 22 Jan 2025 15:23:57 +0100 Subject: [PATCH 4/7] Tests for the rust functions --- .../deeptools/test/test_r_bamCompare.py | 88 +++++++++ .../deeptools/test/test_r_bamCoverage.py | 182 ++++++++++++++++++ 2 files changed, 270 insertions(+) create mode 100644 pydeeptools/deeptools/test/test_r_bamCompare.py create mode 100644 pydeeptools/deeptools/test/test_r_bamCoverage.py diff --git a/pydeeptools/deeptools/test/test_r_bamCompare.py b/pydeeptools/deeptools/test/test_r_bamCompare.py new file mode 100644 index 0000000000..84a3a660b6 --- /dev/null +++ b/pydeeptools/deeptools/test/test_r_bamCompare.py @@ -0,0 +1,88 @@ +import pytest +from deeptools.bamCompare2 import r_bamcompare +import os.path +import filecmp +from os import unlink + +ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" +BAMFILE_A = ROOT + "test1.bam" +BAMFILE_B = ROOT + "test2.bam" + + +def test_r_bamcompare(): + bamifile1 = BAMFILE_A + bamifile2 = BAMFILE_B + ofile = ROOT + "r_bamcompare_output.bedgraph" + ofiletype = "bedgraph" + norm = "None" + effective_genome_size = 0 + scalefactorsmethod = "None" + operation = "ratio" + pseudocount = 0 + # filtering options + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + _ignorechr = [] + binsize = 500 + regions = [] + verbose = False + + # Call the Rust function + r_bamcompare( + bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, + pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, + _ignorechr, binsize, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t500\t4.571429\n', + '3R\t500\t1000\t2.8333333\n', + '3R\t1000\t1500\t1\n',] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) + +def test_r_bamcompare_RPKM(): + bamifile1 = BAMFILE_A + bamifile2 = BAMFILE_B + ofile = ROOT + "r_bamcompare_output.bedgraph" + ofiletype = "bedgraph" + norm = "RPKM" + effective_genome_size = 0 + scalefactorsmethod = "None" + operation = "ratio" + pseudocount = 0 + # filtering options + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + _ignorechr = [] + binsize = 500 + regions = [] + verbose = False + + # Call the Rust function + r_bamcompare( + bamifile1, bamifile2, ofile, ofiletype, norm, effective_genome_size, scalefactorsmethod, operation, + pseudocount, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, nproc, + _ignorechr, binsize, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t500\t4.571429\n', + '3R\t500\t1000\t2.8333333\n', + '3R\t1000\t1500\t1\n',] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) \ No newline at end of file diff --git a/pydeeptools/deeptools/test/test_r_bamCoverage.py b/pydeeptools/deeptools/test/test_r_bamCoverage.py new file mode 100644 index 0000000000..5d50a67ef0 --- /dev/null +++ b/pydeeptools/deeptools/test/test_r_bamCoverage.py @@ -0,0 +1,182 @@ +import pytest +from deeptools.bamCoverage2 import r_bamcoverage +import os.path +import filecmp +from os import unlink + +ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" +BAMFILE_A = ROOT + "testA.bam" +BAMFILE_B = ROOT + "testB.bam" + + +def test_r_bamcoverage(): + bamifile = BAMFILE_A + ofile = ROOT + "output.bedgraph" + ofiletype = "bedgraph" + norm = "None" + effectivegenomesize = 0 + scalefactor = 1.0 + mnase = False + offset = [1, -1] # Adjusted to a regular Python list + extendreads = 0 + centerreads = False + filterrnastrand = "none" + blacklist = "" + ignorechr = [] + skipnoncovregions = False + smoothlength = 0 + binsize = 50 + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + regions = [] + verbose = False + + + # Call the Rust function + r_bamcoverage( + bamifile, ofile, ofiletype, norm, effectivegenomesize, scalefactor, mnase, offset, extendreads, + centerreads, filterrnastrand, blacklist, ignorechr, skipnoncovregions, smoothlength, + binsize, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, + nproc, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t100\t0\n', '3R\t100\t200\t1\n', 'chr_cigar\t0\t50\t1\n', 'chr_cigar\t50\t200\t0\n'] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) + +def test_r_bamcoverage_RPKM(): + bamifile = BAMFILE_A + ofile = ROOT + "output.bedgraph" + ofiletype = "bedgraph" + norm = "RPKM" + effectivegenomesize = 0 + scalefactor = 1.0 + mnase = False + offset = [1, -1] # Adjusted to a regular Python list + extendreads = 0 + centerreads = False + filterrnastrand = "none" + blacklist = "" + ignorechr = [] + skipnoncovregions = False + smoothlength = 0 + binsize = 50 + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + regions = [] + verbose = False + + + # Call the Rust function + r_bamcoverage( + bamifile, ofile, ofiletype, norm, effectivegenomesize, scalefactor, mnase, offset, extendreads, + centerreads, filterrnastrand, blacklist, ignorechr, skipnoncovregions, smoothlength, + binsize, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, + nproc, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t100\t0\n', '3R\t100\t200\t6666666.5\n', 'chr_cigar\t0\t50\t6666666.5\n', 'chr_cigar\t50\t200\t0\n'] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) + +def test_r_bamcoverage_RPKM_with_effectivegenomesize(): + bamifile = BAMFILE_B + ofile = ROOT + "testB.bedgraph" + ofiletype = "bedgraph" + norm = "RPKM" + effectivegenomesize = 142573017 + scalefactor = 1.0 + mnase = False + offset = [1, -1] # Adjusted to a regular Python list + extendreads = 0 + centerreads = False + filterrnastrand = "none" + blacklist = "" + ignorechr = [] + skipnoncovregions = False + smoothlength = 0 + binsize = 50 + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + regions = [] + verbose = False + + + # Call the Rust function + r_bamcoverage( + bamifile, ofile, ofiletype, norm, effectivegenomesize, scalefactor, mnase, offset, extendreads, + centerreads, filterrnastrand, blacklist, ignorechr, skipnoncovregions, smoothlength, + binsize, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, + nproc, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t50\t0\n', '3R\t50\t150\t5000000\n', '3R\t150\t200\t10000000\n'] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) + +def test_r_bamcoverage_RPKM_with_effectivegenomesize_and_scalefactor(): + bamifile = BAMFILE_B + ofile = ROOT + "testB.bedgraph" + ofiletype = "bedgraph" + norm = "RPKM" + effectivegenomesize = 142573017 + scalefactor = 2.0 + mnase = False + offset = [1, -1] # Adjusted to a regular Python list + extendreads = 0 + centerreads = False + filterrnastrand = "none" + blacklist = "" + ignorechr = [] + skipnoncovregions = False + smoothlength = 0 + binsize = 50 + ignoreduplicates = False + minmappingquality = 0 + samflaginclude = 0 + samflagexclude = 0 + minfraglen = 0 + maxfraglen = 0 + nproc = 1 + regions = [] + verbose = False + + + # Call the Rust function + r_bamcoverage( + bamifile, ofile, ofiletype, norm, effectivegenomesize, scalefactor, mnase, offset, extendreads, + centerreads, filterrnastrand, blacklist, ignorechr, skipnoncovregions, smoothlength, + binsize, ignoreduplicates, minmappingquality, samflaginclude, samflagexclude, minfraglen, maxfraglen, + nproc, regions, verbose + ) + # Add assertions to verify the expected behavior + expected = ['3R\t0\t50\t0\n', '3R\t50\t150\t2\n', '3R\t150\t200\t4\n'] + _foo = open(ofile, 'r') + resp = _foo.readlines() + _foo.close() + assert f"{resp}" == f"{expected}", f"{resp} != {expected}" + unlink(ofile) From 99864de6157c6d00405b1f0bba15baa4829ee107 Mon Sep 17 00:00:00 2001 From: gerikson Date: Wed, 22 Jan 2025 15:55:04 +0100 Subject: [PATCH 5/7] Tests for AlignmentSieve --- .../deeptools/test/test_r_alignmentsieve.py | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 pydeeptools/deeptools/test/test_r_alignmentsieve.py diff --git a/pydeeptools/deeptools/test/test_r_alignmentsieve.py b/pydeeptools/deeptools/test/test_r_alignmentsieve.py new file mode 100644 index 0000000000..55b8baa37c --- /dev/null +++ b/pydeeptools/deeptools/test/test_r_alignmentsieve.py @@ -0,0 +1,133 @@ +import pytest +from deeptools.alignmentSieve2 import r_alignmentsieve +import os.path + + +ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" +BAMFILE_A = ROOT + "test_paired.bam" +BAMFILE_B = ROOT + "test_paired2.bam" + +def test_r_alignmentsieve_basic(): + bamifile = BAMFILE_A + ofile = BAMFILE_B + nproc = 4 + filter_metrics = ROOT + "filter_metrics_basic.txt" + filtered_out_readsfile = ROOT + "filtered_out_reads.bam" + verbose = False + shift = [] + _bed = False + filter_rna_strand = "None" + min_mapping_quality = 30 + sam_flag_incl = 0 + sam_flag_excl = 0 + _blacklist = "" + min_fragment_length = 0 + max_fragment_length = 1000 + extend_reads = 0 + center_reads = False + + result = r_alignmentsieve( + bamifile, ofile, nproc, filter_metrics, filtered_out_readsfile, verbose, shift, _bed, + filter_rna_strand, min_mapping_quality, sam_flag_incl, sam_flag_excl, _blacklist, + min_fragment_length, max_fragment_length, extend_reads, center_reads + ) + + expected_content = [ + "#bamFilterReads --filterMetrics", + "#File\tReads\tRemaining Total\tInitial Reads", + "test_paired.bam\t49\t49" + ] + + with open(filter_metrics, 'r') as f: + lines = f.readlines() + + # Remove the file path prefix from the third line + lines[2] = os.path.basename(lines[2]) + + # Strip newline characters from the lines + lines = [line.strip() for line in lines] + + assert lines == expected_content + + +def test_r_alignmentsieve_with_shift(): + bamifile = BAMFILE_A + ofile = BAMFILE_B + nproc = 4 + filter_metrics = ROOT + "filter_metrics_shift.txt" + filtered_out_readsfile = ROOT + "filtered_out_reads.bam" + verbose = False + shift = [] + _bed = False + filter_rna_strand = "None" + min_mapping_quality = 30 + sam_flag_incl = 0 + sam_flag_excl = 0 + _blacklist = "" + min_fragment_length = 0 + max_fragment_length = 1000 + extend_reads = 0 + center_reads = False + + result = r_alignmentsieve( + bamifile, ofile, nproc, filter_metrics, filtered_out_readsfile, verbose, shift, _bed, + filter_rna_strand, min_mapping_quality, sam_flag_incl, sam_flag_excl, _blacklist, + min_fragment_length, max_fragment_length, extend_reads, center_reads + ) + + expected_content = [ + "#bamFilterReads --filterMetrics", + "#File\tReads\tRemaining Total\tInitial Reads", + "test_paired.bam\t27\t49" + ] + + with open(filter_metrics, 'r') as f: + lines = f.readlines() + + # Remove the file path prefix from the third line + lines[2] = os.path.basename(lines[2]) + + # Strip newline characters from the lines + lines = [line.strip() for line in lines] + + + +def test_r_alignmentsieve_with_filtering(): + bamifile = BAMFILE_A + ofile = BAMFILE_B + nproc = 4 + filter_metrics = ROOT + "filter_metrics_withFiltering.txt" + filtered_out_readsfile = ROOT +"filtered_out_reads.bam" + verbose = False + shift = [] + _bed = False + filter_rna_strand = "forward" + min_mapping_quality = 30 + sam_flag_incl = 0 + sam_flag_excl = 0 + _blacklist = "" + min_fragment_length = 100 + max_fragment_length = 500 + extend_reads = 0 + center_reads = False + + result = r_alignmentsieve( + bamifile, ofile, nproc, filter_metrics, filtered_out_readsfile, verbose, shift, _bed, + filter_rna_strand, min_mapping_quality, sam_flag_incl, sam_flag_excl, _blacklist, + min_fragment_length, max_fragment_length, extend_reads, center_reads + ) + + expected_content = [ + "#bamFilterReads --filterMetrics", + "#File\tReads\tRemaining Total\tInitial Reads", + "test_paired.bam\t27\t49" + ] + + with open(filter_metrics, 'r') as f: + lines = f.readlines() + + # Remove the file path prefix from the third line + lines[2] = os.path.basename(lines[2]) + + # Strip newline characters from the lines + lines = [line.strip() for line in lines] From b5b77df2eff59a367991ecc205c7bd033dfc4322 Mon Sep 17 00:00:00 2001 From: gerikson Date: Wed, 22 Jan 2025 16:00:19 +0100 Subject: [PATCH 6/7] Fixed bug for alignment sieve --- pydeeptools/deeptools/test/test_r_alignmentsieve.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pydeeptools/deeptools/test/test_r_alignmentsieve.py b/pydeeptools/deeptools/test/test_r_alignmentsieve.py index 55b8baa37c..55572d75a7 100644 --- a/pydeeptools/deeptools/test/test_r_alignmentsieve.py +++ b/pydeeptools/deeptools/test/test_r_alignmentsieve.py @@ -78,7 +78,7 @@ def test_r_alignmentsieve_with_shift(): expected_content = [ "#bamFilterReads --filterMetrics", "#File\tReads\tRemaining Total\tInitial Reads", - "test_paired.bam\t27\t49" + "test_paired.bam\t49\t49" ] with open(filter_metrics, 'r') as f: @@ -90,6 +90,7 @@ def test_r_alignmentsieve_with_shift(): # Strip newline characters from the lines lines = [line.strip() for line in lines] + assert lines == expected_content def test_r_alignmentsieve_with_filtering(): @@ -131,3 +132,5 @@ def test_r_alignmentsieve_with_filtering(): # Strip newline characters from the lines lines = [line.strip() for line in lines] + + assert lines == expected_content From 2fb3cbd28bef874b47c252ddbbcd0205d3bf9879 Mon Sep 17 00:00:00 2001 From: gerikson Date: Wed, 22 Jan 2025 16:10:32 +0100 Subject: [PATCH 7/7] Fixed bug for alignment sieve --- .../deeptools/test/test_r_alignmentsieve.py | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/pydeeptools/deeptools/test/test_r_alignmentsieve.py b/pydeeptools/deeptools/test/test_r_alignmentsieve.py index 55572d75a7..de031b244b 100644 --- a/pydeeptools/deeptools/test/test_r_alignmentsieve.py +++ b/pydeeptools/deeptools/test/test_r_alignmentsieve.py @@ -134,3 +134,45 @@ def test_r_alignmentsieve_with_filtering(): lines = [line.strip() for line in lines] assert lines == expected_content + +def test_r_alignmentsieve_with_filtering_extendReads(): + bamifile = BAMFILE_A + ofile = BAMFILE_B + nproc = 4 + filter_metrics = ROOT + "filter_metrics_extendReads.txt" + filtered_out_readsfile = ROOT +"filtered_out_reads.bam" + verbose = False + shift = [] + _bed = False + filter_rna_strand = "forward" + min_mapping_quality = 30 + sam_flag_incl = 0 + sam_flag_excl = 0 + _blacklist = "" + min_fragment_length = 100 + max_fragment_length = 500 + extend_reads = 100 + center_reads = False + + result = r_alignmentsieve( + bamifile, ofile, nproc, filter_metrics, filtered_out_readsfile, verbose, shift, _bed, + filter_rna_strand, min_mapping_quality, sam_flag_incl, sam_flag_excl, _blacklist, + min_fragment_length, max_fragment_length, extend_reads, center_reads + ) + + expected_content = [ + "#bamFilterReads --filterMetrics", + "#File\tReads\tRemaining Total\tInitial Reads", + "test_paired.bam\t27\t49" + ] + + with open(filter_metrics, 'r') as f: + lines = f.readlines() + + # Remove the file path prefix from the third line + lines[2] = os.path.basename(lines[2]) + + # Strip newline characters from the lines + lines = [line.strip() for line in lines] + + assert lines == expected_content