U
    f»{jç  ã                   @   sr   d Z ddlZddl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„ Zddd„Zdd„ ZdS )zCreate coordinate transforms.é    Né   )Úcombine_transformsÚinvert_transformÚ	TransformÚ_quat_to_affineÚ_fit_matched_pointsÚapply_transÚget_ras_to_neuromag_trans)Úloggeré   )ÚFIFFé   )ÚCTFc                 C   s   t t|| t|||ƒƒƒS )z)Make a transform from cardinal landmarks.)r   r   r	   )ÚfroÚtoZr_lpaZr_nasionZr_rpa© r   úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/ctf/trans.pyÚ_make_transform_card   s
      
ÿr   ç-Cëâ6?c           
      C   sÄ   |j d |j d   kr dks&n t‚tt||ƒd ƒ}t d¡ t||ƒD ]j\}}t||ƒ}tj	 
|| ¡}	t dtd| ƒtd| ƒ td| ƒ d|	 f  ¡ |	|krLtdƒ‚qLt| ||ƒS )zBPerform an alignment using the unit quaternions (modifies points).r   r   r   z2    Quaternion matching (desired vs. transformed):z_    %7.2f %7.2f %7.2f mm <-> %7.2f %7.2f %7.2f mm (orig : %7.2f %7.2f %7.2f mm) diff = %8.3f mmiè  z@Something is wrong: quaternion matching did not work (see above))ÚshapeÚAssertionErrorr   r   r
   ÚinfoÚzipr   ÚnpZlinalgZnormÚtupleÚRuntimeErrorr   )
Z
from_frameZto_frameZfrom_ptsZto_ptsZdiff_tolZtransr   r   ZrrÚdiffr   r   r   Ú_quaternion_align   s     &


ÿÿþ
r   c                    sî  d } } } } } }}|dk	rÚ|D ]l}	|	d r(|	d t jkr(|dkr^|	d tjkr^|	}q(|dkrz|	d tjkrz|	}q(|dkr(|	d tjkr(|	}q(|dks®|dks®|dkr¶tdƒ‚tdd|d |d |d ƒ}
t|
ƒ}t	 
d	¡}d
d
dg|dd…df< dt	 d¡ }||d< | |d< ||d< ||d< tdd|ƒ}tƒ ‰tƒ ‰ tjtjtjtjf}|dk	�rš|D ]’}	|	d �rd|	d t jk�r´|D ]*}|ˆk�r†|	d |k�r†|	d ˆ|< �q†n@|	d t jk�rd|D ]*}|ˆ k�rÈ|	d |k�rÈ|	d ˆ |< �qÈ�qdt‡fdd„|dd… D ƒƒ�r tdƒ‚t‡ fdd„|dd… D ƒƒ�rHtdƒ‚‡ ‡fdd„|D ƒ}t	 ‡fdd„|D ƒ¡}t	 ‡ fdd„|D ƒ¡}tdd||ƒ}|dk	�rÎ|dk	�rÎt||ddƒ}tt|ƒ|ddƒ}t|||||d�}t d¡ |S ) z/Figure out the necessary coordinate transforms.NZvalidZcoord_frameÚkindz?Some of the mandatory HPI device-coordinate info was not there.ÚheadZctf_headÚré   g        gR¸…ëQÈ?r   g      à?g       @)r   r   )r   r   )r   r   )r   r   Zctf_megZmegc                 3   s   | ]}|ˆ kV  qd S ©Nr   ©Ú.0r   ©Úh_ptsr   r   Ú	<genexpr>_   s     z,_make_ctf_coord_trans_set.<locals>.<genexpr>éÿÿÿÿc                 3   s   | ]}|ˆ kV  qd S r"   r   r#   ©Úd_ptsr   r   r'   b   s     z=Some of the mandatory HPI head-coordinate info was not there.c                    s    g | ]}|ˆkr|ˆ kr|‘qS r   r   r#   ©r*   r&   r   r   Ú
<listcomp>e   s     ÿz-_make_ctf_coord_trans_set.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r   r   r#   r%   r   r   r,   g   s     c                    s   g | ]}ˆ | ‘qS r   r   r#   r)   r   r   r,   h   s     )Z
t_dev_headZt_ctf_dev_ctf_headZt_ctf_head_headZt_ctf_dev_devZt_ctf_dev_headz+    Coordinate transformations established.)r   ZFIFFV_MNE_COORD_CTF_HEADr   ZCTFV_COIL_LPAZCTFV_COIL_RPAZCTFV_COIL_NASr   r   r   r   ÚeyeÚsqrtr   ÚdictZCTFV_COIL_SPAREZFIFFV_MNE_COORD_CTF_DEVICEÚanyÚarrayr   r   r
   r   )Zres4ZcoilsZlpaZrpaZnasZT1ZT2ZT3ZT5ÚpÚtÚRÚvalZT4Úkindsr   Z	use_kindsZr_headZr_devÚsr   r+   r   Ú_make_ctf_coord_trans_set+   sz    ÿ  ÿ

ÿ

   ÿ
r8   )r   )Ú__doc__Únumpyr   Z
transformsr   r   r   r   r   r   r	   Úutilsr
   Ú	constantsr   r   r   r   r8   r   r   r   r   Ú<module>   s   $
