ó
¦žbc           @   s"  d  d l  m Z m Z y d  d l m Z Wn! e k
 rM d  d l m Z n Xd  d l m Z d  d l	 m
 Z
 m Z m Z m Z d  d l m Z d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ e d d „ Z d „  Z d „  Z d „  Z d d „ Z d S(   iÿÿÿÿ(   t   heappusht   heappop(   t   OrderedDict(   t   qconfig(   t   is_misassemblyt   exclude_internal_overlapst   Misassemblyt$   is_fragmented_ref_fake_translocation(   t   is_same_referencet	   ScoredSetc           B   s   e  Z d Z d „  Z RS(   t   scoret   indexest	   uncoveredc         C   s   | |  _  | |  _ | |  _ d  S(   N(   R
   R   R   (   t   selfR
   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   __init__   s    		(   s   scores   indexess	   uncovered(   t   __name__t
   __module__t	   __slots__R   (    (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR	      s   t   PutativeBestSetc           B   sM   e  Z d
 Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z	 RS(   R   t
   score_dropR   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   R   R   R   (   R   R   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR      s    		c         C   s   |  | k  o |  | k S(   N(    (   R   t   other(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   __eq__$   s    c         C   s   |  | k S(   N(    (   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   __ne__'   s    c         C   s"   |  j  |  j f | j  | j f k  S(   N(   R   R   (   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   __lt__*   s    c         C   s"   |  j  |  j f | j  | j f k S(   N(   R   R   (   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   __gt__-   s    c         C   s   |  | k p |  | k S(   N(    (   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   __ge__0   s    c         C   s   |  | k  p |  | k S(   N(    (   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   __le__3   s    (   s   indexess
   score_drops	   uncovered(
   R   R   R   R   R   R   R   R   R   R   (    (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR      s   						t   PSAc           B   sJ   e  Z d Z d Z d Z d Z d d d	 „ Z d
 „  Z d „  Z	 d „  Z
 RS(   t   alignt	   num_sidest   startt
   unique_endt   total_unique_lent   end_overlap_penaltyt   start_overlap_penaltyi    i   c         C   s±   | |  _  | |  _ | j ƒ  |  _ | d  k r9 | j ƒ  n t | j ƒ  | ƒ |  _ d |  _ | d  k rl d n t d | j ƒ  | ƒ } t | |  j	 |  j
 ƒ |  _ |  j
 |  _ d  S(   Ni    (   R   R   R   t   Nonet   endt   minR   R    t   maxt   overlap_penalty_coefft   max_single_side_penaltyR!   R"   (   R   R   t   ctg_unique_endR   t   end_overlap(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR   >   s    		0	+c         C   s5   |  j  t |  j d |  j |  j |  j |  j ƒ k S(   Ni   (   R    R&   t   min_unique_lenR   R(   R"   R!   (   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   is_solidH   s    c         C   s7   |  j  |  j d |  j |  j |  j |  j |  j k S(   Ni   (   R   R   R    R   R(   R"   R!   (   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   could_be_solidM   s    c      	   C   s¼   |  j  t d |  j t | j ƒ  |  j d ƒ ƒ 7_  t |  j d t |  j | j ƒ  d ƒ ƒ |  _ | j ƒ  |  j k  r¸ t d | j ƒ  |  j d ƒ } t | |  j |  j ƒ |  _ n  d  S(   Ni    i   (	   R    R&   R   R$   R   R%   R'   R(   R"   (   R   R   t   start_overlap(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt	   intersectQ   s
    5/ (   s   aligns	   num_sidess   starts
   unique_ends   total_unique_lens   end_overlap_penaltys   start_overlap_penaltyN(   R   R   R   R'   R(   R+   R#   R   R,   R-   R/   (    (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR   7   s   
		t   SolidRegionc           B   s    e  Z d Z d „  Z d „  Z RS(   R   R$   c         C   s"   | j  ƒ  |  _  | j ƒ  |  _ d  S(   N(   R   R$   (   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR   \   s    c         C   s(   |  j  | j  ƒ  k o' | j ƒ  |  j k S(   N(   R   R$   (   R   R   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   include`   s    (   s   starts   end(   R   R   R   R   R1   (    (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR0   Y   s   	c   )      C   s:	  t  ƒ  } t d t t j t t | d ƒ ƒ ƒ ƒ d | d <t d t t j t t | d ƒ ƒ ƒ ƒ d | d <d | d	 <d
 | d <t |  d d „  ƒ}  g  } t	 |  ƒ t j
 k rö| j d t	 |  ƒ ƒ | d t _ | d t _ t j t _ t |  d d d ƒ}	 |	 j }
 x¾ t |  d  ƒ D]¬ } |	 s:|	 j ƒ  rm| j ƒ  |
 k  r t | |
 ƒ }	 |	 j }
 q q n  |	 j | ƒ |	 j ƒ  rŸ| j |	 j ƒ d  }	 n  | j ƒ  |
 k  r t | |
 ƒ }	 |	 j }
 q q W|	 r
d |	 _ d |	 _ |	 j ƒ  r
| j |	 j ƒ q
n  | j d t	 | ƒ ƒ x+ t | ƒ D] } | j d t | ƒ ƒ q.W| j d ƒ t } t	 | ƒ rÝg  } t | d ƒ } xV | d D]J } | j ƒ  d | j k  rÊ| j | ƒ t | ƒ } q| j ƒ  | _ qW| j | ƒ t | ƒ } d } y§ | j  ƒ  } x” t! |  ƒ D]† \ } } | | k r6qn  xe | j" | ƒ s€| j ƒ  | j k ro| j  ƒ  } q9n  | j | ƒ Pq9W| j d t | ƒ ƒ t# } qWWn t$ k
 rÄ| |  | 7} n Xt | d d „  ƒ}  n  | rö| j d ƒ qön  | j d t	 |  ƒ ƒ t% d g  | ƒ g } d } d } d } t | d d „  d t ƒ} xZt! |  ƒ D]L\ } } d } d  } | rš| | d k rš| } | d =n  xË t | ƒ D]½ } | j& rÍ| j& d | k  rÍPn  g  | j& D] } |  | ^ q×| g } t' | j( | | | | j) | | | ƒ \ } } | d  k r3q§n  | | k r§| } t% | | j& | g | ƒ } q§q§W| r“| j | ƒ | | k r“| } q“n  | | k r\| } q\q\Wt	 |  ƒ t j
 k r%t j* d k r%| j d t j* ƒ | j  ƒ  } x | j( | k r| j  ƒ  } qóWt# t# |  | g f S| | t j+ } g  } g  } xP | D]H } | | j( }  |  | k rIt, | t- | j& d g |  | j) ƒ ƒ qIqIWt }! t# }" x†t	 | ƒ r)	t. | ƒ }# |# j& d d k r€| j t% | |# j/ |# j& d |# j) ƒ ƒ |! rOt	 | ƒ d k rO| s't# |" |  | f St j* d k sFt |" |  | f St# }! n  t	 | ƒ t j0 k r¤t	 | ƒ d k }" Pq¤q¤n  |  |# j& d } d } |# j) }$ t1 ƒ  }% xä | D]Ü } | j& rÝ| j& d |# j& d k rÝPn  g  | j& D] } |  | ^ qç| g } t' | j( | | | | j) | | | ƒ \ } } | d  k	 r°| | f |% | <| | k rh| } | }$ qŒ| | k rŒ| |$ k  rŒ| }$ qŒq°q°Wx“ |% j2 ƒ  D]… \ }& \ } } | | |# j/ }  |  | k rÒqn  |& j& rè|& j& d n d }' | |# j) |$ }( t, | t- |' g |# j& |  |( ƒ ƒ qWq¤Wt |" |  | f S(   Ni2   gš™™™™™©?i   t	   extensivei   g{®Gáz„?t   locali   t   scaffoldg      à?t   overlap_multipliert   keyc         S   s   |  j  ƒ  |  j f S(   N(   R$   t   len2(   t   x(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   <lambda>l   s    s:   			Too much alignments (%d), will use speed up heuristics
iÿÿÿÿR   i    s   			Found %d solid alignments:
s   		Solid alignment %s
sN   			Skipping alignments located inside solid regions since they are redundant:
s"   		Skipping redundant alignment %s
c         S   s   |  j  ƒ  |  j f S(   N(   R$   R7   (   R8   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR9   ³   s    s   		Nothing was skipped
sG   			Looking for the best set of alignments (out of %d total alignments)
c         S   s   |  j  ƒ  |  j f S(   N(   R$   R7   (   R8   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyR9   ¾   s    t   reverset   allsl   		Ambiguity for this contig is not checked for speed up (too much alignments and --ambiguity-usage is "%s")
(3   t   dictR&   R%   R   t   BSS_EXTENSIVE_PENALTYt   intt   roundt   BSS_LOCAL_PENALTYt   sortedt   lent   BSS_critical_number_of_alignst   writeR   R(   R'   t   min_alignmentR+   R   t   reversedR-   R/   R,   t   appendR   R#   R   R"   t   strt   TrueR0   R$   t   listt   popt	   enumerateR1   t   Falset
   IndexErrorR	   R   t	   get_scoreR
   R   t   ambiguity_usaget   ambiguity_scoreR    R   R   R   t   BSS_MAX_SETS_NUMBERR   t   items()   t   sorted_alignst   ctg_lent   stdout_ft   seqt   ref_lenst	   is_cyclict   region_struct_variationst	   penaltiest   solidst   cur_PSAR)   R   t   nothing_skippedt   solid_regionst
   cur_regiont   filtered_alignst   idxt   all_scored_setst	   max_scoret   cur_solid_idxt   next_solid_idxt   local_max_scoret   new_scored_sett
   scored_sett   it   cur_set_alignsR
   R   t   best_sett   max_allowed_score_dropt   putative_setst	   best_setsR   t   ambiguity_check_is_neededt   too_much_best_setst   putative_sett   local_uncoveredt   putative_predecessorst   preceding_sett	   new_indext   new_uncovered(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   get_best_aligns_setsd   s0   	33

				
'#$	-			#'	c         C   s-   t  g  |  D] } | j D] } | ^ q q
 ƒ S(   N(   t   setR   (   Ro   Rl   t   index(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   get_used_indexes  s    c         C   sç   d } |  | } | j  ƒ  t | j ƒ  d | j  ƒ  ƒ } d } x | j ƒ  | j ƒ  k  rÞ | | j ƒ  | j ƒ  7} | d 8} | t |  ƒ k rÚ | j ƒ  } |  | } | t d t | | j  ƒ  ƒ | j ƒ  d ƒ 8} qB PqB W| | S(   Niþÿÿÿi   i    (   R$   R&   R   RB   R%   (   t
   set_alignst	   cur_alignt   last_align_idxt
   last_alignt   added_rightt
   added_leftt
   prev_start(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   get_added_len!  s    
)

3c         C   sÓ  t  | ƒ d k r¤| d j ƒ  | d j ƒ  f \ } }	 \ | d <| d <t | |	 | ƒ }
 t d | j ƒ  |	 j ƒ  d ƒ } t  | ƒ d k r¹ | d j ƒ  | d <t | d | ƒ n  t | |	 ƒ \ } } t | j |	 j ƒ t	 j
 k  rð d St | | d ƒ } | | | 8} |  t |	 d | ƒt | d | ƒ7}  t | |	 | | | | |
 ƒ \ } } | r| d } | j |	 j k r´t	 j r¨t | j |	 j ƒ r¨t j } qt j } nS t | d	 ƒ t	 j k rþt j } |  t t | d	 ƒ ƒ | | j 8}  n	 t j } |  | t j 8}  na | d
 r.d } nN t | d	 ƒ t	 j k r_| d r_| d } n | d rv| d } n d } t | | d | ƒ } |  | | 8}  n% |  t | d ƒ 7}  | | d j 8} |  | f S(   Ni   iþÿÿÿiÿÿÿÿi    i   iýÿÿÿRU   R2   t   inconsistencyt   is_svt   is_scaffold_gapR3   R4   R5   (   NN(   RB   t   cloneR   R&   R$   R   R   R%   R7   R   RE   R#   Rƒ   t   score_single_alignR   t   reft   is_combined_refR   R   t   INTERSPECTRANSLOCATIONt   TRANSLOCATIONt   abst   extensive_misassembly_thresholdt
   RELOCATIONt   floatt	   INVERSIONt   local_misassembly_min_length(   R
   t   alignsRX   RY   t   uncovered_lenRW   RZ   R[   t   align1t   align2t   is_fake_translocationt   overlaped_lent   reduced_lent   _t	   added_lent   is_extensive_misassemblyt   aux_datat   misassembly_penaltyt   misassemblyt   overlap_penalty(    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyRO   2  sL    8#&
	(	
	$
c         C   s'   | d  k r |  j } n  | |  j d S(   Ng      Y@(   R#   R7   t   idy(   R   RU   (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyRˆ   a  s    N(   t   heapqR    R   t   collectionsR   t   ImportErrort%   quast_libs.site_packages.ordered_dictt
   quast_libsR   t)   quast_libs.ca_utils.analyze_misassembliesR   R   R   R   t   quast_libs.ca_utils.miscR   t   objectR	   R   R   R0   RM   R#   Rx   R{   Rƒ   RO   Rˆ   (    (    (    sT   /home/psgendb/BIRCHDEV/install/quast-5.2.0/quast_libs/ca_utils/best_set_selection.pyt   <module>   s    "	"¹			/