Source code for riboraptor.wig

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()