3
s]                 @   sD   d dl Zdd Zdd Zdd Zdd	 Zd
d Zdd Zdd ZdS )    Nc             C   s  d}d}d}d}d}d}	||  j }
d}|}x>| rh|dkrh|| |  dkr^d}|| |  j }q,|d8 }q,W |rx*t||
D ]}|||
 | 7 }|d7 }qzW |dkr|| }d}|}x>| r|dkr|| |  dkrd}|| |  j }q|d8 }qW |r<x0t|
d |D ]}||| |
 7 }|d7 }qW |dkr<|| }	|dkr|dkr||	kr||	 d }|	| t|	|  || d | |	| d |   }nd}|S )zoCalculates directionality score for locus. See Dixon 2012 supplemental. Positive=downstream. Negative=upstream.r   FT      )relative_indexrangeabs)	abs_indexpoints
contactMat	numPointsabZaCountZbCountZavg_aZavg_bZ	currIndexZupstreamIndexFoundZnumPointsUpstreamZminIndexiZdownstreamIndexFoundZnumPointsDownstreamZmaxIndexescore r   f/oak/stanford/groups/akundaje/marinovg/Symbiodinium/2019-09-27-figures/multi_mds/miniMDS-master/tad.py	calcScore   sL    

6r   c             C   s`   g }t | }xN|j D ]B}|j||j  j}t||d | |f}|jt||j| | qW |S )z3Calculates all directionality scores for chromosomer   )lennonzero_abs_indicesr   offsetr   minappendr   )r	   	structureZmaxNumPointsscoresZ	totNumLocr   r   r
   r   r   r   	allScores7   s    r   c       	      C   s   |t |  }d}d}g }xvtt | D ]f}| | }|t | d krV|}|j||g n2|dkr|dk r|| |kr|}|j||g |}|}q&W tj|S )Nr   r   )r   r   r   nparray)	r   minSizeFractionZ	minNumLocstartZ	prevScoreZdomainsr   r   endr   r   r   domainsFromScoresA   s    r    c             C   s8   t | |d}ttt| | df}t||}t||S )zIdentify TADs in contact matrix2   r   )r   maxintr   smoothWithMovingAverager    )r	   r   ZsizeParameterr   r   ZsmoothingFactorsmoothedr   r   r   
getDomainsR   s    
r&   c             C   s,   t j|}t jt j|| | dt|d S )zbModified from http://beauty-of-imagination.blogspot.fr/2012/09/fun-with-signal-processing-and.htmlvalidr   )r   onesrollconvolver#   )signalsize_of_windowwindowr   r   r   movingAverageY   s    
r.   c             C   sr   t | |}t| }| || d | }tj|}|d }x*t|D ]}t ||| || ||< qBW tj||fS )Nr   )r.   r   r   
zeros_liker   concatenate)r+   r,   r%   Zsignal_size	remainderZsmoothed_remainderZremainder_sizer   r   r   r   r$   ^   s    

r$   c             C   s`   | j  }d}xN|D ]F}||d  }||d  }| j|| j || j  }| j|| |}qW d S )Nr   r   )r   r   r   createSubstructure)r   Ztadsabs_indicesr   Ztdr   r   r   r   r   r   substructuresFromTadsh   s    
r4   )	numpyr   r   r   r    r&   r.   r$   r4   r   r   r   r   <module>   s   4

