ó
Æ;ìWc           @   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(   iÿÿÿÿN(   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(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/hypergeometric.pyt   getLogFETPvalue   s    7$c         C   s   |  t  k  r d St |  ƒ Sd  S(   Ng        (   t
   _log_smallR   (   t   x(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/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(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/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   (    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/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(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/hypergeometric.pyt   sprint_logxD   s    
gËPÊÿÿï?gÜ1¯  ð?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(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/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        gÈÛáiåE†>g      @gã~\ÇÕä>g      @gA~»²¼Á?g      @g>@~Â)@g      @g—”œQ®f@g      @gtÓa–ˆ@g       @g&ÔŽŽ¬“@g      ð?g÷
Ã¶)$…@gïÿÿÿÿï?g*hóÆS@g      à?g      @(   R    (   t   zR   (    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/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_keyR7   (   R	   t   keyt   result(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/hypergeometric.pyt   lnfact¨   s    
c         C   s"   t  |  ƒ t  | ƒ t  |  | ƒ S(   N(   R<   (   R	   t   k(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/hypergeometric.pyt   lnbicoµ   s    c         C   s/   t  | |  ƒ t  | | | |  ƒ t  | | ƒ S(   N(   R>   (   t   n11t   n1_t   n_1R	   (    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/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(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/hypergeometric.pyR   ¼   s&    99	c         C   s   t  |  d d d ƒ S(   Ni    (   R   (   R?   (    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/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   usageR4   t   argR   R   R	   R
   R   t   pvalue(    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/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   (    (    (    sJ   /woldlab/castor/home/georgi/programs/meme_4.11.2/scripts/hypergeometric.pyt   <module>   sD   "

						E							6 