2 """Module Description: Test functions for pileup functions.
4 This code is free software; you can redistribute it and/or modify it
5 under the terms of the BSD License (see the file LICENSE included with
11 from math
import log10
12 from MACS3
.Signal
.Pileup
import *
14 # ------------------------------------
16 # ------------------------------------
18 class Test_SE_Pileup(unittest
.TestCase
):
19 """Unittest for pileup functions in Pileup.pyx for single-end
22 Function to test: se_all_in_one_pileup
26 self
.plus_pos
= np
.array(( 0, 1, 3 ), dtype
="int32")
27 self
.minus_pos
= np
.array(( 8, 9, 10 ), dtype
="int32")
28 self
.rlength
= 100 # right end of coordinates
29 # expected result from pileup_bdg_se: ( start, end, value )
30 # the actual fragment length is 1+five_shift+three_shift
31 self
.param_1
= { "five_shift": 0,
35 self
.expect_pileup_1
= \
43 # expected result from pileup_w_multiple_d_bdg_se: ( start, end, value )
44 self
.param_2
= { "five_shift": 0,
48 self
.expect_pileup_2
= \
57 def test_pileup_1(self
):
58 pileup
= se_all_in_one_pileup( self
.plus_pos
, self
.minus_pos
,
59 self
.param_1
["five_shift"],
60 self
.param_1
["three_shift"],
62 self
.param_1
["scale_factor"],
63 self
.param_1
["baseline"] )
66 pnext
= iter(p
).__next
__
67 vnext
= iter(v
).__next
__
69 for i
in range(len(p
)):
72 result
.append( (pre
,pos
,value
) )
75 self
.assertEqual( result
, self
.expect_pileup_1
)
77 def test_pileup_2(self
):
78 pileup
= se_all_in_one_pileup( self
.plus_pos
, self
.minus_pos
,
79 self
.param_2
["five_shift"],
80 self
.param_2
["three_shift"],
82 self
.param_2
["scale_factor"],
83 self
.param_2
["baseline"] )
86 pnext
= iter(p
).__next
__
87 vnext
= iter(v
).__next
__
89 for i
in range(len(p
)):
92 result
.append( (pre
,pos
,value
) )
95 self
.assertEqual( result
, self
.expect_pileup_2
)
97 class Test_Quick_Pileup(unittest
.TestCase
):
98 """Unittest for pileup functions in Pileup.pyx for quick-pileup.
100 Function to test: quick_pileup
104 self
.start_pos
= np
.array( ( 0, 1, 3, 3, 4, 5 ), dtype
="int32")
105 self
.end_pos
= np
.array( ( 5, 6, 8, 8, 9, 10 ), dtype
="int32")
106 # expected result from pileup_bdg_se: ( start, end, value )
107 self
.param_1
= { "scale_factor": 0.5,
109 self
.expect_pileup_1
= \
118 def test_pileup_1(self
):
119 pileup
= quick_pileup ( self
.start_pos
, self
.end_pos
,
120 self
.param_1
["scale_factor"],
121 self
.param_1
["baseline"] )
124 pnext
= iter(p
).__next
__
125 vnext
= iter(v
).__next
__
127 for i
in range(len(p
)):
130 result
.append( (pre
,pos
,value
) )
133 self
.assertEqual( result
, self
.expect_pileup_1
)
135 class Test_Naive_Pileup(unittest
.TestCase
):
136 """Unittest for pileup functions in Pileup.pyx for naive-quick-pileup.
138 Function to test: naive_quick_pileup
142 self
.pos
= np
.array( ( 2, 3, 5, 5, 6, 7 ), dtype
="int32")
143 # expected result from pileup_bdg_se: ( start, end, value )
144 self
.param_1
= { "extension": 2 }
145 self
.expect_pileup_1
= \
152 def test_pileup_1(self
):
153 pileup
= naive_quick_pileup ( self
.pos
,
154 self
.param_1
["extension"] )
158 pnext
= iter(p
).__next
__
159 vnext
= iter(v
).__next
__
161 for i
in range(len(p
)):
164 result
.append( (pre
,pos
,value
) )
167 self
.assertEqual( result
, self
.expect_pileup_1
)
169 class Test_Over_Two_PV_Array(unittest
.TestCase
):
170 """Unittest for over_two_pv_array function
172 Function to test: over_two_pv_array
176 self
.pv1
= [ np
.array( ( 2, 5, 7, 8, 9, 12 ), dtype
="int32" ),\
177 np
.array( ( 1, 2, 3, 4, 3, 2), dtype
="float32" ) ]
178 self
.pv2
= [ np
.array( ( 1, 4, 6, 8, 10, 11 ), dtype
="int32" ),\
179 np
.array( ( 5, 3, 2, 1, 0, 3), dtype
="float32" ) ]
180 # expected result from pileup_bdg_se: ( start, end, value )
181 self
.expect_pv_max
= \
192 self
.expect_pv_min
= \
203 self
.expect_pv_mean
= \
216 pileup
= over_two_pv_array ( self
.pv1
, self
.pv2
, func
="max" )
220 pnext
= iter(p
).__next
__
221 vnext
= iter(v
).__next
__
223 for i
in range(len(p
)):
226 result
.append( (pre
,pos
,value
) )
229 self
.assertEqual( result
, self
.expect_pv_max
)
232 pileup
= over_two_pv_array ( self
.pv1
, self
.pv2
, func
="min" )
236 pnext
= iter(p
).__next
__
237 vnext
= iter(v
).__next
__
239 for i
in range(len(p
)):
242 result
.append( (pre
,pos
,value
) )
245 self
.assertEqual( result
, self
.expect_pv_min
)
248 pileup
= over_two_pv_array ( self
.pv1
, self
.pv2
, func
="mean" )
252 pnext
= iter(p
).__next
__
253 vnext
= iter(v
).__next
__
255 for i
in range(len(p
)):
258 result
.append( (pre
,pos
,value
) )
261 self
.assertEqual( result
, self
.expect_pv_mean
)