11import numpy as np
2- import pandas as pd
32
43from coolbox .utilities import (
54 split_genome_range , change_chrom_names ,
65 GenomeRange , get_logger , to_gr
76)
7+ import oxbow as ox
88from .base import HistBase
99
1010log = get_logger (__name__ )
@@ -39,13 +39,13 @@ def __init__(self, file, **kwargs):
3939 ** kwargs
4040 })
4141 super ().__init__ (** properties )
42- import bbi
43- self .bw = bbi .open (self .properties ['file' ])
42+ self .ds = ox .from_bigwig (self .properties ['file' ])
4443
4544 def fetch_plot_data (self , gr : GenomeRange , ** kwargs ):
46- num_bins = self .get_num_bins ()
4745 self .check_chrom_name (gr )
48- return self .fetch_scores (gr , num_bins )
46+ intervals = self .fetch_data (gr )
47+ values = intervals ['value' ].values
48+ return values
4949
5050 def fetch_data (self , gr : GenomeRange , ** kwargs ):
5151 """
@@ -59,47 +59,17 @@ def fetch_data(self, gr: GenomeRange, **kwargs):
5959 BigWig interval table.
6060 """
6161 chrom , start , end = split_genome_range (gr )
62- if chrom not in self .bw . chromsizes :
62+ if chrom not in self .ds . chrom_names :
6363 chrom = change_chrom_names (chrom )
6464
65- intervals = self .bw .fetch_intervals (chrom , start , end )
66- columns = list (intervals .columns )
67- if 'value' in columns :
68- columns [columns .index ('value' )] = 'score'
69- intervals .columns = columns
70-
65+ intervals = self .ds .regions (f"{ chrom } :{ start } -{ end } " ).pd ()
7166 return intervals
7267
73- def get_num_bins (self , default_num = 700 ):
74- num_bins = default_num
75- if 'number_of_bins' in self .properties :
76- try :
77- num_bins = int (self .properties ['number_of_bins' ])
78- except TypeError :
79- num_bins = default_num
80- log .warning ("'number_of_bins' value: {} for bigwig file {} "
81- "is not valid. Using default value (700)" .format (self .properties ['number_of_bins' ],
82- self .properties ['file' ]))
83- return num_bins
84-
85- def fetch_scores (self , genome_range , num_bins , max_try_nums = 5 ):
86- """Fetch bins scores within input chromosome range.
87- """
88- scores_per_bin = np .zeros (num_bins )
89- gr = to_gr (genome_range )
90- if gr .chrom not in self .bw .chromsizes :
91- gr .change_chrom_names ()
92- try :
93- scores_per_bin = self .bw .fetch (gr .chrom , gr .start , gr .end , num_bins ).astype (float )
94- except Exception as e :
95- log .warning (f"error found while reading bigwig scores: { e } " )
96- return scores_per_bin
97-
9868 def check_chrom_name (self , genome_range ):
99- if genome_range .chrom not in self .bw . chromsizes :
100- genome_range .change_chrom_names ()
69+ if genome_range .chrom not in self .ds . chrom_names :
70+ genome_range = genome_range .change_chrom_names ()
10171
102- if genome_range .chrom not in self .bw . chromsizes :
72+ if genome_range .chrom not in self .ds . chrom_names :
10373 log .warning ("Can not read region {} from bigwig file:\n \n "
10474 "{}\n \n Please check that the chromosome name is part of the bigwig file "
10575 "and that the region is valid" .format (str (genome_range ), self .properties ['file' ]))
0 commit comments