U
    f»{jÇ�  ã                   @   sÞ  d dl mZ d dlmZ d dlZd dlZd dlm	Z	 d dl
m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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+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z; e)j<dd�Z<e =e<ddd¡Z>e =e<ddd¡Z?e =e<ddd¡Z@e =e<ddd¡ZAe =e<ddd¡ZBe =e<dddd¡ZCe =e<dd¡ZDeEdd d!�ZFd"d#„ ZGd•d'd(„ZHejIjJe)jKd)d*„ ƒƒZLejIjJe9d+ƒe)jKejI Md,d-d.d/d0g¡d1d2„ ƒƒƒƒZNe)jKejIjJejI Md3d4d5d6d7d8g¡d9d:„ ƒƒƒZOe)jKejI Md;d<¡ejI Md=d>¡d?d@„ ƒƒƒZPejIjJe)jKdAdB„ ƒƒZQejIjJe)jKejI MdCdDdEdFdGg¡dHdI„ ƒƒƒZRejI MdJdKdLdMdNdOdPdQdRg¡dSdT„ ƒZSejI MdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjg¡dkdl„ ƒZTejI Mdmdndodpdqdrdsdtdudvg	¡dwdx„ ƒZUejI Md3ejVdydzejIjJd{�d5d4ejVd|dejIjJd{�g¡d}d~„ ƒZWe)jKdd€„ ƒZXe)jKejI Md�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒd�dŽg¡d�d�„ ƒƒZYd‘d’„ ZZd“d”„ Z[dS )–é    )ÚdeepcopyN)Úlinalg)Úcdist)Úassert_array_almost_equalÚassert_array_equalÚassert_allcloseÚassert_array_less)Úapply_transÚinvert_transform)Úconvert_forward_solutionÚread_forward_solutionÚcompute_rankÚVolVectorSourceEstimateÚVolSourceEstimateÚEvokedArrayÚpick_channels_covÚread_vectorview_selection)Ú	make_lcmvÚ
apply_lcmvÚapply_lcmv_epochsÚapply_lcmv_rawÚ
BeamformerÚread_beamformerÚapply_lcmv_covÚ	make_dics)Ú_prepare_beamformer_input)Útesting)Ú	_get_args)Úset_current_comp)ÚFIFF)Úmake_inverse_operatorÚapply_inverse)Ú_assert_free_ori_match)Úsimulate_evoked)Úobject_diffÚrequires_versionÚcatch_loggingÚ_record_warningsF)ÚdownloadZMEGÚsamplezsample_audvis_trunc_raw.fifzsample_audvis_trunc-cov.fifz)sample_audvis_trunc-meg-eeg-oct-4-fwd.fifz%sample_audvis_trunc-meg-vol-7-fwd.fifzsample_audvis_trunc_raw-eve.fifÚlabelszAud-lh.labelZCTFzsomMDYO-18av.dsg»½×Ùß|û=gê-�™—‘=©ÚgradÚmagc                  O   s$   t | Ž }t|f|Ž}tj|ddd�S )NTF)ÚmegÚeeg)r   r   ÚmneZpick_types_forward)ÚargsÚkwargsÚfwd© r4   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/beamformer/tests/test_lcmv.pyÚ_read_forward_solution_meg.   s    r6   çš™™™™™¹¿ç333333Ã?Tc                    sì  t  t¡}t  t¡}t jjtdd�‰t  t	¡}	|rXt
t	dd�}
t
t	dddd�}t
tƒ}nd}
d}d}d| |  }} }dd	gˆjd
< tdƒ}t jˆjd|d�‰ ˆ ddd… ‰ ddg}‡fdd„|D ƒ}t‡ fdd„|D ƒƒrÞt‚t ˆ |g¡‰ ˆ ‡fdd„ˆ D ƒ¡ Š |ˆjd
< |�r"ˆj ¡  nˆ ¡  |�r|t jˆ||| |dd|td�	}|�r`|jddd� | dd¡ | ¡ }|j}nd}d}ˆj}t  t¡}g |d< t jj||dddddd�}|�rÐt j|ddd d!�}nd}ˆ||||||	|
||f
S )"zRead in data used in tests.T©Úpreload)Úsurf_oriF)Úforce_fixedr;   Úuse_cpsNé   zMEG 2443zEEG 053ÚbadszLeft-temporal)r.   Z	selectioné   éd   ée   c                    s   g | ]}ˆ j | ‘qS r4   ©Úch_names©Ú.0Úpick©Úrawr4   r5   Ú
<listcomp>Q   s     z_get_data.<locals>.<listcomp>c                 3   s   | ]}|ˆ kV  qd S ©Nr4   rE   )Úpicksr4   r5   Ú	<genexpr>R   s     z_get_data.<locals>.<genexpr>c                    s   g | ]}ˆ j | ‘qS r4   rC   )rF   ÚiirH   r4   r5   rJ   T   s     )Nr   )ÚprojZbaseliner:   ÚrejectéÈ   r   )ZnpadÚprojsçš™™™™™©?çš™™™™™¹?)r-   r,   r/   rO   Úrankç{®Gáz¤?g�Âõ(\�Â?Úerror)ÚtminÚtmaxÚverbose) r0   Ú
read_labelÚfname_labelZread_eventsÚfname_eventÚioÚread_raw_fifÚ	fname_rawr   Ú	fname_fwdr6   Úfname_fwd_volÚinfor   Ú
pick_typesÚanyÚAssertionErrorÚnpÚconcatenateÚpick_channelsZnormalize_projÚdel_projÚEpochsrP   ZresampleÚcropÚaverageZread_covÚ	fname_covÚcovZ
regularizeÚcompute_covariance)rX   rY   Zall_forwardÚepochsZepochs_preloadÚdata_covrO   ÚlabelÚeventsÚforwardÚforward_surf_oriÚforward_fixedÚforward_volZevent_idZleft_temporal_channelsZ	bad_picksr?   Úevokedrc   Ú	noise_covr4   )rL   rI   r5   Ú	_get_data4   s˜    


 ÿ   ÿ

ÿ
       þ
  ÿ   ÿ  ÿr{   c                  C   sü  t j t¡j} t  | t j| ddd�¡} |  ¡ � | jg g d� W 5 Q R X t  	t
¡}t  || d ¡}dd„ |d D ƒ}td	d
„ |D ƒƒ}|dks’t‚d}t  |t |¡ |dd| d  ¡}t j|dddd�}t j ||¡}t  | ¡}|jt |d ¡dd� t||| |dd�}|d }	|d }
t dd„ t|d |ƒD ƒ¡}t |¡d }t|
|d | ƒ ~t| ||dd�}t||dd�}|j|dd…t |¡f }|tjj |dd�dd…tj!f  }t "t #tj||	 dd�¡¡}t $|¡d k �sèt‚t  | ¡}t%j&t'd!d"�� t(| ||d#|d$d� W 5 Q R X t)ƒ }t*|ƒD �]”}| +¡  ,|j-| |j-| ¡}d|d%< t .|j|j¡|d  |d< t /|d ¡}|d |d  d&k �sœt‚t0ƒ �}t(| ||d#|dd'�}W 5 Q R X | 1¡ }d(|k�sØt‚t0ƒ �}t(| ||d#|ddd)�}W 5 Q R X | 1¡ }d(|k�st‚t2||ƒ}t2||ƒ}t3|t jƒ�s<t‚t3|t j4ƒ�sNt‚t5|j| 6¡ jƒ t t7|d |
|g ƒd*k ¡d }| 8tj$|j|dd…df dd�¡ |d  tj  |d ¡  < �q.t "t #tj||	 dd�¡¡}t $|¡d+k �søt‚dS ),zTest vector LCMV solutions.r,   r4   )r.   Úexclude)r?   rR   rD   c                 S   s   g | ]}|d  ddd… ‘qS )ÚvertnoNrQ   r4   )rF   Úsr4   r4   r5   rJ   ˆ   s     z$test_lcmv_vector.<locals>.<listcomp>Úsrcc                 s   s   | ]}t |ƒV  qd S rK   )Úlen)rF   Úvr4   r4   r5   rM   ‰   s     z#test_lcmv_vector.<locals>.<genexpr>é   çH¯¼šò×z>r   ç      ð?ZsfreqT)r<   r=   ÚcopyÚdataF)r†   Údiagr>   )ZnaveÚ	source_nnÚ	source_rrc                 S   s    g | ]\}}t  |d  |¡‘qS )r}   )rg   Zin1d©rF   r~   r�   r4   r4   r5   rJ   ™   s   ÿ)ÚlooseÚvector)Úpick_oriNéÿÿÿÿ©Úaxisé#   r�   ©ÚmatchrS   Úbadr‡   g     jø@)rZ   z498 sources)r�   rZ   ç{®Gáz”?é7   )9r0   r^   r_   r`   rc   Z	pick_inford   Z_unlockÚupdater   ra   Zpick_channels_forwardÚsumrf   ZSourceEstimaterg   Úeyer   ru   Zrestrict_forward_to_stcÚmake_ad_hoc_covr‡   r#   rh   ÚzipÚwherer   r    r!   r†   Zaranger   ÚnormÚnewaxisZrad2degZarccosÚmeanÚpytestÚraisesÚ
ValueErrorr   ÚlistÚranger…   rl   ÚtimesÚouterZsvdvalsr&   Úgetvaluer   Ú
isinstanceZVectorSourceEstimater   Ú	magnituder   Úappend)rc   ru   ÚverticesZ
n_verticesZ	amplitudeÚstcZforward_simrz   ry   rˆ   r‰   ÚmaskÚmappingÚinvZstc_vector_mneZmne_oriZ
mne_anglesrr   Zlcmv_oriÚtiÚthis_evokedÚvalsÚlogÚfiltersZfilters_vectorZ
stc_vectorÚidxZlcmv_anglesr4   r4   r5   Útest_lcmv_vectorz   s�    

 
ÿ ÿ

ÿ"
ÿÿ
 þ

"$ r¶   Zh5iozreg, proj, kind)ç{®Gáz„?TÚvolume)ç        Fr¸   )r·   FÚsurface)r¹   Trº   c           )   
   C   s®  t |d�\
}}}}}}	}
}}}|dkr,|
}n|}|dks<t‚t|j||||d�}t||ƒ}| dd¡ tjt |j	¡dd�}t 
|¡}|j	| }|jt 
|¡ }d	|  k r´d
k s¾n t|ƒ‚dt |¡  k rØdk sèn tt |¡ƒ‚|dk�rât|j||||ddd�}t||ƒ}| dd¡ tjt |j	¡dd�}t 
|¡}|j	| }|jt 
|¡ }|�rddnd}||  k �r€dk �sŠn t|ƒ‚|�r”dnd}|t |¡  k �r¶dk �sÆn tt |¡ƒ‚t |j	¡|j	k ¡ �sât‚t|j||||dd�}t||ƒ}| dd¡ tjt |j	¡dd�}t 
|¡}t |j	| ¡}|jt 
|¡ }|�rXd	nd}||  k �rtd
k �s~n t|ƒ‚dt |¡  k �rœdk �s¬n tt |¡ƒ‚t |j	¡|j	dd…dd…f< |dk�rt t¡}	|j|	|d dd�}|j|	|d dd�}tt || ¡dƒ |d |k�s,t‚t|jƒdk�s@t‚t|jd ƒ|�rVd nd!k�sbt‚t|jd" ƒd#k�szt‚|�r„d$nd%}d&t|ƒk�sšt‚d't|ƒk�s¬t‚|d( › d)�t|ƒk�sÈt‚d*t|ƒk�sÚt‚d+| t|ƒk�sðt‚t t| ƒd,¡}tjtd-d.�� | |¡ W 5 Q R X t|ƒ}t|tƒ�s<t‚t|tƒ�sLt‚t |d/ ƒ|d/< t |d/ ƒ|d/< t!||ƒd0k�s€t‚|dk�rŽdS tj"t#t|j||d1|dd� tj"t#t|j||d1|dd� tj"t#t|j|
|d1|dd� tj"t#t|j||d1|dd� tj"t#t|j||d1ddd2� t$|ƒ}| %|jdd… ¡ t|j||d1|d�}t|j||d1|d�}t||ƒ}t||ƒ}t&|j	|j	ƒ |�r¶| '¡  (¡ }tj"t#d3d.�� t)||ƒ W 5 Q R X | '¡  d!d¡} t)| |ƒ}t*|j| jƒ t+|j,d! |d d! d4 ƒ d|k�st‚|d= tjtd5d.�� t||ƒ W 5 Q R X t|j||d1|d�}t-||ƒ}!t-||d6d7�}"t+|!d! j	t.|"ƒj	ƒ | /¡  t|j0ƒt|!ƒk�s”t‚t 1|!d! j	¡}#|!D ]}$|#|$j	7 }#�q¨|#t|!ƒ }#t|j||d1|d�}t||ƒ}%t&|#|%j	ƒ t|j||d1||	d8�}t-||ƒ}&t&|&d! j	|!d!  2|	¡j	ƒ | '¡ }'d!|'d9 dd…< t|j||'d1|d�}t+|d: d!ƒ t3|d;d<„ |jd= D ƒƒ}(t|(d> ƒd?k�s–t‚t|j||(d1|d� dS )@z-Test LCMV with evoked data and single trials.©rO   rº   r¸   ©Úregrz   r•   Nr>   r�   ç{®Gáz´?r8   gÍÌÌÌÌÌì?g      @Únormal)r½   rz   r�   Úweight_normrV   gš™™™™™™?gìQ¸…ëÁ?gvƒôõ!”>çH¯¼šò×Š>gTäqs*É>ú	max-power)r½   rz   r�   çš™™™™™é?g      @r   rŸ   )Úmoder„   Zsrc_typeé   rR   é   r   r?   r@   é   é   ÚLCMVzunknown subjectZnsourcez vertz20 chzrank %sz
filters.h5z-lcmv.h5r’   rU   Ú r·   )rr   r½   rz   r�   zdo not match the projectionsr}   z(spatial filter does not contain src_typeT)Zreturn_generator)r½   rz   rs   r†   Úweightsc                 S   s   g | ]}|  d ¡r|‘qS ))Ú2Ú3)Úendswith)rF   Zch_namer4   r4   r5   rJ   ¯  s    
ÿz&test_make_lcmv_bem.<locals>.<listcomp>rD   Únamesr‚   )4r{   rf   r   rc   r   rl   rg   r˜   Úabsr†   Úargmaxr¥   ÚmaxÚallr0   r[   r\   Zextract_label_time_courser   r€   rD   ÚreprÚopÚjoinÚstrr    ÚwarnsÚRuntimeWarningÚsaver   r¨   r   Úintr$   r¡   r¢   r   ri   r   r…   rj   r   r   r   r«   r   ÚnextZdrop_badrt   Z
zeros_likeZin_labelr   ))Ztmp_pathr½   rO   ÚkindrI   rq   ry   rr   rz   rs   ru   rv   rw   rx   r3   r´   r¬   Ústc_powrµ   Úmax_stcrY   Z
stc_normalÚlowerZstc_max_powerZmean_stcZmean_stc_max_powrU   ÚfnameZfilters_readZ	evoked_chZstc_chZraw_projZuse_rawZstcsZstcs_Zstc_avgZthis_stcZ	stc_fixedZ
stcs_labelZzero_covZdata_cov_gradr4   r4   r5   Útest_make_lcmv_bemÒ   sZ   ÿ  ÿ


*

  þ


". ÿ

".

  ÿ  ÿÿ"
  ÿ  ÿ  ÿ  ÿ  þÿÿ


ÿ
ÿ
 ÿ
ÿ ÿÿrâ   zweight_norm, pick_ori)úunit-noise-gainrÂ   )rã   rŒ   )rã   N)ÚnairŒ   )NrÂ   c                 C   sÄ  t dd�\
}}}}}}}}}}d|ks*t‚d|ks6t‚tjddd�}tjd|d	d
d�}t |jd||¡}tjt	dd��< tj
tdd��" t|j||d||| ddd�	 W 5 Q R X W 5 Q R X t|j||d||| dd�}	t||	ƒ}
t|
tƒrð|
 ¡ }
nt|
ƒ}
t|
tƒ�st‚|
 dd¡ tj|
jdd�}t |¡}|
j| }|
jt |¡ }d|  k �r`dk �sjn t|ƒ‚d\}}|dk�rŒ|d9 }|d9 }|t |¡  k �rª|k �sÀn t|t |¡|fƒ‚dS )z!Test LCMV with sphere head model.Tr»   r/   r.   )r¹   r¹   r¹   r¾   )Zr0Zhead_radiusg      9@g      @g       @)ÚposÚsphereZmindistr|   NzSingular matrix detectedr’   zpositive semidefiniterT   FÚfull)r½   rz   rÀ   r�   Úreduce_rankrU   )r½   rz   rÀ   r�   rè   r•   r>   r�   r8   )r„   g      @rÁ   )r{   rf   r0   Úmake_sphere_modelÚsetup_volume_source_spaceÚmake_forward_solutionrc   r    r¡   r¢   rØ   rÙ   r   r   r¨   r   r©   rÐ   r   rl   rg   r˜   r†   rÑ   r¥   rÒ   )r�   rÀ   Ú_ry   rr   rz   ræ   r   Z
fwd_spherer´   Z
stc_sphererÞ   rµ   rß   rY   Zmin_Zmax_r4   r4   r5   Útest_make_lcmv_sphere¶  s\       ÿ      ý  þ




"
rí   rÀ   )Nrã   r�   )rÂ   r¿   c              
   C   sJ  t ƒ \
}}}}}}}}	}
}t|ddd� t|j|||| |d�}||fD ]þ}t||jƒ}| ¡  |d ¡}|jd |d< |j|d ksˆt‚t	||ƒ}|j
 ¡ dks¤t‚|jdks²t‚t|j
|jƒ}t||ƒ}|j
 ¡ dk sÜt‚t|j
j|jƒ}t||ƒ}|j
jd	k�st‚t |j
¡d
d
…tjf }| ¡ dk�s4t‚t||j
dd� qFd
S )z#Test LCMV source power computation.TF©r;   r…   )rz   rÀ   r�   rÏ   rR   r   )éò  r>   )rï   rï   Nçê-�™—q=©Úrtol)r{   r   r   rc   r   rD   r…   ri   rf   r   r†   ÚminÚshaper   r   ÚTrg   r‡   rž   r   )rÀ   r�   rI   rq   ry   rr   rz   rs   ru   rv   rw   rx   r´   ro   Zthis_covr±   r¬   ZevZstc_1Zstc_2r†   r4   r4   r5   Útest_lcmv_covë  s6    ÿ   ÿ


rö   c               	   C   s   t jjtdd�} |  | jdd… ¡ t j| dd�dd… }t j| |ddd	�}| ¡ }t  	|¡}t  
|jdt jd
d�t  ¡ ¡}tjtdd�� t|j||ƒ W 5 Q R X t|j||dd�}d|ksÂt‚|j ¡ }t|dƒ tjtdd�� t|||ƒ W 5 Q R X dS )z-Test interpolation with compensated CTF data.Tr9   NéF   çš™™™™™É?)Údurationr@   r7   ©rX   rY   g      >@)rå   rè   r’   )rè   rË   r>   zCompensation grade .* not match)r0   r^   Zread_raw_ctfÚ	ctf_fnamerG   rD   Zmake_fixed_length_eventsrk   rm   rp   rë   rc   rê   ré   r    r¡   r¢   r   rf   r…   r   ÚRuntimeError)rI   rt   rq   ry   rr   r3   r´   Z	info_compr4   r4   r5   Útest_lcmv_ctf_comp  s$    


þ

rý   zproj, weight_norm)Trã   )Frã   )TN)Trä   c                 C   s  t jjtdd�}t  |¡}|jdd� t|jƒdks8t‚t j	||dd| d�}t
jtdd��$ t j|d	d
�}t j|ddd�}W 5 Q R X t  t¡}t|j||d|ddddd�	}d}	|d |	ks¾t‚t
jtdd�� t|j||ddd� W 5 Q R X |jdd� tdd|d�}
t|j||fd|i|
—Ž}t|j||fddi|
—Ž}t  |j¡}t|j||fd|i|
—Ž}| ¡ }t||ƒ}t||ƒ}t||ƒ}|dk�r¤t |d d	 ¡}nd}t|j|j| ƒ t |d |d ¡}t |d |d ¡| }t t || ¡¡d }t|||dd� |dk�rd }nd}ttjj|jd	d!�| tjj|jd	d!�d"d#� ttjj|jd	d!�| | tjj|jd	d!�d"d#� |dk�r²||fD ]}t|j  ¡ d$d%d#� �q”nf|dk�râ||fD ]}t|j  ¡ d&d'd#� �qÄn6|dk�sðt‚t|j  ¡ d(d'd#� t|j  ¡ d)d%d#� dS )*z Test LCMV with and without proj.Tr9   ©r.   i1  N)r:   rO   zToo few samplesr’   r   )rY   rV   r8   rú   rS   rÂ   rä   )r½   rz   r�   rÀ   rU   rZ   i.  rU   zseveral sensor typesr¼   r,   )r½   r�   rÀ   rz   rã   r†   r„   rË   Zwhitenerrƒ   )Úatolrò   g¸…ëQ¸¾?r�   g333333Ó?rñ   gã¥›Ä °â?rø   g„÷CÖ”^>rT   g%mŒ�qk=gV-²�ïÇ?)!r0   r^   r_   r`   Úfind_eventsrd   r€   rD   rf   rk   r    rØ   rÙ   rp   r   ra   r   rc   r¡   r¢   Údictrš   rm   r   rg   Úsqrtr   r†   ÚdotrŸ   r   r�   Ústd)rO   rÀ   rI   rt   rq   rz   rr   ru   r´   Z	want_rankr2   Zfilters_covZfilters_nocovZad_hocZfilters_adhocry   Zstc_covZ	stc_nocovZ	stc_adhocÚscaleÚaÚbrÿ   Zadhoc_scaler¬   r4   r4   r5   Útest_lcmv_reg_proj#  s”    


   þÿÿÿÿÿÿÿ




 þ þ

r  z.reg, weight_norm, use_cov, depth, lower, upper)rS   rã   TNéa   éb   )rS   rä   TNé`   r
  )rS   rä   TrÃ   r  r
  )rS   NTNéJ   éL   )rS   NTrÃ   éZ   é]   )rS   rã   FNéS   éV   )rS   rã   FrÃ   r  r  )r¹   rã   TNr‘   éc   c                 C   s¢   | \}}}	}
}|s"|j dd� d}	|
d jd t|
d ƒks@t‚t|t|j||
||	||d�ƒj}t 	|¡}|tj
|dd�k ¡ d	 }||  kr˜|ksžn t‚dS )
z2Test localization bias for fixed-orientation LCMV.r,   rþ   Nr†   r   rÏ   )ÚdepthrÀ   r�   rA   )rd   rô   r€   rf   r   r   rc   r†   rg   rÐ   rÑ   rŸ   )Úbias_params_fixedr½   rÀ   Úuse_covr  rà   Úupperry   r3   rz   rr   ÚwantÚlocÚpercr4   r4   r5   Útest_localization_bias_fixedu  s     þ

r  zNreg, pick_ori, weight_norm, use_cov, depth, lower, upper, lower_ori, upper_ori)	rS   rŒ   úunit-noise-gain-invariantFNé   é   g=
×£p=ê?gáz®Gáê?)	rS   rŒ   r  TNé(   é*   ç¸…ëQ¸î?ç\�Âõ(\ï?)	rS   rŒ   rã   FNé   é   gHáz®Gé?gìQ¸…ëé?)	rS   rŒ   rã   TNr‘   é%   r!  ç®Gáz®ï?)	rS   rŒ   rä   TNr‘   r$  r!  r%  )	rS   rŒ   NTNé   r#  ç
×£p=
ï?r!  )	rS   rŒ   NTrÃ   é'   é+   r'  r!  )	rS   rÂ   r  FNrÇ   rÈ   r   r   )	rS   rÂ   rã   FNrÇ   rÈ   r   r   )	rS   rÂ   rä   TNé   é   r   r   )	rS   rÂ   NTNé   é
   r   r   )	rS   rÂ   NTrÃ   é   é   r   r   )	rS   NNTrÃ   r  r  r   r   )	r¹   rŒ   NTNé   r+  r   r'  )	r¹   rŒ   r  TNé4   é6   gffffffî?r   )	r¹   rŒ   rã   TNé,   é0   r'  r%  )	r¹   rŒ   rä   TNr3  r4  r'  r%  )	r¹   rÂ   NTNr#  r.  r   r   )	r¹   rÂ   r  TNr‘   r$  r   r   )	r¹   rÂ   rã   TNr‘   r$  r   r   )	r¹   rÂ   rä   TNr‘   r$  r   r   c
                 C   sî   | \}
}}}}|s"|
j dd� d}tƒ �  t|
j|||||||d�}W 5 Q R X t|
|ƒj}|dkr~| ¡ tjj	|ddd� }nd}|dkrštjj	|dd	�nt 
|¡}tj|d
d	�}||k ¡ d }||  krÖ|ksÜn t‚t||||	ƒ dS )z1Test localization bias for free-orientation LCMV.r,   rþ   N©r�   rÀ   r  rŒ   r>   T©r�   Zkeepdimsr�   r   rA   )rd   r'   r   rc   r   r†   r…   rg   r   r�   rÐ   rÑ   rŸ   rf   r"   )Úbias_params_freer½   r�   rÀ   r  r  rà   r  Ú	lower_oriÚ	upper_oriry   r3   rz   rr   r  r´   r  ÚoriÚmax_idxr  r4   r4   r5   Útest_localization_bias_free’  s(     ý"r<  zDreg, weight_norm, use_cov, depth, lower, upper, lower_ori, upper_ori)rS   r  FNé&   r  çHáz®Gá?çš™™™™™á?)rS   rã   FNr=  r  r>  r?  )rS   rä   TNé8   é9   çáz®Gáâ?ç…ëQ¸…ã?)rS   NTNé   r  çìQ¸…ëá?ç=
×£p=â?)rS   NTrÃ   r  r)  rE  rF  )r¹   NTNé2   é3   g�Âõ(\�â?rB  )r¹   r  TNéI   éK   rB  rC  )r¹   rã   TNrI  rJ  rB  rC  )r¹   rä   TNrI  rJ  rB  rC  c
              
   C   sŽ  | \}
}}}}|d }|s*|
j dd� d}t|
j||||d||d�}t|
|ƒj}|d }|jdksft‚t |¡}tj	|d	d
�}||k}| 
¡ d }||  kr¦|ks¬n t‚|d tjks¾t‚t dd„ t|d |d ƒD ƒ¡}|| }tt|d ƒ|dd�}ttjj|dd
�ddd� ttjj|dd
�ddd� t || ||   d¡¡}t|dƒ td	|ƒ t 
|¡}||  k �r„|	k �sŠn t‚dS )z7Test orientation selection for bias for max-power LCMV.r>   r,   rþ   NrÂ   r5  Úmax_power_ori)éö   rÆ   r   r�   rA   Zcoord_framec                 S   s   g | ]\}}|d  | ‘qS )Únnr4   rŠ   r4   r4   r5   rJ   ñ  s     z.test_orientation_max_power.<locals>.<listcomp>r   r«   Z
mri_head_tF)Úmoveg�íµ ÷Æ°>©rÿ   rð   rŽ   )rd   r   rc   r   r†   rô   rf   rg   rÐ   rÑ   rŸ   r   ZFIFFV_COORD_HEADrh   r›   r	   r
   r   r   r�   r˜   r   )r  r7  r½   rÀ   r  r  rà   r  r8  r9  ry   rì   rz   rr   r  r3   r´   r  r:  r;  r­   r  rM  ÚdotsÚgotr4   r4   r5   Útest_orientation_max_powerÉ  s@     ý
ÿ


rR  rä   rÂ   )Zmarksrã   c                 C   s¶   | \}}}}}t |t|j||d|||dd�ƒj}t |t|j||d|||dd�ƒj}	|j|	jksbt‚t||	ƒD ]D\}
}|t t 	|
 
¡ | 
¡ ¡¡9 }tj |
¡d }t|
||d� qldS )zATest that depth weighting does not matter for normalized filters.rS   r¹   r5  r„   rƒ   rO  N)r   r   rc   r†   rô   rf   r›   rg   Úsignr  Zravelr   r�   r   )r7  rÀ   r�   ry   r3   rz   rr   rì   r†   Z
data_depthZd1Zd2rÿ   r4   r4   r5   Útest_depth_does_not_matterý  s4          þ
      þ
rT  c                  C   s°   t j t¡ ¡ } t j | ¡}t  |¡}~ |jdd� t	|j
ƒdksFt‚t  ||¡}t j|dd�}t  t¡}t||jd�}|ddiksˆt‚d|d	d
fD ]}t|j|||d� q”d
S )zTest LCMV on maxfiltered data.r-   rþ   éf   r   )rX   )rc   éG   rc   rç   N)rU   )r0   r^   r_   r`   Zfix_mag_coil_typesZpreprocessingZmaxwell_filterr   rd   r€   rD   rf   rk   rp   r   ra   r   rc   r   )rI   Zraw_sssrt   rq   rr   r3   rU   Zuse_rankr4   r4   r5   Útest_lcmv_maxfiltered  s    

rW  z%pick_ori, weight_norm, reg, inversion)rŒ   r  rS   Úmatrix)rŒ   r  rS   Úsingle)rŒ   rã   rS   rX  )rŒ   rã   rS   rY  )rŒ   rã   r¹   rX  )rŒ   rã   r¹   rY  )rŒ   rä   rS   rX  )rÂ   rã   rS   rX  )rÂ   rã   r¹   rY  )rÂ   rã   rS   rY  )rÂ   r  rS   rX  )r¿   rã   rS   rX  )r¿   rä   r¹   rX  c              
   C   s`  t jjtdd�}t  |¡}|jdd� t|jƒdks8t‚t j	||ddd�}t j
|ddd	�}t j|jtd
d
d�d�}t  t¡}	t|	ddd� d}
t||| ||
|d�}|dkrê| dkrê|dkrêtjtdd�� t|j|	|f|Ž W 5 Q R X dS t|j|	|f|Ž}t|j|	dd||
ddd�\}}}}}}}}|j\}}|d }||df|_| ddd¡}t||ƒ dS )z,Test unit-noise-gain filter against formula.Tr9   r-   rþ   rU  NrV   r8   rú   r„   r+   )r  Frî   )r½   rz   r�   rÀ   rU   Ú	inversionrY  rŒ   r  z
Cannot user’   )rz   rU   ZpcaÚexprÆ   r>   r@   r   )r0   r^   r_   r`   r   rd   r€   rD   rf   rk   rp   rš   rc   r  r   ra   r   r    r¡   r¢   r   r   rô   Z	transposeÚ_assert_weight_norm)r�   rÀ   r½   rZ  rI   rt   rq   rr   rz   ru   rU   r2   r´   rì   ÚGÚ
n_channelsÚ	n_sourcesr4   r4   r5   Útest_unit_noise_gain_formula(  sJ    

  ÿÿ      þ
r`  c                 C   s‚  | d | d  }}| d dkr:|t j }|dk	r:|t j }|dk	rP|dt jf }| d }| d }|jd	 }|d
krŒ| d }| d r†dnd}n|dkr¢|jd }d}t|ƒD �]Ð\}	}
|
 |||¡}
| d dkrèt j|||	  ddd�}n(| d dk�r|dd…dd…f }n|}|dk�r(| |d|¡}|
j|j  k�rJ|||fk�sPn t‚t  |
|
 ¡  	dd¡¡}t j
t  |¡t j |
jd dd�}|dk�rà|dk�ràt j||dd��r´t‚| |d¡dd…dd|d …f }t  |¡}|dk�rd|jd  }||jd 9 }nd}t|||dd� |dkrª|dkrª|
| 	dd¡ }t  |ddd¡}t  t jd|¡}t  |¡jd  }t|||d!d� qªdS )"z=Check the result of the chosen weight normalization strategy.rË   rK  rÝ   rÉ   N.rÀ   rZ  r@   rX  r_  Zis_free_orirÆ   r>   rY  r�   rÂ   Tr6  r¿   rŽ   éþÿÿÿr   r�   )rã   rä   rƒ   rO  rä   zw @ w.conj().T = I)rÿ   Úerr_msgr  rð   u   G.T @ w = Î¸I)rg   rž   rô   Ú	enumerateZreshaper˜   rf   ÚmatmulZconjZswapaxesÚrepeatr™   ZallcloseZ	ones_likeZflatr   ZdiagonalZapply_along_axisZdiagflatrŸ   Úreal)r´   r]  rË   rK  rÀ   rZ  r^  r_  Zn_orientZwiÚwZuse_GrQ  Zdesiredrÿ   Zdiagsr  r4   r4   r5   r\  W  sV    




(""

r\  c                  C   sL   t tƒ} t tƒ}d|| d¡< d|| d¡< | | d¡¡ | |ksHt‚dS )zTest LCMV/DICS API equivalence.rr   Úcsdrz   Z	noise_csdZreal_filterN)r   r   r   ÚindexÚpoprf   )Z
lcmv_namesZ
dics_namesr4   r4   r5   Útest_api™  s    rk  )r7   r8   TTTTT)\r…   r   Úos.pathÚpathrÕ   r    Únumpyrg   Zscipyr   Zscipy.spatial.distancer   Znumpy.testingr   r   r   r   r0   Zmne.transformsr	   r
   r   r   r   r   r   r   r   r   Zmne.beamformerr   r   r   r   r   r   r   r   Z"mne.beamformer._compute_beamformerr   Zmne.datasetsr   Z	mne.fixesr   Zmne.io.compensatorr   Zmne.io.constantsr   Zmne.minimum_normr    r!   Z#mne.minimum_norm.tests.test_inverser"   Zmne.simulationr#   Z	mne.utilsr$   r%   r&   r'   Z	data_pathrÖ   r`   rn   ra   rb   r]   r\   rû   r  rP   r6   r{   ÚmarkZslowtestZrequires_testing_datar¶   Zparametrizerâ   rí   rö   rý   r  r  r<  rR  ÚparamrT  rW  r`  r\  rk  r4   r4   r4   r5   Ú<module>   s>  ((
ÿ
ÿ
ÿ      ÿ
FVü \û,üJ÷
êþ
öÿ
'ü

óB