U
    f»{j/  ã                
   @   sà  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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ddddgZejejejejejej gZ!eeee
eegZ"e#e#e#ej$e%e%gZ&dd„ Z'dd„ Z(dZ)ej*ej+ej,ej-ej.ej/ej0ej1ej2ej3f
Z4e
e
ee
e
e
e
e
eef
Z5e6e6ej$e6e6e6ej$e6e7e7f
Z8dZ9ej*ej:ej;fZ<e
eefZ=e6e7e7fZ>dZ?ejejej ej@fZAee
eefZBe#ej$e%efZCdZDejEejFfZGeefZHej$ej$fZIdd„ ZJdd„ ZKdd„ ZLdS )é    Né   )Úread_tagÚ	fiff_open)Údir_tree_find)	Ústart_blockÚ	end_blockÚ	write_intÚwrite_floatÚwrite_stringÚwrite_float_matrixÚwrite_int_matrixÚwrite_float_sparseÚwrite_id)Úfind_tag)ÚFIFFé   )Ú_csc_matrix_cast)ÚwarnÚ_check_fnameZparent_file_idÚblock_idZparent_block_idÚdateZexperimenterÚcreatorc                 C   s  t |tjƒ}tƒ }t|ƒdk�r|d }t |tjƒ}|D ]Þ}tƒ }t|d ƒD ]h}|d | j}|d | j	}	t
tttƒD ].\}
}}||krzt| |	ƒ}||jƒ||
<  qNqztd| ƒ qNt| |ƒ|d< t |tjƒ}t|ƒdkrüdd„ tt|ƒƒD ƒ}||d< t|d ƒdkr8| |¡ q8|S )	aL  Read processing history from fiff file.

    This function reads the SSS info, the CTC correction and the
    calibaraions from the SSS processing logs inside af a raw file
    (C.f. Maxfilter v2.2 manual (October 2010), page 21)::

        104 = {                 900 = proc. history
          104 = {               901 = proc. record
            103 = block ID
            204 = date
            212 = scientist
            113 = creator program
            104 = {             502 = SSS info
              264 = SSS task
              263 = SSS coord frame
              265 = SSS origin
              266 = SSS ins.order
              267 = SSS outs.order
              268 = SSS nr chnls
              269 = SSS components
              278 = SSS nfree
              243 = HPI g limit    0.98
              244 = HPI dist limit 0.005
            105 = }             502 = SSS info
            104 = {             504 = MaxST info
              264 = SSS task
              272 = SSST subspace correlation
              279 = SSST buffer length
            105 = }
            104 = {             501 = CTC correction
              103 = block ID
              204 = date
              113 = creator program
              800 = CTC matrix
              3417 = proj item chs
            105 = }             501 = CTC correction
            104 = {             503 = SSS finecalib.
              270 = SSS cal chnls
              271 = SSS cal coeff
            105 = }             503 = SSS finecalib.
          105 = }               901 = proc. record
        105 = }                 900 = proc. history
    r   ÚnentÚ	directoryz"Unknown processing history item %sÚmax_infoc                 S   s   g | ]
}t ƒ ‘qS © )Údict)Ú.0Ú_r   r   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/proc_history.pyÚ
<listcomp>b   s     z&_read_proc_history.<locals>.<listcomp>Úias)r   r   ÚFIFFB_PROCESSING_HISTORYÚlistÚlenÚFIFFB_PROCESSING_RECORDr   ÚrangeÚkindÚposÚzipÚ
_proc_keysÚ	_proc_idsÚ_proc_castersr   Údatar   Ú_read_maxfilter_recordÚ	FIFFB_IASÚappend)ÚfidÚtreeÚproc_historyÚoutZproc_recordsZproc_recordÚrecordÚi_entr'   r(   ÚkeyÚid_ÚcastÚtagZiassÚssr   r   r   Ú_read_proc_history   s8    ,ÿÿ
r<   c                 C   s¾   t |d ƒdkrºt| tjƒ |d D ]ˆ}t| tjƒ ttttƒD ]"\}}}||kr@|| ||| ƒ q@t	| |d ƒ d|kr |d D ]}t| tj
ƒ t| tj
ƒ q‚t| tjƒ q$t| tjƒ dS )z!Write processing history to file.r3   r   r   r!   N)r$   r   r   r"   r%   r)   r*   r+   Ú_proc_writersÚ_write_maxfilter_recordr/   r   )r1   Úinfor5   r7   r8   Úwriterr   r   r   r   Ú_write_proc_historyi   s    rA   )
ÚjobÚframeÚoriginZin_orderZ	out_orderZnchanÚ
componentsZnfreeZhpi_g_limitZhpi_dist_limit)rB   Z	subspcorrÚbuflen)r   r   r   Z	decoupler)Z	cal_chansZ	cal_corrsc           	   	   C   s²   t | ddd�} t| ƒ\}}}|�ˆ}t||ƒd }d|  }t|ƒdkrLt|ƒ‚t|tjƒd }t||tj	ƒj
}|dkr|t|ƒ‚t||tjƒj
|d< t||tjƒj
|d	< W 5 Q R X |S )
z"Read cross-talk correction matrix.ÚreadT)Ú	overwriteZ
must_existÚsss_ctczInvalid cross-talk FIF: %sr   zcross-talk compensation matrixr   r   )r   r   r.   r$   Ú
ValueErrorr   r   ZFIFFB_DATA_CORRECTIONr   ZFIFF_COMMENTr-   ÚFIFF_CREATORÚFIFF_MEAS_DATE)	ÚfnameÚfr2   r   r1   rI   Zbad_strÚnodeÚcommentr   r   r   Ú	_read_ctc¤   s    rQ   c                 C   sª  t |tjƒ}tƒ }t|ƒdkr�|d }t|d ƒD ]\}|d | j}|d | j}tt	t
tƒD ].\}}}	||kr^t| |ƒ}
|	|
jƒ||<  q2q^q2t |tjƒ}tƒ }t|ƒdk�r"|d }t|d ƒD ]\}|d | j}|d | j}ttttƒD ].\}}}	||krðt| |ƒ}
|	|
jƒ||<  qÄqðqÄt |tjƒ}tƒ }t|ƒdk�rü|d }t|d ƒD ]¤}|d | j}|d | j}ttttƒD ]4\}}}	||k�r‚t| |ƒ}
|	|
jƒ||<  �qV�q‚|tjk�rVt| |ƒ}
|
j d¡}|d  d¡d |d< ||d< �qVt |tjƒ}tƒ }t|ƒdk�r–|d }t|d ƒD ]d}|d | j}|d | j}ttttƒD ]4\}}}	||k�r\t| |ƒ}
|	|
jƒ||<  �q0�q\�q0t||||d�}|S )	z+Read maxfilter processing record from file.r   r   r   ú:éÿÿÿÿú Úproj_items_chs)Ússs_inforI   Ússs_calÚmax_st)r   r   ÚFIFFB_SSS_INFOr   r$   r&   r'   r(   r)   Ú_sss_info_keysÚ_sss_info_idsÚ_sss_info_castersr   r-   ÚFIFFB_SSS_ST_INFOÚ_max_st_keysÚ_max_st_idsÚ_max_st_castersÚFIFFB_CHANNEL_DECOUPLERÚ_sss_ctc_keysÚ_sss_ctc_idsÚ_sss_ctc_castersÚFIFF_PROJ_ITEM_CH_NAME_LISTÚsplitÚFIFFB_SSS_CALÚ_sss_cal_keysÚ_sss_cal_idsÚ_sss_cal_casters)r1   r2   Zsss_info_blockrV   r6   r'   r(   r7   r8   r9   r:   Zmax_st_blockrX   Zsss_ctc_blockrI   ZchsZsss_cal_blockrW   r   r   r   r   r.   ¶   s„    ÿ
ÿ
ÿ



ÿ

 ÿr.   c           	      C   sž  |d }t |ƒdkr\t| tjƒ ttttƒD ]"\}}}||kr,|| ||| ƒ q,t| tjƒ |d }t |ƒdkr¸t| tj	ƒ tt
ttƒD ]"\}}}||krˆ|| ||| ƒ qˆt| tj	ƒ |d }t |ƒdk�r8t| tjƒ ttttƒD ]"\}}}||kræ|| ||| ƒ qæd|k�r,t| tjd |d ¡ƒ t| tjƒ |d }t |ƒdk�ršt| tjƒ ttttƒD ]&\}}}||k�rf|| ||| ƒ �qft| tjƒ dS )	z*Write maxfilter processing record to file.rV   r   rX   rI   rU   rR   rW   N)r$   r   r   rY   r)   rZ   r[   Ú_sss_info_writersr   r]   r^   r_   Ú_max_st_writersra   rb   rc   Ú_sss_ctc_writersr
   re   Újoinrg   rh   ri   Ú_sss_cal_writers)	r1   r5   rV   r7   r8   r@   rX   rI   rW   r   r   r   r>   ý   sP    ÿÿÿ
ÿÿ
r>   )MÚnumpyÚnpÚopenr   r   r2   r   Úwriter   r   r   r	   r
   r   r   r   r   r:   r   Ú	constantsr   Úfixesr   Úutilsr   r   r*   ZFIFF_PARENT_FILE_IDZFIFF_BLOCK_IDZFIFF_PARENT_BLOCK_IDrL   ZFIFF_EXPERIMENTERrK   r+   r=   r   ÚarrayÚstrr,   r<   rA   rZ   ZFIFF_SSS_JOBZFIFF_SSS_FRAMEZFIFF_SSS_ORIGINZFIFF_SSS_ORD_INZFIFF_SSS_ORD_OUTZFIFF_SSS_NMAGZFIFF_SSS_COMPONENTSZFIFF_SSS_NFREEZFIFF_HPI_FIT_GOOD_LIMITZFIFF_HPI_FIT_DIST_LIMITr[   rk   ÚintÚfloatr\   r^   ZFIFF_SSS_ST_CORRZFIFF_SSS_ST_LENGTHr_   rl   r`   rb   ZFIFF_DECOUPLER_MATRIXrc   rm   rd   rh   ZFIFF_SSS_CAL_CHANSZFIFF_SSS_CAL_CORRSri   ro   rj   rQ   r.   r>   r   r   r   r   Ú<module>   s˜   ,  ÿû  ÿJ÷
    þ
    þÿ

ýG