ó
?îec           @   s0  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 m	 Z	 m
 Z
 m Z d d l m Z d d l m Z m Z d d l m Z d d l m Z d d l m Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z i e d 6e d 6e d 6e d 6e d 6e d 6Z d „  Z d S(   sq   
Script to call nucleosome positions-- track making, nucleosome calling, and nfr calling!

@author: Alicia Schep
iÿÿÿÿN(   t   shell_commandt   read_chrom_sizes_from_bamt   read_chrom_sizes_from_fasta(   t	   ChunkList(   t   NucChunkt   NucParameters(   t   FragmentSizes(   t   PWM(   t   VMatc         C   s÷   |  \ } } y© t  | ƒ } | j | ƒ i g  t | j ƒ D] } | j | ^ q; d 6g  t | j ƒ D] } | j | ^ qe d 6| j d 6| j d 6| j d 6| j	 d 6} | 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

    t   nucposs   nucpos.redundantt   nucleoatac_signalt   nucleoatac_rawt   nucleoatac_backgrounds   nucleoatac_signal.smooths"   Caught exception when processing:
s   
(    (   R   t   processt   sortedt   nonredundantt   nuc_collectiont	   redundantt   norm_signalt
   nuc_signalt   biast   smoothedt
   removeDatat	   Exceptiont   asBedt	   tracebackt	   print_exc(   t   argt   chunkt   paramst   nuct   it   outt   e(    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt
   _nucHelper   s    W

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   .nucleoatac_signal.bedgrapht   at   STOPs6   Caught exception when writing NucleoATAC signal track
(    (
   t   opent   itert   gett   write_trackt	   task_doneR   R   R   t   closet   True(   t   track_queueR    t
   out_handlet   trackR!   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt   _writeNucSig+   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   .nucleoatac_background.bedgraphR#   R$   s:   Caught exception when writing NucleoATAC background track
(    (
   R%   R&   R'   R(   R)   R   R   R   R*   R+   (   R,   R    R-   R.   R!   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt   _writeBackground:   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"   .nucleoatac_signal.smooth.bedgraphR#   R$   s?   Caught exception when writing smoothed NucleoATAC signal track
(    (
   R%   R&   R'   R(   R)   R   R   R   R*   R+   (   R,   R    R-   R.   R!   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt   _writeSmoothI   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   .nucleoatac_raw.bedgraphR#   R$   sD   Caught exception when writing un-normalized NucleoATAC signal track
(    (
   R%   R&   R'   R(   R)   R   R   R   R*   R+   (   R,   R    R-   R.   R!   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt	   _writeRawW   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   .nucpos.bedR#   R$   s7   Caught exception when writing nucleosome position file
(    (
   R%   R&   R'   t   writeR)   R   R   R   R*   R+   (   t	   pos_queueR    R-   t   poslistt   posR!   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt   _writeNucPosg   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   .nucpos.redundant.bedR#   R$   sA   Caught exception when writing redundant nucleosome position file
(    (
   R%   R&   R'   R3   R)   R   R   R   R*   R+   (   R4   R    R-   R5   R6   R!   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt   _writeNucPosRedundantv   s    


R	   s   nucpos.redundantR
   R   R   s   nucleoatac_signal.smoothc         C   s±  t  j |  j ƒ } |  j r- t |  j ƒ } n t |  j ƒ } t j |  j ƒ } t	 j
 |  j d | d | j j d | j d t | j | j ƒ |  j d d |  j d ƒ} | j | d |  j d d |  j d ƒ| j ƒ  |  j d } |  j d/ k	 rt j |  j ƒ } n( t d	 d
 | j ƒ} | j |  j | ƒ t d | d | d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j d |  j  ƒ } | j! d |  j d ƒ } t" j# d t d |  j d ƒ ƒ }	 |  j$ rd d d d d d g }
 n d d d d g }
 i  } i  } i  } xÀ |
 D]¸ } | d0 k rft |  j% d! | d" d# ƒ | | <n" t |  j% d! | d$ d# ƒ | | <| | j& ƒ  t" j' d% | ƒ | | <t" j( d& t) | d' | | |  j% f ƒ | | <| | j* ƒ  q/Wxi | D]a } |	 j+ t, t- | t. j/ | ƒ ƒ ƒ } x4 | D], } x# |
 D] } | | j0 | | ƒ q0Wq#WqòW|	 j& ƒ  |	 j1 ƒ  x |
 D] } | | j0 d( ƒ qrWx|
 D]} | | j1 ƒ  | d1 k r0t2 j3 |  j% d! | d" |  j% d! | d) d* t4 ƒt5 d+ |  j% d! | d" ƒ t2 j6 |  j% d! | d) d, d- d* t4 ƒq”t2 j3 |  j% d! | d$ |  j% d! | d. d* t4 ƒt5 d+ |  j% d! | d$ ƒ t2 j6 |  j% d! | d. d, d- d* t4 ƒq”Wd/ S(2   s   run occupancy calling

    t	   chromDictt
   min_offseti   i   t
   min_lengtht   upt   downi
   i    t   uppert   vmatt   fragmentsizest   bamt   fastat   pwmt	   occ_trackt   sdt   nonredundant_sept   redundant_sept   min_zt   min_lrt   atact   itemsi   t	   processesR	   s   nucpos.redundantR
   s   nucleoatac_signal.smoothR   R   t   nfrpost   .s	   .bedgrapht   ws   .bedt   maxsizet   targett   argsR$   s   .bedgraph.gzt   forces   rm t   presett   beds   .bed.gzN(   R	   s   nucpos.redundantRM   (   R	   s   nucpos.redundant(7   R   R%   R?   RB   R   R   RA   R   RC   R   t   readRU   t   matt   shapeR>   t   maxR<   R=   t   nuc_sept   slopt   merget   corest   sizest   NoneR   t   calculateSizesR   RD   RE   RG   RH   RI   RJ   t   splitt   mpt   Poolt	   write_allR    R*   t   JoinableQueuet   Processt   _writeFuncst   startt   mapR"   t   zipt	   itertoolst   repeatt   putt   joint   pysamt   tabix_compressR+   R    t   tabix_index(   RR   R?   t   chrsRC   t   chunkst   maxQueueSizet   fragment_distR   t   setst   pool1t   outputst   handlest   write_queuest   write_processesR   t   jt   tmpt   result(    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt   run_nuc   sh    	^'
-	"	%"-$!

4+4(    t   __doc__t   multiprocessingRb   t   numpyt   npR   Rk   Ro   t   pyatac.utilsR    R   R   t   pyatac.chunkR   t   nucleoatac.NucleosomeCallingR   R   t   pyatac.fragmentsizesR   t   pyatac.biasR   t   pyatac.VMatR   R"   R/   R0   R1   R2   R7   R8   Rg   R   (    (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_nuc.pyt   <module>   s,   							
