ó
?îec           @   sÈ   d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l	 m
 Z
 m Z m Z d d l m Z d d l m Z m Z d d l m Z d „  Z d „  Z d	 „  Z d
 „  Z d S(   s;   
Script to determine NFR positions!

@author: Alicia Schep
iÿÿÿÿN(   t   shell_commandt   read_chrom_sizes_from_fastat   read_chrom_sizes_from_bam(   t	   ChunkList(   t   NFRParameterst   NFRChunk(   t   PWMc         C   s¢   |  \ } } yT t  | ƒ } | j | ƒ | j d k rL | j | j f } n	 | j } | j ƒ  Wn; t k
 r } d | j ƒ  d GHt	 j
 ƒ  d GH| ‚ n X| S(   s8   function to get occupancy for a set of bed regions

    s"   Caught exception when processing:
s   
N(    (   R   t   processt	   ins_trackt   Nonet   nfrst   inst
   removeDatat	   Exceptiont   asBedt	   tracebackt	   print_exc(   t   argt   chunkt   paramst   nfrt   outt   e(    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nfr.pyt
   _nfrHelper   s    	

c         C   sš   t  | d d ƒ } yI xB t |  j d ƒ D]. } x | D] } | j | ƒ q6 W|  j ƒ  q) WWn- t k
 r‹ } d GHt j ƒ  d GH| ‚ n X| j ƒ  t	 S(   Ns   .nfrpos.bedt   at   STOPs.   Caught exception when writing occupancy track
(    (
   t   opent   itert   gett   writet	   task_doneR   R   R   t   closet   True(   t	   pos_queueR   t
   out_handlet   poslistt   posR   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nfr.pyt	   _writeNFR)   s    


c         C   s‰   t  | d d ƒ } y8 x1 t |  j d ƒ D] } | j | ƒ |  j ƒ  q) WWn- t k
 rz } d GHt j ƒ  d GH| ‚ n X| j ƒ  t	 S(   Ns   .ins.bedgraphR   R   s.   Caught exception when writing insertion track
(    (
   R   R   R   t   write_trackR   R   R   R   R   R    (   t   track_queueR   R"   t   trackR   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nfr.pyt	   _writeIns8   s    


c         C   s
  |  j  d k r- |  j d k r- t d ƒ ‚ n  |  j sj d j t j j |  j	 ƒ j
 d ƒ d d !ƒ |  _ n  |  j d k	 rÊ t |  j ƒ } t j |  j ƒ } t j |  j d | d t | j | j ƒ ƒ} n t j |  j ƒ } |  j  d k	 rt |  j  ƒ } | j | d d ƒn  | j ƒ  |  j d	 } t |  j |  j	 |  j |  j  d
 |  j d |  j d |  j d |  j ƒ} | j
 d |  j d ƒ } t j d t d |  j d ƒ ƒ } t |  j d d ƒ }	 |	 j  ƒ  t j! ƒ  }
 t j" d t# d |
 |  j f ƒ } | j$ ƒ  | j d k rgt |  j d d ƒ } | j  ƒ  t j! ƒ  } t j" d t% d | |  j f ƒ } | j$ ƒ  n  x„ | D]| } | j& t' t( | t) j* | ƒ ƒ ƒ } xO | D]G } | j d k rÙ|
 j+ | d ƒ | j+ | d ƒ qŸ|
 j+ | ƒ qŸWqnW| j  ƒ  | j ƒ  |
 j+ d ƒ | j ƒ  | j d k rB| j+ d ƒ | j ƒ  n  t, j- |  j d |  j d d t. ƒt/ d |  j d ƒ t, j0 |  j d d d d t. ƒ| j d k rt, j- |  j d |  j d d t. ƒt/ d |  j d ƒ t, j0 |  j d d d d t. ƒn  d S(   s   run nfr calling

    s.   Must supply either bam file or insertion trackt   .i    iýÿÿÿt	   chromDictt
   min_offsett   chrom_sources   BAM filei
   t   max_occt   max_occ_uppert   fastat   pwmt   itemsi   t	   processesi   s   .nfrpos.bedt   wt   targett   argss   .ins.bedgraphR   s   .nfrpos.bed.gzt   forces   rm t   presett   beds   .ins.bedgraph.gzN(1   t   bamR	   R   R   R   t   joint   ost   patht   basenamet   callst   splitR0   R   R   R   R1   R   t   readR9   t   maxt   upt   downR   t   checkChromst   merget   coresR   t	   occ_trackR.   R/   t   mpt   PoolR   t   JoinableQueuet   ProcessR%   t   startR)   t   mapR   t   zipt	   itertoolst   repeatt   putt   pysamt   tabix_compressR    R    t   tabix_index(   R6   t
   chrs_fastaR1   t   chunkst   chrs_bamt   maxQueueSizeR   t   setst   pool1t
   nfr_handlet	   nfr_queuet   nfr_processt
   ins_handlet	   ins_queuet   ins_processt   jt   tmpt   result(    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nfr.pyt   run_nfrH   sd    	40
0"
!

!$


$ $(   t   __doc__t   multiprocessingRI   t   numpyt   npR<   R   RP   RS   t   pyatac.utilsR    R   R   t   pyatac.chunkR   t   nucleoatac.NFRCallingR   R   t   pyatac.biasR   R   R%   R)   Re   (    (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nfr.pyt   <module>   s   			