U
    f»{jLJ  ã                   @   sÌ   d dl Zd dlmZ d dlZd dlZddlmZm	Z	 ddl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mZ ddlmZ ddlmZmZmZ eddd„ƒZddd„ZG dd„ deƒZdS )é    Né   )Ú_load_mne_locsÚ	_read_posé   )ÚloggerÚwarnÚverboseÚ_check_fnameé   ©Ú_read_segments_file)ÚBaseRaw)Ú_empty_info)Ú_make_dig_pointsÚDigPoint)ÚFIFF)Úget_ras_to_neuromag_transÚapply_transÚ	TransformFTc                 C   s   t | ||||d�S )a�  Read Artemis123 data as raw object.

    Parameters
    ----------
    input_fname : str
        Path to the data file (extension ``.bin``). The header file with the
        same file name stem and an extension ``.txt`` is expected to be found
        in the same directory.
    %(preload)s
    %(verbose)s
    pos_fname : str or None (default None)
        If not None, load digitized head points from this file.
    add_head_trans : bool (default True)
        If True attempt to perform initial head localization. Compute initial
        device to head coordinate transform using HPI coils. If no
        HPI coils are in info['dig'] hpi coils are assumed to be in canonical
        order of fiducial points (nas, rpa, lpa).

    Returns
    -------
    raw : instance of Raw
        A Raw object containing the data.

    See Also
    --------
    mne.io.Raw : Documentation of attribute and methods.
    )Úpreloadr   Ú	pos_fnameÚadd_head_trans)ÚRawArtemis123)Úinput_fnamer   r   r   r   © r   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/artemis123/artemis123.pyÚread_raw_artemis123   s     ÿr   c              	   C   sÚ  t  | ¡d } | d }t d¡ dddddd	d
g}tƒ }g |d< d|d< g |d< t|dƒ��œ}d}|D �]Š}| ¡ rf|dkrˆ| d¡rˆqf| d¡r˜d}qf| d¡r¨d}qf| d¡r¸d}qf| d¡rÈd}qf| d¡rØd}qf| d¡rèd}qf|dk�r*| ¡  d¡}t	|ƒdk�r| 
d¡ |d ||d < qf|dk�r˜| ¡  d¡}t	|ƒdk�rdtd| d|  ƒ‚tƒ }	t||ƒD ]\}
}||	|
< �qt|d  
|	¡ qf|dk�r¼d |d | ¡ f |d< qf|dk�rØt| ¡ ƒ|d!< qf|dkrf|d  
| ¡ ¡ qfW 5 Q R X d"D ] }
||
 d#k�rtd$|
 ƒ �q|d �r:td%|
 ƒ tt|d& ƒƒ}z4tj t  | ¡ d'¡d d(¡}t | ¡ ¡df}W n tk
�r˜   d)}Y nX zd*t|d+ ƒi}W n tk
�rÌ   d*di}Y nX d}d,D ]}
|d- |
||
 ¡7 }�qÖ|d. |d ¡7 }| ||||d/ d0œ¡ d1d2d3d4d5d6g}d7d8d9d:d;d<g}tƒ }g |d=< g |d>< t|d ƒD �]\}}t|d ƒ|d |d |d d?tjtjd@œ}|dA dk�r¼dB|dA< |d>  
|dC ¡ |  |d t! "dD¡¡|dE< |d  dF¡�rtj#|dG< tj$|dH< tj%|dI< tj&|dJ< �n|d |k�rJtj'|dG< tj(|dH< tj%|dI< tj&|dJ< nÚ|d |k�r‚tj)|dG< tj(|dH< tj%|dI< tj&|dJ< n¢|d  dK¡�rÄtj*|dG< tj+|dH< tj,|dI< |d>  
|dC ¡ n`|d  dL¡�rtj*|dG< tj,|dI< |d  dM¡�rtj-|dH< n
tj+|dH< ntdNdO|d   ƒ‚|dA  dP|dJ  9  < tj|dJ< |d=  
|¡ |d
 dQk�r^|d>  
|dC ¡ �q^t.t/|d> ƒƒ|d>< tƒ }tƒ tƒ tƒ tƒ g|dR< tƒ tƒ tƒ tƒ g}dSdTdUdVg}dW}|dX dYk�rêdZd[d\d]g}nd^d_d`d]g}t0dƒD ]Ž}|d || da< || || db< | 1|dc|d f || ¡}||| dd< ||de|d f  dfk�rxdg|dR | dg< ndhg|dR | dg< �qþ||di< dR|ig|dj< |d)k	�r¼t2|ƒ|dk< ng |dk< dl|_3| 4¡  ||fS )mz1Generate info struct from artemis123 header file.r   ú.txtzReading header...ÚnameZscalingZFLL_GainZFLL_ModeZFLL_HighPassZFLL_AutoResetZFLL_ResetLockZfilter_histÚ ÚcommentsZchannelsÚrr
   zDAQ Mapz<endz<start main header>r   z<start per channel header>z<start comments>r   z<start length>é   z<start filtering history>é   ú	é   zError parsing line 
	:%s
zfrom file %sz%s%sÚnum_samples)zTemporal Filter Active?zDecimation Active?zSpatial Filter Active?ÚFALSEz %s - set to but is not supportedz4Non-Empty Filter history found, BUT is not supportedzDAQ Sample RateÚ_z%Y-%m-%d-%Hh-%MmNÚidz
Subject ID)ÚPurposeZNotesz{} : {}
zComments : {}zProject Name)Ú	meas_dateÚdescriptionÚsubject_infoZ	proj_nameZREF_001ZREF_002ZREF_003ZREF_004ZREF_005ZREF_006ZREF_007ZREF_008ZREF_009ZREF_010ZREF_011ZREF_012ZchsZbadsg      ð?)ÚcalÚch_nameZlognoZscannoÚrangeÚunit_mulÚcoord_framer.   g™JÉÊ<4 >r/   é   ÚlocZMEGZ	coil_typeÚkindÚunitr1   ZREF)ÚAUXÚTRGZMIOr8   zChannel does not match expectedz channel Types:"%s"é
   ÚTRUEÚ	hpi_coilsZMIO_001ZMIO_003ZMIO_009ZMIO_011zHead Tracking %s %dZsfreqiè  éŒ   é–   é    é(   i¼  iî  i   ÚnumberZ
drive_chanZ	FrequencyZ	coil_freqZChannelZOFFÚ
event_bitsé   Úhpi_subsystemZhpi_measÚdigF)5ÚopÚsplitextr   ÚinfoÚdictÚopenÚstripÚ
startswithÚsplitÚlenÚappendÚIOErrorÚzipÚintr   r   ÚfloatÚdatetimeÚstrptimeÚbasenameÚcalendarÚtimegmÚutctimetupleÚ	ExceptionÚ
ValueErrorÚformatÚupdater   Ú	enumerater   ZFIFF_UNITM_NONEÚFIFFV_COORD_DEVICEÚgetÚnpÚzerosZFIFFV_COIL_ARTEMIS123_GRADZFIFFV_MEG_CHZFIFF_UNIT_TZFIFF_UNITM_FZFIFFV_COIL_ARTEMIS123_REF_MAGZFIFFV_REF_MEG_CHZFIFFV_COIL_ARTEMIS123_REF_GRADZFIFFV_COIL_NONEZFIFFV_MISC_CHZFIFF_UNIT_VZFIFFV_STIM_CHÚlistÚsetr0   Úpopr   Z	_unlockedZ_update_redundant)Úfnamer   ÚheaderZ	chan_keysÚheader_infoZfidZsectionFlagÚlineÚvaluesÚtmpÚkÚvrG   Údater+   r-   ÚdescZref_mag_namesZref_grad_namesZloc_dictÚiZchanÚtZhpi_subr;   Zdrive_channelsZkey_baseZdefault_freqsZ	this_freqr   r   r   Ú_get_artemis123_info6   sP   

 ÿ
ÿÿ








ÿ
ÿ


 ÿ
ý  ÿ  ÿ  ý














ÿ
ÿ
rq   c                       s.   e Zd ZdZed	‡ fdd„	ƒZdd„ Z‡  ZS )
r   a  Raw object from Artemis123 file.

    Parameters
    ----------
    input_fname : str
        Path to the Artemis123 data file (ending in ``'.bin'``).
    %(preload)s
    %(verbose)s

    See Also
    --------
    mne.io.Raw : Documentation of attribute and methods.
    FNTc           +   	      sÎ  ddl m} ddlm}m}m}	 t|dddƒ}t |¡\}
}|dkrN|
d	 }n|d	kr^t	d
ƒ‚t 
|¡stt	d| ƒ‚t||d�\}}| dd¡d g}tt| ƒj|||g|g|d|d� |�rÊd}|d d D ]}|d dgkrÎ|d7 }qÎ|dk �rtd| d ƒ �nÂ| ¡ �, tdd„ t|ƒD ƒtddƒd�g|d< W 5 Q R X || ddddd�}t|d ƒdk�sjt‚|| j|ƒ}| ¡ � d |d< W 5 Q R X |d  d }|d! d }g }t|ƒD ]@\}}d"}|d#k �rÞ| |¡ |d$7 }t ||d |f ¡ �q¶tj||dd%�}tj||dd%�}|d k	�r8t d&d„ | j d'g ¡D ƒ¡}t|ƒt|ƒk�rnd(}t	|t|ƒt|ƒf ƒ‚|	||ƒ\}}}ttjtj |ƒ| jd)< t|ƒD ]4\}}||d tj!tjd*œ}| jd'  t"|ƒ¡ �qœ||| || ƒ} |||ƒ}!t #| |! ¡}"|" $¡ d+ }#d,}|d-| 7 }|d.d/|" $¡   7 }t |¡ nÈt d0¡ |d }$|d1 }%|d }&t%|$|%|&ƒ}'| j ¡ � ttjtj |'ƒ| jd)< W 5 Q R X t&|'|$ƒ}$t&|'|%ƒ}%t&|'|&ƒ}&t&| jd) |ƒ}(| j ¡ � t'|$|%|&|(d2�| jd'< W 5 Q R X t ddd1g¡}d3}#tƒ })g }*t|ƒD ]&\}}|* ||d tj!tjd*œ¡ �q|*|)d4< | jd) |)d5< |d |)d6< t (d¡d |)d7< |#|)d8< d#|)d9< |)d8 d3k�r¨td:d;d<|" $¡    d= ƒ | j ¡ � |)g| jd< W 5 Q R X d S )>Nr   )Úcdistr   )Úcompute_chpi_amplitudesÚcompute_chpi_locsÚ_fit_coil_order_dev_head_transÚreadTr   r   z.binz3Valid artemis123 files must end in "txt" or ".bin".z%s - Not Found)r   r&   r   Zsingle)Ú	filenamesZ
raw_extrasÚ
last_sampsZorig_formatr   rC   r;   rA   rB   z,%d HPIs active. At least 3 needed to performz3head localization
 *NO* head localization performedc                 S   s&   g | ]}t t d ¡tj|d d�‘qS )r   r   )r!   r2   Úident)rH   r`   ra   r   r^   )Ú.0Úiir   r   r   Ú
<listcomp>X  s   ýýz*RawArtemis123.__init__.<locals>.<listcomp>ZmegÚhead)Ú
dig_pointsÚcoord_transZhpi_resultsg      Ð?)ZtminZtmaxZt_windowZ
t_step_minÚtimesZgofsZrrsz.HPI coil %d - location goodness of fit (%0.3f)g\�Âõ(\ï?z *Removed from coregistration*)Zaxisc                 S   s"   g | ]}|d  t jkr|d ‘qS )r5   r!   )r   ÚFIFFV_POINT_HPI)rz   Údr   r   r   r|   s  s   þrD   zDnumber of digitized (%d) and active (%d) HPI coils are not the same.Z
dev_head_t)r!   ry   r5   r2   gš™™™™™ñ?zHPI-Dig corrregsitration
z	GOF : %0.3f
z	Max Coil Error : %0.3f cm
éd   zAssuming Cardinal HPIsr
   )ZnasionÚlpaÚrpaÚhpig{®Gázt?r~   r   ÚorderÚusedÚ
dist_limitZ
good_limitzYLarge difference between digitized geometry and HPI geometry. Max coil to coil differencez is %0.2f cm
g      Y@z"beware of *POOR* head localization))Zscipy.spatial.distancerr   Zchpirs   rt   ru   r	   rE   rF   ÚRuntimeErrorÚexistsrq   r_   Úsuperr   Ú__init__r   Z_unlockrH   r0   r   rM   ÚAssertionErrorrG   r]   rN   r   r`   ÚdeleteÚarrayr   r^   ZFIFFV_COORD_HEADr�   r   ÚabsÚmaxr   r   r   Zarange)+Úselfr   r   r   r   r   rr   rs   rt   ru   re   ÚextrG   rg   rx   Zn_hpisr‚   Zcoil_amplitudesZ	coil_locsZhpi_gZhpi_devZbad_idxro   ÚgÚmsgZhpi_headZmesgZhead_to_dev_tr‡   Ztrans_gÚidxÚpointZ	dig_distsZ	dev_distsZ	tmp_distsr‰   Znasr„   r…   rp   r†   Z
hpi_resultrD   ©Ú	__class__r   r   r�   1  s   

ÿ

    ý

ÿ

ýû    ÿ




ÿ
ÿÿ ÿÿþ
ÿ
 ÿÿ


ýþþýzRawArtemis123.__init__c                 C   s   t | |||||||dd�	 dS )zRead a chunk of raw data.z>f4)ZdtypeNr   )r“   Údatar—   ÚfiÚstartÚstopZcalsZmultr   r   r   Ú_read_segment_fileÒ  s            ÿz RawArtemis123._read_segment_file)FNNT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r�   rŸ   Ú__classcell__r   r   r™   r   r   "  s       ÿ !r   )FNNT)N)Únumpyr`   Úos.pathÚpathrE   rS   rV   Úutilsr   r   r   r   r   r	   r   Úbaser   Z	meas_infor   Z_digitizationr   r   Ú	constantsr   Z
transformsr   r   r   r   rq   r   r   r   r   r   Ú<module>   s&       ÿ!
 m