ó
?îec           @   sá   d  Z  d d l j 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 m Z d d l m Z d d l m Z d „  Z d	 „  Z d
 „  Z d „  Z d S(   sC   
Script to make nucleosome occupancy track!

@author: Alicia Schep
iÿÿÿÿN(   t   shell_commandt   read_chrom_sizes_from_bamt   read_chrom_sizes_from_fasta(   t	   ChunkList(   t   FragmentMixDistributiont   OccupancyParameterst   OccChunk(   t   FragmentSizes(   t   PWMc         C   s¶   |  \ } } yh t  | ƒ } | j | ƒ | j ƒ  | j g  t | j j ƒ  ƒ D] } | j | ^ qM f } | 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   
(    (   R   t   processt
   getNucDistt   occt   sortedt   peakst   keyst
   removeDatat	   Exceptiont   asBedt	   tracebackt	   print_exc(   t   argt   chunkt   paramsR   t   it   outt   e(    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_occ.pyt
   _occHelper   s    	8

c         C   sø   t  | d d ƒ } t  | d d ƒ } t  | d d ƒ } ym xf t |  j d ƒ D]R } | j | d | j ƒ| j | d | j ƒ| j | d | j ƒ|  j ƒ  qO WWn- t k
 rÕ } d GHt	 j
 ƒ  d GH| ‚ n X| j ƒ  | j ƒ  | j ƒ  t S(	   Ns   .occ.bedgrapht   as   .occ.lower_bound.bedgraphs   .occ.upper_bound.bedgrapht   STOPt   valss.   Caught exception when writing occupancy track
(    (   t   opent   itert   gett   write_trackt   smoothed_valst   smoothed_lowert   smoothed_uppert	   task_doneR   R   R   t   closet   True(   t   track_queueR   t   out_handle1t   out_handle2t   out_handle3t   trackR   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_occ.pyt	   _writeOcc)   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   .occpeaks.bedR   R   s.   Caught exception when writing occupancy track
(    (
   R   R   R    t   writeR%   R   R   R   R&   R'   (   t	   pos_queueR   t
   out_handlet   poslistt   posR   (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_occ.pyt   _writePeaks>   s    


c         C   sL  |  j  r t |  j  ƒ } n t |  j ƒ } t j |  j ƒ } t j |  j	 d | d |  j
 |  j d t | j | j ƒ |  j d ƒ} | j | d |  j d d |  j d ƒ| j ƒ  |  j d } t d d |  j ƒ} |  j d1 k	 r't j |  j ƒ } t d |  j d	 | j d |  j ƒ ƒ| _ n | j |  j | ƒ | j ƒ  | j |  j d
 ƒ | j j |  j d ƒ t | |  j |  j  |  j d |  j d |  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 d d ƒ } | j% ƒ  t |  j d d ƒ } | j% ƒ  t# j& d | ƒ } t# j' d t( d | |  j f ƒ } | j) ƒ  t |  j d d ƒ } | j% ƒ  t# j& ƒ  } t# j' d t* d | |  j f ƒ } | j) ƒ  t+ j, |  j ƒ } xs | D]k } |	 j- t. t/ | t0 j1 | ƒ ƒ ƒ } x> | D]6 } | | d 7} | j2 | d ƒ | j2 | d ƒ q<WqW|	 j% ƒ  |	 j3 ƒ  | j2 d ƒ | j2 d ƒ | j3 ƒ  | j3 ƒ  t4 j5 |  j d |  j d d  t6 ƒt7 d! |  j d ƒ t4 j8 |  j d d" d# d  t6 ƒx‡ d2 D] } t4 j5 |  j d' | d( |  j d' | d) d  t6 ƒt7 d! |  j d' | d( ƒ t4 j8 |  j d' | d) d" d# d  t6 ƒqWt d |  j d	 | ƒ} | j |  j d* ƒ d+ GHt9 j: ƒ  } t9 j; t< d |  j ƒ | j d |  j ƒ d, d- ƒt9 j= d. ƒ t9 j> d/ ƒ | j? |  j d0 ƒ t9 j% | ƒ d1 S(3   s   run occupancy calling

    t	   chromDictt
   min_offseti   t   upt   downi
   i    t   upperR   s   .occ_fit.epss   .fragmentsizes.txtt   sept   min_occt   flankt   bamt   cit   stept   itemsi   t	   processesi   s   .occ.bedgrapht   ws   .occ.lower_bound.bedgraphs   .occ.upper_bound.bedgrapht   maxsizet   targett   argss   .occpeaks.bedR   s   .occpeaks.bed.gzt   forces   rm t   presett   bedR   s   occ.lower_bounds   occ.upper_boundt   .s	   .bedgraphs   .bedgraph.gzs   .nuc_dist.txts   Making figuret   labels   Nucleosome Distributions   Fragment Sizet	   Frequencys   .nuc_dist.epsN(   R   s   occ.lower_bounds   occ.upper_bound(@   t   fastaR   R   R<   R   R   t   pwmR   t   readRG   R;   R8   t   maxR6   R7   t   nuc_sept   slopt   merget   coresR   t   sizest   NoneR   R    t   fragmentsizest   getFragmentSizest   modelNFRt   plotFitsR   t   saveR   R:   t   confidence_intervalR>   t   splitt   mpt   PoolR&   t   JoinableQueuet   ProcessR-   t   startR3   t   npt   zerost   mapR   t   zipt	   itertoolst   repeatt   putt   joint   pysamt   tabix_compressR'   R    t   tabix_indext   pltt   figuret   plott   ranget   xlabelt   ylabelt   savefig(   RD   t   chrsRL   t   chunkst   maxQueueSizet   fragment_distt   tmpR   t   setst   pool1R)   R*   R+   t   write_queuet   write_processt   peaks_handlet   peaks_queuet   peaks_processt   nuc_distt   jt   resultR   t   dist_outt   fig(    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_occ.pyt   run_occM   s~    	J'
-
-'"


!

!
$



$ 4,1(   t   __doc__t   matplotlib.pyplott   pyplotRl   t   multiprocessingR\   t   numpyRa   R   Re   Ri   t   pyatac.utilsR    R   R   t   pyatac.chunkR   t   nucleoatac.OccupancyR   R   R   t   pyatac.fragmentsizesR   t   pyatac.biasR   R   R-   R3   R„   (    (    (    s8   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/run_occ.pyt   <module>   s   			