U
    f»{jw  ã                	   @   sx  d dl m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Zd dlmZmZ d dlmZ d dlmZmZmZmZmZmZ d dl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'm(Z(m)Z)m*Z*m+Z+ d d
l,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z8 e 9e :e;¡dddd¡Z<e 9e<d¡Z=e 9e<d¡Z>e 9e<d¡Z?e 9e<d¡Z@e-jAdd�ZAe 9eAddd¡ZBe 9eAdd¡ZCe 9eAdd¡ZDe 9eAdd¡ZEe 9eAdd ¡ZFe 9eAdd!¡ZGe 9eAdd"¡ZHe 9eAd#d$¡ZIe 9eAd#d%¡ZJe 9eAd&d'¡ZKe 9eAd&d(¡ZLe 9eAd)d*¡ZMe 9eAd)d+¡ZNe 9eAd)d,¡ZOe 9eAd)d-¡ZPe 9eAd)d.¡ZQe-jRd/d0„ ƒZSe-jRd1d2„ ƒZTe-jRd3d4„ ƒZUdfd:d;„ZVdgd=d>„ZWe6dhdFdG„ƒZXejYjZe-jRdHdI„ ƒƒZ[e-jRejYjZdJdK„ ƒƒZ\e-jRejYjZdLdM„ ƒƒZ]e-jRdNdO„ ƒZ^e-jRdPdQ„ ƒZ_ejYjZe-jRdRdS„ ƒƒZ`dTdU„ ZadVdW„ ZbdidZd[„ZcejYjZe-jRd\d]„ ƒƒZdd^d_„ Zee-jRd`da„ ƒZfe-jRdbdc„ ƒZge-jRddde„ ƒZhdS )jé    N)Úassert_allcloseÚassert_array_lessÚassert_array_equal)Úinterp1d)Úcdist)Ú
pick_typesÚ	pick_info)Ú_MAG_FACTOR)Úread_raw_fifÚread_raw_artemis123Úread_raw_ctfÚ	read_infoÚRawArrayÚread_raw_kit)ÚFIFF)Úcompute_chpi_amplitudesÚcompute_chpi_locsÚcompute_chpi_snrÚcompute_head_posÚ_setup_ext_projÚ_chpi_locs_to_times_digÚ_compute_good_distancesÚextract_chpi_locs_ctfÚhead_pos_to_trans_rot_tÚread_head_posÚwrite_head_posÚfilter_chpiÚget_chpi_infoÚ_get_hpi_initial_fitÚextract_chpi_locs_kit)Útesting)Úadd_chpi)Úrot_to_quatÚ_angle_between_quats)Úcatch_loggingÚassert_meg_snrÚverbose)Úplot_head_positionsz..ÚioZtestsÚdataztest_ctf_raw.fifztest_chpi_raw_sss.fifztest_chpi_raw_hp.txtztest_raw.fifF)ÚdownloadZMEGÚsamplezsample_audvis_trunc_raw.fifZSSSztest_move_anon_raw.fifztest_move_anon_raw.posztest_move_anon_raw_sss.fifztest_move_anon_hpisubt_raw.fifzchpi5_raw.fifzchpi5_raw_mc.posZCTFztestdata_ctf_mc.dsztestdata_ctf_mc.posZ
ARTEMIS123z<Artemis_Data_2017-04-04-15h-44m-22s_Motion_Translation-z.binz?Artemis_Data_2017-04-04-15h-44m-22s_Motion_Translation-z_mc.posZKITzMQKIT_125_2sec.conzMQKIT_125.mrkzMQKIT_125.elpzMQKIT_125.hspzdata_berlin.conc                  C   sF  t tdd�} tƒ �&}t| jddd� t| jddd� W 5 Q R X dd	d
dddddddddg}| ¡  ¡ }t|ƒt|ƒks”t	dd 
t|ƒt|ƒ ¡ ƒ‚| jd d d d  d7  < |dd… dddg |dd…  }tƒ �&}t| jddd� t| jddd� W 5 Q R X | ¡  ¡ }t|ƒt|ƒk�sBt	dd 
t|ƒt|ƒ ¡ ƒ‚dS ) z!Test cHPI logging and adjustment.Úyes©Úallow_maxshieldTÚdebug)Úadjustr&   Úraise)Ú
on_missingr&   z,HPIFIT: 5 coils digitized in order 5 1 4 3 2zHPIFIT: 3 coils accepted: 1 2 4zHpi coil moments (3 5):z%2.08542e-15 -1.52486e-15 -1.53484e-15z#2.14516e-15 2.09608e-15 7.30303e-16z$-3.2318e-16 -4.25666e-16 2.69997e-15z#5.21717e-16 1.28406e-15 1.95335e-15z$1.21199e-15 -1.25801e-19 1.18321e-15z+HPIFIT errors:  0.3, 0.3, 5.3, 0.4, 3.2 mm.z,HPI consistency of isotrak and hpifit is OK.z.HP fitting limits: err = 5.0 mm, gval = 0.980.z(Using 5 HPI coils: 83 143 203 263 323 HzÚ
Údigé   Úré   ç      ð?Né   z-HPIFIT errors:  0.3, 0.3, 5.3, 999.7, 3.2 mm.z/Note: HPI coil 3 isotrak is adjusted by 5.3 mm!z/Note: HPI coil 5 isotrak is adjusted by 3.2 mm!éþÿÿÿ)r
   Úchpi_fif_fnamer$   r   Úinfor   ÚgetvalueÚ
splitlinesÚsetÚAssertionErrorÚjoin)ÚrawÚlogÚmsg© rE   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/tests/test_chpi.pyÚtest_chpi_adjust>   s@    õ.
ý
ýrG   c              	   C   s¾   t  t| ƒd¡}tj d¡ dd¡}ttƒ}||fD ]$}t	||ƒ t|ƒ}t
||dd� q4t tt	d|¡ t tt	|d¡ t tt	||dd…dd	…f ¡ t ttd¡ t tt|d ¡ dS )
z=Test reading and writing head position quaternion parameters.ztemp.posr   é   é
   çü©ñÒMbP?©ÚatolÚfooNé	   )ÚoprA   ÚstrÚnpÚrandomZRandomStateZrandnr   Ú	pos_fnamer   r   ÚpytestÚraisesÚ	TypeErrorÚ
ValueErrorÚIOError)Útmp_pathÚ	temp_nameZhead_pos_randZhead_pos_readZhead_pos_origÚhead_posrE   rE   rF   Útest_read_write_head_pose   s    
 r\   c              	   C   s~  t  t| ƒd¡}ttfD ]b}t|dd� dd¡}t|jd ƒdksFt	‚|j
|dd� t|ƒ}t|d ƒt|jd ƒkst	‚qttƒ}t|ƒ\}}}t|t d	d
dddg¡ƒ |dks¸t	‚t|t dddddg¡ƒ | ¡ � d|d< g |d< g |d< W 5 Q R X tjtdd�� t|ƒ W 5 Q R X tjtdd�� t|dd� W 5 Q R X t|dd�\}}}tg |ƒ |dk�spt	‚tg |ƒ dS )zTest getting HPI info.ztemp_raw.fifr,   r-   r   çš™™™™™¹?Úhpi_subsystemT)Ú	overwriteg     ÀT@g     àa@g     `i@g     pp@g     0t@iz  é   é   é   é   i   NÚhpi_measÚhpi_resultsúNo appropriate cHPI information©ÚmatchÚwarn)r2   Úignore)rO   rA   rP   r;   Ússs_fif_fnamer
   ÚcropÚlenr<   r@   Úsaver   r   r   rQ   ÚarrayÚ_unlockrT   rU   rW   ÚwarnsÚRuntimeWarningr   )rY   rZ   ÚfnamerB   r<   Z	hpi_freqsZstim_ch_idxZhpi_on_codesrE   rE   rF   Útest_hpi_infoy   s4     
ÿ
rt   çú~j¼t“h?ç      @ç      à?rJ   çü©ñÒMb`?c                  C   sD  d}t | ƒ\}}	}
t |ƒ\}}}t|	ƒ}|dd…dd…f j\}}}| dd…dd…f j\}}}~ ~tj|d |
d dd�s”td|d |
d f ƒ‚||
d k||
d k@ }|| }|| }t|ƒ}|| }|| || ||   }}}||fD ]}t||ƒ}t|d	d
d� qðt|
|dd�|ƒ}t 	tj
|| d dd�¡}t |¡ ¡ �sPt‚t |¡}|| |k�sŠtd|| d||  d| f ƒ‚t|
|dd�|ƒ}dt||ƒ tj }t |¡}|| |k�sâtd|| || |f ƒ‚t|
|ƒ|ƒ}t|||ddd� t|
|ƒ|ƒ}t|||ddd� t|
|ƒ|ƒ}t|||dd� dS )z!Compare estimated cHPI positions.TNé   r   r]   rK   z-Start times not within 100 ms: %0.3f != %0.3féÿÿÿÿç        gñhãˆµøä>©Úaxisr7   é   z!@ %0.3f seconds: %0.3f > %0.3f mméè  é´   z"@ %0.3f seconds: %0.3f > %0.3f degrJ   Úerr)ÚrtolrL   Úerr_msggH¯¼šò×z>ÚgofÚvelocity)rL   rƒ   )r   r"   ÚTrQ   Úiscloser@   r#   r   r   ÚsqrtÚsumÚisfiniteÚallZargmaxÚpi) ÚactualZdesiredÚdist_tolÚ	angle_tolÚerr_rtolZgof_rtolÚvel_atolÚ__tracebackhide__Z	trans_estZrot_estZt_estÚtransZrotÚtZ	quats_estÚgofsZerrsZvelsZgofs_estZerrs_estZvels_estZuse_maskÚquatsÚqÚanglesZtrans_est_interpÚ	distancesZ	arg_worstZquats_est_interpZerrs_est_interpZgof_est_interpZvel_est_interprE   rE   rF   Ú_assert_quatsŸ   sb    ÿ

ÿÿ
ÿÿ
ÿ
ÿÿrš   é   c              	   C   sÆ   t | jdd…dd|…f | j| j| d�}|j ¡ � |jd  |  < W 5 Q R X |jd d d D ]\}|d |jd krdt |d |jd ¡|d< |d |jd d krd|jd |d  |d< qd|S )	zADecimate raw data (with aliasing) in cHPI-fitting compatible way.N)Ú
first_sampÚsfreqrd   r   Ú	hpi_coilsÚ	coil_freqç       @)r   Ú_datar<   rœ   rp   rQ   Úmod)rB   ÚdecimÚraw_decZcoilrE   rE   rF   Ú_decimate_chpiÜ   s      ÿ
ÿr¥   ç{®Gáz„?r8   Úautor1   ç{®Gázt?ç\�Âõ(\ï?r~   c	                 C   s>   t | ||||d�}	t| j|	|||d�}
t| j|
|||d�}|S )N)Ú
t_step_minÚt_windowÚ	ext_orderr&   )Ú
t_step_maxÚ	too_closer&   )Ú
dist_limitÚ	gof_limitr&   )r   r   r<   r   )rB   rª   r­   r«   r®   r¯   r°   r¬   r&   Úchpi_amplitudesÚ	chpi_locsr[   rE   rE   rF   Ú_calculate_chpi_positionsì   s,       þ   þ   þr³   c            	   
      s¾  t tƒ} ttdd�}| dd¡ ¡  tƒ �}t|dddddd	� W 5 Q R X d
| ¡ ksZt	‚t
|dƒ}tƒ �.}tjtdd�� t|ddd�}W 5 Q R X W 5 Q R X | ¡ }d|ks²t	‚d|ks¾t	‚t|| ddd� ttƒ}tjtdd�� t|ƒ W 5 Q R X | ¡ ‰ ˆ jd d d d d= tjtdd�� tˆ ƒ W 5 Q R X | ¡ ‰ ˆ jd D ]&}|d tjk�rLtj|d<  �qt�qLtjtdd�� tˆ ƒ W 5 Q R X ˆ jd D ].}|d tjk�r tj|d< t d¡|d< �q ˆ  dd ¡ t t d!tˆ jƒ¡t ˆ jdd"�d#d#d$… g¡}ˆ  !‡ fd%d&„|D ƒ¡ tjtd'd��& tƒ �}tˆ d dd(� W 5 Q R X W 5 Q R X d)| ¡ k�spt	‚|j "¡ � |jd*  d+  < W 5 Q R X tjtd,d�� t|ƒ W 5 Q R X d#S )-z#Test calculation of cHPI positions.r,   r-   r   r5   r]   r§   r7   T)rª   r«   ZtminZtmaxr&   z83.3 msé   úcannot determinerg   çš™™™™™É?r/   ©r«   r&   z
HPIFITz#Computing 4385 HPI location guessesrJ   çffffffæ?)rŽ   r�   rf   rd   rž   rŸ   r4   ÚkindZcoord_framezcoordinate frame incorrecté   r6   r8   i2  ©ÚmegNé   c                    s   g | ]}ˆ j | ‘qS rE   )Úch_names)Ú.0Úpick©Zraw_badrE   rF   Ú
<listcomp>,  s     z4test_calculate_chpi_positions_vv.<locals>.<listcomp>ZDiscrepancy©rª   r&   z0/5 good HPI fitsÚlowpassr    z	above the)#r   rS   r
   r;   rl   Ú	load_datar$   r   r=   r@   r¥   rT   rq   rr   r³   rš   Úsample_fnamerU   rW   Úcopyr<   r   ZFIFFV_POINT_HPIZFIFFV_COORD_UNKNOWNÚRuntimeErrorZFIFFV_COORD_HEADrQ   ZonesÚconcatenateÚarangerm   r¾   r   Zpick_channelsrp   )	Úmf_quatsrB   rC   r¤   Úpy_quatsZraw_no_chpiÚdÚpicksZlog_filerE   rÁ   rF   Ú test_calculate_chpi_positions_vvý   sf      ÿ
ÿ


ÿ"rÏ   c                  C   s�   t tdd�} t| ƒ}dd„ dD ƒ}t|ƒ| ddh¡ks<t‚|d  ¡ d	ksPt‚|d  ¡ d
k sdt‚|d  ¡ d	ksxt‚|d  ¡ d
k sŒt‚dS )zTest cHPI SNR calculation.r,   r-   c                 S   s$   h | ]}d D ]}|› d|› �’qqS ))ZsnrÚpowerZresidÚ_rE   )r¿   Zch_typeÚkeyrE   rE   rF   Ú	<setcomp>A  s    ÿ z*test_calculate_chpi_snr.<locals>.<setcomp>)ÚmagÚgradÚtimesÚfreqsZmag_snrr~   é(   Zgrad_snrN)r
   r;   r   r?   Úunionr@   ÚminÚmax)rB   ÚresultÚkeysrE   rE   rF   Útest_calculate_chpi_snr:  s    rÞ   c                  C   sV   t tdd�} ttƒ}|dd…dd…f  d  < t| ddd�}t||d	d
ddd� dS )zTest on 5k artemis data.T©ÚpreloadNr9   éd   r    r/   rÃ   rJ   r8   r¸   r¦   ©rŽ   r�   r�   r‘   )r   Ú	art_fnamer   Úart_mc_fnamer³   rš   )rB   rË   rÌ   rE   rE   rF   Ú%test_calculate_chpi_positions_artemisK  s        þrå   c               
   C   s,  t tdd�} t dd„ | jd d d D ƒg¡}tjj|dd	�}||jd  }t|d
ƒ td|ƒ t	| jdd�\}}}t
t d¡||d�}t| j|ƒ}| jd d d }t|d d |dd� | jd d d t }|d d }	tjj|ddd�}
tjj|	ddd�}t|
|dd� ||
 }|	| }t t t tj|| dd	�¡¡¡}t|dƒ t| j|ƒ}|jdk�slt‚| jd d }dtj |dd…df |dd d!…f  ¡ }d"|  k �r¾d#k �sÄn t‚t tt|dd…dd…f ƒ|ddd …f ƒ¡}d"|  k �rd#k �sn t‚|d$ }t|d%d&d� dS )'z6Test that initial fits can be redone based on moments.r,   r-   c                 S   s   g | ]}|d  ‘qS )ÚslopesrE   )r¿   ÚcrE   rE   rF   rÂ   ]  s     z)test_initial_fit_redo.<locals>.<listcomp>rd   r   rž   rz   r|   g»½×Ùß|Ë=gê-�™—q=r~   )r¬   )rÖ   ræ   Úprojre   Zgoodnessr•   g333333Ó?rK   ÚmomentsT)r}   Zkeepdimsr¶   )r‚   rH   )r~   rI   Ú
dev_head_tr“   r   Nrº   r›   ry   r]   r7   )r   ry   g§èH.ÿï?g-Cëâ6?)r
   r;   rQ   ro   r<   ÚlinalgÚnormÚshaper   r   ÚdictÚzerosr   r   r	   Zrad2degZarccosÚabsr‰   r   r@   r#   r"   )rB   ræ   Úampsrè   rÑ   r±   r²   Zcoil_gofZcoil_momentZ	py_momentZcoil_ampZpy_ampZcoil_oriZpy_orir˜   r[   Znm_posÚdistZangler„   rE   rE   rF   Útest_initial_fit_redoX  sD    ÿ

$
, ÿró   c                  C   sT   t tƒ} ttdd�}t| dd¡ ¡ dd�}t|ddddd	�}t|| d
ddd� dS )z@Comparing estimated cHPI positions with MF results (one second).r,   r-   r{   g      $@r9   ©r£   r8   r/   ©rª   r­   r«   r&   rx   ç333333ó?ru   ©rŽ   r�   r‘   N)	r   Úchpi5_pos_fnamer
   Úchpi5_fif_fnamer¥   rl   rÅ   r³   rš   ©rË   rB   rÌ   rE   rE   rF   Ú9test_calculate_head_pos_chpi_on_chpi5_in_one_second_stepsƒ  s        ÿ
ÿrû   c               	   C   sn   t tƒ} ttdd�}t| dd¡ ¡ dd�}tjt	dd�� t
|d	d	d	d
d�}W 5 Q R X t|| dddd� dS )zCComparing estimated cHPI positions with MF results (smaller steps).r,   r-   r{   rv   r9   rô   rµ   rg   r]   r/   rõ   rx   rö   ç{®Gáz”?r÷   N)r   rø   r
   rù   r¥   rl   rÅ   rT   rq   rr   r³   rš   rú   rE   rE   rF   Ú6test_calculate_head_pos_chpi_on_chpi5_in_shorter_steps”  s        ÿ
ÿrý   c               
   C   sä  t tƒ} d}t| d d d ƒ}dt |¡d  }|dtjddddgtjd	�idtjd
dd
d
gtjd	�idtjddddgtjd	�idtjddddgtjd	�ig|dœ}|  ¡ �@ || d< t|ƒD ] \}}|| d d d | d< qÀd| d< W 5 Q R X t	| dddg d�}t
| |ƒ} d| d | d  d¡ d< |  ¡  |  ¡ � g | d< W 5 Q R X | d d  ¡ }t t|dd…dd…f ƒ|dd…df g¡}	t ddd g¡}
d}d!}t|| d  | ƒ}|dk�sÆt‚d"}t |df¡}t |¡| d  | |dd…df< |	dd… |dd…d d#…f< |	dd… t t |¡| |
¡ |dd…d#d$…f< d%|dd…d$f< || d |  |dd…d&f< t t|ƒt|| d  d' ƒf¡}t|| ƒ}t||ƒ t||jd | |jd | d%d(�}t||d"d%d)d*� dS )+z7Test calculation of cHPI positions with simulated data.ZSTI201re   r   ÚorderrI   r5   Z
event_bitsr`   )Zdtypera   rb   rc   )Úevent_channelrž   Úncoilr^   rd   rž   rŸ   g      Y@r�   TF)r¼   ÚstimÚeegÚexcludeZchsr¾   zSTI 001Zch_nameZprojsrê   r“   Nrº   r~   r¦   rJ   r›   ry   r8   rN   rw   )rª   r­   r«   çü©ñÒMbp?r÷   )r   Ú	raw_fnamerm   rQ   rÊ   ro   Zint32rp   Ú	enumerater   r   ÚindexZ_update_redundantrÇ   rÉ   r"   Úintr@   rï   Úouterr   r!   r³   r<   rš   )r<   Zchpi_channelr   rŸ   r^   ÚfiÚfreqrÎ   Z
info_transZdev_head_pos_iniZezÚdurationZhead_pos_sfreq_quotientÚSZdzZdev_head_posÚraw_datarB   r–   rE   rE   rF   Ú%test_simulate_calculate_head_pos_chpi¤  s‚    ÿÿÿÿÿÿù
õ


ÿ"
ÿ"

  þ
ÿr  c                 C   s$   t | |d�}t| j||d�}t|ƒS )zWrap to facilitate change diff.©r&   )r   r   r<   r   )rB   r&   r±   r²   rE   rE   rF   Ú_calculate_chpi_coil_locsì  s    r  rü   ç{®Gáz¤?c                 C   sè   d}t | ƒ}t||ƒ}t dd„ |D ƒ¡}t||ƒ\}	}
t |	¡d }t|ƒdksVt‚t t|ƒ¡}t	t|ƒƒD ]&}t 
||¡}t |
| | ¡||< qpt |¡}t|| dƒ t |	 ¡d }t|ƒrä|| }t||ƒ t||ƒ d S )NTc                 S   s   g | ]}|d  ‘qS )r6   rE   )r¿   rÍ   rE   rE   rF   rÂ   ÷  s     z _check_dists.<locals>.<listcomp>r   rº   ru   )r   r   rQ   ro   r   Úwhererm   r@   ÚemptyÚrangeÚ	setdiff1dÚmedianr   )r<   Ú	cHPI_digsÚn_badZbad_lowZbad_highr’   ÚorigZhpi_coil_distancesÚnew_posÚmaskr™   Zgood_idxZmedsÚiiÚidxZbad_idxÚbadsrE   rE   rF   Ú_check_distsó  s$    


r   c               	   C   s2  t tddd�} t| dƒ}t|dd�\}}t|d dd	d
� t|d d d dddgdd
� t|d d d ddd
� t|d d d dddgdd
� t|d d d ddd
� t| j|d dd� ttdd�} t| dd�\}}t	t
 || j| j ¡ƒdksþt‚t|d ddd
� t|d d d dd d
� t|d d d d!d"d#gdd
� t| j|d ƒ t| ƒ}tjtd$d%�� t| j|d&d'� W 5 Q R X t
jj|d( d)d*�}||d( jd)  }|jt	|d+ ƒd,fk�sÎt‚t|d-ƒ td.|ƒ |d(  t
j¡ t| j|ƒ}|d/ jd0k�st‚t| j|ƒ}|jd1k�s.t‚d2S )3z#Test computing just cHPI locations.r,   T©r.   rà   r´   r/   r  r   g      "@r¦   rK   r7   r6   g …g¶é×“¿góó2Ìil?gõÌý›85°?rJ   r„   g?ÆÜï?r›   gøSã¥›Ä°¿g‡ÙÎ÷S³?g-Cëâ6:?ru   gòAÏfÕí?r~   )r  rß   r5   g      ø?r¶   g×£p=
×ï?r¨   g2U0*©�¿gøSã¥›Ä°?g’ËH¿}]?r®   rg   rM   )r®   ræ   rz   r|   rÖ   rº   g•dyáý¥=g‚vIhÂ%<=Úrrs)r   rº   rº   )r   rI   N)r
   r;   r¥   r  r   r   r<   r   rã   rm   rQ   r  rÖ   Z
first_timer@   r   rT   rU   rW   r   rë   rì   rí   r   ÚfillÚnanr   )rB   r¤   rÖ   r  Zcoil_amplitudesrñ   r²   ÚposrE   rE   rF   Ú%test_calculate_chpi_coil_locs_artemis  sL    
 ÿ ÿ  ÿ

r&  c                 C   s  d}ddl m} t| jdd�}| jd }|  |¡} | |¡}|| |ddd	�\}} |||ddd	�\}	}tj| dd
�} tj|dd
�}|df|dffD ]|\}
}|
D ]n}t t || ¡¡}t | | ¡}t || ¡}dt 	|| ¡ }|d |  k �r |d k sœn t
|ƒ‚qœq�dS )z>Assert that some frequencies are suppressed and others aren't.Tr   )ÚwelchrÕ   r»   r�   Zhannrb   )Znpersegr|   )rI   é<   )éýÿÿÿrº   iöÿÿÿr~   N)Zscipy.signalr'  r   r<   Úget_datarQ   r  Zargminrð   Úlog10r@   )ÚnewÚoldÚ
suppressedZretainedr’   r'  rÎ   r�   ÚfrÑ   r×   Zlimr  ZfidxZthis_newZthis_oldZsuppressionrE   rE   rF   Úassert_suppressed<  s"    


r0  c               
   C   s  t tddd�} dg| jd< |  ¡  |  ¡  dd¡}tƒ �}t| dd	dd
� W 5 Q R X | ¡ }d|ksht	‚d|kstt	‚|  dd¡ t t
ƒ dd¡ ¡ }|jddddddd� t| |ddƒ t| |t ddd¡dddgƒ | ¡ } tƒ �}t| dd	dd
� W 5 Q R X | ¡ }d|k�st	‚d|k�s$t	‚t t t ddd¡t ddd¡g¡¡}t| ||ddgƒ t tdd�} |  ¡ }| jd dk�s†t	‚tjtdd�� t| d	d� W 5 Q R X | j ¡ � d| jd< W 5 Q R X tjtdd�� t| d	d� W 5 Q R X tƒ �}t| dddd � W 5 Q R X | ¡ }d!|k�s*t	‚d"|k�s8t	‚t| |dgdd#d$gƒ t tdd%�} |  dd&¡ ¡ jd'dd(�} | j ¡ �4 d)| jd*< | jd+= | jd, d d-= | jd. d/= W 5 Q R X tƒ �}t| ddd0� W 5 Q R X tjtd1d�� t| d2d� W 5 Q R X d3| ¡ k�st	‚dS )4z!Test subtraction of cHPI signals.r,   Tr!  ZMEG0111r  r   r½   Fr¶   )Zinclude_liner«   r&   zNo average EEGz5 cHPI)r¼   r  ZeogZecgr  Úmiscé�   ip  éS   iD  r(  é   é–   z6 linei-  rß   Z	line_freqNzline_freq.*consider setting itrg   )r«   g      N@rf   r§   )r«   Zallow_line_onlyr&   z0 cHPIz1 lineé-   éK   r-   r~   g     À‚@)Znpadg      i@rÄ   Z	maxshieldre   ré   r^   rÿ   r·   zmust be > 0rz   z2 cHPI)r
   r;   r<   Zdel_projrÇ   rl   r$   r   r=   r@   Ússs_hpisubt_fnamerÅ   r   r%   r0  rQ   rÊ   ÚsortrÉ   rÆ   rT   rU   rÈ   rp   rW   Zresample)rB   Zraw_origrC   Zraw_cr.  rE   rE   rF   Ú!test_chpi_subtraction_filter_chpiQ  sv         ÿ ÿ
r:  c               	   C   sŒ   t tƒ} t| ƒ}t| j|ƒ}ttƒ}|dd…df  d  < t||ddddd� t|| jd	� t	t
ƒ} tjtd
d�� t| ƒ W 5 Q R X dS )z0Test extracting of cHPI positions from CTF data.NrN   i'  r  g      @r8   gyé&1¬|?râ   ©r<   zCould not findrg   )r   Úctf_chpi_fnamer   r   r<   r   Úctf_chpi_pos_fnamerš   r'   r
   Ú	ctf_fnamerT   rU   rÈ   )rB   r²   r–   Zmc_quatsrE   rE   rF   Útest_calculate_head_pos_ctf—  s    ÿr?  c               	   C   s*  t ttttƒ} t| jd ƒdks$t‚t| ƒ}|d j	dks>t‚t
|d dƒ t
d|d ƒ t| j|ƒ}|j	dkstt‚t|| jd	� t tƒ}t|jd
 d t d¡ƒ t|jd ƒdksºt‚tjtdd�� t|ƒ W 5 Q R X tjtdd�� t|dƒ W 5 Q R X tjtdd�� t|j|ƒ W 5 Q R X dS )z1Test calculation of head position using KIT data.re   r~   r"  )r7   r5   rº   r•   r8   r©   )r7   rI   r;  rê   r“   r›   r   zInvalid valuerg   znot find appropriatezSTI 014zno initial cHPIN)r   Ú	con_fnameÚ	mrk_fnameÚ	elp_fnameÚ	hsp_fnamerm   r<   r@   r   rí   r   r   r'   Úberlin_fnamer   rQ   ÚeyerT   rU   rW   rÈ   )rB   r²   r–   Z
raw_berlinrE   rE   rF   Útest_calculate_head_pos_kit¨  s$    rF  )ru   rv   rw   rJ   rx   )r›   )r¦   r8   r§   r1   r¨   r©   r~   N)r   rü   r  )iÚos.pathÚpathrO   ÚnumpyrQ   Znumpy.testingr   r   r   Zscipy.interpolater   Zscipy.spatial.distancer   rT   Zmner   r   Zmne.forward._compute_forwardr	   Zmne.ior
   r   r   r   r   r   Zmne.io.constantsr   Zmne.chpir   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zmne.datasetsr    Zmne.simulationr!   Zmne.transformsr"   r#   Z	mne.utilsr$   r%   r&   Zmne.vizr'   rA   ÚdirnameÚ__file__Úbase_dirr>  Zhp_fif_fnameZhp_fnamer  Z	data_pathrÆ   r;   rS   rk   r8  rù   rø   r<  r=  rã   rä   r@  rA  rB  rC  rD  Zrequires_testing_datarG   r\   rt   rš   r¥   r³   ÚmarkZslowtestrÏ   rÞ   rå   ró   rû   rý   r  r  r   r&  r0  r:  r?  rF  rE   rE   rE   rF   Ú<module>   s¶    D   ÿ
&

%    ÿ
=
          ý;
*
H
2
E
