§
    ÖX…f²  ã                   ó$   — d Z  G d„ d¦  «        ZdS )zDApproximate calculation of appropriate thresholds for motif finding.c                   óH   — e Zd ZdZdd„Zdd„Zd„ Zd„ Zd	„ Zd
„ Z	dd„Z
d„ ZdS )ÚScoreDistributiona  Class representing approximate score distribution for a given motif.

    Utilizes a dynamic programming approach to calculate the distribution of
    scores with a predefined precision. Provides a number of methods for calculating
    thresholds for motif occurrences.
    Néè  c                 ó¬  — |€t          d|                     ¦   «         ¦  «        | _        t          d|                     ¦   «         ¦  «        | j        z
  | _        ||j        z  | _        |                     ¦   «         | _        net          d|j         ¦  «        | _        t          d|j        ¦  «        | j        z
  | _        ||j        z  | _        |                     |¦  «        | _        | j        | j        dz
  z  | _	        dg| j        z  | _
        d| j
        |                      | j        ¦  «         <   dg| j        z  | _        d| j        |                      | j        ¦  «         <   |€Xt          |                     ¦   «         |                     ¦   «         ¦  «        D ]!\  }}|                      |||j        ¦  «         Œ"dS t%          |j        ¦  «        D ] }dg| j        z  }dg| j        z  }	|dd…|f         }|                     ¦   «         D ]¸\  }
}||
         }t)          d||
|f         ¦  «        |z  }|                      |¦  «        }t%          | j        ¦  «        D ]f}||                      ||¦  «        xx         | j
        |         |z  z  cc<   |	|                      ||¦  «        xx         | j        |         |z  z  cc<   ŒgŒ¹|| _
        |	| _        ŒdS )zInitialize the class.Nç        é   ç      ð?é   )ÚminÚ	min_scoreÚmaxÚ	max_scoreÚintervalÚlengthÚn_pointsÚicÚmeanÚstepÚ
mo_densityÚ_index_diffÚ
bg_densityÚzipÚlog_oddsÚpwmÚmodifyÚ
backgroundÚrangeÚitemsÚpowÚ_add)ÚselfÚmotifÚ	precisionÚpssmr   ÚloÚmoÚpositionÚmo_newÚbg_newÚletterÚscoreÚbgÚdÚis                  ú5lib/python3.11/site-packages/Bio/motifs/thresholds.pyÚ__init__zScoreDistribution.__init__   sÇ  € àˆ<Ý   e§o¢oÑ&7Ô&7Ñ8Ô8ˆDŒNÝ  U§_¢_Ñ%6Ô%6Ñ7Ô7¸$¼.ÑHˆDŒMØ%¨¬Ñ4ˆDŒMØ—h’h‘j”jˆDŒGˆGå   d¤hÑ/Ô/ˆDŒNÝ  T¤XÑ.Ô.°´Ñ?ˆDŒMØ%¨¬Ñ3ˆDŒMØ—i’i 
Ñ+Ô+ˆDŒGØ”M T¤]°QÑ%6Ñ7ˆŒ	Ø˜% $¤-Ñ/ˆŒØ=@ˆŒ˜×)Ò)¨$¬.Ñ9Ô9Ð9Ñ:Ø˜% $¤-Ñ/ˆŒØ=@ˆŒ˜×)Ò)¨$¬.Ñ9Ô9Ð9Ñ:Øˆ<Ý˜eŸnšnÑ.Ô.°·	²	±´Ñ<Ô<ð 6ð 6‘BØ—’˜B  EÔ$4Ñ5Ô5Ð5Ð5ð6ð 6õ " $¤+Ñ.Ô.ð )ñ )Ø˜ ¤Ñ.Ø˜ ¤Ñ.Ø˜!˜!˜!˜X˜+Ô&Ø%'§X¢X¡Z¤Zð Kð K‘MF˜EØ# FÔ+BÝ˜Q  V¨XÐ%5Ô 6Ñ7Ô7¸"Ñ<BØ×(Ò(¨Ñ/Ô/AÝ" 4¤=Ñ1Ô1ð Kð K˜Ø˜tŸyšy¨¨A™œÐ/Ð/Ô/°4´?À1Ô3EÈÑ3JÑJÐ/Ð/Ñ/Ø˜tŸyšy¨¨A™œÐ/Ð/Ô/°4´?À1Ô3EÈÑ3JÑJÐ/Ð/Ñ/Ð/ðKð #)”Ø"(”‘ð)ð )ó    r   c                 óL   — t          ||z
  d| j        z  z   | j        z  ¦  «        S )Ng      à?)Úintr   )r    ÚxÚys      r.   r   zScoreDistribution._index_diff4   s&   € ÝA˜‘E˜C $¤)™OÑ+°´	Ñ9Ñ:Ô:Ð:r0   c                 óT   — t          dt          | j        dz
  ||z   ¦  «        ¦  «        S )Né    r   )r   r
   r   )r    r-   Újs      r.   r   zScoreDistribution._add7   s'   € Ý1•c˜$œ-¨!Ñ+¨Q°©UÑ3Ô3Ñ4Ô4Ð4r0   c                 óº  — dg| j         z  }dg| j         z  }|                     ¦   «         D ]¡\  }}|                      |¦  «        }t          | j         ¦  «        D ]r}	||                      |	|¦  «        xx         | j        |	         ||         z  z  cc<   ||                      |	|¦  «        xx         | j        |	         ||         z  z  cc<   ŒsŒ¢|| _        || _        dS )z%Modify motifs and background density.r   N)r   r   r   r   r   r   r   )
r    ÚscoresÚmo_probsÚbg_probsr'   r(   ÚkÚvr,   r-   s
             r.   r   zScoreDistribution.modify:   sö   € à˜œÑ&ˆØ˜œÑ&ˆØ—L’L‘N”Nð 	Lð 	L‰DˆAˆqØ× Ò  Ñ#Ô#ˆAÝ˜4œ=Ñ)Ô)ð Lð LØt—y’y  A‘”Ð'Ð'Ô'¨4¬?¸1Ô+=ÀÈÄÑ+KÑKÐ'Ð'Ñ'Øt—y’y  A‘”Ð'Ð'Ô'¨4¬?¸1Ô+=ÀÈÄÑ+KÑKÐ'Ð'Ñ'Ð'ðLð !ˆŒØ ˆŒˆˆr0   c                 óz   — | j         }d}||k     r|dz  }|| j        |         z  }||k     °| j        || j        z  z   S )zVApproximate the log-odds threshold which makes the type I error (false positive rate).r   r   )r   r   r   r   )r    Úfprr-   Úprobs       r.   Úthreshold_fprzScoreDistribution.threshold_fprF   sQ   € àŒMˆØˆØSŠjˆjØ‰FˆAØD”O AÔ&Ñ&ˆDð SŠjˆjð Œ~  D¤I¡Ñ-Ð-r0   c                 óp   — d}d}||k     r|dz  }|| j         |         z  }||k     °| j        || j        z  z   S )zWApproximate the log-odds threshold which makes the type II error (false negative rate).éÿÿÿÿr   r   )r   r   r   )r    Úfnrr-   r@   s       r.   Úthreshold_fnrzScoreDistribution.threshold_fnrO   sO   € àˆØˆØSŠjˆjØ‰FˆAØD”O AÔ&Ñ&ˆDð SŠjˆjð Œ~  D¤I¡Ñ-Ð-r0   r   Fc                 óÖ   — | j         }d}d}||z  |k     r.|dz  }|| j        |         z  }|| j        |         z  }||z  |k     °.|r| j        || j        z  z   |fS | j        || j        z  z   S )zMApproximate log-odds threshold making FNR equal to FPR times rate_proportion.r   r   r   )r   r   r   r   r   )r    Úrate_proportionÚreturn_rater-   r?   rD   s         r.   Úthreshold_balancedz$ScoreDistribution.threshold_balancedX   s•   € àŒMˆØˆØˆØOÑ# cÒ)Ð)Ø‰FˆAØ4”? 1Ô%Ñ%ˆCØ4”? 1Ô%Ñ%ˆCð OÑ# cÒ)Ð)ð ð 	2Ø”> A¨¬	¡MÑ1°3Ð6Ð6à”> A¨¬	¡MÑ1Ð1r0   c                 ó@   — |                       d| j         z  ¬¦  «        S )a"  Threshold selection mimicking the behaviour of patser (Hertz, Stormo 1999) software.

        It selects such a threshold that the log(fpr)=-ic(M)
        note: the actual patser software uses natural logarithms instead of log_2, so the numbers
        are not directly comparable.
        r	   )r?   )rA   r   )r    s    r.   Úthreshold_patserz"ScoreDistribution.threshold_patserf   s#   € ð ×!Ò! a¨$¬'¨¡kÐ!Ñ2Ô2Ð2r0   )Nr   NN)r   )r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   r   r   r   rA   rE   rI   rK   © r0   r.   r   r   	   s¦   € € € € € ðð ð!)ð !)ð !)ð !)ðF;ð ;ð ;ð ;ð5ð 5ð 5ð
!ð 
!ð 
!ð.ð .ð .ð.ð .ð .ð2ð 2ð 2ð 2ð3ð 3ð 3ð 3ð 3r0   r   N)rO   r   rP   r0   r.   ú<module>rQ      sJ   ðð KÐ Jðd3ð d3ð d3ð d3ð d3ñ d3ô d3ð d3ð d3ð d3r0   