o
    g                     @   s
  d dl Z d dlZd dlmZmZmZmZ d dlZd dlm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZ dd Zd	d
 Zdd ZG dd dZG dd dZG dd dZG dd dZG dd dZ dd Z!G dd dZ"G dd dZ#dS )    N)assert_assert_equalassert_allcloseassert_array_equal)raiseswarns)	argrelmax	argrelminpeak_prominencespeak_widths_unpack_condition_args
find_peaksfind_peaks_cwt_identify_ridge_lines)gaussian)_local_maxima_1dPeakPropertyWarningc                 C   sZ   t d|t}t j|td}t|D ]\}}|| |  | }|t |d  7 }q|S )Nr   dtype   )nparangeastypefloatzeros	enumerateexp)center_locssigmastotal_lengthxdataout_dataindsigmatmp r%   b/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/scipy/signal/tests/test_peak_finding.py_gen_gaussians   s   r'   c                 C   sB   t | }||d  }tj||| |dt}t|| |}||fS )N   )num)lenr   linspacer   intr'   )r   r   	num_peaksdeltar   r!   r%   r%   r&   _gen_gaussians_even$   s
   r/   c                 C   sZ  dd }t |}t |}tj|dgtd}| |dddf< |d | d  t| }||k r3td|t| d }|t| d }	td|D ]T}
||
d df }||
d df d }|
| dkrrt|dkrr|d	|
 |	  7 }|
|	 dkrt|dkr||	 7 }|||d }|||d }||g||
ddf< qH|dddf |dddf gS )
a  
    Generate coordinates for a ridge line.

    Will be a series of coordinates, starting a start_loc (length 2).
    The maximum distance between any adjacent columns will be
    `max_distance`, the max distance between adjacent rows
    will be `map_gap'.

    `max_locs` should be the size of the intended matrix. The
    ending coordinates are guaranteed to be less than `max_locs`,
    although they may not approach `max_locs` at all.
    c                 S   s   t | d}t||}|S )Nr   )maxmin)r)   max_valoutr%   r%   r&   keep_bounds:   s   

z$_gen_ridge_line.<locals>.keep_boundsr   r   r   Nz3Cannot generate ridge line according to constraintsr(   )
copydeepcopyr   r   r,   sum
ValueErrorr*   rangepop)
start_locsmax_locslength	distancesgapsr4   locsr   dist_intgap_intr"   nextcolnextrowr%   r%   r&   _gen_ridge_line,   s*   

 rF   c                	   @   sn   e Zd Zdd Zdd Zdd Zdd Zej	d	e
g d
e
g de
g dgdd Zdd ZdS )TestLocalMaxima1dc                 C   s@   t jg t jd}t|D ]}t|t g  t|jdu  qdS )zTest with empty signal.r   N)r   arrayfloat64r   r   r   baseselfxrH   r%   r%   r&   
test_emptyY   s
   zTestLocalMaxima1d.test_emptyc                 C   s<   t dd}t|D ]}t|t g  t|jdu  q
dS )zTest with linear signal.r   d   N)r   r+   r   r   rH   r   rJ   rK   r%   r%   r&   test_linear`   s
   zTestLocalMaxima1d.test_linearc                 C   s\   t ddd}|ddd  d7  < t ddd}t|D ]}t|| t|jdu  qdS )zTest with simple signal.
   2   r   N   r(   )r   r+   r   r   r   r   rJ   )rL   rM   expectedrH   r%   r%   r&   test_simpleg   s   
zTestLocalMaxima1d.test_simplec                 C   s\   t g d}t|\}}}t|t g d t|t g d t|t g d dS )z+Test if flat maxima are detected correctly.)gr   r(   r   r   r   r   rT   rT   rT   gQ@   rW   rW   rW   rQ   rX   rX   rX   rX   rQ   )r   rW            )r   rW            )r      	         N)r   rH   r   r   )rL   rM   	midpoints
left_edgesright_edgesr%   r%   r&   test_flat_maximar   s
   z"TestLocalMaxima1d.test_flat_maximarM   )      ?r   r   )      @rT   r   rW   rW   )      @r_   r_   r      rj   rj   c                 C   s0   t |D ]}t|tg  t|jdu  qdS )z,Test if behavior on signal edges is correct.N)r   r   r   rH   r   rJ   rK   r%   r%   r&   test_signal_edges{   s   z#TestLocalMaxima1d.test_signal_edgesc                 C   s   t tdd ttd W d   n1 sw   Y  t tdd ttjdtd W d   n1 s7w   Y  t tdd td	d
g W d   n1 sSw   Y  t tdd td W d   dS 1 snw   Y  dS )z,Test input validation and raised exceptions.zwrong number of dimensionsmatch)r(   r(   Nzexpected 'const float64_t'r(   r   listrg          @z'x' must not be None)r   r9   r   r   onesr,   	TypeErrorrL   r%   r%   r&   test_exceptions   s   
"z!TestLocalMaxima1d.test_exceptionsN)__name__
__module____qualname__rN   rP   rV   rf   pytestmarkparametrizer   rH   rk   rs   r%   r%   r%   r&   rG   W   s    	
rG   c                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestRidgeLinesc                 C   s6   t ddg}t|t ddd}tt|dk d S )Nrb   rO   r   r(   r   r   r   r   fullr   r*   rL   	test_matrlinesr%   r%   r&   rN      s   zTestRidgeLines.test_emptyc                 C   s   t ddg}d|d< t|t ddd}tt|dk t ddg}d|dddf< t|t ddd}tt|dk d S )Nrb   rO   r(   )r   rR   r   r   rR   r|   r~   r%   r%   r&   test_minimal   s   zTestRidgeLines.test_minimalc                 C   s   g d}g d}t ddgd }d}tddg|j|||}d	||d |d	 f< t dt|}t||t|d	 }t||g d S )
Nr   r(   r   r_   )r   r(   r   r   r(   rb   rS   g-q=rZ   r      r(   )r   r   rF   shaper}   r0   r   r   )rL   r?   r@   r   r>   linemax_distancesidentified_linesr%   r%   r&   test_single_pass   s   zTestRidgeLines.test_single_passc                 C   s   g d}g d}t ddg}d}tddg|j|||}d||d |d f< d	}t d|}t||t|d }tt|d
k |D ](}	t 	|	d }
t j
t |
| t 	|	d }t j
t |t|d  qBd S )Nr   )r   r(   r   rW   rb   rS   rZ   r   r   r(   rT   r   皙?)r   r   rF   r   r}   r   r0   r   r*   difftestingassert_array_lessabs)rL   r?   r@   r   r>   r   max_distr   r   ilineadistsagapsr%   r%   r&   test_single_bigdist   s    z"TestRidgeLines.test_single_bigdistc                 C   s   g d}d}g d}t ddg}d}tddg|j|||}d	||d |d	 f< d
}t d|}t|||}	tt|	dk |	D ](}
t |
d	 }t j	
t || t |
d }t j	
t |t|d  q@d S )Nr   rT   )r   rW   r   r(   rb   rS   rZ   r   r   r(   rj   r   r   r   r   rF   r   r}   r   r   r*   r   r   r   r   r0   rL   r?   max_gapr@   r   r>   r   r   r   r   r   r   r   r%   r%   r&   test_single_biggap   s"   z!TestRidgeLines.test_single_biggapc                 C   s   dg}d}ddg}t ddg}d}tddg|j|||}d||d |d f< d}t d|}t|||}	tt|	dk |	D ](}
t |
d }t j	
t || t |
d }t j	
t |t|d  q?d S )	Nr   r(   rT   rj   rS      r   r   r   r   r%   r%   r&   test_single_biggaps   s"   z"TestRidgeLines.test_single_biggapsN)	rt   ru   rv   rN   r   r   r   r   r   r%   r%   r%   r&   r{      s    r{   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

TestArgrelc                 C   s   t jg td}t d}t|}tt|d t|d | t d}t|dd\}}t|| t|| t|dd\}}t|| t|| d S )Nr   r_   r(   r   )rT   r_   axis)r   rH   r,   r   r	   r   r*   r   )rL   empty_arrayz1iz2rowcolr%   r%   r&   rN      s   




zTestArgrel.test_emptyc                 C   s$  t g dg dg dg dg dg}t|dd\}}t |}t|| g d t|| g d	 t|d
d\}}t |}t|| g d t|| g d t|dd\}}t |}t|| g d t|| g d t|d
d\}}t |}t|| g d t|| g d d S )N)r(   r   r   rT   r   )r   r(   r   r   rT   )rT   r   r(   r   r   )r   rT   r   r(   r   )r(   r   rT   r   r(   r   r   r(   r   rT   )rW   r   r(   r(   )r   rT   rW   )rT   r(   r   )r   rH   r   argsortr   r	   )rL   rM   r   r   orderr%   r%   r&   
test_basic  s,   




zTestArgrel.test_basicc                 C   s|   d}g d}t |d\}}|| d ||| < || d ||| < t||ddd }tt|t|k t||k  d S )Nr   )rg   ro         $@ri   g      .@  gwJ?clip)r   moder   )r/   r   r   r*   all)rL   r   r   	test_dataact_locsrel_max_locsr%   r%   r&   test_highorder'  s   zTestArgrel.test_highorderc                 C   s   g d}t |d\}}d}tdt|| }t||| g}t|ddd\}}td|jd D ] }	||	k}
tt||
 t|k t|||
 ||	  k	  q1d S )N)rg   ro   r   rO   rb   r   r(   )r   r   )
r/   r   r   r*   vstackr   r:   r   r   r   )rL   r   r   r   
rot_factor	rot_rangetest_data_2rel_max_rowsrel_max_colsrwindsr%   r%   r&   test_2d_gaussians2  s   zTestArgrel.test_2d_gaussiansN)rt   ru   rv   rN   r   r   r   r%   r%   r%   r&   r      s
    r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestPeakProminencesc                 C   s   t g dg }t|tjtjtjgD ]\}}t|jdk t|j|k qt g g }t|tjtjtjgD ]\}}t|jdk t|j|k q5dS )N
        Test if an empty array is returned if no peaks are provided.
        r   r   N)r
   zipr   rI   intpr   sizer   )rL   r3   arrr   r%   r%   r&   rN   C  s   
zTestPeakProminences.test_emptyc                 C   s   t g d}t g d}t g d}t g d}|| t j|| || gdd }t||}t|d | t|d | t|d | d	S )
z
        Test if height of prominences is correctly calculated in signal with
        rising baseline (peak widths are 1 sample).
        )r5   333333?r   r(   皙	@g?g
ףp=
@g @)r(   r   rW   rj   )r   r   r   r_   )rT   rT   r_   r\   r   r   r(   r   N)r   rH   r0   r
   r   )rL   rM   peakslbasesrbasespromsr3   r%   r%   r&   r   Q  s   "
zTestPeakProminences.test_basicc                 C   s   g d}g d}t ||\}}}t|g d t|g d t|g d g d}tg d}t ||\}}}t|g d t||d  t||d  d	S )
z"
        Test edge cases.
        )r   r   r(   r   r(   r   r   r(   rT   r_   )r   r   r   )r   r   r   )rj   rj   rj   )r   r(   r   r(   r   r(   r   )r(   r(   r(   r(   N)r
   r   r   rH   rL   rM   r   r   r   r   r%   r%   r&   test_edge_casesb  s   z#TestPeakProminences.test_edge_casesc                 C   sr   t g dd}t g dd}t|ddd |ddd \}}}t|g d t|g d t|g d dS ):
        Test with non-C-contiguous input arrays.
        )ir`   r`   r   rT   r(   r   )r(   r   rW   N)r`   r`   r   )r   r   rT   )rT   rT   r_   )r   repeatr
   r   r   r%   r%   r&   test_non_contiguousv  s   $z'TestPeakProminences.test_non_contiguousc                 C   sX   g d}dg}t t||g d dD ]\}}t t|||d| d| d| g qdS )	zO
        Test if wlen actually shrinks the evaluation range correctly.
        )r   r(   r   rT   r(   r   r5   rT   )rh   r   rj   ))rY   r   )r\   r   )rj   r   )r_   r(   )r   r(   rT   r   )皙?r   rh   r   rj   N)r   r
   )rL   rM   peakwlenr   r%   r%   r&   	test_wlen  s   &zTestPeakProminences.test_wlenc              	   C   s  t tdd tg dgddg W d   n1 sw   Y  t tdd tg dddgg W d   n1 s;w   Y  t tdd tddg W d   n1 sWw   Y  t td	d tg dg W d   n1 ssw   Y  d
D ] }t td	d tg d|g W d   n1 sw   Y  qzt tdd tg dddg W d   n1 sw   Y  t tdd ttdddgdd W d   dS 1 sw   Y  dS )zA
        Verify that exceptions and warnings are raised.
        	1-D arrayrl   )r   r(   r(   r   r(   r   NrT   r   not a valid index)ir5   rT     r(   r   r   cannot safely castr   ffffff@r   rR   r_   r   )r   r9   r
   rq   r   r   )rL   pr%   r%   r&   rs     s.   "z#TestPeakProminences.test_exceptionsc              	   C   s   d}dD ] }t t|d tg d|g W d   n1 sw   Y  qt t|d tg ddgdd W d   dS 1 sAw   Y  dS )	>
        Verify that appropriate warnings are raised.
        z!some peaks have a prominence of 0)r   r(   r   rl   r   Nr   r(   r(   r(   r   r   r   )r   r   r
   )rL   msgr   r%   r%   r&   test_warnings  s   "z!TestPeakProminences.test_warningsN)
rt   ru   rv   rN   r   r   r   r   rs   r   r%   r%   r%   r&   r   A  s    r   c                   @   s\   e Zd Zdd Zejddd Zdd Zdd	 Z	d
d Z
dd Zejddd ZdS )TestPeakWidthsc                 C   s   t g g d }tt|tj t|jd t g dg d }tt|tj t|jd t g g }|D ]}tt|tj t|jd q3dS )r   r   r   N)r   r   
isinstancer   ndarrayr   r   )rL   widthsr3   r   r%   r%   r&   rN     s   
zTestPeakWidths.test_empty#ignore:some peaks have a width of 0c                 C   sn   t g d}d}dD ])\}}}}t|dg|\}}}	}
t|| t|d||   t|	| t|
| qdS )zk
        Test a simple use case with easy to verify results at different relative
        heights.
        )r(   r   r(   r   r(   r   r5   r   ))        r   rh   rh   )g      ?rg         @      @)      ?ro   ro         @)      ?rh         ?      @)rg   r   rg   ri   )ro   ri   rg         @)rh   ri   rg   r   rT   N)r   rH   r   r   )rL   rM   
prominence
rel_height
width_truelip_truerip_true
width_calcheightlip_calcrip_calcr%   r%   r&   r     s   	

zTestPeakWidths.test_basicc                 C   sN   t g dd}t dgd}t|ddd |ddd }t|g d dS )r   )r   rO   rS   rW   r(   rT   N)r   K   r   r   )r   r   r   r   )rL   rM   r   resultr%   r%   r&   r     s   z"TestPeakWidths.test_non_contiguousc                 C   sB  t tdd ttdtd W d   n1 sw   Y  t tdd tddg W d   n1 s8w   Y  t tdd ttdtjdtjd	 W d   n1 s\w   Y  t tdd ttdd W d   n1 szw   Y  t td
d ttdddg W d   n1 sw   Y  t td
d tg ddg W d   n1 sw   Y  t tdd ttdddg W d   n1 sw   Y  t tdd tg dddgdd W d   n1 sw   Y  t tdd tg ddgdd W d   dS 1 sw   Y  dS )zD
        Verify that argument validation works as intended.
        r   rl   )rT   rW   rT   Nr   rR   r   r   r   rY   r]   r(   r   r   r   r   r   )r   r(   r   r(   r   r5   r   None)r(   r   r(   )NNNprominence_data)	r   r9   r   r   r   rp   r   r   rq   rr   r%   r%   r&   rs     s6   $zTestPeakWidths.test_exceptionsc              
   C   s   d}t t|d tg ddgdd W d   n1 sw   Y  t t|d( tg dd	gtd
gtjtd	gtjtd	gtjfd W d   dS 1 sSw   Y  dS )r   zsome peaks have a width of 0rl   r   r(   r   r(   r   r   Nr   r   r   r   )r   r   r   r   rH   rI   r   )rL   r   r%   r%   r&   r     s   
"zTestPeakWidths.test_warningsc           	   	   C   s   g d}dg}t g dD ]D\}\}}}tj|tjdtj|tjdtj|tjdf}|dk r2d}nd}tt|d t|||d	 W d
   n1 sLw   Y  qd
S )z4Test with mismatching peak and / or prominence data.r   r(   ))rg   )r5   r   )r   r   )rT   )r   r   r   )rg   rg   r   r   r   r   )r   r   r   )r   r   r   )r   r   r   r   rT   z#prominence data is invalid for peakz4arrays in `prominence_data` must have the same shaperl   r   N)r   r   rH   rI   r   r   r9   r   )	rL   rM   r   r   prominences
left_basesright_basesr   rm   r%   r%   r&    test_mismatching_prominence_data  s   
z/TestPeakWidths.test_mismatching_prominence_datac                 C   s@   g d}t t|dgddg d t t|dgddg d dS )	z3Test if x == eval_height counts as an intersection.)r   r(   r   r(   rT   rT   rT   r(   r   r(   r   r_   r   )r   r   ))r   rh   ri   r  gUUUUUU?))r   r   r  )g      @N)r   r   )rL   rM   r%   r%   r&   test_intersection_rules2  s   z&TestPeakWidths.test_intersection_rulesN)rt   ru   rv   rN   rw   rx   filterwarningsr   r   rs   r   r  r  r%   r%   r%   r&   r     s    

	 
r   c                  C   s>  t d} | }|d }|ddd }tdtd| |k tdtd| |k tdtd| |k tdtd| |k tdtd| |k t||f| |\}}t|||  t|||  ttd	d
 t|t d| W d   n1 svw   Y  ttdd
 td|ft d| W d   dS 1 sw   Y  dS )zW
    Verify parsing of condition arguments for `scipy.signal.find_peaks` function.
    rR   r(   Nr   NN)r(   NNr   )rh   r   zarray size of lowerrl   r]   zarray size of upper)r   r   r   r   r   r   r9   )rM   	amin_true	amax_truer   	amin_calc	amax_calcr%   r%   r&   test_unpack_condition_args?  s$   
"r  c                   @   s   e Zd Zh dZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zejdddd Zejdi ddiddiddigdd  Zd!S )"TestFindPeaks>
   r   left_ips	right_ipsr   r   r  peak_heightswidth_heightsleft_thresholdsright_thresholdsc                 C   sP   d}t td||||d\}}t|jdk | jD ]}t|| jdk qdS )z@
        Test behavior for signal without local maxima.
        r  rR   r   	thresholdr   widthr   N)r   r   rp   r   r   property_keys)rL   open_intervalr   propskeyr%   r%   r&   test_constantb  s   


zTestFindPeaks.test_constantc                 C   s  t g d}t |jd d }||ddd< t j|jtd}|ddd |ddd< t ||}t|dd\}}t|g d t|d	 | t|d
 ||d d   t|d ||d   tt|ddd g d tt|ddd g d tt|ddd ddg dS )z8
        Test plateau size condition for peaks.
        )r(   r   rT   rW   rY   rb   o   r   r(   Nr   r  )plateau_size)r(   rT   r\   r]   r[   !   rO   plateau_sizesrd   re   rW   r   )r]   r[   r  rO   )Nr   )r(   rT   r\   )r_   rS   r[   r  )	r   rH   r   r   rp   r,   r   r   r   )rL   r   rM   repeatsr   r  r%   r%   r&   test_plateau_sizen  s   zTestFindPeaks.test_plateau_sizec                 C   s   d}t |dd\}}t|tg d t|d tg d tt |ddd td	d
g tt |ddd tdd	g tt |ddd td	g dS )z2
        Test height condition for peaks.
        )r   UUUUUU?r   r   r   r   r   r  )r   r   r  )r#  r   r   r   r   rT   r_   )NrT   r(   )r   rT   Nr   r   r   rH   rL   rM   r   r  r%   r%   r&   test_height_condition  s     "z#TestFindPeaks.test_height_conditionc                 C   s   d}t |dd\}}t|tddg t|d tddg t|d tdd	g tt |ddd
 tdg tt |ddd
 tg  tt |ddd
 tddg tt |ddd
 tdg tt |ddd
 tg  dS )z5
        Test threshold condition for peaks.
        )r   r   r(   rW   r5   r  )r  r(   rT   r  r   r  r_   r   r   )Nr_   )NrW   )r   rW   Nr$  r%  r%   r%   r&   test_threshold_condition  s     z&TestFindPeaks.test_threshold_conditionc                 C   s   t ddd}t d}||  t dd|j7  < tt|ddd | t|ddd }tt j||dd	jdk tt 	|d
 g d}t|ddd }t|jdkoY|d dk dS )z4
        Test distance condition for peaks.
        r(      rT   r   distancer   g9m4 @T)assume_uniquerj   )r(   r5   r   rR   N)
r   r   r   r+   r   r   r   r   	setdiff1dr   )rL   	peaks_allrM   peaks_subsetr%   r%   r&   test_distance_condition  s   
z%TestFindPeaks.test_distance_conditionc           	      C   s   t ddd}t ddd}t dd|j}||  |7  < || ||d   }d}t |d |k||d k@ }t||d\}}t|||  t|d	 ||  t|d
 d t|d || d  dS )z6
        Test prominence condition for peaks.
        r   rR   rO   r(   c   r   )rT   r`   )r   r   r   r  N)r   r+   r   r   nonzeror   r   )	rL   rM   
peaks_trueoffsetr   intervalkeep
peaks_calc
propertiesr%   r%   r&   test_prominence_condition  s   z'TestFindPeaks.test_prominence_conditionc                 C   sr   t g d}t|ddd\}}t|jd t|d t|d d t|d	 d
 t|d d t|d d dS )z1
        Test width condition for peaks.
        )	r(   r   r(   r   r(   r   r5   rW   r   r  r   )r  r   r(   r\   r   g?r  rg   r  g@r  g      @N)r   rH   r   r   r   r   r%  r%   r%   r&   test_width_condition  s   
z"TestFindPeaks.test_width_conditionc                 C   s\   d}g d}t |||||d\}}tt|t| jk | jD ]}t|j|| jk qdS )z+
        Test returned properties.
        r  )
r   r(   r   r   r   r   rT   r   r_   r`   r  N)r   r   r*   r  r   )rL   r  rM   r   r  r  r%   r%   r&   test_properties  s   

zTestFindPeaks.test_propertiesc                 C   s   t tdd ttd W d   n1 sw   Y  t tdd ttd W d   n1 s5w   Y  t tdd ttddd	 W d   dS 1 sUw   Y  dS )
z5
        Test exceptions raised by function.
        r   rl   r(   Nr   r*  rR   r5   r)  )r   r9   r   r   rH   rp   r   rr   r%   r%   r&   test_raises  s   "zTestFindPeaks.test_raisesz(ignore:some peaks have a prominence of 0r   c                 C   sh   t g ddddd\}}t|d t|d d t|d d t|d d	 d
D ]	}t|| | q(dS )z
        Test behavior of prominence and width calculation if the given window
        length is smaller than a peak's plateau size.

        Regression test for gh-9110.
        r   r  r   )r   r  r   r   r   r   r  r(   )r   r  r  r  N)r   r   )rL   r   r  r  r%   r%   r&   test_wlen_smaller_plateau  s   
	

z'TestFindPeaks.test_wlen_smaller_plateaukwargsr*  rh   r   r  r  r  c                 C   sL   t ddd}| }d|j_t|\}}t|fi |\}}t|| dS )z4
        Test readonly arrays are accepted.
        r   rR      FN)r   r+   r6   flags	writeabler   r   )rL   r?  rM   
x_readonlyr   _peaks_readonlyr%   r%   r&   test_readonly_array  s   z!TestFindPeaks.test_readonly_arrayN)rt   ru   rv   r  r  r"  r&  r'  r1  r:  r;  r<  r=  rw   rx   r  r>  ry   rF  r%   r%   r%   r&   r  [  s,    
r  c                   @   rz   )TestFindPeaksCwtc                 C   sP   g d}d}t ||\}}tdt|}t||dddd}tj||d dS )	zX
        Generate a series of gaussians and attempt to find the peak locations.
        ri   rh   r   g      4@r   g      I@r   r   r   r   N)
gap_threshmin_snr
min_lengthz4Found maximum locations did not equal those expected)r/   r   r   r0   r   r   r   )rL   r   
num_pointsr   r   r   
found_locsr%   r%   r&   test_find_peaks_exact  s   

z&TestFindPeaksCwt.test_find_peaks_exactc           
      C   s   g d}d}t ||\}}tdt|}d}tjd |tj|d d|  7 }t||dd	|d
 d}tj	t
|t
|d t|| }t|d
 }	tj||	dd|	   dS )zz
        Verify that peak locations are (approximately) found
        for a series of gaussians with added noise.
        rH  r   r   gQ?or   r   r@  r(   r_   )rK  rI  rJ  z,Different numberof peaks found than expectedzMaximum location differedzby more than %sN)r/   r   r   r0   randomseedrandr   r   r   r*   r   rH   r   )
rL   r   rL  r   r   r   	noise_amprM  diffs	max_diffsr%   r%   r&   test_find_peaks_withnoise)  s    
z*TestFindPeaksCwt.test_find_peaks_withnoisec                 C   s^   d}d}t jd t j|d d|  }t dd}t||dd	d
}t jt|d dS )zQ
        Verify that no peak is found in
        data that's just noise.
        rg   rO   iW
r   r   rR   rS   r_   r   )rJ  
noise_percr   N)	r   rP  rQ  rR  r   r   r   r   r*   )rL   rS  rL  r   r   rM  r%   r%   r&   test_find_peaks_nopeak?  s   z'TestFindPeaksCwt.test_find_peaks_nopeakc                 C   s@   t dd}tg d}t||t d}tjtdg| d S )N   r   )r(   r   rT   rW   )waveletrO   )r   r   rH   r   r   r   )rL   rM   r   ar%   r%   r&   )test_find_peaks_with_non_default_waveletsL  s   
z:TestFindPeaksCwt.test_find_peaks_with_non_default_waveletsc                 C   s   ddg}d}t ||\}}tdt|d}d}tjd |tj|d d|  7 }|d	d
  d8  < t||ddddd}t	t
 |j|jksNJ W d   n1 sXw   Y  t||ddddd}|j|jksoJ dS )zq
        Verify that window_size is passed correctly to private function and
        affects the result.
        ro   r   r   g?皙?rO  r   r      i@  r(   rT   N)rI  rJ  rK  window_sizerb   )r/   r   r   r0   rP  rQ  rR  r   rw   r   AssertionErrorr   )rL   r   rL  r   r   r   rS  rM  r%   r%   r&   test_find_peaks_window_sizeS  s$   

z,TestFindPeaksCwt.test_find_peaks_window_sizec                 C   s:   t dt jd}t |}d}t||}t j|d dS )z]
        Verify that the `width` argument
        in `find_peaks_cwt` can be a float
        r   r]  r(       N)r   r   pisinr   r   r   )rL   xsr   r   rM  r%   r%   r&   test_find_peaks_with_one_widthm  s
   

z/TestFindPeaksCwt.test_find_peaks_with_one_widthN)	rt   ru   rv   rN  rV  rX  r\  ra  rf  r%   r%   r%   r&   rG    s    rG  )$r6   numpyr   numpy.testingr   r   r   r   rw   r   r   scipy.signal._peak_findingr   r	   r
   r   r   r   r   r   scipy.signal.windowsr    scipy.signal._peak_finding_utilsr   r   r'   r/   rF   rG   r{   r   r   r   r  r  rG  r%   r%   r%   r&   <module>   s*    (
	+;\Su 
 @