Source code for pyseqlogo.wigoperations
import os
import warnings
import numpy as np
import pyBigWig
[docs]class WigReader(object):
"""Class for reading and querying wigfiles."""
def __init__(self, wig_location):
"""
Parameters
---------
wig_location : string
Path to wig file
"""
self.wig_location = wig_location
try:
self.wig = pyBigWig.open(self.wig_location)
except Exception as e:
raise Exception('Error reading wig file {} : {}'.format(
os.path.abspath(self.wig_location), e))
[docs] def query(self, intervals):
""" Query regions for scores.
Parameters
----------
intervals : list(tuple)
A list of tuples with the following format:
(chr, chrStart, chrEnd, strand)
Returns
-------
scores : array_like
A numpy array containing scores for each tuple
.. currentmodule:: .WigReader
.. autosummary::
.WigReader
"""
scores = []
chrom_lengths = self.get_chromosomes
for chrom, chrom_start, chrom_end, strand in intervals:
if chrom not in list(chrom_lengths.keys()):
warnings.warn(
'Chromosome {} does not appear in the bigwig'.format(
chrom), UserWarning)
continue
chrom_length = chrom_lengths[chrom]
if int(chrom_start) > chrom_length:
raise Exception(
'Chromsome start point exceeds chromosome length: {}>{}'.
format(chrom_start, chrom_length))
elif int(chrom_end) > chrom_length:
raise Exception(
'Chromsome end point exceeds chromosome length: {}>{}'.
format(chrom_end, chrom_length))
score = self.wig.values(chrom, int(chrom_start), int(chrom_end))
if strand == '-':
score.reverse()
scores.append(score)
return np.array(scores)
@property
def get_chromosomes(self):
"""Return list of chromsome and their sizes
as in the wig file.
Returns
-------
chroms : dict
Dictionary with {"chr": "Length"} format
.. currentmodule:: .WigReader
.. autosummary::
.WigReader
"""
return self.wig.chroms()