
    瞤d/0                         d dl m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Zd	 Zd
ZdZdZdZdZdZdZdZd Zd Zd Zd Zd Zd Zg dZg dZg dZ g dZ!g dZ"dS )    )absolute_import)logexp)range)floorpisin   )TreeFc                     t          |           } 	 |                     |          d         }n# t          $ r t          d           Y nw xY wd}i }|ri }|                                s|j        }|                                D ]j}|rP|j        dk    r(d                    |                                          }n|j        }|	                    ||           |	                    ||           k|dz  }|                                |r||fS |S )aP  
    returns dict of species age for a given TOL and a given seed

    **Example:**

    ::

      tol  = "((((((((Drosophila melanogaster,(Drosophila simulans,Drosophila secchellia)),(Drosophila yakuba,Drosophila erecta))[&&NHX:name=melanogaster subgroup],Drosophila ananassae)[&&NHX:name=melanogaster group],(Drosophila pseudoobscura,Drosophila persimilis)[&&NHX:name=obscura group])[&&NHX:name=Sophophora Old World],Drosophila willistoni)[&&NHX:name=subgenus Sophophora],(Drosophila grimshawi,(Drosophila virilis,Drosophila mojavensis))[&&NHX:name=subgenus Drosophila])[&&NHX:name=genus Drosophila],(Anopheles gambiae,Aedes aegypti)[&&NHX:name=Culicidae])[&&NHX:name=Arthropoda],Caenorhabditis elegans)[&&NHX:name=Animalia];"
      seed = "Drosophila melanogaster"
      ROOTING, age2name = get_rooting (tol, seed, True)

      ROOTING == {"Aedes aegypti"           : 7,
                  "Anopheles gambiae"       : 7,
                  "Caenorhabditis elegans"  : 8,
                  "Drosophila ananassae"    : 3,
                  "Drosophila erecta"       : 2,
                  "Drosophila grimshawi"    : 6,
                  "Drosophila melanogaster" : 1,
                  "Drosophila mojavensis"   : 6,
                  "Drosophila persimilis"   : 4,
                  "Drosophila pseudoobscura": 4,
                  "Drosophila secchellia"   : 1,
                  "Drosophila simulans"     : 1,
                  "Drosophila virilis"      : 6,
                  "Drosophila willistoni"   : 5,
                  "Drosophila yakuba"       : 2}

      age2name == {1: "Drosophila melanogaster. Drosophila simulans. Drosophila secchellia",
                   2: "melanogaster subgroup",
                   3: "melanogaster group",
                   4: "Sophophora Old World",
                   5: "subgenus Sophophora",
                   6: "genus Drosophila",
                   7: "Arthropoda",
                   8: "Animalia"}

    :argument seed_species: species name
    :argument False agename: if True, also returns the inverse dictionary

    :returns: ROOTING dictionary with age of each species

    )namer   z&ERROR: Seed species not found in tree
   NoName.)
r   search_nodes
IndexErrorexitis_rootupget_leaf_namesr   join
setdefault)	tolseed_speciesagenamenodeageROOTINGage2nameleafnams	            /lib/python3.11/site-packages/ete3/evol/utils.pyget_rootingr#   2   sJ   X **C9l33A6 9 9 97888889
CG llnn 
w'')) 	+ 	+D /9((((D$7$7$9$9::CC)C##S#...c****q llnn 
  !  Ns   . A
	A
c                 "   i ddddddddddd	dd
dddddddddddddddddddddi ddddddddddd dd!dd"d#d$d#d%d&d'd&d(dd)dd*dd+dd,d-d.d-i d/d-d0d-d1d2d3d2d4d2d5d2d6d7d8d7d9d:d;d:d<d=d>d=d?d=d@d=dAddBddCdi dDddEdFdGdFdHddIddJdKdLdKdMdNdOdNdPdQdRdQdSdNdTdUdVdWdXdYdZd[}d2d=gdQdgd=dgd2dQgd=dQgd2dgg d\g d]g d^g d_g d`da}db}|                                  } t          dct          |           dd          D ]}	 ||| ||ddz                     z  }# t          $ r g }| ||ddz            D ]D}||v r|                    ||                    "|                    t          |                     Edb}|dc         D ]W}|de         D ]L}	|df         D ]A}
	 |dbk    r|||	z   |
z            }n|||	z   |
z            |k    rd[} n/# t          $ r d[}Y  nw xY wMX||z  }Y w xY w|S )gz
    little function to translate DNA to protein...
    from: http://python.genedrift.org/
    TODO : inseqgroup functions?

    :argument sequence: string

    :returns: translated sequence
    ATAIATCATTATGMACATACCACGACTAACNAATAAAKAAGAGCSAGTAGARAGGCTALCTCCTGCTTCCAPCCCCCGCCTCACHCATCAAQCAGCGACGCCGGCGTGTAVGTCGTGGTTGCAAGCCGCGGCTGACDGATGAAEGAGGGAGGGCGGGGGTTCATCCTCGTCTTTCFTTTTTATTGTACYTATTAAr   TAGTGCCTGTTGATGGWz----nnnxNNNX)rt   ra   r,   )rV   ra   r,   )rV   rt   r,   )rV   rt   ra   )rV   rt   ra   r,   )ro   r:   r*   r4   r7   rx   rQ   rG   r[   Br1    r      r   r
   )upperr   lenKeyErrorappendlist)sequencegencodeambig
proteinseqnnewcodntaant1nt2nt3s              r"   	translater   w   s*   c#C).sc#C).s 	c  $C */s 	c	 	 $C	 */s	
 	c 
 
 $C
 */s 	c  $C */s 	c  $C */s 	c  $C */s 	c    $C */s 	c  $C */s 	c  $C */s 	c  $C */s 	c  $C   */s 	c  $C */s 	c  $C */s  	c!  !  $C!  */s!" 	c#" #" $C# G& s#s#s#ssc
 ooo???%%%' 'E J~~H1c(mmQ''  	'(1QqS5/22JJ 	 	 	Fq1uo - -;;MM%),,,,MM$)),,,,Bay " "!!9 
" 
"C%ay 	" 	""!Rxx&-c#gck&:!(S!5!;!;%( %' " " "!$B!EE"
" "JJJ)	* s7   -EA>H)G/
,H/G?;H>G??
HHg+=g9B.@g%m]LWg      0Cg      <g      <gdg?gHP?c                     t          |           } | dk     rt          d| z            |dk     rt          d|z            t          t          |          dz  | dz            S )a  Returns right-hand tail of chi-square distribution (x to infinity).

    df, the degrees of freedom, ranges from 1 to infinity (assume integers).
    Typically, df is (r-1)*(c-1) for a r by c table.

    Result ranges from 0 to 1.

    See Cephes docs for details.
    r   z"chi_high: x must be >= 0 (got %s).r   z#chi_high: df must be >= 1 (got %s).r
   )fix_rounding_error
ValueErrorigamcfloat)r{   dfs     r"   chi_highr      si     	1A1uu=ABBB	Avv>CDDDr1ac"""    c                 j    t            | cxk     rdk     rn ndS d| cxk     rdt           z   k     rn ndS | S )zIf x is almost in the range 0-1, fixes it.

    Specifically, if x is between -ROUND_ERROR and 0, returns 0.
    If x is between 1 and 1+ROUND_ERROR, returns 1.
    r   r   )ROUND_ERROR)r{   s    r"   r   r      s]     	|a!q	
Q				;					qHr   c                 x   |dk    s| dk    rdS |dk     s|| k     rdt          | |          z
  S | t          |          z  |z
  t          |           z
  }|t           k     rdS t	          |          }d| z
  }||z   dz   }d}d}|}|dz   }||z  }	||	z  }
	 |dz  }|dz  }|dz  }||z  }||z  ||z  z
  }|	|z  ||z  z
  }|dk    r||z  }t          |
|z
  |z            }|}
nd}|}|}|	}|}	t          |          t          k    r(|t          z  }|t          z  }|t          z  }|	t          z  }	|t          k    rn|
|z  S )z8Complemented incomplete Gamma integral: see Cephes docs.r   r   r
   )	igamr   lgamMAXLOGr   absbigbiginvMACHEP)ar{   axyzcpkm2qkm2pkm1qkm1ansycpkqkrts                   r"   r   r      s   Avvaq1uuA41::~	
SVVa$q''	!B	VG||q	RB	AA	A	A	ADDq5Dq5D
t)C	Q	Q	QUAXr	!AXr	!772ASUAIACCAr77S==FNDFNDFNDFND;;/0 8Or   c                    | dk     r|  }t          |          }t          |          }||k    rt          d          ||z
  }|dk    r
|dz  }||z
  }|t          t          |z            z  }|dk    rt          d          t
          t          |          z
  |z
  }|S | dk     rd}d}| }|dk    r|dz  }| |z   }||z  }|dk    |dk     r*|dk    rt          d          ||z  }|dz  }| |z   }|dk     *|dk     r| }|dk    rt          |          S |dz  }| |z   } | t          | t                    z  t          | t                    z  }t          |          |z   S | t          k    rt          d	          | dz
  t          |           z  | z
  t          z   }| d
k    r|S d| | z  z  }| dk    r|d|z  dz
  |z  dz   | z  z  }n|t          |t                    | z  z  }|S )z=Natural log of the gamma fuction: see Cephes docs for detailsizlgam returned infinity.g      ?r   r      r   r
   zToo large a value of x in lgam.g    חAi  gJ?gllf?gUUUUUU?)r   r   OverflowErrorr	   PILOGPIr   polevlGBGCMAXLGMLS2PIGA)r{   qwpr   us         r"   r   r     sJ   3wwBGG!HH66 9:::Es77FAAABFO66 9:::CFFNQ2vv1ffFAAAFA 1ff !eeAvv#$=>>>FAFAAA !ee q55A66q66M	QEq"fQrll*1vvz6zz=>>>	
SCFFQ&A5yy	1Q3ADyy	,q0-.012(),-. 	. 	
VAr]]1_Hr   c                 $    d}|D ]
}|| z  |z   }|S )zevaluates a polynomial y = C_0 + C_1x + C_2x^2 + ... + C_Nx^N

    Coefficients are stored in reverse order, i.e. coef[0] = C_N
    r    )r{   coefresultr   s       r"   r   r   H  s,    
 F    !aMr   c                 B   |dk    s| dk    rdS |dk    r|| k    rdt          | |          z
  S | t          |          z  |z
  t          |           z
  }|t           k     rdS t	          |          }| }d}d}	 |dz  }|||z  z  }||z  }||z  t
          k    rn"||z  | z  S )zCLeft tail of incomplete gamma function: see Cephes docs for detailsr   r   g        )r   r   r   r   r   r   )r   r{   r   r   r   r   s         r"   r   r   S  s    Avvaq1uuQ51::~ 
SVVa$q''	!B	VG||s	RB 	
A	A
C	Q	QqSqS5F?? 8a<r   )gaf3'PJ?gC逵Cg^ J?glfgKUUUUU?)gagg>[54g剐s=gQ۔1gE:g^Tg*)      ?gugW׉{gLt
gC qb1gL/URCgJjK>)gS!9$?gS?gW?g#c?g1}ܩ?g97?r   )g zHgs%)A?gJP@rg[1?gg?yW?gBοgQ<DI?r   N)F)#
__future__r   mathr   r   	six.movesr   numpyr   r   r   r	   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   GPGQr   r   r"   <module>r      s|   & & & & & &R               & & & & & & & & & &      B B B BJ> > >D &"((%$# # #&
 
 
, , ,^3 3 3l    8        	 	 	r   