Skip to main content

Accessing modified-base data from BAM files.

Project description

Oxford Nanopore Technologies logo

Modified-base BAM to bedMethyl

A program to aggregate modified base counts stored in a modified-base BAM (Section 2.1) file to a bedMethyl file.

A Python module is also available to obtain modified base information from BAM files in a convenient form. It is envisaged that this will eventually be replaced by an implementation in pysam.

Installation

The program is available from our conda channel, so can be installed with:

mamba create -n modbam2bed -c bioconda -c conda-forge -c epi2melabs modbam2bed

Packages are available for both Linux and MacOS.

Alternatively to install from the source code, clone the repository and then use make:

git clone --recursive https://github.com/epi2me-labs/modbam2bed.git
make modbam2bed
./modbam2bed

See the Makefile for more information. The code has been tested on MacOS (with dependencies from brew) and on Ubuntu 18.04 and 20.04.

Usage

The code requires aligned reads with the Mm and Ml tags (MM and ML also supported), and the reference sequence used for alignment.

The below is a snapshot of the command-line interface; it may not be up-to-date, please refer to the program --help option for the most accurate guidance.

Usage: modbam2bed [OPTION...] <reference.fasta> <reads.bam> [<reads.bam> ...]
modbam2bed -- summarise one or more BAM with modified base tags to bedMethyl. 

 General options:
      --aggregate            Output additional aggregated (across strand)
                             counts, requires --cpg or --chg.
      --combine              Create output with combined modified counts: i.e.
                             alternative modified bases within the same family
                             (same canonical base) are included.
  -c, --pileup               Output (full) raw base counts rather than BED
                             file.
  -e, --extended             Output extended bedMethyl including counts of
                             canonical, modified, and filtered bases (in that
                             order).
  -m, --mod_base=BASE        Modified base of interest, one of: 5mC, 5hmC, 5fC,
                             5caC, 5hmU, 5fU, 5caU, 6mA, 5oxoG, Xao. (Or modA,
                             modC, modG, modT, modU, modN for generic modified
                             base).
  -p, --prefix=PREFIX        Output file prefix. Only used when multiple output
                             filters are given.
  -r, --region=chr:start-end Genomic region to process.
  -t, --threads=THREADS      Number of threads for BAM processing.

 Base filtering options:
  -a, --canon_threshold=THRESHOLD
                             Deprecated. The option will be removed in a future
                             version. Please use --threshold.
  -b, --mod_threshold=THRESHOLD   Deprecated. The option will be removed in a
                             future version. Please use --threshold.
      --chg                  Output records filtered to CHG sites.
      --chh                  Output records filtered to CHH sites.
      --cpg                  Output records filtered to CpG sites.
  -f, --threshold=THRESHOLD  Bases with a call probability < THRESHOLD are
                             filtered from results (default 0.66).
  -k, --mask                 Respect soft-masking in reference file.

 Read filtering options:
  -d, --max_depth=DEPTH      Max. per-file depth; avoids excessive memory
                             usage.
  -g, --read_group=RG        Only process reads from given read group.
      --haplotype=VAL        Only process reads from a given haplotype.
                             Equivalent to --tag_name HP --tag_value VAL.
      --tag_name=TN          Only process reads with a given tag (see
                             --tag_value).
      --tag_value=VAL        Only process reads with a given tag value.

  -?, --help                 Give this help list
      --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Method and output format

Oxford Nanopore Technogies' sequencing chemistries and basecallers can detect any number of modified bases. Compared to traditional methods which force a false dichoctomy between say cytosine and 5-methylcytosine, this rich biology needs to be remembered when interpreting modified base calls.

The htslib pileup API is used to create a matrix of per-strand base counts including substitutions, modified bases and deletions. Inserted bases are not counted. Bases of an abiguous nature (refered to as "filtered" below), as defined by the filter threshold probabilities option -b are masked and used (along with substitutions and deletions) in the definition of the "score" (column 5) and "coverage" (column 10) entries of the bedMethyl file.

In the case of ?-style MM subtags, where a lack of a recorded call should not be taken as implying a canonical-base call, the "no call" count is incremented. The "no call" count is used in the calculation of "coverage" and also the denominator of "score".

In summary, a base is determined as being either "canonical", "modified", "filtered", or "no call". The final output includes a modification frequency and score and coverage information in order to assess the reliability of the frequency.

Call filtering

To determine the base present at a locus in a read, the query base in the BAM record is examined along with the modified base information. A "canonical" base probability is calculated as 1 - sum(P_mod), with P_mod being the set of probabilities associated with all the modifications enumerated in the BAM record. The base form with largest probability is taken as the base present subject to the user-specified threshold. If the probability is below the threshold the call is masked and contributes to the "filtered" base count rather than the "canonical" or "modified" counts.

Special Handling of alternative modified bases (--combine option)

To intepret the case of multiple modifications being listed in the BAM, modbam2bed can operate in two modes:

  • default: alternative modified bases in the same family as the requested modification are counted separatedly as "other" --- neither in the "canonical" count of the "modified" count.
  • --combine: alternative modified bases are lumped together into the "modified" count and ultimately into a single modification frequency.

A particular case where --combine is useful is when comparing to the result of bisulfite sequencing.

Output format

The description of the bedMethyl format on the ENCODE project website is rather loose. The definitions below are chosen pragmatically.

The table below describes precisely the entries in each column of the output BED file. Columns seven to nine inclusive are included for compatibility with the BED file specification, the values written are fixed and no meaning should be derived from them. Columns 5, 10, and 11 are defined in terms of counts of observed bases to agree with reasonable interpretations of the bedMethyl specifications:

  • Ncanon - canonical (unmodified) base count, (contigent on the use of --combine, see above.)
  • Nmod - modified base count.
  • Nfilt - count of bases where read does not contain a substitution or deletion with respect to the reference, but the modification status is ambiguous: these bases were filtered from the calculation of the modification frequency.
  • Nsub - count of reads with a substitution with respect to the reference.
  • Ndel - count of reads with a deletion with respect to the reference.
  • Nno call - counts of reads with an absent modification call (but not a substitution or deletion).
  • Nalt mod - counts of reads with and alternative modification call (but not a substitution or deletion).

Since these interpretations may differ from other tools an extended output is available (enabled with the -e option) which includes three additional columns with verbatim base counts.

column description
1 reference sequence name
2 0-based start position
3 0-based exclusive end position (invariably start + 1)
4 Abbreviated name of modified-base examined
5 "Score" 1000 * (Nmod + Ncanon) / (Nmod + Ncanon + Nno call + Nalt mod + Nfilt + Nsub + Ndel). The quantity reflects the extent to which the calculated modification frequency in Column 11 is confounded by the alternative calls. The denominator here is the total read coverage as given in Column 10.
6 Strand (of reference sequence). Forward "+", or reverse "-".
7-9 Ignore, included simply for compatibility.
10 Read coverage at reference position including all canonical, modified, undecided (no calls and filtered), substitutions from reference, and deletions. Nmod + Ncanon + Nno call + Nalt mod + Nfilt + Nsub + Ndel
11 Percentage of modified bases, as a proportion of canonical and modified (excluding no calls, filtered, substitutions, and deletions). 100 * Nmod / (Nmod + Nalt mod + Ncanon)
12* Ncanon
13* Nmod
14* Nfilt those bases with a modification probability falling between given thresholds.
15* Nno call those bases for which the query base was the correct canonical base for the modified base being considered, but no call was made (see the definition of the . and ? flags in the SAM tag specification).
16* Nalt mod those bases for which the query base was the correct canonical base for the modified base being considered, but and alternative modification was present.

* Included in extended output only.

Limitations

The code has not been developed extensively and currently has some limitations:

  • Support for motif filtering is limited to CpG, CHG, and CHH, sites. Without this filtering enabled all reference positions that are the canonical base (on forward or reverse strand) equivalent to the modified base under consideration are reported.
  • Insertion columns are completely ignored for simplicitly (and avoid any heuristics).
  • Second strand MM subtags (i.e. MM:C-m as compared with MM:C+m) are not supported. These are not typically used so shouldn't affect most users. If such a tag is detected and warning will be thrown and the tag ignored. These tags do come in to play for duplex basecalls.

Python package

A Python package is available on PyPI which contains basic functionality for parsing BAM files with modified-base information. It is envisaged that this will eventually be replaced by an implementation in pysam. As such the interface is supplements but does not integrate or replace pysam.

The package can be installed with:

pip install modbampy

The package contains simply to modes of use. Firstly an interface to iterate over reads in a BAM file and report modification sites:

from modbampy import ModBam
with ModBam(args.bam) as bam:
    for read in bam.reads(args.chrom, args.start, args.end):
        for pos_mod in read.mod_sites:
            print(*pos_mod)

Each line of the above reports the

  • read_id,
  • reference position,
  • query (read) position,
  • reference strand (+ or -),
  • modification strand (0 or 1, as defined in the HTSlib tag specification. This is invariable 0),
  • canonical base associated with modification,
  • modified base,
  • modified-base score (scaled to 0-255).

A second method is provided which mimics the couting procedure implemented in modbam2bed:

from modbampy import ModBam
with ModBam(args.bam) as bam:
    positions, counts = bam.pileup(
        args.chrom, args.start, args.end
        low_threshold=0.33, high_threshold=0.66, mod_base="m")

The result is two numpy arrays. The first indicates the reference positions associated with the counts in the second array. Each row of the second array (counts above) enumerates the observed counts of bases in the order:

a c g t A C G T d D m M f F n N

where uppercase letters refer to bases on the forward strand, lowercase letters relate to the reverse strand:

  • A, C, G, T are the usual DNA bases,
  • D indicates deletion counts,
  • M modified base counts,
  • F filtered counts - bases in reads with a modified-base record but which were filtered according to the thresholds provided.
  • N no call base counts.

Extras

The read iterator API also contains a minimal set of functionality mirroring properties of alignments available from pysam. See the code for further details.

Acknowledgements

We thank jkbonfield for developing the modified base functionality into the htslib pileup API, and Jared Simpson for testing and comparison to his independently developed code.

Help

Licence and Copyright

© 2021- Oxford Nanopore Technologies Ltd.

modbam2bed is distributed under the terms of the Mozilla Public License 2.0.

Research Release

Research releases are provided as technology demonstrators to provide early access to features or stimulate Community development of tools. Support for this software will be minimal and is only provided directly by the developers. Feature requests, improvements, and discussions are welcome and can be implemented by forking and pull requests. However much as we would like to rectify every issue and piece of feedback users may have, the developers may have limited resource for support of this software. Research releases may be unstable and subject to rapid iteration by Oxford Nanopore Technologies.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

modbampy-0.9.1.tar.gz (994.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

modbampy-0.9.1-cp310-cp310-manylinux_2_24_x86_64.whl (5.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64

modbampy-0.9.1-cp39-cp39-manylinux_2_24_x86_64.whl (5.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64

modbampy-0.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

modbampy-0.9.1-cp38-cp38-manylinux_2_24_x86_64.whl (5.7 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.24+ x86-64

modbampy-0.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

modbampy-0.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

modbampy-0.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

modbampy-0.9.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

File details

Details for the file modbampy-0.9.1.tar.gz.

File metadata

  • Download URL: modbampy-0.9.1.tar.gz
  • Upload date:
  • Size: 994.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.10

File hashes

Hashes for modbampy-0.9.1.tar.gz
Algorithm Hash digest
SHA256 20c93819a591def0ab5565bc5f3b8a9d627856b1fed51d595384f6e1bd4aac00
MD5 8047818a2c9dcc01f296623d09d33100
BLAKE2b-256 95b6003c2f41583e143d230f285d9ab70933c0fce4b692c8e6fc276671ccd676

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp310-cp310-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp310-cp310-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 101fcd05465efca670b2bd1d8648b38e7ab6a1a1cd2968118b23ab9cb353df99
MD5 4843021ac66cb124c8b0f54f1856d7de
BLAKE2b-256 1a32ac3ada3678cb787d6303399627ace01516d362bdcee507b86e90dedd6c0b

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp39-cp39-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp39-cp39-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 b9ecea2196a69f01933c546940a6d13c2d877943b3fbcd8107bbf8c3f1f4474b
MD5 5aa84bdc6b2789a4743418a1dfc8cf8d
BLAKE2b-256 4a025e31a4c9b88906ff2651868a742bd79d746de89c7c0d41509bc95f8bfe58

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 349b5e2b60e4b71abd0d7bb4746d4a8fa445fb4628b8905ac7f299535231fd65
MD5 a40a17a690803b62d05d21cfa251d95c
BLAKE2b-256 24d8b6745a96f42c48285b24d45f2df18360c0945ba68de6940c4d42f1872fab

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp38-cp38-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp38-cp38-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 6008fc0bae64140944f8e91b81fc3d061b79971ed3f17fd2e977141d225cfb21
MD5 20c5ab7ab7a4513961d476666b51290b
BLAKE2b-256 2e923d80a39e14d125717d68c522490c9b858bf5a10653c8f187dd19d8ec4653

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ac85f85e81cdbf73895996935f40a184afdf5237af87af36d83102122d0b8b20
MD5 84a37ffc08fa04171d3358ff0c1aa47b
BLAKE2b-256 cf5181efa067b462f4b14f2feba2ec6239af3564ca9ee68b77b2c57fe78628eb

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 64309b59877b1c153d899e844a969d77dbd852feaa7294267783765a8a30c0f4
MD5 0c49b1442c8ff77561f61ad4d96917b5
BLAKE2b-256 3ac89228aedf3851fe4cff2b0085c8729ad148c0afb520a83467d91cd1a53b0e

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c1f34b5bf1bdd6bd064b856ca485aff6c57afb33f70c0357ced7e06a6adf7bf1
MD5 8229decc36e928010ab062ea76f7c73c
BLAKE2b-256 105aaa90bad8e18000ca8dd0a0a1a325ae329293d9e61da9b96aba4770b1ca95

See more details on using hashes here.

File details

Details for the file modbampy-0.9.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for modbampy-0.9.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ff7249713f0a9d96268a75fb0ab31ff1f50bc8efc2af3352ddd0385cc8d03537
MD5 ad2abf857e1def575b1ba1a2615382dd
BLAKE2b-256 bb27aca2b52ecc487d1f902ae83dc13b5df424abfdb28a4b962264b7fb15848e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page