ó
?î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 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
 d  Z d S(   sC   
Script to make nucleosome occupancy track!

@author: Alicia Schep
iÿÿÿÿN(   t   shell_commandt   read_chrom_sizes_from_bam(   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(    (    s9   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/diff_occ.pyt   _diffHelper   s    	8

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   .occdiff.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   (    (    s9   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/diff_occ.pyt
   _writeDiff'   s    


i ¡ c         C   s  t  |  j  } t j |  j  } t j |  j d | d |  j |  j	 d t
 | j | j  } | j   t
 d t d | t j g  | D] } | j   ^ q    } t d d |  j	 } t d |  j	 d t j |  j  j d |  j	  | _ | j   t d d |  j	 } t d |  j	 d t j |  j  j d |  j	  | _ | j   t t |  j	 |  j |  j d |  j d	 |  j d
 |  j d |  j d |  j }	 | j d |  }
 t  j! d t
 d |  j" d   } t |  j# d d  } | j$   t  j%   } t  j& d t' d | |  j# f  } | j(   t j) |  j	  } xT |
 D]L } | j* t+ t, | t- j. |	    } x | D] } | j/ | d  qsWqBW| j$   | j0   | j/ d  | j0   t1 j2 |  j# d |  j# d d t3 t4 d |  j# d  t1 j5 |  j# d d d d t3 d S(   s(   run differential occupancy calling

    t	   chromDictt
   min_offseti   id   i    t   uppert   valst   sept   min_occt   flankt   bamt   cit   basest	   processesi   s   .occdiff.bedt   wt   targett   argsR   s   .occdiff.bed.gzt   forces   rm t   presett   bedN(6   R   R/   R   R   t   pwmR   t   readR8   R.   R*   t   maxt   upt   downt   merget   intt   npt   meant   lengthR   R   t   sizes1R   t   fragmentsizest   modelNFRt   sizes2R   t   fragment_distt   fastat   nuc_sepR-   t   confidence_intervalt   splitt   mpt   Poolt   coresR   R!   t   JoinableQueuet   ProcessR'   t   startt   zerost   mapt
   _occHelpert   zipt	   itertoolst   repeatt   putt   joint   pysamt   tabix_compressR"   R    t   tabix_index(   R5   R1   t   chrsR9   t   chunksR   t   maxQueueSizet   fragment_dist1t   fragment_dist2R   t   setst   pool1t   diff_handlet
   diff_queuet   diff_processt   nuc_distt   jt   tmpt   result(    (    s9   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/diff_occ.pyt   run_diff6   s@    ?
?6
6
-"
!
$


$(   t   __doc__t   multiprocessingRL   t   numpyR@   R   RV   RZ   t   pyatac.utilsR    R   t   pyatac.chunkR   t   nucleoatac.OccupancyR   R   R   t   pyatac.fragmentsizesR   t   pyatac.biasR   R   R'   Rk   (    (    (    s9   /tmp/pip-install-bGcd2k/NucleoATAC/nucleoatac/diff_occ.pyt   <module>   s   		