@@ -21,13 +21,13 @@ class ReadDepth(object):
2121 """
2222
2323 __slots__ = [
24- "_junction_dict_plus_ " , "_junction_dict_minus_ " ,
25- "_minus_ " , "_plus_ " , "_number_of_merged_ " ,
24+ "__junction_dict__plus___ " , "__junction_dict__minus__ " ,
25+ "__minus__ " , "__plus__ " , "__number_of_merged__ " ,
2626 "strand_aware" , "site_plus" , "site_minus" ,
2727 ]
2828
2929 def __init__ (self ,
30- wiggle : np .array ,
30+ wiggle : np .ndarray ,
3131 site_plus : Optional [np .array ] = None ,
3232 site_minus : Optional [np .array ] = None ,
3333 minus : Optional [np .array ] = None ,
@@ -45,58 +45,65 @@ def __init__(self,
4545 :param junction_dict_plus: these splice junction from plus strand
4646 :param junction_dict_minus: these splice junction from minus strand
4747 """
48- self ._plus_ = wiggle
48+ self .__plus__ = wiggle
4949 self .strand_aware = strand_aware
50- self ._minus_ = abs (minus ) if minus is not None else minus
51- self ._junction_dict_plus_ = junction_dict_plus
52- self ._junction_dict_minus_ = junction_dict_minus
50+ self .__minus__ = abs (minus ) if minus is not None else minus
51+ self .__junction_dict__plus___ = junction_dict_plus
52+ self .__junction_dict__minus__ = junction_dict_minus
5353 self .site_plus = site_plus
5454 self .site_minus = site_minus * - 1 if site_minus is not None else site_minus
5555
56- self ._number_of_merged_ = 1
56+ self .__number_of_merged__ = 1
5757
5858 @property
5959 def plus (self ) -> Optional [np .array ]:
60- if self ._plus_ is not None and self ._number_of_merged_ > 0 :
61- return self ._plus_ / self ._number_of_merged_
62- return self ._plus_
60+ if self .__plus__ is not None and self .__number_of_merged__ > 0 :
61+ return self .__plus__ / self .__number_of_merged__
62+ return self .__plus__
6363
6464 @property
6565 def minus (self ) -> Optional [np .array ]:
66- if self ._minus_ is not None and self ._number_of_merged_ > 0 :
67- return self ._minus_ / self ._number_of_merged_
68- return self ._minus_
66+ if self .__minus__ is not None and self .__number_of_merged__ > 0 :
67+ return self .__minus__ / self .__number_of_merged__
68+ return self .__minus__
6969
7070 @property
71- def wiggle (self ) -> np .array :
72- if (self ._plus_ is None or not self ._plus_ .any ()) and self ._minus_ is not None :
71+ def wiggle (self ) -> np .ndarray :
72+ if (self .__plus__ is None or not self .__plus__ .any ()) and self .__minus__ is not None :
7373 return self .minus
7474
75- if self ._plus_ is not None and self ._minus_ is not None :
75+ if self .__plus__ is not None and self .__minus__ is not None :
7676 return self .plus + self .minus
7777
7878 return self .plus
7979
8080 @property
81- def junctions_plus (self ) -> dict :
82- if self ._number_of_merged_ > 1 :
83- return {k : v / self ._number_of_merged_ for k , v in self ._junction_dict_plus_ .items ()}
84- return self ._junction_dict_plus_
81+ def mean_junctions_plus (self ) -> dict :
82+ if self .__number_of_merged__ > 1 :
83+ return {k : v / self .__number_of_merged__ for k , v in self .__junction_dict__plus___ .items ()}
84+ return self .__junction_dict__plus___
8585
8686 @property
87- def junctions_minus (self ) -> dict :
88- if self ._number_of_merged_ > 1 :
89- return {k : v / self ._number_of_merged_ for k , v in self ._junction_dict_minus_ .items ()}
90- return self ._junction_dict_minus_
87+ def mean_junctions_minus (self ) -> dict :
88+ if self .__number_of_merged__ > 1 :
89+ return {k : v / self .__number_of_merged__ for k , v in self .__junction_dict__minus__ .items ()}
90+ return self .__junction_dict__minus__
9191
92- @property
93- def junctions_dict (self ) -> dict :
92+ def junctions_dict (self , show_mean_jxn_number : bool = False ) -> dict :
9493 res = {}
95- if self ._junction_dict_plus_ :
96- res .update (self .junctions_plus )
9794
98- if self ._junction_dict_minus_ :
99- res .update (self .junctions_minus )
95+ if show_mean_jxn_number :
96+ if self .__junction_dict__plus___ :
97+ res .update (self .mean_junctions_plus )
98+
99+ if self .__junction_dict__minus__ :
100+ res .update (self .mean_junctions_minus )
101+ else :
102+ if self .__junction_dict__plus___ :
103+ res .update (self .__junction_dict__plus___ )
104+
105+ if self .__junction_dict__minus__ :
106+ res .update (self .__junction_dict__minus__ )
100107 return res
101108
102109 @property
@@ -117,27 +124,27 @@ def __add__(self, other):
117124 if len (self .wiggle ) == len (other .wiggle ):
118125 junc_plus , junc_minus = {}, {}
119126
120- for i in [self ._junction_dict_plus_ , other ._junction_dict_plus_ ]:
127+ for i in [self .__junction_dict__plus___ , other .__junction_dict__plus___ ]:
121128 if i :
122129 junc_plus .update (i )
123- for i in [self ._junction_dict_minus_ , other ._junction_dict_minus_ ]:
130+ for i in [self .__junction_dict__minus__ , other .__junction_dict__minus__ ]:
124131 if i :
125132 junc_minus .update (i )
126133
127134 minus = None
128- if self ._minus_ is not None and other ._minus_ is not None :
129- minus = self ._minus_ + other ._minus_
130- elif self ._minus_ is None and other ._minus_ is not None :
135+ if self .__minus__ is not None and other .__minus__ is not None :
136+ minus = self .__minus__ + other .__minus__
137+ elif self .__minus__ is None and other .__minus__ is not None :
131138 minus = other .minus
132- elif self ._minus_ is not None and other ._minus_ is None :
133- minus = self ._minus_
139+ elif self .__minus__ is not None and other .__minus__ is None :
140+ minus = self .__minus__
134141
135142 merged = ReadDepth (
136- self ._plus_ + other ._plus_ , minus = minus ,
143+ self .__plus__ + other .__plus__ , minus = minus ,
137144 junction_dict_plus = junc_plus ,
138145 junction_dict_minus = junc_minus
139146 )
140- merged ._number_of_merged_ = self ._number_of_merged_ + other ._number_of_merged_
147+ merged .__number_of_merged__ = self .__number_of_merged__ + other .__number_of_merged__
141148 return merged
142149 else :
143150 raise ValueError (f"ReadDepth objects are not equal length: { len (self .wiggle )} != { len (other .wiggle )} " )
@@ -164,23 +171,23 @@ def add_customized_junctions(self, other):
164171 :return:
165172 """
166173
167- for k , v in other ._junction_dict_plus_ :
168- self ._junction_dict_plus_ [k ] = v + self ._junction_dict_plus_ .get (k , 0 )
174+ for k , v in other .__junction_dict__plus___ :
175+ self .__junction_dict__plus___ [k ] = v + self .__junction_dict__plus___ .get (k , 0 )
169176
170- for k , v in other ._junction_dict_minus_ :
171- self ._junction_dict_minus_ [k ] = v + self ._junction_dict_minus_ .get (k , 0 )
177+ for k , v in other .__junction_dict__minus__ :
178+ self .__junction_dict__minus__ [k ] = v + self .__junction_dict__minus__ .get (k , 0 )
172179
173180 return self .junctions_dict
174181
175182 def transform (self , log_trans : str ):
176183 funcs = {"10" : np .log10 , "2" : np .log2 , "zscore" : zscore , "e" : np .log }
177184
178185 if log_trans in funcs .keys ():
179- if self ._plus_ is not None :
180- self ._plus_ = funcs [log_trans ](self ._plus_ + 1 )
186+ if self .__plus__ is not None :
187+ self .__plus__ = funcs [log_trans ](self .__plus__ + 1 )
181188
182189 if self .minus is not None :
183- self ._minus_ = funcs [log_trans ](self ._minus_ + 1 )
190+ self .__minus__ = funcs [log_trans ](self .__minus__ + 1 )
184191
185192 def normalize (self , size_factor : float , format_ : str = "normal" , read_length : float = 0 ):
186193 u"""
@@ -192,35 +199,35 @@ def normalize(self, size_factor: float, format_: str = "normal", read_length: fl
192199
193200 if format_ == "rpkm" and read_length > 0 :
194201 # for rpkm the size_factor is total reads
195- self ._plus_ = np .divide (
196- self ._plus_ ,
202+ self .__plus__ = np .divide (
203+ self .__plus__ ,
197204 np .multiply (
198- (np .sum (self ._plus_ != 0 ) - read_length + 1 ) / 1e3 ,
205+ (np .sum (self .__plus__ != 0 ) - read_length + 1 ) / 1e3 ,
199206 size_factor / 1e6
200207 )
201208 )
202- if self ._minus_ is not None :
203- self ._minus_ = np .divide (
204- self ._minus_ ,
209+ if self .__minus__ is not None :
210+ self .__minus__ = np .divide (
211+ self .__minus__ ,
205212 np .multiply (
206- (np .sum (self ._minus_ != 0 ) - read_length + 1 ) / 1e3 ,
213+ (np .sum (self .__minus__ != 0 ) - read_length + 1 ) / 1e3 ,
207214 size_factor / 1e6
208215 )
209216 )
210217 elif format_ == "cpm" and read_length > 0 :
211218 # for cpm the size_factor is total reads
212- self ._plus_ = np .divide (self ._plus_ , np .divide (size_factor , 1e6 ))
213- if self ._minus_ is not None :
214- self ._minus_ = np .divide (self ._minus_ , np .divide (size_factor , 1e6 ))
219+ self .__plus__ = np .divide (self .__plus__ , np .divide (size_factor , 1e6 ))
220+ if self .__minus__ is not None :
221+ self .__minus__ = np .divide (self .__minus__ , np .divide (size_factor , 1e6 ))
215222 elif format_ == "cpm" and read_length > 0 :
216223 # for cpm the size_factor is total reads
217- self ._plus_ = np .divide (self ._plus_ , np .divide (size_factor , 1e6 ))
218- if self ._minus_ is not None :
219- self ._minus_ = np .divide (self ._minus_ , np .divide (size_factor , 1e6 ))
224+ self .__plus__ = np .divide (self .__plus__ , np .divide (size_factor , 1e6 ))
225+ if self .__minus__ is not None :
226+ self .__minus__ = np .divide (self .__minus__ , np .divide (size_factor , 1e6 ))
220227 elif size_factor is not None and size_factor > 0 and format_ == "atac" :
221- self ._plus_ = np .divide (self ._plus_ , size_factor ) # * 100
222- if self ._minus_ is not None :
223- self ._minus_ = np .divide (self ._minus_ , size_factor )
228+ self .__plus__ = np .divide (self .__plus__ , size_factor ) # * 100
229+ if self .__minus__ is not None :
230+ self .__minus__ = np .divide (self .__minus__ , size_factor )
224231
225232
226233if __name__ == '__main__' :
0 commit comments