
    DUfU                     $   d dl Z d dlZd dlZd dlZd dl mZ d dlZd dlZd dlZddlm	Z	 dZ
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+d' Z,d( Zd) Z-d* Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4d1 Z5d2 Z6d3 Z7d4 Z8d5 Z9d6 Z:d7 Z;d8 Z<d9 Z=d: Z>d; Z?d< Z@d= ZAd> ZBd? ZCd@ ZDdA ZEdB ZFdC ZGdD ZHdE ZIdF ZJdG ZKdH ZLdI ZMdJ ZNdK ZOdL ZPdM ZQdN ZRdO ZSdP ZTdQ ZUdR ZVdS ZWejX        Y                    dTU          dV             ZZdW Z[dX Z\ejX        jY        dY             Z]dZ Z^ejX        Y                    d[U          d\             Z_d] Z`d^ Zad_ Zbd` Zcda Zddb Zedc ZfdS )d    Nfeaturefuncs   )test_tempdirunwriteablec                      t           j                            t                    st          j        dt          z             t          j        t                     d S )Nmkdir -p %s)ospathexistsr   system
pybedtoolsset_tempdir     S/var/www/html/software/conda/lib/python3.11/site-packages/pybedtools/test/test_1.pysetup_moduler      sD    7>>,'' 0
	-,.///<(((((r   c                      t           j                            t                    rt          j        dt          z             t          j                     d S )Nzrm -r %s)r
   r   r   r   r   r   cleanupr   r   r   teardown_moduler      sB    	w~~l## -
	*|+,,,r   c                 $   d}|                                  D ]x}|                                }|                    d          rd}nd}t          |          dk    rD|                                }d                    |          |z   dz   }||z  }y|S )z
    Replaces spaces with tabs, removes spurious newlines, and lstrip()s each
    line. Makes it really easy to create BED files on the fly for testing and
    checking.
     	r   
)
splitlineslstripendswithlensplitjoin)xsiadd_tabs       r   fixr%      s     	A\\^^ 
 
HHJJ::d 	GGGq66Q;;GGIIIIaLL7"T)	QHr   c                  (   t           j                            t                    rt          j        dt          z             t          j        dt          z             t          j        dt          z             t          j        t                     dS )z
    Make a directory that cannot be written to and set the pybedtools tempdir
    to it. This is used to isolate "streaming" tests to ensure they do not
    write to disk.
    	rm -rf %sr	   zchmod -w %sN)r
   r   r   r   r   r   r   r   r   r   make_unwriteabler(   3   sp     
w~~k"" -
	++,,,Imk)***Imk)***;'''''r   c                      t           j                            t                    rt          j        dt          z             t          j        t                     dS )z/
    Reset to normal tempdir operation....
    r'   N)r
   r   r   r   r   r   r   r   r   r   r   cleanup_unwriteabler*   @   sF     
w~~k"" -
	++,,,<(((((r   c                     t          j        d                                          } | d         dk    sJ | dd         g dk    sJ t          j        g d          } t          | dd                    | dd         d	d
gk    sJ dS )z`
    supplement to the more general test in test_cbedtools.IntervalTest.testGetItemNegative
    z1chr21   9719768 9721892 ALR/Alpha       1004    ++   )9721892z	ALR/Alpha1004)	chr1ucbgene465805.r-   r6   zFID=thaliana_1_465_805;match=scaffold_801404.1;rname=thaliana_1_465_805   r5   r6   N)r   create_interval_from_listr   print)ivs    r   test_interval_indexr<   I   s     
	-;AACC
 
B b6S====ad87777777		-
	
 
	
 
	

 
B 
"QrT(OOOad8s|######r   c                     g d} t          j        |                                           }t          j        d          |k    sJ g d} t          j        |                                           }t          j        d          |k    sJ g d} t          j        |                                           }t	          |d         t           j                  sJ t          |d                   dk    sJ |d         d         dk    sJ d S )	N))r1   1100feature10r-   )r1   r?   200feature2rA   r-   )r1   150500feature3rA   -)r1   900950feature4rA   r-   a.bed))r1   r   d   r@   r   r-   )r1   rL      rC   r   r-   )r1      i  rF   r   rG   )r1     i  rJ   r   r-   ))	r1   faker3   50300r6   r-   r6   zID=gene1)	r1   rP   mRNArQ   rR   r6   r-   r6   ID=mRNA1;Parent=gene1;)	r1   rP   CDS75rD   r6   r-   r6   zID=CDS1;Parent=mRNA1;)	r1   rP   rU   rB   275r6   r-   r6   zID=CDS2;Parent=mRNA1;)	r1   rP   rRNA12001275r6   r-   r6   	ID=rRNA1;r   zInterval(chr1:49-300)IDgene1)r   BedToolsaveasexample_bedtool
isinstanceIntervalrepr)tr!   s     r   test_tuple_creationre   d   s!   	 	 	A 	1$$&&A%g..!3333	 	 	A 	1$$&&A%g..!3333	 	 	A 	1$$&&A adJ/00000!::00000Q4:      r   c                     	 t          j        d          } |                     d          }|                                sJ |                    d          }t          |          }t          |           |t          d          k    sJ t          |                    | d                             t          d          k    sJ 	 t          j        d          t          j        d	          g}|D ]5}t          j
                            |          rt          j        |           6d S # t          j        d          t          j        d	          g}|D ]5}t          j
                            |          rt          j        |           6w xY w)
NrK   T)forcezchr1:99-200zd
        chr1	1	100	feature1	0	+
        chr1	100	200	feature2	0	+
        chr1	150	500	feature3	0	-r.   zD
        chr1	100	200	feature2	0	+
        chr1	150	500	feature3	0	-za.bed.gzza.bed.gz.tbi)r   r`   tabix_tabixedtabix_intervalsstrr:   r%   example_filenamer
   r   r   unlink)ard   resultsfnsfns        r   
test_tabixrr      s   &w//GG$Gzz||##M22g,,g#%
 
 
 
 
 
 1$$QqT**++s%0
 0
 
 
 
 
 
 '
33'77
  	 	Bw~~b!! 	"	 	 '
33'77
  	 	Bw~~b!! 	"	s   CD( (A"F
c                     t          j        dd                                          } t          |                     d                    dk    sJ t          |                     d                    dk    sJ t          |                     d                    dk    sJ t          |                     d	                    dk    sJ t          |                     d
                    dk    sJ d S )Nz
chr1 25 30Tfrom_stringz
chr1:30-35r   z
chr1:29-30r   zchr1:30-35[-]zchr1:29-30[-]r1   )r   r^   rh   r   rj   rn   s    r   test_tabix_intervalsrw      s    <T:::@@BBAq  ..//14444q  ..//14444 q  1122a7777q  1122a7777 q  (())Q......r   c                     t                       t          j        d          } t          j        d          }|                     |          }|                     |d          }t	          j        t                    5  |                    |           ddd           n# 1 swxY w Y   |                                }t          |j
                                                  }t          |j
                                                  }||k    sJ t                       |                     |d          }t          ||          D ]'\  }}t          |          t          |          k    sJ (t          j        d          } t          j        d          }t                       |                    |           }	t                       |                    | d          }
t          |	|
          D ]'\  }}t          |          t          |          k    sJ (|                    | d          }t          |          D ]}t!          |           |                     g dd          D ]_}|d         |d	         |d
         f t	          j        t$                    5  |                    d           ddd           n# 1 swxY w Y   `t                       dS )zV
    Stream and file-based equality, both whole-file and Interval by
    Interval
    rK   b.bedTstreamNd.gff)r   r   r.      r   r   r.   r7   )r*   r   r`   	intersectpytestraisesNotImplementedError__eq__r_   openrq   readr(   ziprk   iterr:   cut
IndexError__getitem__)rn   bcd
d_contents
c_contentsr#   jfg1g2g3rows                r   test_streamr      s   
 "7++A"7++A	AA 	
Ad##A	*	+	+  	              	

Aad""Jad""J#### 	Ad##AAq		    11vvQ 	"7++A"7++A 	
QB 	
Qt	$	$BB    11vvQ 
Qt	$	$B"XX  auu\\\$u//  AAA]:&& 	 	OOA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s$   <BB"%B"J;;J?	J?	c                  >   t          j        d          } |                     | d          }|                     | dd          }t          |          }t          |          }t          |           }||cxk    r|k    sn J |                     | d          }|                     | dd          }|                     |d          }|                     |dd          }t          |          }t          |          }	||	cxk    r|cxk    r|cxk    r|k    sn J dS )z9
    Second-level streaming using self-intersections
    rK   Tur   r{   Nr   r`   r~   rk   )
rn   
nonstream1stream1nonstream1_strstream1_stra_str
nonstream2stream2nonstream2_strstream2_strs
             r   test_stream_of_streamr      s?    	"7++A Q$''Jkk!tDk11G__Ng,,KFFE[1111E111111 Q$''Jkk!tDk11GZ400Jkk'T$k77G__Ng,,K[RRRRNRRRRkRRRRURRRRRRRRr   c                     t          j        d          } t          j        t          |                     }t	          |           t	          |          k    sJ |                     | d          }t          j        d | D                                           |           }t	          |          t	          |          k    sJ dS )zG
    Equality of BedTools created from file, iter(), and generator
    rK   Trz   c              3      K   | ]}|V  d S Nr   .0r#   s     r   	<genexpr>z!test_generator.<locals>.<genexpr>        NN1QNNNNNNr   N)r   r`   r^   r   rk   r~   )rn   r   b1b2s       r   test_generatorr     s    
 	"7++A477##Aq66SVV 
Qt	$	$B		NNNNN	+	+	5	5a	8	8Br77c"ggr   c                  r   t          j        d          } t          j        d          }|                     | d          }t          j        d | D                                           | d          }t	          |          }t	          |          }t          |           t          |           ||k    sJ d S )NrK   ry   Trz   c              3      K   | ]}|V  d S r   r   r   s     r   r   z+test_stream_of_generator.<locals>.<genexpr>  r   r   )r   r`   r~   r^   rk   r:   )rn   r   r   r   sb1sb2s         r   test_stream_of_generatorr     s    "7++A"7++A	
Qt	$	$B		NNNNN	+	+	5	5a	5	E	EB
b''C
b''C	#JJJ	#JJJ#::::::r   c                      t          j        d          } t          j        d          }t          d          D ]}|                     |          }dS )z;regression test to make sure many files can be created
    rK   ry   iL  N)r   r`   ranger~   )rn   r   r#   r   s       r   test_many_filesr   #  sV     	"7++A"7++A 4[[  KKNN r   c                     t          j        dd          } t          |           }t          t	          |                     t          j        t           j                  5  |                                 ddd           dS # 1 swxY w Y   dS )z@
    Malformed BED lines should raise MalformedBedLineError
    zj
    chr1 100 200
    chr1 100 90
    chr1 100 200
    chr1 100 200
    chr1 100 200
    chr1 100 200
    Trt   N)	r   r^   r   r:   nextr   r   MalformedBedLineError__next__)rn   a_is     r   test_malformedr   .  s     		 
	 
	 
	A q''C 
$s)) 
z7	8	8                   s    BB	Bc                  V   t          j        dd          } |                                 }t          j        dd          }t          j        t
                    5  |                    |           ddd           n# 1 swxY w Y   t          |          t          |          k    sJ dS )zK
    Remove_invalid() removes invalid lines, track lines, and comments
    z
    chr1 100 200
    chr1 100 90
    track name='try to break parser'
    chr1 100 200
    chr1 100 200
    chr1 100 200
    #
    chr1 100 200
    Trt   zU
    chr1 100 200
    chr1 100 200
    chr1 100 200
    chr1 100 200
    chr1 100 200N)r   r^   remove_invalidr   r   r   r   rk   )rn   r   cleaneds      r   test_remove_invalidr   G  s     			 	 	 	A 	
A 	   G 
*	+	+  	              q66S\\!!!!!!s   A<<B B c                  F   t          j        d          } t          j        d          }|                     |dd          }|                     |dd          }t          |                                                    |                      |D ]}t          |           dS )zV
    Iterator handles extra fields from long features (BED+GFF -wao intersection)
    rK   c.gffTF)waor{   N)r   r`   r~   r:   sortclosest)rn   r   r   r   r#   s        r   #test_create_from_list_long_featuresr   j  s     	"7++A"7++A	A4..A	A4--A 
!&&((

1

  a r   c                      d} t          j        | d          }t          |          }t          |d                    t	          |d                   dk    s
J |            dS )z.
    Iterator should ignore non-BED lines
    z
    track name="test"


    browser position chrX:1-100
    # comment line
    chrX  1 10
    # more comments
    track name="another"


    Trt   r   z
chrX	1	10
N)r   r^   listr:   rk   )r"   rn   ro   s      r   test_iteratorr   z  sf    	A 	1$///A1ggG	'!*wqz??o---w-----r   c                     t          j        d          } t          j        dddddd          }|t          t	          |                     k    sJ t          | dd	                   }t          |          d	k    sJ |d         |k    sJ | d         |k    sJ t          j        t                    5  | 
                    d
           ddd           dS # 1 swxY w Y   dS )z 
    Indexing into BedTools
    rK   r1   r   rL   r@   rA   r-   r   r.   keyN)r   r`   rb   r   r   r   r   r   r   
ValueErrorr   )rn   intervalro   s      r   test_indexingr     s/    	"7++A "61c:sCHHH tDGG}}$$$$ 1QqS6llGw<<11:!!!! Q48 
z	"	"  	e                 s   1CCCc                  X   t          j        d          } t          j        d          }| |z   }|                     |d          }t          j        |j                   dt          |           v sJ dt          |          v sJ dt          |          v sJ dt          |          v sJ dS )z;
    Missing files and streams should say so in repr()
    rK   ry   Trz   MISSING FILEr{   N)r   r`   r~   r
   rm   rq   rc   rn   r   r   r   s       r   test_repr_and_printingr     s     	"7++A"7++A	AA	Ad##AIadOOOd1ggd1ggT!WW$$$$tAwwr   c                  `    t          j        d          } t          d          D ]	}| j         
dS )z
    Regression test on file_type checks

    Previously file_type was creating a new IntervalFile every time it was
    called; now it's cached so an IntervalFile is only created once per
    BedTool.
    rK   i  N)r   r`   r   	file_type)rn   r#   s     r   test_file_typer     s<     	"7++A4[[  	 r   c                     t          j        d          } t          j        d | D                                                       }t	          t          |                    }|                                }t          |          t          |d                   dz
  k    s&J t          |          t          |          f            d S )Nz	mm9.bed12c              3   0   K   | ]}|j         d k    |V  dS )zTcea1,uc007afj.1N)name)r   r   s     r   r   ztest_introns.<locals>.<genexpr>  s/      II!AF6H,H,HA,H,H,H,HIIr   	   r   )	r   r`   r^   r_   r   r   intronsr   int)rn   r   bfeatbis       r   test_intronsr     s    ";//AIIqIIIJJQQSSAaMME	
B r77c%(mma''''#b''3q66):'''''r   c            	          t          j        d          } t          j        t                    5   | j        di t          dd           ddd           dS # 1 swxY w Y   dS )z=
    Calling slop with no genome should raise ValueError
    rK   rL   r   )lrNr   )r   r`   r   r   r   slopdictrv   s    r   	test_slopr     s     	"7++A 
z	"	" # #""q!!!"""# # # # # # # # # # # # # # # # # #s   AAAc                      t          j        d          } t          j        d          }|                     |          }t          |          t          |           k    sJ d S )NrK   ry   )r   r`   r   r   )rn   r   r   s      r   test_closestr     sT    "7++A"7++A			!Aq66SVVr   c                     t           j                            t          d          } d}d}t	          j        |d          }t          j        t                    5  |	                    d           ddd           n# 1 swxY w Y   t          | d          }|                    d          D ])}|                    |                                           *|                                 t          |                                d          }t           j        }|t           _        |                    | 	          }|t           _        |j        |j        k    sJ t          |j                                                  }	t-          |	           d
}
t-          d                    t/          j        |	|
                               t-          |
           |	|
k    sJ |                    | d          }t          |j                                                  }	d}
t-          |	           t-          |
           t-          d                    t/          j        |	|
                               |	|
k    sJ |	                    d          }t          d                                          |
k    sJ |                                |
k    sJ t          j        d           t	          j        |d          }||k    sJ t          j        |            t           j                            | dz             rt          j        | dz              dS dS )a  
    From UCSC:

    chromStart - The starting position of the feature in the chromosome or
    scaffold. The first base in a chromosome is numbered 0.

    chromEnd - The ending position of the feature in the chromosome or
    scaffold. The chromEnd base is not included in the display of the feature.
    For example, the first 100 bases of a chromosome are defined as
    chromStart=0, chromEnd=100, and span the bases numbered 0-99. z
test.fastazY
    chrX 9  16 . . +
    chrX 9  16 . . -
    chrY 1  4  . . +
    chrZ 28 31 . . +
    z
    >chrX
    AAAAAAAAATGCACTGAAAAAAAAAAAAAAA
    >chrY
    GCTACCCCCCCCCCCCCCCCCCCCCCCCCCC
    >chrZ
    AAAAAAAAAAAAAAAAAAAAAAAAAAAATCT
    Trt   )noneNw)fizD>chrX:9-16
TGCACTG
>chrX:9-16
TGCACTG
>chrY:1-4
CTA
>chrZ:28-31
TCT
r   )r   r"   zP>chrX:9-16(+)
TGCACTG
>chrX:9-16(-)
CAGTGCA
>chrY:1-4(+)
CTA
>chrZ:28-31(+)
TCT
zdeleteme.faz.fai)r
   r   r    r   r   r^   r   r   r   	save_seqsr   r   writer   close_tmpsysstderrsequencerq   seqfnr   r:   difflibndiffprint_sequencerm   r   )r   r"   fastarn   foutlinetmporig_stderrr   seqsexpectedfresh_as               r   test_sequencer     s     
lL	1	1B	AE 	1$///A	z	"	"  	I               C==D  && " "

4;;==!!!!JJLLL qvvxx

C*KCJ	

b
ACJ414<<<<==D	$KKKH 
"'''-h//
0
0111	(OOO8	

bD
!!A==DH 
$KKK	(OOO	"'''-h//
0
01118	M""A##%%1111))))Im 555Ga<<<<IbMMM	w~~b6k"" 
	"v+ s   A;;A?A?c                      t          j        d          } t          j        d          }|                     |d          | |z   k    sJ |                     |d          | |z
  k    sJ d S )NrK   ry   Tr   )v)r   r`   r~   rn   r   s     r   test_add_subtractr  N  sr    "7++A"7++A;;qD;!!a!e,,,,;;qD;!!a!e,,,,,,r   c                  4   t          j        d          } dd l}|                    d           t	          |                     d                                                    }t          |          dk    sJ t          |d         t           j	                  sJ t	          |                     t          |                                                               }t          t          |                     t          |          t          |           k    sJ d S )NrK   r   r   )r   r`   randomseedr   random_subsetfeaturesr   ra   rb   r:   )rn   r  r"   s2s       r   test_subsetr	  U  s    "7++AMMM
KKNNNQ__Q((**++Aq66Q;;;;adJ/00000	aooc!ff%%..00	1	1B	#b''NNNr77c!ffr   c                     t          j        d          } t          j        d          }| |k    sJ d}| |k    sJ t          j        d          }|| k    sJ | dk    sJ |                     |d          }|                     |          }t          j        t
                    5  ||k     d d d            n# 1 swxY w Y   t          j        t
                    5  ||k     d d d            n# 1 swxY w Y   t          j        d | D                       }t          j        t
                    5  | |k     d d d            n# 1 swxY w Y   t          j        t
                    5  || k     d d d            n# 1 swxY w Y   t          |          }t          t          |           	                    d                     t          |	                    d                     | |k    sJ d S )NrK   zfchr1	1	100	feature1	0	+
chr1	100	200	feature2	0	+
chr1	150	500	feature3	0	-
chr1	900	950	feature4	0	+
ry   blahTrz   c              3      K   | ]}|V  d S r   r   r   s     r   r   ztest_eq.<locals>.<genexpr>  s      >>!A>>>>>>r   )
r   r`   r~   r   r   r   r^   rk   r:   r   )rn   r   r"   r   r   es         r   test_eqr  d  s   "7++A"7++A 6666	A
 6666"7++A6666 ;;;; 	
Ad##A	AA	*	+	+  	Q              	*	+	+  	Q               	>>q>>>**A	*	+	+  	Q              	*	+	+  	Q              
 	AA	#a&&

D
!
!"""	!,,t

666666sH   $B77B;>B;C..C25C20EE
E'E::E>E>c                  F    t          j        d          } i }| D ]}d||<   d S )NrK   r   )r   r`   )rn   r   r#   s      r   	test_hashr    s;    "7++A
A  ! r   c                      t          j        d          } |                                 dk    sJ t          |           dk    sJ d S )NrK   r7   )r   r`   countr   rv   s    r   test_count_bedr    s>    "7++A7799>>>>q66Q;;;;;;r   c                     ddl m}  t          j        dd          }|                    | j        d          }t          |                                          }t          |           |d         j        dk    sJ |d         j	        dk    sJ |d         j
        d	k    sJ |d         j        d
k    sJ |d         j	        dk    sJ |d         j
        dk    sJ d S )Nr   r   zl
                           chr1 1 100
                           chr5 3000 4000
                           Trt   r   2   3   r1   i  i  chr5)r   r   r^   eachcenterr   r  r:   startstopchrom)r   rn   r   ro   s       r   test_feature_centersr    s   ''''''	 	 	 	A 	
|"A&&A1::<<  G	'NNN1:r!!!!1:?b    1:v%%%%1:t####1:?d""""1:v%%%%%%r   c            
         t          j        d          } t          j        |           }|j        | j        k    sJ t	          j        t                    5  t          j        d           d d d            n# 1 swxY w Y   d}t          j        |d          }t          d                    t          j
        t          |          t          |                                          t          |          t          |           k    sJ d S )NrK   znonexistend.bed
    chr1	1	100	feature1  0	+
    chr1	100	200	feature2  0	+
    chr1	150	500	feature3  0	-
    chr1	900	950	feature4  0	+
    Trt   r   )r   r`   r^   rq   r   r   FileNotFoundErrorr:   r    r   r   rk   )rn   r   r"   ru   s       r   test_bedtool_creationr!    s&    	"7++A1A414<<<<	(	)	) . .,---. . . . . . . . . . . . . . .	A $QD999K 
"'''-K 0 0#a&&99
:
:;;;{s1vv%%%%%%s   A55A9<A9c                      d} t          j        | d          }t          j        d          }t          j        d          }||k    sJ ||k    sJ ||k    rJ ||k    rJ d S )Nr  Trt   rK   ry   )r   r^   r`   )r"   ru   rn   r   s       r   test_special_methodsr#    s    	A $QD999K"7++A"7++A!!aar   c                  >   t          j        d          } |                                 dk    sJ t           j                                        }t          |d                                           t          j        |          }|                                dk    sJ d S )NrK      r   r   )r   r`   field_countr^   r   r   r   )rn   r   r   s      r   test_field_countr'    s    "7++A==??a


!
!
#
#CcNN3A==??ar   c                  H   t          j        d          } t          j        d          }| |z   }t          j        |j                   dt          |           v sJ dt          |          v sJ dt          |          v sJ t          |                     d                     d S )NrK   ry   r   r   )r   r`   r
   rm   rq   rc   r:   headrn   r   r   s      r   r   r     s    "7++A"7++A	AAIadOOOd1ggd1ggT!WW$$$$	!&&))r   c                      t          j        d          } |                     g d          }|                                dk    s
J |            d S )NrK   )r   r   r.   r7   r7   )r   r`   r   r&  )rn   r   s     r   test_cutr,    sN    "7++A	lllA==??ar   c                      t          j        d          } |                     d           }t          |          dk    sJ d S )NrK   c                 .    | j         dk     o
| j         dk    S )NrL   r   )length)r   s    r   <lambda>ztest_filter.<locals>.<lambda>  s    18c>:ahl r   r.   )r   r`   filterr   r  s     r   test_filterr2    s>    "7++A	::;;Aq66Q;;;;;;r   c                      d S r   )r   r`   r   randomintersectionr   )Nrn   r   lis       r   test_random_intersectionr7  	  s    
Fr   c                      t          j        d          } t          j        d          }t          j        d          }|                     |          |                     |          k    sJ t	          d          }|                     |          |k    sJ t          j        d          } t          j        d          }|                     |d          }t          |           t          |          z   t          |          k    s4J t          |           t          |          t          |          f            t          |           |t	          d          k    sJ t	          d          }t	          d          }t          j        g           }|                    |          |k    sJ |                    |          |k    sJ |                    |d          |k    sJ |                    |d          |k    sJ d S )	NrK   ry   z'
    chr1 1   500
    chr1 800 950
    F)	postmergez
    chr1	1	100	feature1	0	+
    chr1	100	200	feature2	0	+
    chr1	150	500	feature3	0	-
    chr1	900	950	feature4	0	+
    chr1	155	200	feature5	0	-
    chr1	800	901	feature6	0	+
    zA
    chr1	155	200	feature5	0	-
    chr1	800	901	feature6	0	+
    z'
    chr1	155	200
    chr1	800	901
    )r   r`   rl   catr%   r   r:   r^   )rn   r   b_fnr   r   
b_expectedb_merge_expectedemptys           r   test_catr?    s   "7++A"7++A&w//D5588quuT{{""""	 H 5588x"7++A"7++A	a5!!Aq66CFF?c!ff$$$s1vvs1vvs1vv&>$$$	!HHH		 	 	 	 	 	 	 J 	  r""E55<<+++++99Q<<+++++55%5((J666699Q%9((J666666r   c                  j   ddi} t          j        d                              |           }t          j        d          }	 |                    |dd          }|d         d	k    sJ |d
         dk    sJ |d         dk    sJ d S # t          $ r# t
          j                            d           Y d S w xY w)Nr1   r     rK   ry   rL   T)debugactual   zmedian randomizedg       @
percentileg     V@z:SciPy not installed, so not testing BedTool.randomstats().)r   r`   set_chromsizesrandomstatsImportErrorr   r   r   )
chromsizesrn   r   ro   s       r   test_randomstatsrK  D  s    )$J"7++:::FFA"7++A
--3d-33x A%%%%*+s2222 |$,,,,,, 
 
 

K	
 	
 	
 	
 	
 	

s   AB )B21B2c                      d} t          j        | d          }|                                \  }}}|j        dk    sJ |j                    |j        dk    sJ |j                    |j        J |j                    d S )Nz
    chr1  fake  gene 1 100 . + . ID=gene1
    chr1  fake  mRNA 1 100 . + . Name=mRNA1
    chr1  fake  CDS 50 90 . + . other=nothing
    Trt   r]   mRNA1)r   r^   r  r   )r"   r   f1f2f3s        r   test_gff_stuffrQ  \  s    	A
 	1$///AJBB7grw7grw7??BG?????r   c                      t          t          t          j        d                              } | j        dk    sJ | j                    d S )Nr   thaliana_1_465_805)r   r   r   r`   r   r   s    r   	test_namerU  i  sF    T*,W556677A6))))16)))))r   c                  p    ddl m}   | ddddddgdgdgg          }t          |           |g d	k    sJ d S )
Nr   )_flatten_listr   r.   rE  r}   r   rL   )r   r.   rE  r   r   r}   r   rL   )pybedtools.helpersrW  r:   )rW  results     r   test_flattenrZ  s  sd    000000]Q1a!Q3cU;<<F	&MMM/////////r   c                  t   t          j        d          } t          j        d          }|                     |          }|                    |           }|j        d         j        }t          j        |          |k    sJ t          j        t                    5  t          j        d           d d d            n# 1 swxY w Y   t          |j                   |                    dd            t          j                            | j                  sJ t          j                            |j                  sJ t          j                            |j                  sJ t          j                            |j                  sJ |                    dd            t          j                            | j                  sJ t          j                            |j                  sJ t          j                            |j                  rJ t          j                            |j                  sJ t          j        d          } t          j        d          }|                     |          }|                    |           }|                    d	
           t          j                            | j                  sJ t          j                            |j                  sJ t          j                            |j                  rJ t          j                            |j                  sJ d S )NrK   ry   r   nonexistentTc                     dS )Nnr   r!   s    r   r0  z#test_history_step.<locals>.<lambda>  s    # r   )askraw_input_funcc                     dS )NYesr   r_  s    r   r0  z#test_history_step.<locals>.<lambda>  s    % r   F)r`  )r   r`   r~   subtracthistory
result_tagfind_taggedr   r   r   r:   delete_temporary_historyr
   r   r   rq   )rn   r   r   r   tags        r   test_history_steprj  {  s   "7++A"7++A	AA	

1A
)A,
!C!#&&!++++	z	"	" . .}---. . . . . . . . . . . . . . . 
!)4FFF7>>!$7>>!$7>>!$7>>!$4HHH7>>!$7>>!$w~~ad#####7>>!$"7++A"7++A	AA	

1A5)))7>>!$7>>!$w~~ad#####7>>!$s   B99B= B=c                      t          j        d          } |                     | d          }|                     |           }t          |          t          |          k    sJ d S )NrK   F)r"   r   r*  s      r   test_kwargsrl    sY    "7++A	AA	AAq66SVVr   c                      t          j        d          } t          j        d          }t           j                            |           sJ t           j                            |          rJ d S )Nzsnps.bed.gzrK   )r   rl   helpersisGZIP)gzfnrq   s     r   test_is_gziprq    sb    &}55D		$W	-	-B$$T*****!((,,,,,,,r   c                     t           j                                        } t           j                                        }t          j        dt          j        d          d|            t          j        dt          j        d          d|           t          j        |           } t          j        |          }| j        |j        cxk    rdk    sn J t          j        d          }t          j        d          }|                    |          |                     |          cxk    r3|                    |          cxk    r|                     |          k    sn J d S )Nzgzip -c rK   z > ry   bed)	r   r^   r   r
   r   rl   r   r`   r~   )agzbgzrn   r   s       r   	test_gziprv    sO   


!
!
#
#C


!
!
#
#CII:#>w#G#G#G#GMNNNII:#>w#G#G#G#GMNNN

S
!
!C

S
!
!C=CM2222U222222"7++A"7++A;;q>>S]]3//WWWW1;;s3C3CWWWWs}}UVGWGWWWWWWWWWr   c                      t          j        d          } t          j        d          }t          j        d          }| j        sJ |j        sJ |j        rJ d S )Nx.bamzy.bamrK   )r   r`   _isbam)r!   yrn   s      r   test_bam_bedtool_creationr{    s\    "7++A"7++A"7++A8OOO8OOOxr   c                      t          j        d          } t          d          }t          d           t          |            t          d           t          |           | |k    sJ d S )Ngdc.bama  
    None	0	chr2L	11	255	5M	*	0	0	CGACA	IIIII	NM:i:0	NH:i:1
    None	16	chr2L	71	255	5M	*	0	0	TTCTC	IIIII	NM:i:0	NH:i:1
    None	16	chr2L	141	255	5M	*	0	0	CACCA	IIIII	NM:i:0	NH:i:1
    None	16	chr2L	151	255	5M	*	0	0	GTTCA	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	211	255	5M	*	0	0	AAATA	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	71	255	5M	*	0	0	GAGAA	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	141	255	5M	*	0	0	TGGTG	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	161	255	5M	*	0	0	GATAA	IIIII	NM:i:0	NH:i:1zx:z	expected:)r   r`   r%   r:   )r!   r   s     r   test_print_abamr~    sh    "9--A	?
 
H 
$KKK	!HHH	+	(OOO======r   c                      t          j        d          } d}t          | d                   t          t          t	          |                               cxk    r|k    sn J d S )Nr}  z7None	0	chr2L	11	255	5M	*	0	0	CGACA	IIIII	NM:i:0	NH:i:1
r   )r   r`   rk   r   r   )r!   r"   s     r   test_bam_iterr    s`    "9--ABAqt99DaMM**////a////////r   c                      t          j        d          } t          j        d          }|                     |ddd          }t          |          }t	          d          }||k    sJ d S )Nr}  gdc.gffT)r   rs  r{   ab  
    chr2L	70	75	None	255	-	70	75	0,0,0	1	5,	0,
    chr2L	140	145	None	255	-	140	145	0,0,0	1	5,	0,
    chr2L	150	155	None	255	-	150	155	0,0,0	1	5,	0,
    chr2L	210	215	None	255	+	210	215	0,0,0	1	5,	0,
    chr2L	70	75	None	255	+	70	75	0,0,0	1	5,	0,
    chr2L	140	145	None	255	+	140	145	0,0,0	1	5,	0,
    chr2L	160	165	None	255	+	160	165	0,0,0	1	5,	0,
    )r   r`   r~   rk   r%   )r!   r   r   str_cr   s        r   bam_stream_bedr    ss    "9--A"9--A	A455AFFE	
 
H Hr   c                      t          j        d          } t          j        d          }|                     |dd          }t          d          }t	          |          |k    sJ d S Nr}  r  Tr   a  
    None	16	chr2L	71	255	5M	*	0	0	TTCTC	IIIII	NM:i:0	NH:i:1
    None	16	chr2L	141	255	5M	*	0	0	CACCA	IIIII	NM:i:0	NH:i:1
    None	16	chr2L	151	255	5M	*	0	0	GTTCA	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	211	255	5M	*	0	0	AAATA	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	71	255	5M	*	0	0	GAGAA	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	141	255	5M	*	0	0	TGGTG	IIIII	NM:i:0	NH:i:1
    None	0	chr2L	161	255	5M	*	0	0	GATAA	IIIII	NM:i:0	NH:i:1)r   r`   r~   r%   rk   )r!   r   r   r   s       r   bam_stream_bamr    sl    "9--A"9--A	Ad++A	?	 	H q66Xr   c                     t          j        d          } t          j        d          }|                     |dd          }t          d          }|                    |          }t	          |           t          |          |k    sJ d S r  )r   r`   r~   r%   r:   rk   )r!   r   r   r   r   s        r   bam_stream_bam_streamr    s    "9--A"9--A	Ad++A	?	 	H 	
AA	!HHHq66Xr   c                  B   t          j        d          } | d         j        dk    sJ | d         j        dk    sJ | d         d         dk    sJ | d         j        dk    sJ t          | d         d                   t          | d                   cxk    rd	k    sn J d S )
Nrx  r   chr2Liq$  rE  9330i$  r   $   )r   r`   r  r  r  r   r_  s    r   test_bam_intervalr  !  s    "7++AQ4:    Q4:Q47fQ49qtAw<<3qt99************r   c                  z    t          j        d          } | d         j        dk    sJ | d         j        dk    sJ d S )Nrx  r   samr  )r   r`   r   r  r_  s    r   test_bam_regressionr  *  sH     	"7++AQ4>U""""Q4:      r   c                      t          j        d          } t          j        d | D                                                       }|j        dk    sJ d S )Nr}  c              3      K   | ]}|V  d S r   r   r   s     r   r   z$test_sam_filetype.<locals>.<genexpr>6  s      ..1......r   r  )r   r`   r^   r_   r   r  s     r   test_sam_filetyper  3  sQ    "9--A..a...((//11A;%r   c                     t          j        d          } t          |           }| j        dk    sJ |                                 }|j        dk    sJ t          |          |k    sJ |                    d          }|j        dk    sJ |j        |j        k    sJ t          t           j        	                                d          }|
                    t          |                     |                                 t          j        |j                  }|j        dk    sJ |                    d          }|j        dk    sJ | |k    sJ | |k    sJ | |k    sJ | |k    sJ dS )ztest directly from #135r}  bamdm3genomer   r  Nr   r`   rk   r   r_   to_bamrq   r   r^   r   r   r   r   rn   origr   r   r   r  s         r   test_bam_to_sam_to_bam2r  :  si   "9--Aq66D;% 	


A;% q66T>>>> 	
A;% 414<<<< 	Z$$&&,,AGGCFFOOOGGIII16""A;%	A;% 666666666666666666r   c                     t          j        d          } t          |           }| j        dk    sJ |                                 }|j        dk    sJ t          |          |k    sJ |                    d          }|j        dk    sJ |j        |j        k    sJ t          t           j        	                                d          }|
                    t          |                     |                                 t          j        |j                  }|j        dk    sJ |                    d          }|j        dk    sJ | |cxk    r|cxk    r|cxk    r|k    sn J d S )Nr}  r  r  r  r   r  r  r  s         r   test_bam_to_sam_to_bamr  _  sx   "9--Aq66D;% 	


A;% q66T>>>> 	
A;% 414<<<< 	Z$$&&,,AGGCFFOOOGGIII16""A;%	A;%     Q    !    q        r   c                      t          j        d          } t          j        d          }|                     |          }|j        dk    sJ d S )Nr}  r  r  )r   r`   r~   r   r*  s      r   test_bam_filetyper    sL     	"9--A"9--A	AA;%r   c                      t          j        d          } t          j        d          }|                     |          }t          |j                   |j        dk    sJ d S )Nr}  r  z@SQ	SN:chr2L	LN:1800
)r   r`   r~   r:   _bam_headerr*  s      r   test_bam_headerr    s[    "9--A"9--A	AA	!-=4444444r   c                      t          j        d          } t          j        d          }|                     |          }|                     |d          }||k    sJ t          j        d           d S )NrK   ry   zdeleteme.bed)output)r   r`   r~   r
   rm   r   s       r   test_output_kwargr    si    "7++A"7++A	AA	An--A6666Inr   c                     t          j        d          } | d         }dd l}|                    |          }|j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        k    sJ |j        |j        cxk    rdk    sn J |xj        dz  c_        |j        |j        dz   k    sJ d S )NrK   r   rs  r   )	r   r`   copyr  r  r  r   fieldsr   )rn   r!   r  rz  s       r   	test_copyr    s    "7++A	!A KKK		!A7ag6QV7ag6QV8qx;!+.......... GGqLGG7agk!!!!!!r   c                      t          j        g d          } t           j                                        }dd l}t          |d          }t          d | j        D                        t          t          t          |                                |
                    | |           |                                 |                    t          |d                    }t          |           t          |          k    sJ t          j        g d          } t           j                                        }dd l}t          |d          }|
                    | |           |                                 |                    t          |d                    }t          |           t          |          k    sJ t          j        d                    d                    } t           j                                        }dd l}t          |d          }|
                    | |           |                                 |                    t          |d                    }t          |           t          |          k    sJ d S )	N)r1   r>   r?   asdfr   wbc                 ,    g | ]}t          |          S r   )typer   s     r   
<listcomp>z#test_pickleable.<locals>.<listcomp>  s    
,
,
,q477
,
,
,r   rb)r1   r>   r?   z>chr2L	.	UTR	41	70	0	+	.	ID=mRNA:xs2:UTR:41-70;Parent=mRNA:xs2;r   )r   r9   r^   r   pickler   r:   r  r  rk   dumpr   loadr   )r   rq   r  outnew_intervals        r   test_pickleabler    s   34P4P4PQQH			 	 	"	"BMMM
r4..C	
,
,HO
,
,
,---	$s8}}


KK#IIKKK;;tB~~..Lx==C------34H4H4HIIH			 	 	"	"BMMM
r4..C
KK#IIKKK;;tB~~..Lx==C------3HNNtTT H 
		 	 	"	"BMMM
r4..C
KK#IIKKK;;tB~~..Lx==C--------r   c                      t          j        d          } d }t          |                     |dd                    }|t	          d          k    sJ d S )NrK   c              3      K   | j         |z   }| j        |z   }|| _         || _        | V  | xj         |z  c_         | xj        |z  c_        | V  dS )zshift the features aroundN)r  r  )r!   dist1dist2newstartnewstops        r   funcztest_split.<locals>.func  sa       7U?&5.	5	%r   rB  rL   a  
    chr1	1001	1100	feature1	0	+
    chr1	901	1000	feature1	0	+
    chr1	1100	1200	feature2	0	+
    chr1	1000	1100	feature2	0	+
    chr1	1150	1500	feature3	0	-
    chr1	1050	1400	feature3	0	-
    chr1	1900	1950	feature4	0	+
    chr1	1800	1850	feature4	0	+
    )r   r`   rk   r   r%   )rn   r  rY  s      r   
test_splitr    sr    "7++A   tS))**FS		       r   c                      t          j        d          } t          d          }|                     ddt	          d          d          |k    sJ d S )	NrK   z5
    chr1	1	2	1
    chr1	100	101	1
    chr1	900	901	1Tr-   rA  r1   z-5)bgstrandgadditional_args)r   r`   r%   genome_coverager   )rn   r   s     r   test_additional_argsr    sw    "7++A	 H 	
C4Y#7#7#7 	 	
 	
 	 	 	 	 	 	r   c                      t          j        d          } t          |                     t          j        ddd                    }t          |           |t          d          k    sJ d S )NrK   rE  r}   _TSS)upstream
downstreamadd_to_namez
    chr1	0	6	feature1_TSS	0	+
    chr1	97	105	feature2_TSS	0	+
    chr1	495	503	feature3_TSS	0	-
    chr1	897	905	feature4_TSS	0	+
    )r   r`   rk   r  r   TSSr:   r%   rn   ro   s     r   test_tssr    sz    "7++A	|!vNN G 
'NNNc	       r   c                      t          j        d          } t          |                     t          j        d                    }t          |           |t          d          k    sJ d S )NrK      z
    chr1	1	100	feature1	0	+	1	100
    chr1	100	200	feature2	0	+	100	200
    chr1	150	500	feature3	0	-	150	500
    chr1	900	950	feature4	0	+	900	950
    )r   r`   rk   r  r   extend_fieldsr:   r%   r  s     r   test_extend_fieldsr    sm    "7++A!&&3Q7788G	'NNNc	       r   c                  `   t          j        d          } t          |                     t          j        d                    }|t          d          k    sJ t          |                     t          j                            }|t          d          k    sJ t          |                     t          j        d                    }|t          d          k    sJ t          |                     t          j        d                    }t          |           |t          d	          k    sJ d S )
Nr|   Parent)
name_fieldz~
    chr1	49	300	.	.	+
    chr1	49	300	gene1	.	+
    chr1	74	150	mRNA1	.	+
    chr1	199	275	mRNA1	.	+
    chr1	1199	1275	.	.	+z
    chr1	49	300	gene1	.	+
    chr1	49	300	mRNA1	.	+
    chr1	74	150	CDS1	.	+
    chr1	199	275	CDS2	.	+
    chr1	1199	1275	rRNA1	.	+
    r\  zw
    chr1	49	300	.	.	+
    chr1	49	300	.	.	+
    chr1	74	150	.	.	+
    chr1	199	275	.	.	+
    chr1	1199	1275	.	.	+
    r   z
    chr1	49	300	fake	.	+
    chr1	49	300	fake	.	+
    chr1	74	150	fake	.	+
    chr1	199	275	fake	.	+
    chr1	1199	1275	fake	.	+)r   r`   rk   r  r   gff2bedr%   r:   r  s     r   test_gff2bedr  #  sI   "7++A!&&-(&CCDDGc	      !&&-..//Gc	      !&&--&HHIIGc	      !&&-!&<<==G	'NNNc	       r   c                     	 ddl m}  n # t          $ r t          d           Y d S w xY wd }t	          j        d          }|                    |                                          }| j        }|	                                }t          |                    t          j        ||                    }t          |           |t          d          k    sJ d S )Nr   )cmz1matplotlib not installed; skipping test_add_colorc                 h    | j         }t          | d                   |d<   t          j        |          S )Nr.   r7   )r  rk   r   r9   )r   r  s     r   modify_scoresz%test_add_color.<locals>.modify_scoresX  s-    !IIq	3F;;;r   rK   )cmapnormz
    chr1	1	100	feature1	100	+	1	100	0,0,127
    chr1	100	200	feature2	200	+	100	200	0,0,255
    chr1	150	500	feature3	500	-	150	500	99,255,147
    chr1	900	950	feature4	950	+	900	950	127,0,0)
matplotlibr  rI  r:   r   r`   r  r_   jetcolormap_normalizerk   r   	add_colorr%   )r  r  rn   r  r  ro   s         r   test_add_colorr  Q  s   !!!!!!!   ABBB< < <
 	"7++A	}$$&&A6D!!D!&&/d&FFGGG	'NNNc	3       s   	 &&c                  L   t          j        d          } d|                     t          j        g d                    k    sJ d|                     t          j        g d          d          k    sJ d|                     t          j        g d                    k    sJ d S )NrK   r   )r1   rH   905r6   r6   rG   r   Tsame_strand)r1   80009000r6   r6   rG   )r   r`   any_hitsr9   rv   s    r   test_any_hitsr  o  s    "7++A

,-R-R-RSS      

,-R-R-RSS       
 

,-T-T-TUU       r   c                     t          j        d          } | d         | d         g|                     t          j        g d                    k    sJ | d         g|                     t          j        g d          d          k    sJ d S )NrK   r.   rE  r1   450r  r6   r6   rG   Tr  )r   r`   all_hitsr9   rv   s    r   test_all_hitsr    s    "7++AaD!A$<1::,-R-R-RSS      aD6QZZ,-R-R-RSS          r   c                  "   t          j        d          } t          |                     t          j        g d                              dk    sJ t          |                     t          j        g d          d                    dk    sJ d S )NrK   r  r.   Tr  r   )r   r`   r   r  r9   rv   s    r   test_count_hitsr    s    "7++A 	JJ4999  	
 	
 	 	 	 	 	JJ4999  !	   	
 	
 	 	 	 	 	 	r   c                  R   t          j        d          } t          j        d          }t          j                    }|                    | j        |j        g          t          d          k    sJ |                    | j        |j        gd          t          d          k    sJ d S )NrK   ry   r#   z
        chr1	1	155	1	1	1	0
        chr1	155	200	2	1,2	1	1
        chr1	200	500	1	1	1	0
        chr1	800	900	1	2	0	1
        chr1	900	901	2	1,2	1	1
        chr1	901	950	1	1	1	0T)r#   clusterz>
        chr1	155	200	2	1,2	1	1
        chr1	900	901	2	1,2	1	1)r   r`   r^   multi_intersectrq   r%   )rn   r   r!   s      r   test_multi_intersectr    s     	"7++A"7++AAad|,,	 1 1     ad|T::c	"? ?      r   c                  *   t          j        dd          } t          j        dd          }t          j        dd          }t          j                    }|                    | j        |j        |j        g          }|t	          d          k    sJ d S )Nz?
    chr1  1000    1500    10
    chr1  2000    2100    20
    Trt   z;
    chr1  900 1600    60
    chr1  1700    2050    50
    z?
    chr1  1980    2070    80
    chr1  2090    2100    20
    r  aI  
    chr1  900 1000    0   60  0
    chr1  1000    1500    10  60  0
    chr1  1500    1600    0   60  0
    chr1  1700    1980    0   50  0
    chr1  1980    2000    0   50  80
    chr1  2000    2050    20  50  80
    chr1  2050    2070    20  0   80
    chr1  2070    2090    20  0   0
    chr1  2090    2100    20  0   20
    )r   r^   union_bedgraphsrq   r%   )rn   r   r   r!   rY  s        r   test_union_bedgraphsr    s     		 	 	 	A 		 	 	 	A 		 	 	 	A 	A!$ad!344FS
	       r   c                     t          j                    } t          j        d          }|                     |j        d          }t          |           |t          d          k    sJ t          j                    } |                     dd          }t          |d                   d	k    sJ t          |d
                   dk    sJ d S )NrK   r  )r   r   z
    chr1	1	51
    chr1	51	100
    chr1	100	150
    chr1	150	200
    chr1	150	200
    chr1	200	250
    chr1	250	300
    chr1	300	350
    chr1	350	400
    chr1	400	450
    chr1	450	500
    chr1	900	950
    hg19i )r  r   r   zchr1	0	100000
i'  zchr5	118200000	118300000
)r   r^   r`   window_makerrq   r:   r%   rk   )r!   rn   rY  zs       r   test_window_makerr    s    A"7++A^^adb^))F	&MMMS	       	A	f//Aqt99+++++qx==:::::::r   c                      t          j                    } |                     dddd                                          }t	          |           |t          d          k    sJ d S )N
   r  r   )r   r^  r  r  af  
    chr3	123121550	123121560	1	10	-
    chr8	10634720	10634730	2	10	-
    chr7	24782325	24782335	3	10	+
    chr12	19713230	19713240	4	10	+
    chr11	31590686	31590696	5	10	-
    chr7	100526957	100526967	6	10	+
    chr2	117350440	117350450	7	10	+
    chr15	25320997	25321007	8	10	+
    chr5	116677189	116677199	9	10	-
    chr17	75329339	75329349	10	10	-
    )r   r^   r  r_   r:   r%   )rn   rY  s     r   test_randomr    sr    AXXbaX88??AAF	&MMMS       r   c                     t          j        dt          j        d          z             t          j        d          } |                                 } t          t          j        d                                                    }t          | j                                                  }t          |           t          |           ||k    sJ t          j
        d           d S )Nzcp %s a.links.bedrK   za.links.bedza.links.html)r
   r   r   rl   r^   linksr   r   
links_htmlr:   rm   )rn   expobss      r   
test_linksr
    s     I!J$?$H$HHIII=))A			A
z*>::
;
;
@
@
B
BC
q|


!
!
#
#C	#JJJ	#JJJ#::::Imr   c                     t          j        d          } |                                 } t          | j                                                  }t          t          j        d                                                    }||k    sJ d S )NrK   za.igv_script)r   r`   igvr   
igv_scriptr   rl   )rn   r	  r  s      r   test_igvr  '  so    "7++A	A
q|


!
!
#
#C
z*>::
;
;
@
@
B
BC#::::::r   z3bedtools bam2fastq (v2.30) outputs double the reads)reasonc                  >   t          j        d          } t           j                                        }|                     |          }t          |j                                                  }t          t          j        d                                                    }t          |           t          |           t          |j                                                  t          t          j        d                                                    k    sJ d S )Nz	small.bam)fqzsmall.fastq)
r   r`   r^   r   bam_to_fastqr   fastqr   rl   r:   )r!   tmpfnrz  r	  r  s        r   test_bam_to_fastqr  /  s    ";//A##%%E	%  A
qw--



C
z*=99
:
:
?
?
A
AC	#JJJ	#JJJ 	QWZ%@%O%O P P U U W WWWWWWWr   c                      g d} t          j        |           } | j         g d} t          j        |           } | j         d S )N)	r1   rP   rS   51rR   r6   r-   r6   rT   )	scaffold_52	Cufflinksexon54785568r6   r-   r6   zgene_id "XLOC_017766"; transcript_id "TCONS_00033979"; exon_number "6"; gene_name "g18412"; oId "PAC:26897502"; nearest_ref "PAC:26897502"; class_code "="; tss_id "TSS21210"; p_id "P18851";)r   r9   attrs)gffs    r   test_gtf_gff_attrsr  >  sU     Y
X
XC

.s
3
3CII
 
 
C 
.s
3
3CIIIIr   c                     t          j        d          } |                     t          j        d                    }|dddddk    s
J |            |                     t          j        d          d	          }||k    s
J |            d S )
NrK   ry   .   i  g~%?r.   )intersectionunionjaccardn_intersectionsTrz   )r   r`   r$  r!   ro   results2s      r   test_jaccardr(  ^  s    "7++Aii
27;;<<G	    
    yy3G<<TyJJHhr   c                  P   t          j        d          } |                     t          j        d                    }|g dg dg dg ddk    s
J |            |                     t          j        d          d	          }t          |           |t	          d
          k    sJ d S )NrK   ry   )g333333?gzG?gQ?)r   r   r   )rE  rE  rE  )Zd;O?r*  r*  )reldistr  totalfractionT)detailzj
    chr1	1	100	feature1	0	+	0.282
    chr1	100	200	feature2	0	+	0.153
    chr1	150	500	feature3	0	-	0.220)r   r`   r+  r:   r%   r&  s      r   test_reldistr/  m  s    "7++Aii
27;;<<G%%%)))	    
    yy3G<<TyJJH	(OOOs	'       r   c                      t          j        t                    5  t          j        dd           ddd           dS # 1 swxY w Y   dS )z	from #134z@ftp://ftp-trace.ncbi.nih.gov/this/url/clearly/does/not/exist.bamTremoteN)r   r   r   r   r^   r   r   r   7test_remote_bam_raises_exception_when_file_doesnt_existr3    s    	z	"	" 
 
N	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   >AAz4Known failure: no support in BEDTools for remote BAMc                      d} t          j        | d          fd}t          j         |                                                      }|t          d          k    s
J |            d S )Nz>http://genome.ucsc.edu/goldenPath/help/examples/bamExample.bamTr1  c               3   t   K   t                                                    D ]\  } }|V  | dk    r d S d S )Nr   )	enumerate
bam_to_bed)r#   r   r!   s     r   genztest_remote_bam.<locals>.gen  sR      allnn-- 	 	DAqGGGAvv 	 	r   a  
    11	60636	60736	SRR081241.13799221/1	0	+
    11	60674	60774	SRR077487.5548889/1	0	+
    11	60684	60784	SRR077487.12853301/1	0	+
    11	60789	60889	SRR077487.5548889/2	0	-
    11	60950	61050	SRR077487.13826494/1	0	+
    11	60959	61059	SRR081241.13799221/2	0	-
    11	61052	61152	SRR077487.12853301/2	0	-
    11	61548	61648	SRR081241.16743804/2	0	+
    11	61665	61765	SRR081241.16743804/1	0	-
    11	61989	62089	SRR077487.167173/2	0	+)r   r^   r_   r%   r:   socketserverThreadingMixInBaseHTTPServer
HTTPServerThreadingTCPServerrk   socketgetsocknamerl   r
   chdir	threadingThreadserve_foreverdaemonr  r    shutdown)	urlr8  ro   ThreadingHTTPServerhttpdportserved_folderserver_threadr!   s	           @r   test_remote_bamrL    s    
JC3t,,,A      ''..00Gc
	-        Fr   c                      t          j        d          } t          j        dd          }|j        dk    sJ | |z   |k    sJ || z   |k    sJ | |z
  | k    sJ || z
  |k    sJ ||z
  |k    sJ d S )NrK   r   Trt   r>  )r   r`   r^   r   r  s     r   test_empty_overloaded_opsrN    s    "7++A24000A;'!!!! Ea<<<<Ea<<<<Ea<<<<Ea<<<<Ea<<<<<<r   c                     d } 	 dd l }n$# t          $ r t          j        d           Y nw xY wt	          j        d          }|                                }|j        d         dk    sJ t          |j	                  g dk    sJ |j        d         d	k    sJ |                                }t          j
                            |          }||k    sJ t          j
                            |j        |j        d
k     g df                   }|t          d          k    sJ t          |                      t	          j        d          }|                                }t          |j	                  g dk    sJ |j        d         dk    sJ |j        d         dk    sJ t	          j        d          }|                    |d          }t!          j        d          5 }	|                                 t%          |	          dk    sJ t'          |	d         j        t*                    sJ t          |	d         j                                      d          sJ 	 d d d            n# 1 swxY w Y   g d}
|                    |
          }t          |j	                  g dk    sJ |j        d         dk    sJ |j        d         dk    sJ d S )Nc                 b    d                     |                     d          dd                    S )Nr   Tr   )r    r   )dfs    r   fix_dataframez(test_to_dataframe.<locals>.fix_dataframe  s)    wwr}}T**122.///r   r   z#pandas not installed; skipping testrK   )r   r   r@   )r  r  endr   scorer  )rE  r  r-   rL   )r  r  rS  r   z%
        chr1	1	100	feature1
        r|   )	seqnamesourcefeaturer  rS  rT  r  frame
attributes)r   rU  r1   )r7   rY  r[   r   TrT  )recordr   r,   zDefault names for filetype)
rU  rV  rW  r  rS  rT  r  rX  rY  r  )names)   r  rE  )pandasrI  r   xfailr   r`   to_dataframelocr   columnsr^   from_dataframer  r%   rk   r~   warningscatch_warningsr   
issubclasscategoryUserWarningmessage
startswith)rR  r]  rn   ro   rQ  a2a3r   r!   r   r[  s              r   test_to_dataframerl    s   0 0 0< < < <:;;;;;< 	"7++AnnG;y!Z////  $X$X$XXXXX;{#s**** 
		B			*	*2	.	.B7777 
		*	*
rx#~@@@@A
 
B 	     2ww	   	"7++AnnG   
% 
% 
% 
 
 
 
 ;|$....;';6666 	"7++A	AA		 	-	-	- K	1vv{{{{!B%.+666661R5=!!,,-IJJJJJJK K K K K K K K K K K K K K K  E nn5n))G   % % %     ;|$....;{#q((((((s   
 ++A;I&&I*-I*c                  f   t          j        d          } |                     d          }t          d          }||k    sJ |                     dd          }t          d          }||k    sJ t          j        d          } t	          |           }|                     d          }||k    sJ d S )Nzrmsk.hg18.chr21.small.bedT)	as_stringa  
        chr21	13355834	13356047	MER58A	892	-
        chr21	13356250	13356290	AT_rich	26	+
        chr21	13356358	13356381	AT_rich	23	+
        chr21	13356571	13356910	L2	333	-
        chr21	13357179	13357987	L1MEc	1264	-
        chr21	13358003	13358300	L1MEc	379	-
        chr21	13358304	13358952	L1MEc	1271	-
        chr21	13358960	13359288	L2	336	+
        chr21	13359444	13359751	AluY	2337	+
        chr21	13360044	13360225	L1M5	284	-rE  z
        chr21	13358960	13359288	L2	336	+
        chr21	13359444	13359751	AluY	2337	+
        chr21	13360044	13360225	L1M5	284	-rK   )r   r`   tailr%   rk   )rn   observedr   r	  s       r   	test_tailrq  H  s    "#>??Avvv%%H
	. H x vva4v((H	. H x 	"7++A1vvH
&&4&
 
 C(??????r   c                      t          j        d          } t          j        d          }|                     |d          }t          |          dk    s
J |            d S )NrK   ry   r  r  a  # Number of query intervals: 4
# Number of db intervals: 2
# Number of overlaps: 3
# Number of possible intervals (estimated): 13958448
# phyper(3 - 1, 4, 13958448 - 4, 2, lower.tail=F)
# Contingency Table Of Counts
#_________________________________________
#           |  in -b       | not in -b    |
#     in -a | 3            | 1            |
# not in -a | 0            | 13958444     |
#_________________________________________
# p-values for fisher's exact test
left	right	two-tail	ratio
1	8.8247e-21	8.8247e-21	inf
)r   r`   fisherrk   r*  s      r   test_fisherrt  k  sr    "7++A"7++A	6""AA	 	 	  	!	 	 	 	 	r   c                  d    t          j        g d          } t          |           dk    sJ | sJ d S )N)r1   r>   r>   r   )r   r9   r   r  s    r   test_zero_len_booleanrv    s;     	,-?-?-?@@Aq66Q;;;;HHHHHr   c            	         t          j        d                              t          j        dddt          j        d                                                    } | t          d          k    sJ t          |                       t          j        d                              t          j        dddt          d	                                                    } | t          d
          k    sJ t          |                       t          j        d                              t          j
        dddt          d	                                                    } | t          d          k    sJ t          |                       t          j        d                              t          j
        dddt          d	                                                    } | t          d          k    sJ t          |                       d S )NrK   r   r  r  r  )r  r  z
        chr1	0	11	feature1_TSS	0	+
        chr1	99	110	feature2_TSS	0	+
        chr1	490	501	feature3_TSS	0	-
        chr1	899	910	feature4_TSS	0	+
        )r   rO   r  z
        chr1	0	11	feature1_TSS	0	+
        chr1	99	110	feature2_TSS	0	+
        chr1	490	501	feature3_TSS	0	-
        chr1	899	900	feature4_TSS	0	+
        z
        chr1	99	110	feature1_TSS	0	+
        chr1	199	210	feature2_TSS	0	+
        chr1	140	151	feature3_TSS	0	-
        chr1	900	900	feature4_TSS	0	+
        )r   x   z
        chr1	99	110	feature1_TSS	0	+
        chr1	120	120	feature2_TSS	0	+
        chr1	120	120	feature3_TSS	0	-
        chr1	120	120	feature4_TSS	0	+
        )r   r`   r  r   
five_primerJ  r_   r%   rk   r   three_primerv   s    r    test_chromsizes_in_5prime_3primer{    sL    	"7++	#(00 
 

 

 
  	     1vv   	"7++	#X&&& 
 

 

 
  	     1vv   	"7++	$X&&& 
 

 

 
  	     1vv   	"7++	$X&&& 
 

 

 
  	     1vv    r   c                     t           j                                        } t          | d          5 }|                    d           ddd           n# 1 swxY w Y   t          j        |           }|                                 t          j        t           j        j	                  5  t          |           ddd           dS # 1 swxY w Y   dS )z
    The new BedTool.head no longer iterates using IntervalIterator but instead
    just prints the lines of the file directly.
    r   zchr1	5	10
chr1	-1	15
N)r   r^   r   r   r   r)  r   r   	cbedtoolsr   r:   )r   r   rn   s      r   test_new_headr~    s1   
 

!
!
#
#C	c3 54

34445 5 5 5 5 5 5 5 5 5 5 5 5 5 53A FFHHH 
z+A	B	B  a                 s#   AAA'CCC)gr   r
   r   r   r   r   rA  rc  tfuncsr   r   r   r   r%   r(   r*   r<   re   rr   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r!  r#  r'  r,  r2  r7  r?  rK  rQ  rU  rZ  rj  rl  rq  rv  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  markr^  r  r  r(  r/  r3  rL  rN  rl  rq  rt  rv  r{  r~  r   r   r   <module>r     sV                   # # # # # #                  ) ) )    4
( 
( 
() ) )$ $ $6 !  !  !F  @
/ 
/ 
/$4 4 4nS S S0  	 	 	    2 "  "  "F   7 7 7,  2  
 
 
.; ; ;# # #  Z Z Z@- - -  ) ) )X    & & &0& & &4     $     	 	 	# # #    .7 .7 .7b
 
 
0
$ 
$ 
$2 2 20 0 0!  !  ! H  - - -X X X"    (0 0 0  (  $  &+ + +! ! !     " " "J! ! !B     5 5 5  " " ".!. !. !.H  @        + + +\  <  "
 
 
  6  .' ' 'T; ; ;8  (     OPP  QP  @) ) )   (
 
 
 PQQR R RQRn  T) T) T)n     F	 	 	0  V V Vr    r   