U
    f»{j‹N  ã                   @   s¨  d dl mZ d dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlm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mZmZmZ d dlmZ d dlm Z  d d	l!m"Z" e #ed
d�ddd¡Z$e #ed
d�ddd¡Z%e #ed
d�ddd¡Z&e j'dd„ ƒZ(dd„ Z)e j'ej* +de&e%e$g¡dd„ ƒƒZ,e j'ej* +de&e%e$g¡dd„ ƒƒZ-e j'ej* +de&e%e$g¡dd„ ƒƒZ.dd„ Z/dd„ Z0d d!„ Z1d"d#„ Z2e j'd$d%„ ƒZ3d&d'„ Z4dS )(é    N)Úassert_array_equalÚassert_array_almost_equalÚassert_allclose)Úcreate_info)Ú	data_path)Úread_raw_nirxÚRawArray)Úoptical_densityÚbeer_lambert_lawÚ_fnirs_spread_badsÚ_validate_nirs_infoÚ_check_channels_orderedÚtddrÚ_channel_frequenciesÚ_channel_chromophoreÚ_fnirs_optode_namesÚ_optode_positionÚscalp_coupling_index)Ú_picks_to_idx)Útesting)ÚFIFFF)ÚdownloadZNIRxZnirscoutZnirx_15_0_recordingZnirx_15_2_recordingZnirx_15_2_recording_w_shortc                  C   s¨  t tƒ} t| jdƒ}t|ƒt| jƒks*t‚|  ¡ jdd�}|jd D ]}|d t	j
ksDt‚qDt| jddgƒ}t|ƒt| jƒks‚t‚t| jdddgƒ}t|ƒt| jƒksªt‚t tt| jd¡ t tt| jd¡ t tt| jdg¡ t tt| jd¡ t tt| jd	¡ t| ƒ} t| jdƒ}t|ƒt| jƒk�s2t‚|  ¡ jdd�}|jd D ]}|d t	jk�sLt‚�qLt| jddgƒ}t|ƒt| jƒk�s�t‚t| jdddgƒ}t|ƒt| jƒk�sºt‚t tt| jd¡ t tt| jd¡ t tt| jd¡ t tt| jd¡ t tt| jd	¡ t| ƒ} t| jdƒ}t|ƒt| jƒd
 k�sDt‚|  ¡ jdd�}|jd D ]}|d t	jk�s^t‚�q^t| jdgƒ}t|ƒt| jƒd
 k�s¤t‚|  ¡ jdgd�}|jd D ]}|d t	jk�sÀt‚�qÀt| jddgƒ}t|ƒt| jƒk�st‚t| jdddgƒ}t|ƒt| jƒk�s.t‚t| jddgƒ}t|ƒt| jƒd
 k�sZt‚t tt| jd¡ t tt| jdg¡ t tt| jd	¡ t tt| jd¡ dS )z8Test picking of fnirs types after different conversions.Úfnirs_cw_amplitude©ÚpicksÚchsZ	coil_typeÚfnirs_odÚhbrÚhboZfnirs_fd_phaseZjunké   N)r   Úfname_nirx_15_0r   ÚinfoÚlenÚch_namesÚAssertionErrorÚcopyÚpickr   ZFIFFV_COIL_FNIRS_CW_AMPLITUDEÚpytestÚraisesÚ
ValueErrorr	   ZFIFFV_COIL_FNIRS_ODr
   ZFIFFV_COIL_FNIRS_HBOZFIFFV_COIL_FNIRS_HBR)Úrawr   Z
raw_subsetÚch© r,   úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/preprocessing/nirs/tests/test_nirs.pyÚtest_fnirs_picks%   sf    r.   c                 C   s   t | ƒ d S )N)r   ©r!   r,   r,   r-   Ú_fnirs_check_badsd   s    r0   Úfnamec              	   C   s:  t | ƒ}t|jƒ t|ƒ}t|jƒ t|ƒ}t|jƒ t | ƒ}|jdd… |jd< t|jƒ t|ƒ}t|jƒ t|ƒ}t|jƒ t | ƒ}|jdd… |jd< t tt|j¡ tjtdd�� t|ƒ}W 5 Q R X g |jd< t|ƒ}|jdd… |jd< t tt|j¡ tjtdd�� t|ƒ}W 5 Q R X t tt|j¡ dS )úTest checking of bad markings.r   r   Úbadsé   zbad labelling©ÚmatchN)	r   r0   r!   r	   r
   r#   r'   r(   ÚRuntimeError)r1   r*   r,   r,   r-   Útest_fnirs_check_badsh   s2    






r8   c                    s¾   t | ƒ‰dgˆjd< tˆjƒ‰ ˆ d ddgks2t‚tˆƒ‰ˆjdd… ˆjd< tˆjƒ‰ ˆ d ˆjdd… ksrt‚tˆƒ‰‡fdd„d	D ƒˆjd< tˆjƒ‰ ˆ d ‡ fd
d„dD ƒksºt‚dS )r2   ú	S1_D1 760r3   ú	S1_D1 850é   é   é   c                    s   g | ]}ˆ j | ‘qS r,   ©r#   ©Ú.0Úx)r*   r,   r-   Ú
<listcomp>    s     z*test_fnirs_spread_bads.<locals>.<listcomp>)r4   é   c                    s   g | ]}ˆ j | ‘qS r,   r>   r?   r/   r,   r-   rB   ¢   s     )r   r4   rC   é	   N)r   r!   r   r$   r	   r#   r
   )r1   r,   )r!   r*   r-   Útest_fnirs_spread_bads�   s    


rE   c           	   	      s€  t | ƒ}t t|jƒ¡}t|ddgƒ t t|jƒ¡}t|ƒdksFt‚t	|j|ƒ}t|ƒt|j
ƒksht‚| ¡  |j
d ¡}tjtdd�� t	|j|ƒ W 5 Q R X | ¡ j
}| ¡  | ¡ j|dd�‰ tjtd	d�� t	ˆ jddgƒ W 5 Q R X t	ˆ j|ƒ}t‡ fd
d„|ddd… D ƒƒ}|dhk�s,t‚t‡ fdd„|ddd… D ƒƒ}|dhk�s\t‚t|ƒ}t t|jƒ¡}t|ddgƒ t t|jƒ¡}t|ƒdk�s¤t‚t	|j|ƒ}t|ƒt|j
ƒk�sÈt‚t|ƒ}t t|jƒ¡}t|ƒdk�sòt‚tt|jƒƒt|j
ƒk�st‚t t|jƒ¡}t|ddgƒ t	|j|ƒ}t|ƒt|j
ƒk�sRt‚tjtdd�� t	|jddgƒ W 5 Q R X dS )z2Ensure fNIRS channel checking on standard readers.éø  éR  r   r=   znot ordered correctlyr5   T)ÚorderedzThe frequencies.*sorted.*c                 3   s    | ]}ˆ j |  ¡ d  V  qdS ©r4   N©r#   Úsplit©r@   r&   ©Zraw_reversedr,   r-   Ú	<genexpr>Å   s    z>test_fnirs_channel_naming_and_order_readers.<locals>.<genexpr>Nr   Z760c                 3   s    | ]}ˆ j |  ¡ d  V  qdS rI   rJ   rL   rM   r,   r-   rN   È   s    r4   Ú850r   r   úchromophore in info)r   ÚnpÚuniquer   r!   r   r   r"   r$   r   r#   r%   Zdrop_channelsr'   r(   r)   ÚreverseZpick_channelsÚsetr	   r
   )	r1   r*   ÚfreqsÚchromar   Zraw_droppedZraw_names_reversedZ	got_firstZ
got_secondr,   rM   r-   Ú+test_fnirs_channel_naming_and_order_readers¥   sR    
ÿÿrW   c            	   	   C   sð  t jjdd�} ddddddg}t  d	d
¡}t||dd�}t| |dd�}t  ddgd¡}t|ƒD ]\}}||jd | d d< q^t  	t
|jƒ¡}t|j|ƒ}t|ƒt|jƒks°t‚t|ƒd
ksÀt‚ddddddg}t  d	d
¡}t||dd�}t| |dd�}t  ddgd¡}t|ƒD ] \}}||jd | d d< �qt|jddgƒ}t|ƒt|jƒk�sZt‚t|ƒd
k�slt‚ddddddg}t  d	d
¡}t||dd�}t| |dd�}t  ddgd¡}t|ƒD ] \}}||jd | d d< �q¼tjtdd�� t|jddgƒ W 5 Q R X ddddddg}t  d	d
¡}t||dd�}t| |dd�}tjtdd�� t|jddgƒ W 5 Q R X ddddddg}t  d	d
¡}t||dd�}t| |dd�}t  ddgd¡}t|ƒD ] \}}||jd | d d< �qºt|jddgƒ dS )ú7Ensure fNIRS channel checking on manually created data.©r<   é
   ©Úsizer9   r:   ú	S2_D1 760ú	S2_D1 850ú	S3_D1 760ú	S3_D1 850r   r<   ç      ð?©r#   Úch_typesZsfreqT©ÚverboserF   rG   é   r   ÚlocrD   z	S1_D1 920z	S2_D1 920z	S3_D1 920i˜  znot orderedr5   zmissing wavelength informationN)rQ   ÚrandomÚnormalÚrepeatr   r   ÚtileÚ	enumerater!   rR   r   r   r"   r#   r$   r'   r(   r)   )	Údatar#   rc   r!   r*   rU   ÚidxÚfr   r,   r,   r-   Ú.test_fnirs_channel_naming_and_order_custom_rawâ   sz     ÿ ÿ ÿ ÿ  ÿrp   c            
   	   C   sà  t jjdd�} ddddddg}t  d	d
¡}t||dd�}t| |dd�}t  ddgd¡}t|ƒD ]\}}||jd | d d< q^t  	t
|jƒ¡}t|j|ƒ}t|ƒt|jƒks°t‚t|ƒd
ksÀt‚ddddddg}t  d	d
¡}t||dd�}t| |dd�}t  ddgd¡}t|ƒD ] \}}||jd | d d< �qt|jddgƒ |jddddddgd� t|jddgƒ dddddd g}t  d!d"gd¡}t||dd�}t| |dd�}	| |	g¡ tjtd#d$�� t|jddgƒ W 5 Q R X d%S )&rX   rY   r[   r9   r:   r]   r^   r_   r`   r   r<   ra   rb   Trd   rF   rG   rf   r   rg   rD   r   r4   r=   r   r;   r   ú	S1_D1 hboú	S1_D1 hbrú	S2_D1 hboú	S2_D1 hbrú	S3_D1 hboú	S3_D1 hbrr   r   zdoes not support a combinationr5   N)rQ   rh   ri   rj   r   r   rk   rl   r!   rR   r   r   r"   r#   r$   r&   Zadd_channelsr'   r(   r)   )
rm   r#   rc   r!   r*   rU   rn   ro   r   Zraw2r,   r,   r-   Ú:test_fnirs_channel_naming_and_order_custom_optical_density'  sN     ÿ  ÿ ÿrw   c               	   C   s   t j d¡ dd¡} dddddd	g}t  d
dgd¡}t||dd�}t| |dd�}t  t|j	ƒ¡}t
|j	|ƒ}t|ƒt|jƒks‚t‚t|ƒdks’t‚dddddd	g}t  d
dgd¡}t||dd�}t| |dd�}t
|j	d
dgƒ |jddddddgd� t
|j	d
dgƒ tjtdd�� t
|j	ddgƒ W 5 Q R X dddddd	g}t  d
dgd¡}t||dd�}t| |dd�}tjtdd�� t
|j	d
dgƒ W 5 Q R X dddddd	g}t  d
dgd¡}t||dd�}t| |dd�}tjtdd�� t
|j	d
dgƒ W 5 Q R X d S )!rX   r   r<   rZ   rq   rr   rs   rt   ru   rv   r   r   rf   ra   rb   Trd   r4   r=   r   r;   r   rP   r5   Zhbbz	S1_D1 hbbz	S2_D1 hbbz	S3_D1 hbbznaming conventionsz	S1_DX hboz	S1_DX hbrzcan not be parsedN)rQ   rh   ÚRandomStateZrandnrk   r   r   rR   r   r!   r   r"   r#   r$   rj   r&   r'   r(   r)   )rm   r#   rc   r!   r*   rV   r   r,   r,   r-   Ú1test_fnirs_channel_naming_and_order_custom_chromaU  sV     ÿ  ÿ ÿ ÿry   c                  C   sÊ   ddddddg} t  dd¡}t| |d	d
�}t|ƒ\}}t|dd„ dD ƒƒ t|dd„ dD ƒƒ ddddddg} t  ddgd¡}t| |d	d
�}t|ƒ\}}t|dd„ tddƒD ƒƒ t|dd„ dD ƒƒ dS )z)Ensure optode name extraction is correct.z
S11_D2 760z
S11_D2 850r_   r`   z
S2_D13 760z
S2_D13 850r   r<   ra   rb   c                 S   s   g | ]}d |› �‘qS ©ÚSr,   ©r@   Únr,   r,   r-   rB   �  s     z%test_optode_names.<locals>.<listcomp>)Ú2Ú3Ú11c                 S   s   g | ]}d |› �‘qS ©ÚDr,   r|   r,   r,   r-   rB   �  s     )Ú1r~   Z13z
S1_D11 hboz
S1_D11 hbrz
S2_D17 hboz
S2_D17 hbrru   rv   r   r   rf   c                 S   s   g | ]}d |› �‘qS rz   r,   r|   r,   r,   r-   rB   —  s     r4   r=   c                 S   s   g | ]}d |› �‘qS r�   r,   r|   r,   r,   r-   rB   ˜  s     )rƒ   r€   Z17N)rQ   rj   r   r   r   rk   Úrange)r#   rc   r!   Z	src_namesZ	det_namesr,   r,   r-   Útest_optode_namesˆ  s&      ÿ ÿr…   c                  C   s(   t tƒ} t| jdƒ}t|dddgƒ dS )z-Ensure optode location extraction is correct.ZD3g)]ú—¤2µ?gzªCn†�?gäôõ|Ír™?N)r   Úfname_nirx_15_2_shortr   r!   r   )r*   rg   r,   r,   r-   Útest_optode_loc›  s    r‡   c           	         s²  | \}}|  ¡  tj d¡ t|jƒ¡¡}t|||d�}~~~tƒ }| 	¡ D ]z\}‰ t
ˆ  ¡ ƒdhksjt‚‡ fdd„|d jD ƒ||< t|d jt ˆ j¡||  ƒ t|d  ¡ ˆ  || ¡|d� qLt|d t t|d jƒ¡ƒ | 	¡ D ]N\}‰ tˆ ƒ ||< ‰ t|d  ¡ ˆ  || ¡|d� t
ˆ  ¡ ƒdhksît‚qîtƒ }| 	¡ D ]6\}‰ tˆ ƒ ||< ‰ t|d ˆ ||  |d	d
� �qLtƒ }| 	¡ D ]T\}‰ tˆ ƒ ||< ‰ t|d  ¡ ˆ  || ¡|dd� t
ˆ  ¡ ƒdhk�s’t‚�q’| 	¡ D ]V\}‰ tˆ ƒ ||< ‰ t|d  ¡ ˆ  || ¡|dd
� t
ˆ  ¡ ƒddhk�sðt‚�qðtƒ }| 	¡ D ]V\}‰ tˆ ƒ ||< ‰ t|d  ¡ ˆ  || ¡|dd� t
ˆ  ¡ ƒddhk�sVt‚�qVdS )z;Test that order does not matter to (pre)processing results.r   )ÚnirxZsnirfrh   r   c                    s   g | ]}ˆ j  |¡‘qS r,   )r#   Úindex)r@   Úname©Úrr,   r-   rB   ®  s    z'test_order_agnostic.<locals>.<listcomp>rˆ   )Úerr_msgr   g{®Gáz„?)r�   Zrtolg-Cëâ6?)r�   ZatolgH¯¼šò×Š>r   r   g•Ö&è.>N)r%   r&   rQ   rh   rx   Zpermutationr"   r#   ÚdictÚitemsrT   Zget_channel_typesr$   r   Úarrayr   Úget_dataZaranger	   r   r   r
   )	Z
nirx_snirfZraw_nirxZ	raw_snirfZ
raw_randomZrawsZordersÚkeyZsciZtddrsr,   r‹   r-   Útest_order_agnostic£  s~    ÿ
ÿ
 ÿ
  ÿ
  ÿ 
  þ
  þ
  þr“   )5Úos.pathÚpathÚopr'   ÚnumpyrQ   Znumpy.testingr   r   r   Zmner   Zmne.datasets.testingr   Zmne.ior   r   Zmne.preprocessing.nirsr	   r
   r   r   r   r   r   r   r   r   r   Zmne.io.pickr   Zmne.datasetsr   Zmne.io.constantsr   Újoinr    Zfname_nirx_15_2r†   Zrequires_testing_datar.   r0   ÚmarkZparametrizer8   rE   rW   rp   rw   ry   r…   r‡   r“   r,   r,   r,   r-   Ú<module>   sd   4  ÿ  ÿ þ
>ÿ"ÿÿ:E.3
