From 1640fc1722079331730714c320ddeb722f2a1be3 Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Thu, 22 Jun 2023 16:35:10 +0200 Subject: [PATCH 1/7] fixup! benchmark incorporates CPU/memory usage --- README.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/README.rst b/README.rst index f12f6ec1..85d18d90 100644 --- a/README.rst +++ b/README.rst @@ -551,7 +551,6 @@ Version Description ========= ============================================================================== 1.1.0 * Implement ability to benchmark the CPU and memory usage (not just time) benchmark incorporates CPU/memory usage - * add missing cython in requirements (and psutil for benchmarking) 1.0.0 * Fix bam2fastq for paired data that computed useless intermediate file https://github.com/bioconvert/bioconvert/issues/325 * more realistic fastq simulator From 38c0611d2f9d2e8f686bb22f59533ae14805f3d5 Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Thu, 22 Jun 2023 17:06:24 +0200 Subject: [PATCH 2/7] Update README.rst --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index 85d18d90..ea5bdab1 100644 --- a/README.rst +++ b/README.rst @@ -551,6 +551,10 @@ Version Description ========= ============================================================================== 1.1.0 * Implement ability to benchmark the CPU and memory usage (not just time) benchmark incorporates CPU/memory usage +<<<<<<< HEAD +======= + * add missing cython in requirements (and psutil for benchmarking) +>>>>>>> 86b3623... Update README.rst 1.0.0 * Fix bam2fastq for paired data that computed useless intermediate file https://github.com/bioconvert/bioconvert/issues/325 * more realistic fastq simulator From c3c7df6459550e8be3ceba0c35fe26d35767a208 Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Sat, 1 Jul 2023 23:06:32 +0200 Subject: [PATCH 3/7] add picard-slim in environment --- environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/environment.yml b/environment.yml index 301020fc..9e7cd5d4 100644 --- a/environment.yml +++ b/environment.yml @@ -18,6 +18,7 @@ dependencies: - mappy - matplotlib-base - networkx +- picard-slim - pyyaml - pysam - pyexcel From ffb465d39084ae89541adc052662e0e98e3bea80 Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Wed, 12 Jul 2023 22:00:38 +0200 Subject: [PATCH 4/7] replaces requires(go) by goalign or gotree --- bioconvert/clustal2fasta.py | 2 +- bioconvert/clustal2nexus.py | 2 +- bioconvert/fasta2clustal.py | 2 +- bioconvert/fasta2nexus.py | 2 +- bioconvert/fasta2phylip.py | 2 +- bioconvert/newick2nexus.py | 2 +- bioconvert/newick2phyloxml.py | 2 +- bioconvert/nexus2clustal.py | 2 +- bioconvert/nexus2fasta.py | 2 +- bioconvert/nexus2newick.py | 2 +- bioconvert/nexus2phylip.py | 2 +- bioconvert/nexus2phyloxml.py | 2 +- bioconvert/phylip2fasta.py | 2 +- bioconvert/phylip2nexus.py | 2 +- bioconvert/phyloxml2newick.py | 2 +- bioconvert/phyloxml2nexus.py | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/bioconvert/clustal2fasta.py b/bioconvert/clustal2fasta.py index 6a444c4c..74c86fa6 100644 --- a/bioconvert/clustal2fasta.py +++ b/bioconvert/clustal2fasta.py @@ -71,7 +71,7 @@ def _method_squizz(self, *args, **kwargs): cmd = "squizz -c FASTA {infile} > {outfile}".format(infile=self.infile, outfile=self.outfile) self.execute(cmd) - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert :term:`CLUSTAL` file in :term:`FASTA` format using goalign. diff --git a/bioconvert/clustal2nexus.py b/bioconvert/clustal2nexus.py index d071a29a..4abb9593 100644 --- a/bioconvert/clustal2nexus.py +++ b/bioconvert/clustal2nexus.py @@ -53,7 +53,7 @@ def __init__(self, infile, outfile=None, alphabet=None, *args, **kwargs): super(CLUSTAL2NEXUS, self).__init__(infile, outfile) self.alphabet = alphabet - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, threads=None, *args, **kwargs): """Convert :term:`CLUSTAL` file in :term:`NEXUS` format using goalign tool. diff --git a/bioconvert/fasta2clustal.py b/bioconvert/fasta2clustal.py index 20fa2de8..42e131c0 100644 --- a/bioconvert/fasta2clustal.py +++ b/bioconvert/fasta2clustal.py @@ -68,7 +68,7 @@ def _method_squizz(self, *args, **kwargs): cmd = "squizz -c CLUSTAL {infile} > {outfile}".format(infile=self.infile, outfile=self.outfile) self.execute(cmd) - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert :term:`FASTA` file in :term:`CLUSTAL` format using goalign tool. diff --git a/bioconvert/fasta2nexus.py b/bioconvert/fasta2nexus.py index ef90223f..e1804afb 100644 --- a/bioconvert/fasta2nexus.py +++ b/bioconvert/fasta2nexus.py @@ -51,7 +51,7 @@ def __init__(self, infile, outfile=None, alphabet=None, *args, **kwargs): """ super(FASTA2NEXUS, self).__init__(infile, outfile) - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert fasta file in Nexus format using goalign tool. diff --git a/bioconvert/fasta2phylip.py b/bioconvert/fasta2phylip.py index 862df825..e3866851 100644 --- a/bioconvert/fasta2phylip.py +++ b/bioconvert/fasta2phylip.py @@ -76,7 +76,7 @@ def _method_squizz(self, *args, **kwargs): cmd = "squizz -c PHYLIPI {infile} > {outfile}".format(infile=self.infile, outfile=self.outfile) self.execute(cmd) - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert fasta file in Phylip interleaved format using goalign tool. diff --git a/bioconvert/newick2nexus.py b/bioconvert/newick2nexus.py index 7c420339..49a2f5f6 100644 --- a/bioconvert/newick2nexus.py +++ b/bioconvert/newick2nexus.py @@ -52,7 +52,7 @@ def __init__(self, infile, outfile=None, *args, **kwargs): """ super().__init__(infile, outfile) - @requires("go") + @requires("gotree") @compressor def _method_gotree(self, *args, **kwargs): """Convert :term:`NEWICK` file in :term:`NEXUS` format using gotree tool. diff --git a/bioconvert/newick2phyloxml.py b/bioconvert/newick2phyloxml.py index 9694b3cc..9e101262 100644 --- a/bioconvert/newick2phyloxml.py +++ b/bioconvert/newick2phyloxml.py @@ -53,7 +53,7 @@ def __init__(self, infile, outfile=None, alphabet=None, *args, **kwargs): super().__init__(infile, outfile) self.alphabet = alphabet - @requires("go") + @requires("gotree") @compressor def _method_gotree(self, *args, **kwargs): """Convert :term:`NEWICK` file in :term:`PHYLOXML` format using gotree tool. diff --git a/bioconvert/nexus2clustal.py b/bioconvert/nexus2clustal.py index b3b03bd2..437f4520 100644 --- a/bioconvert/nexus2clustal.py +++ b/bioconvert/nexus2clustal.py @@ -54,7 +54,7 @@ def __init__(self, infile, outfile=None, alphabet=None, *args, **kwargs): super().__init__(infile, outfile) self.alphabet = alphabet - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert :term:`NEXUS` file in :term:`CLUSTAL` format using goalign tool. diff --git a/bioconvert/nexus2fasta.py b/bioconvert/nexus2fasta.py index 29e5ecea..ca89705c 100644 --- a/bioconvert/nexus2fasta.py +++ b/bioconvert/nexus2fasta.py @@ -52,7 +52,7 @@ def __init__(self, infile, outfile=None, alphabet=None, *args, **kwargs): super().__init__(infile, outfile) self.alphabet = alphabet - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert :term:`NEXUS` interleaved file in :term:`FASTA` format using goalign tool. diff --git a/bioconvert/nexus2newick.py b/bioconvert/nexus2newick.py index e0199269..a1b80da7 100644 --- a/bioconvert/nexus2newick.py +++ b/bioconvert/nexus2newick.py @@ -65,7 +65,7 @@ def _method_biopython(self, *args, **kwargs): Phylo.convert(self.infile, "nexus", self.outfile, "newick") - @requires("go") + @requires("gotree") @compressor def _method_gotree(self, *args, **kwargs): """Convert :term:`NEXUS` file in :term:`NEWICK` format using gotree tool. diff --git a/bioconvert/nexus2phylip.py b/bioconvert/nexus2phylip.py index 63f338a9..b757ad1f 100644 --- a/bioconvert/nexus2phylip.py +++ b/bioconvert/nexus2phylip.py @@ -53,7 +53,7 @@ def __init__(self, infile, outfile=None, alphabet=None, *args, **kwargs): super().__init__(infile, outfile) self.alphabet = alphabet - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert :term:`NEXUS` interleaved file in :term:`PHYLIP` format using goalign tool. diff --git a/bioconvert/nexus2phyloxml.py b/bioconvert/nexus2phyloxml.py index 44c3b36e..48747380 100644 --- a/bioconvert/nexus2phyloxml.py +++ b/bioconvert/nexus2phyloxml.py @@ -54,7 +54,7 @@ def __init__(self, infile, outfile=None, alphabet=None, *args, **kwargs): super().__init__(infile, outfile) self.alphabet = alphabet - @requires("go") + @requires("gotree") @compressor def _method_gotree(self, *args, **kwargs): """uses gotree tool: diff --git a/bioconvert/phylip2fasta.py b/bioconvert/phylip2fasta.py index 4154d2e6..202dc194 100644 --- a/bioconvert/phylip2fasta.py +++ b/bioconvert/phylip2fasta.py @@ -70,7 +70,7 @@ def _method_squizz(self, *args, **kwargs): cmd = "squizz -c FASTA {infile} > {outfile}".format(infile=self.infile, outfile=self.outfile) self.execute(cmd) - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert fasta file in Phylip interleaved format using goalign tool. diff --git a/bioconvert/phylip2nexus.py b/bioconvert/phylip2nexus.py index 069da12a..6686bc56 100644 --- a/bioconvert/phylip2nexus.py +++ b/bioconvert/phylip2nexus.py @@ -52,7 +52,7 @@ def __init__(self, infile, outfile=None, *args, **kwargs): """ super().__init__(infile, outfile) - @requires("go") + @requires("goalign") @compressor def _method_goalign(self, *args, **kwargs): """Convert :term:`PHYLIP` interleaved file in :term:`NEXUS` format using goalign tool. diff --git a/bioconvert/phyloxml2newick.py b/bioconvert/phyloxml2newick.py index f15fd32a..6396ce2f 100644 --- a/bioconvert/phyloxml2newick.py +++ b/bioconvert/phyloxml2newick.py @@ -52,7 +52,7 @@ def __init__(self, infile, outfile=None, *args, **kwargs): """ super(PHYLOXML2NEWICK, self).__init__(infile, outfile) - @requires("go") + @requires("gotree") @compressor def _method_gotree(self, *args, **kwargs): """Convert :term:`PHYLOXML` file in :term:`NEWICK` format using gotree tool. diff --git a/bioconvert/phyloxml2nexus.py b/bioconvert/phyloxml2nexus.py index 5a3c8764..7de252bd 100644 --- a/bioconvert/phyloxml2nexus.py +++ b/bioconvert/phyloxml2nexus.py @@ -52,7 +52,7 @@ def __init__(self, infile, outfile=None, *args, **kwargs): """ super().__init__(infile, outfile) - @requires("go") + @requires("gotree") @compressor def _method_gotree(self, *args, **kwargs): """Convert :term:`PHYLOXML` file in :term:`NEXUS` format using gotree tool. From 052f70ddbb1a522480b004c3c0680f08cd18a684 Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Wed, 12 Jul 2023 22:09:44 +0200 Subject: [PATCH 5/7] update README --- README.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.rst b/README.rst index ea5bdab1..85d18d90 100644 --- a/README.rst +++ b/README.rst @@ -551,10 +551,6 @@ Version Description ========= ============================================================================== 1.1.0 * Implement ability to benchmark the CPU and memory usage (not just time) benchmark incorporates CPU/memory usage -<<<<<<< HEAD -======= - * add missing cython in requirements (and psutil for benchmarking) ->>>>>>> 86b3623... Update README.rst 1.0.0 * Fix bam2fastq for paired data that computed useless intermediate file https://github.com/bioconvert/bioconvert/issues/325 * more realistic fastq simulator From 3e8269b9fd56c6bf3e8fa5dafc3aac074aafb242 Mon Sep 17 00:00:00 2001 From: Thomas Cokelaer Date: Mon, 17 Jul 2023 21:51:06 +0200 Subject: [PATCH 6/7] add pod5 extensions, requirements and test --- .github/workflows/abi2fasta.yml | 1 - .github/workflows/abi2fastq.yml | 1 - .github/workflows/abi2qual.yml | 1 - .github/workflows/bam2bedgraph.yml | 1 - .github/workflows/bam2bigwig.yml | 1 - .github/workflows/bam2cov.yml | 1 - .github/workflows/bam2cram.yml | 1 - .github/workflows/bam2fasta.yml | 1 - .github/workflows/bam2fastq.yml | 1 - .github/workflows/bam2json.yml | 1 - .github/workflows/bam2sam.yml | 1 - .github/workflows/bam2tsv.yml | 1 - .github/workflows/bam2wiggle.yml | 1 - .github/workflows/bcf2vcf.yml | 1 - .github/workflows/bcf2wiggle.yml | 1 - .github/workflows/bed2wiggle.yml | 1 - .github/workflows/bedgraph2bigwig.yml | 1 - .github/workflows/bedgraph2cov.yml | 1 - .github/workflows/bedgraph2wiggle.yml | 1 - .github/workflows/bigbed2bed.yml | 1 - .github/workflows/bigbed2wiggle.yml | 1 - .github/workflows/bigwig2bedgraph.yml | 1 - .github/workflows/bigwig2wiggle.yml | 1 - .github/workflows/bplink2plink.yml | 1 - .github/workflows/bplink2vcf.yml | 1 - .github/workflows/bz22gz.yml | 1 - .github/workflows/clustal2fasta.yml | 1 - .github/workflows/clustal2nexus.yml | 1 - .github/workflows/clustal2phylip.yml | 1 - .github/workflows/clustal2stockholm.yml | 1 - .github/workflows/cram2bam.yml | 1 - .github/workflows/cram2fasta.yml | 1 - .github/workflows/cram2fastq.yml | 1 - .github/workflows/cram2sam.yml | 1 - .github/workflows/create_wk.py | 1 - .github/workflows/csv2tsv.yml | 1 - .github/workflows/csv2xls.yml | 1 - .github/workflows/dsrc2gz.yml | 1 - .github/workflows/embl2fasta.yml | 1 - .github/workflows/embl2genbank.yml | 1 - .github/workflows/fast52pod5.yml | 107 ++++++++++++++++++++++++ .github/workflows/fasta2clustal.yml | 1 - .github/workflows/fasta2faa.yml | 1 - .github/workflows/fasta2fasta_agp.yml | 1 - .github/workflows/fasta2fastq.yml | 1 - .github/workflows/fasta2genbank.yml | 1 - .github/workflows/fasta2nexus.yml | 1 - .github/workflows/fasta2phylip.yml | 1 - .github/workflows/fasta2twobit.yml | 1 - .github/workflows/fasta_qual2fastq.yml | 1 - .github/workflows/fastq2fasta.yml | 1 - .github/workflows/fastq2fasta_qual.yml | 1 - .github/workflows/fastq2qual.yml | 1 - .github/workflows/genbank2embl.yml | 1 - .github/workflows/genbank2fasta.yml | 1 - .github/workflows/genbank2gff3.yml | 1 - .github/workflows/gfa2fasta.yml | 1 - .github/workflows/gff22gff3.yml | 1 - .github/workflows/gff32gff2.yml | 1 - .github/workflows/gff32gtf.yml | 1 - .github/workflows/gz2bz2.yml | 1 - .github/workflows/gz2dsrc.yml | 1 - .github/workflows/json2yaml.yml | 1 - .github/workflows/maf2sam.yml | 1 - .github/workflows/newick2nexus.yml | 1 - .github/workflows/newick2phyloxml.yml | 1 - .github/workflows/nexus2clustal.yml | 1 - .github/workflows/nexus2fasta.yml | 1 - .github/workflows/nexus2newick.yml | 1 - .github/workflows/nexus2phylip.yml | 1 - .github/workflows/nexus2phyloxml.yml | 1 - .github/workflows/ods2csv.yml | 1 - .github/workflows/pdb2faa.yml | 1 - .github/workflows/phylip2clustal.yml | 1 - .github/workflows/phylip2fasta.yml | 1 - .github/workflows/phylip2nexus.yml | 1 - .github/workflows/phylip2stockholm.yml | 1 - .github/workflows/phylip2xmfa.yml | 1 - .github/workflows/phyloxml2newick.yml | 1 - .github/workflows/phyloxml2nexus.yml | 1 - .github/workflows/plink2bplink.yml | 1 - .github/workflows/plink2vcf.yml | 1 - .github/workflows/sam2bam.yml | 1 - .github/workflows/sam2cram.yml | 1 - .github/workflows/sam2paf.yml | 1 - .github/workflows/scf2fasta.yml | 1 - .github/workflows/scf2fastq.yml | 1 - .github/workflows/sra2fastq.yml | 1 - .github/workflows/stockholm2clustal.yml | 1 - .github/workflows/stockholm2phylip.yml | 1 - .github/workflows/tsv2csv.yml | 1 - .github/workflows/twobit2fasta.yml | 1 - .github/workflows/vcf2bcf.yml | 1 - .github/workflows/vcf2bed.yml | 1 - .github/workflows/vcf2bplink.yml | 1 - .github/workflows/vcf2plink.yml | 1 - .github/workflows/vcf2wiggle.yml | 1 - .github/workflows/wig2bed.yml | 1 - .github/workflows/xls2csv.yml | 1 - .github/workflows/xlsx2csv.yml | 1 - .github/workflows/xmfa2phylip.yml | 1 - .github/workflows/yaml2json.yml | 1 - bioconvert/core/extensions.py | 2 + bioconvert/fast52pod5.py | 56 +++++++++++++ environment.yml | 1 + environment_rtd.yml | 1 + requirements.txt | 1 + test/data/fast5/single_read.fast5 | Bin 0 -> 57879 bytes test/data/pod5/single_read.pod5 | Bin 0 -> 47008 bytes test/test_fast52pod5.py | 17 ++++ 110 files changed, 185 insertions(+), 101 deletions(-) create mode 100644 .github/workflows/fast52pod5.yml create mode 100644 bioconvert/fast52pod5.py create mode 100755 test/data/fast5/single_read.fast5 create mode 100644 test/data/pod5/single_read.pod5 create mode 100644 test/test_fast52pod5.py diff --git a/.github/workflows/abi2fasta.yml b/.github/workflows/abi2fasta.yml index b354f25a..443f708d 100644 --- a/.github/workflows/abi2fasta.yml +++ b/.github/workflows/abi2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/abi2fastq.yml b/.github/workflows/abi2fastq.yml index 38062cfe..bb9a11c0 100644 --- a/.github/workflows/abi2fastq.yml +++ b/.github/workflows/abi2fastq.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/abi2qual.yml b/.github/workflows/abi2qual.yml index 194ebb87..d3464ac3 100644 --- a/.github/workflows/abi2qual.yml +++ b/.github/workflows/abi2qual.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2bedgraph.yml b/.github/workflows/bam2bedgraph.yml index b4a18ef0..6de75916 100644 --- a/.github/workflows/bam2bedgraph.yml +++ b/.github/workflows/bam2bedgraph.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2bigwig.yml b/.github/workflows/bam2bigwig.yml index 958915d8..2490cc73 100644 --- a/.github/workflows/bam2bigwig.yml +++ b/.github/workflows/bam2bigwig.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2cov.yml b/.github/workflows/bam2cov.yml index d87e094e..1f984a24 100644 --- a/.github/workflows/bam2cov.yml +++ b/.github/workflows/bam2cov.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2cram.yml b/.github/workflows/bam2cram.yml index a91570ce..4ade97ad 100644 --- a/.github/workflows/bam2cram.yml +++ b/.github/workflows/bam2cram.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2fasta.yml b/.github/workflows/bam2fasta.yml index 22726a9f..68aea6a7 100644 --- a/.github/workflows/bam2fasta.yml +++ b/.github/workflows/bam2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2fastq.yml b/.github/workflows/bam2fastq.yml index 7c0c1982..31019747 100644 --- a/.github/workflows/bam2fastq.yml +++ b/.github/workflows/bam2fastq.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2json.yml b/.github/workflows/bam2json.yml index 231d39f3..052f1e70 100644 --- a/.github/workflows/bam2json.yml +++ b/.github/workflows/bam2json.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2sam.yml b/.github/workflows/bam2sam.yml index 7a466edf..90c37350 100644 --- a/.github/workflows/bam2sam.yml +++ b/.github/workflows/bam2sam.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2tsv.yml b/.github/workflows/bam2tsv.yml index 923d6e91..ca5e2567 100644 --- a/.github/workflows/bam2tsv.yml +++ b/.github/workflows/bam2tsv.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bam2wiggle.yml b/.github/workflows/bam2wiggle.yml index 9795ac7b..c291d56f 100644 --- a/.github/workflows/bam2wiggle.yml +++ b/.github/workflows/bam2wiggle.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bcf2vcf.yml b/.github/workflows/bcf2vcf.yml index a8c5fbbc..ebdba911 100644 --- a/.github/workflows/bcf2vcf.yml +++ b/.github/workflows/bcf2vcf.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bcf2wiggle.yml b/.github/workflows/bcf2wiggle.yml index 22f6c022..20129a09 100644 --- a/.github/workflows/bcf2wiggle.yml +++ b/.github/workflows/bcf2wiggle.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bed2wiggle.yml b/.github/workflows/bed2wiggle.yml index 080a18a4..d018c7d5 100644 --- a/.github/workflows/bed2wiggle.yml +++ b/.github/workflows/bed2wiggle.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bedgraph2bigwig.yml b/.github/workflows/bedgraph2bigwig.yml index c81889a8..ea22c774 100644 --- a/.github/workflows/bedgraph2bigwig.yml +++ b/.github/workflows/bedgraph2bigwig.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bedgraph2cov.yml b/.github/workflows/bedgraph2cov.yml index 29aa68bc..55d5bb84 100644 --- a/.github/workflows/bedgraph2cov.yml +++ b/.github/workflows/bedgraph2cov.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bedgraph2wiggle.yml b/.github/workflows/bedgraph2wiggle.yml index 83bd3a6d..734d8de5 100644 --- a/.github/workflows/bedgraph2wiggle.yml +++ b/.github/workflows/bedgraph2wiggle.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bigbed2bed.yml b/.github/workflows/bigbed2bed.yml index 8d63da75..0ba7f6e7 100644 --- a/.github/workflows/bigbed2bed.yml +++ b/.github/workflows/bigbed2bed.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bigbed2wiggle.yml b/.github/workflows/bigbed2wiggle.yml index e70ed435..1079a9f7 100644 --- a/.github/workflows/bigbed2wiggle.yml +++ b/.github/workflows/bigbed2wiggle.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bigwig2bedgraph.yml b/.github/workflows/bigwig2bedgraph.yml index b0e0ccc1..ffb50916 100644 --- a/.github/workflows/bigwig2bedgraph.yml +++ b/.github/workflows/bigwig2bedgraph.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bigwig2wiggle.yml b/.github/workflows/bigwig2wiggle.yml index 07976b67..876b154c 100644 --- a/.github/workflows/bigwig2wiggle.yml +++ b/.github/workflows/bigwig2wiggle.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bplink2plink.yml b/.github/workflows/bplink2plink.yml index 8c3592f3..2990c7e9 100644 --- a/.github/workflows/bplink2plink.yml +++ b/.github/workflows/bplink2plink.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bplink2vcf.yml b/.github/workflows/bplink2vcf.yml index 8a9cd9f8..02c6848d 100644 --- a/.github/workflows/bplink2vcf.yml +++ b/.github/workflows/bplink2vcf.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/bz22gz.yml b/.github/workflows/bz22gz.yml index dfe4ac7e..f621df6e 100644 --- a/.github/workflows/bz22gz.yml +++ b/.github/workflows/bz22gz.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/clustal2fasta.yml b/.github/workflows/clustal2fasta.yml index cdabae89..9da97c95 100644 --- a/.github/workflows/clustal2fasta.yml +++ b/.github/workflows/clustal2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/clustal2nexus.yml b/.github/workflows/clustal2nexus.yml index 8c58899b..b797db1c 100644 --- a/.github/workflows/clustal2nexus.yml +++ b/.github/workflows/clustal2nexus.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/clustal2phylip.yml b/.github/workflows/clustal2phylip.yml index 743a2aba..6a694a0e 100644 --- a/.github/workflows/clustal2phylip.yml +++ b/.github/workflows/clustal2phylip.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/clustal2stockholm.yml b/.github/workflows/clustal2stockholm.yml index a1091c5f..96e1978b 100644 --- a/.github/workflows/clustal2stockholm.yml +++ b/.github/workflows/clustal2stockholm.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/cram2bam.yml b/.github/workflows/cram2bam.yml index d4b81944..2ffff238 100644 --- a/.github/workflows/cram2bam.yml +++ b/.github/workflows/cram2bam.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/cram2fasta.yml b/.github/workflows/cram2fasta.yml index 5d7757ca..cfee0172 100644 --- a/.github/workflows/cram2fasta.yml +++ b/.github/workflows/cram2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/cram2fastq.yml b/.github/workflows/cram2fastq.yml index 3adfc779..1ae345fe 100644 --- a/.github/workflows/cram2fastq.yml +++ b/.github/workflows/cram2fastq.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/cram2sam.yml b/.github/workflows/cram2sam.yml index c1ee4ef0..c7b7dff5 100644 --- a/.github/workflows/cram2sam.yml +++ b/.github/workflows/cram2sam.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/create_wk.py b/.github/workflows/create_wk.py index 9faeb394..7bd12584 100644 --- a/.github/workflows/create_wk.py +++ b/.github/workflows/create_wk.py @@ -94,7 +94,6 @@ mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/csv2tsv.yml b/.github/workflows/csv2tsv.yml index 2dcfdd36..7194a0a0 100644 --- a/.github/workflows/csv2tsv.yml +++ b/.github/workflows/csv2tsv.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/csv2xls.yml b/.github/workflows/csv2xls.yml index e77aaf97..2a67bacb 100644 --- a/.github/workflows/csv2xls.yml +++ b/.github/workflows/csv2xls.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/dsrc2gz.yml b/.github/workflows/dsrc2gz.yml index 3f9321e6..e5f3d43e 100644 --- a/.github/workflows/dsrc2gz.yml +++ b/.github/workflows/dsrc2gz.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/embl2fasta.yml b/.github/workflows/embl2fasta.yml index 0e3c8249..be557b57 100644 --- a/.github/workflows/embl2fasta.yml +++ b/.github/workflows/embl2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/embl2genbank.yml b/.github/workflows/embl2genbank.yml index 5bfa66ae..01619fa8 100644 --- a/.github/workflows/embl2genbank.yml +++ b/.github/workflows/embl2genbank.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fast52pod5.yml b/.github/workflows/fast52pod5.yml new file mode 100644 index 00000000..28737fed --- /dev/null +++ b/.github/workflows/fast52pod5.yml @@ -0,0 +1,107 @@ +name: sam2bam Testing + +on: + workflow_dispatch: + push: + branches: + - main + - dev + - refactoring + paths: + - bioconvert/fast52pod5.py + - .github/workflows/fast52pod5.yml + pull_request: + branches-ignore: [] + paths: + - bioconvert/fast52pod5.py + schedule: + - cron: '0 0 13 * *' + +jobs: + build-linux: + runs-on: ubuntu-latest + strategy: + max-parallel: 5 + matrix: + python: [3.8, 3.9, '3.10'] + fail-fast: false + + steps: + + - name: install graphviz and curl + run: | + sudo apt-get update + sudo apt-get install -y graphviz-dev + sudo apt-get install libcurl4-gnutls-dev + - name: checkout git repo + uses: actions/checkout@v2 + + - name: conda/mamba + uses: mamba-org/provision-with-micromamba@main + with: + cache-downloads: true + environment-file: false + environment-name: installation + channels: + conda-forge,bioconda,defaults,r + extra-specs: | + python=${{ matrix.python }} + easydev + biosniff + colorlog + deeptools + gffread + pandas + biopython>=1.70 + mappy + matplotlib-base + networkx + pod5 + pyyaml + pysam + pyexcel + pyexcel-ods3 + pyexcel-xls + pyexcel-xlsx + pyBigWig + py2bit + statsmodels + tqdm + bamtools + bcftools + bedtools + bedops + dsrc + go==1.10.3 + goalign + gotree + mosdepth + pbzip2 + pigz + plink + sambamba + samtools>=1.9 + seqtk + seqkit + squizz + sra-tools + ucsc-wigtobigwig + ucsc-twobittofa + ucsc-fatotwobit + ucsc-bedgraphtobigwig + ucsc-bigwigtobedgraph + wiggletools + sed + mawk + xlrd + + # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz + + - name: Install with pip + shell: bash -l {0} + run: | + pip install .[testing] + - name: testing + shell: bash -l {0} + run: | + pytest -n 1 --cov-report term --cov=bioconvert.fast52pod5 test/test_fast52pod5.py diff --git a/.github/workflows/fasta2clustal.yml b/.github/workflows/fasta2clustal.yml index d4b4c739..14d261bd 100644 --- a/.github/workflows/fasta2clustal.yml +++ b/.github/workflows/fasta2clustal.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta2faa.yml b/.github/workflows/fasta2faa.yml index 13a36eee..e6bb1cad 100644 --- a/.github/workflows/fasta2faa.yml +++ b/.github/workflows/fasta2faa.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta2fasta_agp.yml b/.github/workflows/fasta2fasta_agp.yml index abf8d1d8..528cd2dc 100644 --- a/.github/workflows/fasta2fasta_agp.yml +++ b/.github/workflows/fasta2fasta_agp.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta2fastq.yml b/.github/workflows/fasta2fastq.yml index 50c3ed4e..6e89835d 100644 --- a/.github/workflows/fasta2fastq.yml +++ b/.github/workflows/fasta2fastq.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta2genbank.yml b/.github/workflows/fasta2genbank.yml index 64287e36..961d83ee 100644 --- a/.github/workflows/fasta2genbank.yml +++ b/.github/workflows/fasta2genbank.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta2nexus.yml b/.github/workflows/fasta2nexus.yml index c94a977b..810845d0 100644 --- a/.github/workflows/fasta2nexus.yml +++ b/.github/workflows/fasta2nexus.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta2phylip.yml b/.github/workflows/fasta2phylip.yml index 6bc6d1ba..e0c9056b 100644 --- a/.github/workflows/fasta2phylip.yml +++ b/.github/workflows/fasta2phylip.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta2twobit.yml b/.github/workflows/fasta2twobit.yml index 679eb662..4bf396c3 100644 --- a/.github/workflows/fasta2twobit.yml +++ b/.github/workflows/fasta2twobit.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fasta_qual2fastq.yml b/.github/workflows/fasta_qual2fastq.yml index 7dece5f0..a6a677d5 100644 --- a/.github/workflows/fasta_qual2fastq.yml +++ b/.github/workflows/fasta_qual2fastq.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fastq2fasta.yml b/.github/workflows/fastq2fasta.yml index b7758b35..1c7b5648 100644 --- a/.github/workflows/fastq2fasta.yml +++ b/.github/workflows/fastq2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fastq2fasta_qual.yml b/.github/workflows/fastq2fasta_qual.yml index 42e6e192..a9deac56 100644 --- a/.github/workflows/fastq2fasta_qual.yml +++ b/.github/workflows/fastq2fasta_qual.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/fastq2qual.yml b/.github/workflows/fastq2qual.yml index 7ce45a5f..db0d56a2 100644 --- a/.github/workflows/fastq2qual.yml +++ b/.github/workflows/fastq2qual.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/genbank2embl.yml b/.github/workflows/genbank2embl.yml index 7d683220..acd585b1 100644 --- a/.github/workflows/genbank2embl.yml +++ b/.github/workflows/genbank2embl.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/genbank2fasta.yml b/.github/workflows/genbank2fasta.yml index e2ac8b22..13604c39 100644 --- a/.github/workflows/genbank2fasta.yml +++ b/.github/workflows/genbank2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/genbank2gff3.yml b/.github/workflows/genbank2gff3.yml index 77c6c6a5..144b4bb9 100644 --- a/.github/workflows/genbank2gff3.yml +++ b/.github/workflows/genbank2gff3.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/gfa2fasta.yml b/.github/workflows/gfa2fasta.yml index 983c592c..4be68d66 100644 --- a/.github/workflows/gfa2fasta.yml +++ b/.github/workflows/gfa2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/gff22gff3.yml b/.github/workflows/gff22gff3.yml index 3ef5171d..2af42c6e 100644 --- a/.github/workflows/gff22gff3.yml +++ b/.github/workflows/gff22gff3.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/gff32gff2.yml b/.github/workflows/gff32gff2.yml index ce938a70..6b116174 100644 --- a/.github/workflows/gff32gff2.yml +++ b/.github/workflows/gff32gff2.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/gff32gtf.yml b/.github/workflows/gff32gtf.yml index 2e153c19..ac40683e 100644 --- a/.github/workflows/gff32gtf.yml +++ b/.github/workflows/gff32gtf.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/gz2bz2.yml b/.github/workflows/gz2bz2.yml index 2f94b672..576169c0 100644 --- a/.github/workflows/gz2bz2.yml +++ b/.github/workflows/gz2bz2.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/gz2dsrc.yml b/.github/workflows/gz2dsrc.yml index f05faaca..2c7f4f13 100644 --- a/.github/workflows/gz2dsrc.yml +++ b/.github/workflows/gz2dsrc.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/json2yaml.yml b/.github/workflows/json2yaml.yml index 4f527f07..08927cb7 100644 --- a/.github/workflows/json2yaml.yml +++ b/.github/workflows/json2yaml.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/maf2sam.yml b/.github/workflows/maf2sam.yml index 1637c724..76e812eb 100644 --- a/.github/workflows/maf2sam.yml +++ b/.github/workflows/maf2sam.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/newick2nexus.yml b/.github/workflows/newick2nexus.yml index a1c143f5..9606e249 100644 --- a/.github/workflows/newick2nexus.yml +++ b/.github/workflows/newick2nexus.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/newick2phyloxml.yml b/.github/workflows/newick2phyloxml.yml index 00789e25..eb8a0784 100644 --- a/.github/workflows/newick2phyloxml.yml +++ b/.github/workflows/newick2phyloxml.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/nexus2clustal.yml b/.github/workflows/nexus2clustal.yml index 305fb03a..a5e84a18 100644 --- a/.github/workflows/nexus2clustal.yml +++ b/.github/workflows/nexus2clustal.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/nexus2fasta.yml b/.github/workflows/nexus2fasta.yml index dd657e92..860a39b9 100644 --- a/.github/workflows/nexus2fasta.yml +++ b/.github/workflows/nexus2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/nexus2newick.yml b/.github/workflows/nexus2newick.yml index b8711479..4387008d 100644 --- a/.github/workflows/nexus2newick.yml +++ b/.github/workflows/nexus2newick.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/nexus2phylip.yml b/.github/workflows/nexus2phylip.yml index 32e60d71..92da07d8 100644 --- a/.github/workflows/nexus2phylip.yml +++ b/.github/workflows/nexus2phylip.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/nexus2phyloxml.yml b/.github/workflows/nexus2phyloxml.yml index 73df910d..b7c08e96 100644 --- a/.github/workflows/nexus2phyloxml.yml +++ b/.github/workflows/nexus2phyloxml.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/ods2csv.yml b/.github/workflows/ods2csv.yml index 5794e57b..c41d08e3 100644 --- a/.github/workflows/ods2csv.yml +++ b/.github/workflows/ods2csv.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/pdb2faa.yml b/.github/workflows/pdb2faa.yml index 96ddb768..782bcf04 100644 --- a/.github/workflows/pdb2faa.yml +++ b/.github/workflows/pdb2faa.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/phylip2clustal.yml b/.github/workflows/phylip2clustal.yml index a9c0b466..d0bfa1af 100644 --- a/.github/workflows/phylip2clustal.yml +++ b/.github/workflows/phylip2clustal.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/phylip2fasta.yml b/.github/workflows/phylip2fasta.yml index ce9579e1..6eef7b51 100644 --- a/.github/workflows/phylip2fasta.yml +++ b/.github/workflows/phylip2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/phylip2nexus.yml b/.github/workflows/phylip2nexus.yml index b3d7b9ad..9b6de7c2 100644 --- a/.github/workflows/phylip2nexus.yml +++ b/.github/workflows/phylip2nexus.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/phylip2stockholm.yml b/.github/workflows/phylip2stockholm.yml index 9565f576..c25107ea 100644 --- a/.github/workflows/phylip2stockholm.yml +++ b/.github/workflows/phylip2stockholm.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/phylip2xmfa.yml b/.github/workflows/phylip2xmfa.yml index 412e70d7..84bf7a39 100644 --- a/.github/workflows/phylip2xmfa.yml +++ b/.github/workflows/phylip2xmfa.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/phyloxml2newick.yml b/.github/workflows/phyloxml2newick.yml index 6d9f5c27..4667432e 100644 --- a/.github/workflows/phyloxml2newick.yml +++ b/.github/workflows/phyloxml2newick.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/phyloxml2nexus.yml b/.github/workflows/phyloxml2nexus.yml index f77a6111..da947a52 100644 --- a/.github/workflows/phyloxml2nexus.yml +++ b/.github/workflows/phyloxml2nexus.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/plink2bplink.yml b/.github/workflows/plink2bplink.yml index 83833e13..b9a63d37 100644 --- a/.github/workflows/plink2bplink.yml +++ b/.github/workflows/plink2bplink.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/plink2vcf.yml b/.github/workflows/plink2vcf.yml index 1edcc499..82c5c17f 100644 --- a/.github/workflows/plink2vcf.yml +++ b/.github/workflows/plink2vcf.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/sam2bam.yml b/.github/workflows/sam2bam.yml index e51b469d..ffaa7928 100644 --- a/.github/workflows/sam2bam.yml +++ b/.github/workflows/sam2bam.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/sam2cram.yml b/.github/workflows/sam2cram.yml index 47565eed..97ec3dbc 100644 --- a/.github/workflows/sam2cram.yml +++ b/.github/workflows/sam2cram.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/sam2paf.yml b/.github/workflows/sam2paf.yml index a81356e2..d5fc118d 100644 --- a/.github/workflows/sam2paf.yml +++ b/.github/workflows/sam2paf.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/scf2fasta.yml b/.github/workflows/scf2fasta.yml index 3aafa176..7f2cb0c1 100644 --- a/.github/workflows/scf2fasta.yml +++ b/.github/workflows/scf2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/scf2fastq.yml b/.github/workflows/scf2fastq.yml index d9ba8b33..dd1a6891 100644 --- a/.github/workflows/scf2fastq.yml +++ b/.github/workflows/scf2fastq.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/sra2fastq.yml b/.github/workflows/sra2fastq.yml index 5a04fc9f..841e215c 100644 --- a/.github/workflows/sra2fastq.yml +++ b/.github/workflows/sra2fastq.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/stockholm2clustal.yml b/.github/workflows/stockholm2clustal.yml index 34da16c4..d8e2a346 100644 --- a/.github/workflows/stockholm2clustal.yml +++ b/.github/workflows/stockholm2clustal.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/stockholm2phylip.yml b/.github/workflows/stockholm2phylip.yml index 8d577cf4..e689157d 100644 --- a/.github/workflows/stockholm2phylip.yml +++ b/.github/workflows/stockholm2phylip.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/tsv2csv.yml b/.github/workflows/tsv2csv.yml index 4b7f35cd..a5fd30d5 100644 --- a/.github/workflows/tsv2csv.yml +++ b/.github/workflows/tsv2csv.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/twobit2fasta.yml b/.github/workflows/twobit2fasta.yml index ee73b14a..5b6d7108 100644 --- a/.github/workflows/twobit2fasta.yml +++ b/.github/workflows/twobit2fasta.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/vcf2bcf.yml b/.github/workflows/vcf2bcf.yml index 390b39da..a015a247 100644 --- a/.github/workflows/vcf2bcf.yml +++ b/.github/workflows/vcf2bcf.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/vcf2bed.yml b/.github/workflows/vcf2bed.yml index 65c5a349..08b03e73 100644 --- a/.github/workflows/vcf2bed.yml +++ b/.github/workflows/vcf2bed.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/vcf2bplink.yml b/.github/workflows/vcf2bplink.yml index d3992d2d..40563757 100644 --- a/.github/workflows/vcf2bplink.yml +++ b/.github/workflows/vcf2bplink.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/vcf2plink.yml b/.github/workflows/vcf2plink.yml index ae88e4ca..1ed62478 100644 --- a/.github/workflows/vcf2plink.yml +++ b/.github/workflows/vcf2plink.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/vcf2wiggle.yml b/.github/workflows/vcf2wiggle.yml index 1da17358..49247f12 100644 --- a/.github/workflows/vcf2wiggle.yml +++ b/.github/workflows/vcf2wiggle.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/wig2bed.yml b/.github/workflows/wig2bed.yml index 07c095f8..120d2271 100644 --- a/.github/workflows/wig2bed.yml +++ b/.github/workflows/wig2bed.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/xls2csv.yml b/.github/workflows/xls2csv.yml index 335bf076..67dc935f 100644 --- a/.github/workflows/xls2csv.yml +++ b/.github/workflows/xls2csv.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/xlsx2csv.yml b/.github/workflows/xlsx2csv.yml index 08cf152f..59e7894e 100644 --- a/.github/workflows/xlsx2csv.yml +++ b/.github/workflows/xlsx2csv.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/xmfa2phylip.yml b/.github/workflows/xmfa2phylip.yml index e5bc26f3..a3e9e89b 100644 --- a/.github/workflows/xmfa2phylip.yml +++ b/.github/workflows/xmfa2phylip.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/.github/workflows/yaml2json.yml b/.github/workflows/yaml2json.yml index 7a6b7d24..a0a91659 100644 --- a/.github/workflows/yaml2json.yml +++ b/.github/workflows/yaml2json.yml @@ -94,7 +94,6 @@ jobs: mawk xlrd - # mamba install -c conda-forge -c bioconda --quiet -y samtools bedtools bamtools mosdepth pbzip2 pigz dsrc sambamba squizz - name: Install with pip shell: bash -l {0} diff --git a/bioconvert/core/extensions.py b/bioconvert/core/extensions.py index 2124b564..6869871d 100644 --- a/bioconvert/core/extensions.py +++ b/bioconvert/core/extensions.py @@ -83,6 +83,7 @@ def update(self, content): "embl": ["embl"], # annotation/sequence "ena": ["ena"], "faa": ["faa", "mpfa", "aa"], # fasta multiple amino acid + "fast5": ["fast5"], "fasta": ["fasta", "fa", "fst"], # sequence "fastq": ["fastq", "fq"], # sequence "genbank": ["genbank", "gbk", "gb"], # annotation/sequence @@ -101,6 +102,7 @@ def update(self, content): "phylip": ["phy", "ph", "phylip"], # phylo "phyloxml": ["phyloxml", "xml"], # phylo "plink": ["plink"], + "pod5": ["pod5"], "qual": ["qual"], # seauence "sam": ["sam"], # alignement "scf": ["scf"], # alignement diff --git a/bioconvert/fast52pod5.py b/bioconvert/fast52pod5.py new file mode 100644 index 00000000..f51f8c6d --- /dev/null +++ b/bioconvert/fast52pod5.py @@ -0,0 +1,56 @@ +########################################################################### +# Bioconvert is a project to facilitate the interconversion # +# of life science data from one format to another. # +# # +# Copyright © 2018-2022 Institut Pasteur, Paris and CNRS. # +# # +# bioconvert is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# bioconvert is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program (COPYING file). # +# If not, see . # +# # +# Repository: https://github.com/bioconvert/bioconvert # +# Documentation: http://bioconvert.readthedocs.io # +########################################################################### +"""Convert :term:`FASTQ` to :term:`FASTA` format""" +from bioconvert import ConvBase, bioconvert_script + +from bioconvert.core.decorators import requires, requires_nothing + + +class FAST52POD5(ConvBase): + """Convert :term:`FAST5` to :term:`POD5` + + + """ + + _default_method = "pod5" + _loss = False + _threading = True # not used but required for the main benchmark + + def __init__(self, infile, outfile): + """ + :param str infile: The path to the input FAST5 file. + :param str outfile: The path to the output POD5 file. + """ + super(FAST52POD5, self).__init__(infile, outfile) + + @requires("pod5") + def _method_pod5(self, *args, **kwargs): + """ + """ + if kwargs.get('force', False) is True: + cmd = f"pod5 convert fast5 {self.infile} --output {self.outfile} --force-overwrite " + else: + cmd = f"pod5 convert fast5 {self.infile} --output {self.outfile}" + self.execute(cmd) + diff --git a/environment.yml b/environment.yml index 9e7cd5d4..0249d04c 100644 --- a/environment.yml +++ b/environment.yml @@ -19,6 +19,7 @@ dependencies: - matplotlib-base - networkx - picard-slim +- pod5 - pyyaml - pysam - pyexcel diff --git a/environment_rtd.yml b/environment_rtd.yml index 342cc9a9..7839e5d7 100644 --- a/environment_rtd.yml +++ b/environment_rtd.yml @@ -16,6 +16,7 @@ dependencies: - numpy - matplotlib - pandas +- pod5 - pyBigWig - mawk - scipy diff --git a/requirements.txt b/requirements.txt index 094f324e..bf16ca89 100755 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ colorlog cython deeptools pandas +pod5 biopython>=1.70 mappy matplotlib diff --git a/test/data/fast5/single_read.fast5 b/test/data/fast5/single_read.fast5 new file mode 100755 index 0000000000000000000000000000000000000000..db7c75c42ca5057d7e1785d22f0661aa636279f2 GIT binary patch literal 57879 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�sNzx)y~*klJ6@RXPl7w16H?OtrI+22{!DpFt;`k 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 Q=b|5%sEMA>|IT0k0pcgNpa1{> literal 0 HcmV?d00001 diff --git a/test/data/pod5/single_read.pod5 b/test/data/pod5/single_read.pod5 new file mode 100644 index 0000000000000000000000000000000000000000..5ce805f22a869489388b1b079159e4d22a1068f5 GIT binary patch literal 47008 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 Date: Mon, 17 Jul 2023 22:25:58 +0200 Subject: [PATCH 7/7] Fix label in benchmark plots --- .github/workflows/create_wk.py | 2 +- .github/workflows/fasta52pod5.yml | 105 ++++++++++++++++++++++++++++++ README.rst | 3 + bioconvert/core/benchmark.py | 8 ++- environment.yml | 1 - setup.py | 2 +- 6 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/fasta52pod5.yml diff --git a/.github/workflows/create_wk.py b/.github/workflows/create_wk.py index 7bd12584..7db3df04 100644 --- a/.github/workflows/create_wk.py +++ b/.github/workflows/create_wk.py @@ -106,7 +106,7 @@ """ -for x in ['abi2fasta','abi2fastq','abi2qual','bam2bedgraph','bam2bigwig','bam2cov','bam2cram','bam2fasta','bam2fastq','bam2json','bam2sam','bam2tsv','bam2wiggle','bcf2vcf','bcf2wiggle','bed2wiggle','bedgraph2bigwig','bedgraph2cov','bedgraph2wiggle','bigbed2bed','bigbed2wiggle','bigwig2bedgraph','bigwig2wiggle','bplink2plink','bplink2vcf','bz22gz','clustal2fasta','clustal2nexus','clustal2phylip','clustal2stockholm','cram2bam','cram2fasta','cram2fastq','cram2sam','csv2tsv','csv2xls','dsrc2gz','embl2fasta','embl2genbank','fasta2clustal','fasta2faa','fasta2fasta_agp','fasta2fastq','fasta2genbank','fasta2nexus','fasta2phylip','fasta2twobit','fasta_qual2fastq','fastq2fasta_qual','fastq2fasta','fastq2qual','genbank2embl','genbank2fasta','genbank2gff3','gfa2fasta','gff22gff3','gff32gff2','gff32gtf', 'gz2bz2','gz2dsrc','json2yaml','maf2sam','newick2nexus','newick2phyloxml','nexus2clustal','nexus2fasta','nexus2newick','nexus2phylip','nexus2phyloxml','ods2csv','pdb2faa', 'phylip2clustal','phylip2fasta','phylip2nexus','phylip2stockholm','phylip2xmfa','phyloxml2newick','phyloxml2nexus','plink2bplink','plink2vcf','sam2bam','sam2cram','sam2paf','scf2fasta','scf2fastq','sra2fastq','stockholm2clustal','stockholm2phylip','tsv2csv','twobit2fasta','vcf2bcf','vcf2bed','vcf2bplink','vcf2plink','vcf2wiggle','wig2bed','xls2csv','xlsx2csv','xmfa2phylip','yaml2json']: +for x in ['abi2fasta','abi2fastq','abi2qual','bam2bedgraph','bam2bigwig','bam2cov','bam2cram','bam2fasta','bam2fastq','bam2json','bam2sam','bam2tsv','bam2wiggle','bcf2vcf','bcf2wiggle','bed2wiggle','bedgraph2bigwig','bedgraph2cov','bedgraph2wiggle','bigbed2bed','bigbed2wiggle','bigwig2bedgraph','bigwig2wiggle','bplink2plink','bplink2vcf','bz22gz','clustal2fasta','clustal2nexus','clustal2phylip','clustal2stockholm','cram2bam','cram2fasta','cram2fastq','cram2sam','csv2tsv','csv2xls','dsrc2gz','embl2fasta','embl2genbank','fasta52pod5', 'fasta2clustal','fasta2faa','fasta2fasta_agp','fasta2fastq','fasta2genbank','fasta2nexus','fasta2phylip','fasta2twobit','fasta_qual2fastq','fastq2fasta_qual','fastq2fasta','fastq2qual','genbank2embl','genbank2fasta','genbank2gff3','gfa2fasta','gff22gff3','gff32gff2','gff32gtf', 'gz2bz2','gz2dsrc','json2yaml','maf2sam','newick2nexus','newick2phyloxml','nexus2clustal','nexus2fasta','nexus2newick','nexus2phylip','nexus2phyloxml','ods2csv','pdb2faa', 'phylip2clustal','phylip2fasta','phylip2nexus','phylip2stockholm','phylip2xmfa','phyloxml2newick','phyloxml2nexus','plink2bplink','plink2vcf','sam2bam','sam2cram','sam2paf','scf2fasta','scf2fastq','sra2fastq','stockholm2clustal','stockholm2phylip','tsv2csv','twobit2fasta','vcf2bcf','vcf2bed','vcf2bplink','vcf2plink','vcf2wiggle','wig2bed','xls2csv','xlsx2csv','xmfa2phylip','yaml2json']: with open(f"{x}.yml", "w") as fout: fout.write(TEMPLATE.replace("__NAME__", x)) diff --git a/.github/workflows/fasta52pod5.yml b/.github/workflows/fasta52pod5.yml new file mode 100644 index 00000000..bcab811a --- /dev/null +++ b/.github/workflows/fasta52pod5.yml @@ -0,0 +1,105 @@ +name: fasta52pod5 Testing + +on: + workflow_dispatch: + push: + branches: + - main + - dev + - refactoring + paths: + - bioconvert/fasta52pod5.py + - .github/workflows/fasta52pod5.yml + pull_request: + branches-ignore: [] + paths: + - bioconvert/fasta52pod5.py + schedule: + - cron: '0 0 13 * *' + +jobs: + build-linux: + runs-on: ubuntu-latest + strategy: + max-parallel: 5 + matrix: + python: [3.8, 3.9, '3.10'] + fail-fast: false + + steps: + + - name: install graphviz and curl + run: | + sudo apt-get update + sudo apt-get install -y graphviz-dev + sudo apt-get install libcurl4-gnutls-dev + - name: checkout git repo + uses: actions/checkout@v2 + + - name: conda/mamba + uses: mamba-org/provision-with-micromamba@main + with: + cache-downloads: true + environment-file: false + environment-name: installation + channels: + conda-forge,bioconda,defaults,r + extra-specs: | + python=${{ matrix.python }} + easydev + biosniff + colorlog + deeptools + gffread + pandas + biopython>=1.70 + mappy + matplotlib-base + networkx + pyyaml + pysam + pyexcel + pyexcel-ods3 + pyexcel-xls + pyexcel-xlsx + pyBigWig + py2bit + statsmodels + tqdm + bamtools + bcftools + bedtools + bedops + dsrc + go==1.10.3 + goalign + gotree + mosdepth + pbzip2 + pigz + plink + sambamba + samtools>=1.9 + seqtk + seqkit + squizz + sra-tools + ucsc-wigtobigwig + ucsc-twobittofa + ucsc-fatotwobit + ucsc-bedgraphtobigwig + ucsc-bigwigtobedgraph + wiggletools + sed + mawk + xlrd + + + - name: Install with pip + shell: bash -l {0} + run: | + pip install .[testing] + - name: testing + shell: bash -l {0} + run: | + pytest -n 1 --cov-report term --cov=bioconvert.fasta52pod5 test/test_fasta52pod5.py diff --git a/README.rst b/README.rst index 85d18d90..7ad6eafa 100644 --- a/README.rst +++ b/README.rst @@ -549,6 +549,9 @@ Changes ========= ============================================================================== Version Description ========= ============================================================================== +1.1.1 * Fix benchmark labels. + * NEW: fast52pod5 conversion + * FIX: set goalign and gotree instead of go requirements 1.1.0 * Implement ability to benchmark the CPU and memory usage (not just time) benchmark incorporates CPU/memory usage 1.0.0 * Fix bam2fastq for paired data that computed useless intermediate file diff --git a/bioconvert/core/benchmark.py b/bioconvert/core/benchmark.py index 6b9817bc..a3307f26 100644 --- a/bioconvert/core/benchmark.py +++ b/bioconvert/core/benchmark.py @@ -148,7 +148,7 @@ def monitor_usage(self): self.cpu_percent.append(cpu_percent) self.memory_usage.append(memory_usage) - def plot(self, rerun=False, ylabel="Time (seconds)", rot_xticks=0, boxplot_args={}, mode="time"): + def plot(self, rerun=False, ylabel=None, rot_xticks=0, boxplot_args={}, mode="time"): """Plots the benchmark results, running the benchmarks if needed or if *rerun* is True. @@ -165,6 +165,12 @@ def plot(self, rerun=False, ylabel="Time (seconds)", rot_xticks=0, boxplot_args= assert mode in ["time", "CPU", "memory"], f"mode must be time, CPU or memory; {mode} provided" data = self.results[mode].copy() + if mode == "time" and ylabel is None: + ylabel = "Time (seconds)" + elif mode == "CPU" and ylabel is None: + ylabel = "CPU usage (%)" + elif mode == "memory" and ylabel is None: + ylabel = "Memory usage (%)" methods = sorted(data, key=lambda x: pylab.mean(data[x])) pylab.boxplot([data[x] for x in methods], **boxplot_args) diff --git a/environment.yml b/environment.yml index 0249d04c..9e7cd5d4 100644 --- a/environment.yml +++ b/environment.yml @@ -19,7 +19,6 @@ dependencies: - matplotlib-base - networkx - picard-slim -- pod5 - pyyaml - pysam - pyexcel diff --git a/setup.py b/setup.py index dcff61d3..e44bfed1 100755 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ _MAJOR = 1 _MINOR = 1 -_MICRO = 0 +_MICRO = 1 version = "%d.%d.%d" % (_MAJOR, _MINOR, _MICRO) release = "%d.%d" % (_MAJOR, _MINOR)