
Zc           @   sq  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 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 rme#   n  d S(   iN(   t   logt   expt   powt   floort   __main__s   Using psyco...i
   g    _g    _c         C   se   |  | | | k r[ t  |  | | |  | |  | k  r[ t | | | | |  |   d } 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   i    (   t   log_hyper_323t   log_getFETprob(   t   pt   Pt   nt   Nt   log_pthresht
   log_pvalue(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   getLogFETPvalue   s    7$c         C   s   |  t  k  r d St |   Sd  S(   Ng        (   t
   _log_smallR   (   t   x(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   my_exp0   s    c         C   s4   |  | t  k r |  S|  t d t | |    Sd  S(   Ni   (   t   _mm_natsR    R   (   t   logxt   logy(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   log_sum16   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   (    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/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(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   sprint_logxD   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_pt   it   j(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyR   T   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   (    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/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_keyR7   (   R	   t   keyt   result(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   lnfact   s    
c         C   s"   t  |   t  |  t  |  |  S(   N(   R<   (   R	   t   k(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   lnbico   s    c         C   s/   t  | |   t  | | | |   t  | |  S(   N(   R>   (   t   n11t   n1_t   n_1R	   (    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/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(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyR      s&    99	c         C   s   t  |  d d d  S(   Ni    (   R   (   R?   (    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/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   usageR4   t   argR   R   R	   R
   R   t   pvalue(    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   main   sR                   !%($   RL   RQ   t   mathR    R   R   R   t   __name__t   psycot   fullt   Truet   psyco_foundt   ImportErrort   FalseRO   R   R   R   R   R   R   R   R   R   R!   R"   R   R7   R8   R<   R>   R   RC   R   R    RW   (    (    (    s]   /oak/stanford/groups/akundaje/marinovg/programs/meme_4.12.0/meme/lib/python/hypergeometric.pyt   <module>   sD   "

						E							6 