
.K\c           @   s  d  d l  Z  d  d l Z d  d l m Z m Z m Z m Z e d k r y  d  d l Z e j	   e
 Z Wn e k
 r e Z n Xe r e  j d IJq n  e d  Z d Z d Z e e  Z d Z d	   Z d
   Z d   Z d   Z d   Z d   Z e d  Z e d  Z d   Z d   Z i  Z d   Z d   Z  d   Z! d a" d   Z# d   Z$ d   Z% e d k r|e%   n  d S(   iN(   t   logt   expt   powt   floort   __main__s   Using psyco...i
   g    _g    _i   c         C   sa   |  | | | k rW t  |  | | |  | |  | k  rW t | | | |  | |   } n d } | S(   s   Return log of hypergeometric pvalue of #pos successes >= p given marginals
            p = positive successes
            P = positives
            n = negative successes
            N = negatives
            log_pthresh = short-circuit if p will be greater
    i    (   t   log_hyper_323t   log_getFETprob2(   t   pt   Pt   nt   Nt   log_pthresht
   log_pvalue(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   getLogFETPvalue   s    7 c         C   s   |  t  k  r d St |   Sd  S(   Ng        (   t
   _log_smallR   (   t   x(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   my_exp2   s    c         C   s4   |  | t  k r |  S|  t d t | |    Sd  S(   Ni   (   t   _mm_natsR    R   (   t   logxt   logy(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   log_sum18   s    c         C   s*   |  | k r t  |  |  St  | |   Sd S(   s.    Return the log(x+y) given log(x) and log(y). N(   R   (   R   R   (    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   log_sum>   s    c         C   sn   |  t  } t |  } t d | |  } | d t d |  d k rZ d } | d 7} n  | | | f } | S(   s    Print x with given format given logx.  Handles very large
    and small numbers with prec digits after the decimal.
    Returns the string to print.i
   g      ?i   (   t   _log10R   R   (   R   t   prect   formatt   log10xt   et   mt   str(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   sprint_logxF   s    
c         C   s   t  |  |  } | | k  r$ | } n | } x t | | d  D]m } t  | |  } t  |  | | |  } | | | }	 | | k r |	 }
 q> |
 t d t |	 |
   }
 q> W|
 S(   ss   Return log Prob(>= k successes given n draws w/o replacement
    from population of size N containing K successes).i   (   t   lnbicot   rangeR    R   (   R
   t   KR	   t   kt   log_N_choose_nt   maxit   it   log_K_choose_it   log_NmK_choose_nmiR   R   (    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyR   Y   s    		"gP?g1  ?c         C   sh  t  t  t  t  f \ } } } } |  | | | } |  | }	 |  | }
 |	 } |
 | k  r_ |
 } n  |	 |
 | } | d k  r d } n  | | k r d } \ } } } } } | St |  |	 |
 |  } t  } t |  } | d } x9 | t | k  rt | |  } t |  } | d } q W| d } | t | k  rDt | |  } n
 | d } t  } t |  } | d } x9 | t | k  rt | |  } t |  } | d } qmW| d } | t | k  rt | |  } n
 | d } t | |   t | |   k  r*| } t d t |   } t | |  } n+ t d t |   } t | |  } | } | | | | | f S(   sm  Computes Fisher's exact test based on a
    null-hypothesis distribution specified by the totals, and
    an observed distribution specified by b1 and b2, i.e.
    determines the probability of b's outcomes 1 and 2.

    Returns an immutable list consisting of the exact
    probability, and assorted p-values (sless, sright, sleft,
    slarg) based on the density.i    i   g      ?(   i    i    i    i    i    (	   t	   _log_zerot
   log_hyper0t	   log_hypert   _log0_99999999R   t   _log1_00000001t   absR    R   (   t   a1t   a2t   b1t   b2t	   log_slesst
   log_srightt	   log_sleftt
   log_slargeR	   t   row1t   col1t   maxt   mint   rtt   log_probt	   log_slargt   log_pR$   t   j(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   log_getFETprobn   sX    	

		





 c         C   s   d } | d |  d } | d |  d } | d |  d } | d |  d	 } | d
 |  d } | d |  d } | d |  d } | d |  } | d } t  |  d |  |  d t  |  d  S(   Ng        giE>g      @g~\>g      @gA~?g      @g>@~)@g      @gQf@g      @gta@g       @g&Ԏ@g      ?g
ö)$@g?g*hS@g      ?g      @(   R    (   t   zR   (    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   lngamm   s    
c         C   sQ   |  d k r d St  |   } t j |  r3 t | St |  d  } | t | <| S(   Ni   g        g      ?(   R   t   _lnfact_hasht   has_keyR@   (   R	   t   keyt   result(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   lnfact   s    
c         C   s"   t  |   t  |  t  |  |  S(   N(   RE   (   R	   R!   (    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyR      s    c         C   s/   t  | |   t  | | | |   t  | |  S(   N(   R   (   t   n11t   n1_t   n_1R	   (    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyR      s    i    c         C   s  | | B| Bd k s |  d d k s |  t  d k rz t t t t  t |   t t  t |  t t t   a |  a  t S|  t  d k r t t t  t t |   t  t t t t t |    a |  a  t Sn  |  a  n |  a  | a | a | a t t  t t t  a t S(   Ni    i
   i   (   t   _sn11t
   _log_sprobR    t   _sn1_t   floatt   _sn_1t   _snR   (   t   n11it   n1_it   n_1it   ni(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyR(      s&    99	c         C   s   t  |  d d d  S(   Ni    (   R(   (   RF   (    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyR)      s    c    	      C   s\  d t  j d }  t t  j  d k rC t  j |  IJt  j d  n  d } x| t t  j  k  rt  j | } | d k r t  j |  IJt  j d  nN| d k r y t j t  j |  } Wqt  j |  IJt  j d  qXn| d k r1y t j t  j |  } Wqt  j |  IJt  j d  qXn | d k r~y t j t  j |  } Wqt  j |  IJt  j d  qXng | d k ry t j t  j |  } Wqt  j |  IJt  j d  qXn t  j |  IJt  j d  | d 7} qL Wt | | | | | |  d } t | d d  } t  j	 | I| I| I| I| IJt  j d  d  S(	   Ns  USAGE:
    %s [options] <p> <P> <n> <N>

    <p>                     # positive successes
    <P>                     # positives
    <n>                     # negative successes
    <N>                     # negatives

    -h                      print this usage message
    i    i   s   -hi   i   i   s   %6.3fe%-5.0f(
   t   syst   argvt   lent   stderrt   exitt   stringt   atoiR>   R   t   stdout(	   t   usageR$   t   argR   R   R	   R
   R   t   pvalue(    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   main   sR                   !%(&   RS   RX   t   mathR    R   R   R   t   __name__t   psycot   fullt   Truet   psyco_foundt   ImportErrort   FalseRV   R   R'   R   R   t
   first_timeR   R   R   R   R   R   R*   R+   R>   R@   RA   RE   R   R   RJ   R(   R)   R^   (    (    (    sT   /oak/stanford/groups/akundaje/marinovg/programs/meme-5.0.5/scripts/hypergeometric.pyt   <module>   sH   "

							E							2 