U
    f»{jµR  ã                   @   s  d dl Z d dlZd dlZddlmZ ddlmZmZ ddl	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 ddlmZmZ ddlmZ ddlmZ ed dd„ƒZdd„ ZeG dd„ deƒƒZ dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dS )!é    Né   )ÚBaseRaw)Úcreate_infoÚ_format_dig_points)Ú_mult_cal_oneé   )ÚAnnotations)ÚloggerÚverboseÚfill_docÚwarnÚ_check_fnameÚ_import_h5py)ÚFIFF)Ú_make_dig_points)Ú_frame_to_strÚapply_trans)Ú_convert_fnirs_to_head)Úget_mni_fiducialsÚunknownFc                 C   s   t | |||ƒS )aå  Reader for a continuous wave SNIRF data.

    .. note:: This reader supports the .snirf file type only,
              not the .jnirs version.
              Files with either 3D or 2D locations can be read.
              However, we strongly recommend using 3D positions.
              If 2D positions are used the behaviour of MNE functions
              can not be guaranteed.

    Parameters
    ----------
    fname : str
        Path to the SNIRF data file.
    optode_frame : str
        Coordinate frame used for the optode positions. The default is unknown,
        in which case the positions are not modified. If a known coordinate
        frame is provided (head, meg, mri), then the positions are transformed
        in to the Neuromag head coordinate frame (head).
    %(preload)s
    %(verbose)s

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

    See Also
    --------
    mne.io.Raw : Documentation of attribute and methods.
    )ÚRawSNIRF)ÚfnameÚoptode_frameÚpreloadr
   © r   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/snirf/_snirf.pyÚread_raw_snirf   s     r   c                 C   s   t | ddd�S )NÚrzlatin-1)Úencoding)Úopen)r   r   r   r   Ú_open9   s    r    c                       s.   e Zd ZdZed	‡ fdd„	ƒZdd„ Z‡  ZS )
r   a5  Raw object from a continuous wave SNIRF file.

    Parameters
    ----------
    fname : str
        Path to the SNIRF data file.
    optode_frame : str
        Coordinate frame used for the optode positions. The default is unknown,
        in which case the positions are not modified. If a known coordinate
        frame is provided (head, meg, mri), then the positions are transformed
        in to the Neuromag head coordinate frame (head).
    %(preload)s
    %(verbose)s

    See Also
    --------
    mne.io.Raw : Documentation of attribute and methods.
    r   FNc           C   
      sf  ddl m} tƒ }t|dddƒ}t d| ¡ | |d¡��‰dˆd	 krRtd
ƒ tˆdƒ}|dk|dk@ rpd}t	 
ˆ d¡¡ ¡ }|dkrštd|› �ƒ‚ˆ d¡jd d }	tˆƒ}
|
dkrÆtdƒ t	 
ˆ d¡¡}dd„ |D ƒ}t|ƒdk�rtdt|ƒ› d|› d�ƒ‚dd„ ‰ ‡ fdd „}t	 
d!d„ ˆd	 d"  ¡ D ƒ¡}t	 
d#d„ |D ƒ¡}|| }t||d$�}d%ˆd& k�r–t	 
ˆ d'¡¡}d(d„ |D ƒ}n&t	 ‡fd)d„|D ƒ¡}d*d„ |D ƒ}d+ˆd& k�rêt	 
ˆ d,¡¡}d-d„ |D ƒ}n&t	 ‡fd.d„|D ƒ¡}d/d„ |D ƒ}d0ˆd& kd1ˆd& k@ �rLt	 
ˆ d2¡¡}t	 
ˆ d3¡¡}nŒd4ˆd& kd5ˆd& k@ �rÐtd6ƒ t	 
ˆ d7¡¡}t	 
ˆ d8¡¡}t	j|t	 |jd df¡dd9�}t	j|t	 |jd df¡dd9�}ntd:ƒ‚t|ƒ|jd k�sðt‚t|ƒ|jd k�st‚g }g }|D �]Š}ttt	 
ˆ d;| d< ¡¡ƒd ƒ}ttt	 
ˆ d;| d= ¡¡ƒd ƒ}|dk�rÖttt	 
ˆ d;| d> ¡¡ƒd ƒ}||d  d? ||d   d@ t||d  ƒ }| |¡ | dA¡ nÈ|dBk�rtt	 
ˆ d;| dC ¡¡ƒd  dD¡}| ¡  dEdF¡}||d  d? ||d   }|dFk�rvttt	 
ˆ d;| d> ¡¡ƒd ƒ}d@t||d  ƒ }nd@| ¡  }|| }| |¡ | |¡ �qt||
|dG�‰i }t	 
ˆ dH¡¡}t|ƒd  dD¡|dI< dJˆ dK¡k�rˆ dL¡d  dD¡} | |dM< dNˆ dK¡k�r2ˆ dO¡d  dD¡}!|!|dP< dQˆ dK¡k�r–ˆ dR¡d  dD¡}"|"dSk�rltj|dQ< n*|"dTk�r‚tj |dQ< n|"dUk�r–tj!|dQ< ˆj"|dV� tˆdWƒ}#t#|#ƒ}$||$ }||$ }|dXk�rêt$dY|d||g ƒ\}}}%}&n
t	 %dZ¡}&|d[k�rtj&}'n*d\ˆ dK¡k�r*tˆ d]¡d ƒ}'ntj'}'t(|ƒD �]`\}(}ttt	 
ˆ d;| d< ¡¡ƒd ƒ}ttt	 
ˆ d;| d= ¡¡ƒd ƒ}||d d d …f ˆd^ |( d_ dd`…< ||d d d …f ˆd^ |( d_ d`da…< ˆd^ |( d_ dd`… ˆd^ |( d_ d`da…  d })|)ˆd^ |( d_ dd…< |'ˆd^ |( db< |dck�sX|dBk�r8||( dFk�r8ttt	 
ˆ d;| d> ¡¡ƒd ƒ}||d  ˆd^ |( d_ da< �q8ddˆ de¡k�r”t	 
ˆ df¡¡}*|*|$ }*t	 
ˆ dg¡¡}+dh\},}-}.}/t)ƒ }0t(|+ƒD ]Š\}(}1|1 ¡ }1|1dik�r|*|(d d…f }-n\|1djk�r6|*|(d d…f },n@|1dkk�rR|*|(d d…f }.n$|*|(d d…f |0dlt|0ƒd dm›�< �qît*|,|-|.|/|0t+|' dn�}2nˆ‡fdod„t,t|ƒƒD ƒ}3t-dYdpdq�}2|2D ]"}4t.|&|4d ƒ|4d< tj&|4db< �q¾t(|3dƒD ]$\}5}6|2 t)tj/|6|5tj&dr�¡ �qìt0|2ƒ}2~&ˆ 1¡ � |2ˆds< W 5 Q R X tt	 
ˆ dt¡¡ƒd  dD¡}7tt	 
ˆ du¡¡ƒd  dD¡}8|7|8 }9dvD ]6}:zt2j2 3|9|:¡};W n t4k
�	r¬   Y nX  �	qÚ�	q€tdw|9› �ƒ t2 2dxddddd¡};|;jt2j5j6dy�};ˆ 1¡ � |;ˆdz< W 5 Q R X d{ˆ dK¡k�
r’t	 
ˆ d|¡¡d  ¡ }<t7 8d}|<¡}=|=d k	�
r’t|= 9¡ d ƒt|= 9¡ d ƒt|= 9¡ d ƒf}>ˆ 1¡ � |>ˆd~ d< W 5 Q R X t:t;| ƒj<ˆ||g|	g|d€� t=g g g ƒ}?ˆd	 D ]z}@d�|@k�
rÄt	 >t	 
ˆ d‚|@ dƒ ¡¡¡}A|Aj?dk�
rÄtt	 
ˆ d‚|@ d„ ¡¡ƒd }B|? |Ad d …df d…|B dD¡¡ �
qÄ| j@|?dpd†� W 5 Q R X || jƒ d S )‡Nr   )Ú_validate_nirs_infoÚreadTr   z
Loading %sr   Zdata2ZnirszoFile contains multiple recordings. MNE does not support this feature. Only the first dataset will be processed.ZManufacturerNamer   Z	GowerlabsÚheadz$nirs/data1/measurementList1/dataType)é   éŸ† z�MNE only supports reading continuous wave amplitude and processed haemoglobin SNIRF files. Expected type code 1 or 99999 but received type code ú/nirs/data1/dataTimeSeriesr   r$   z.Unable to extract sample rate from SNIRF file.znirs/probe/wavelengthsc                 S   s   g | ]}t |ƒ‘qS r   ©Úint)Ú.0Úwr   r   r   Ú
<listcomp>{   s     z%RawSNIRF.__init__.<locals>.<listcomp>r   zThe data contains z wavelengths: zW. MNE only supports reading continuous wave amplitude SNIRF files with two wavelengths.c                 S   s   |   ¡ rt| ƒS | S )N)Úisdigitr(   ©Útextr   r   r   Úatoi…   s    zRawSNIRF.__init__.<locals>.atoic                    s   ‡ fdd„t  d| ¡D ƒS )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   ©r)   Úc©r/   r   r   r+   ‰   s     z;RawSNIRF.__init__.<locals>.natural_keys.<locals>.<listcomp>z(\d+))ÚreÚsplitr-   r2   r   r   Únatural_keysˆ   s    z'RawSNIRF.__init__.<locals>.natural_keysc                 S   s   g | ]}|‘qS r   r   )r)   Únamer   r   r   r+   ‹   s     Zdata1c                 S   s   g | ]}d |k‘qS )ZmeasurementListr   )r)   Únr   r   r   r+   Œ   s     )ÚkeyZsourceLabels_disabledz
nirs/probeznirs/probe/sourceLabelsc                 S   s   g | ]}|  d ¡‘qS ©úUTF-8©Údecode©r)   Úsr   r   r   r+   —   s     c              	      s,   g | ]$}t t ˆ  d | d ¡¡ƒd ‘qS )únirs/data1/ú/sourceIndexr   ©Ú_correct_shapeÚnpÚarrayÚgetr0   ©Údatr   r   r+   ™   s   þ

ÿÿc                 S   s   g | ]}d t |ƒ› �‘qS )ÚSr'   r=   r   r   r   r+   œ   s     ZdetectorLabels_disabledznirs/probe/detectorLabelsc                 S   s   g | ]}|  d ¡‘qS r9   r;   ©r)   Údr   r   r   r+   £   s     c              	      s,   g | ]$}t t ˆ  d | d ¡¡ƒd ‘qS )r?   ú/detectorIndexr   rA   r0   rF   r   r   r+   ¥   s   þ

ÿÿc                 S   s   g | ]}d t |ƒ› �‘qS )ÚDr'   rI   r   r   r   r+   ¨   s     ZdetectorPos3DZsourcePos3Dznirs/probe/detectorPos3Dznirs/probe/sourcePos3DZdetectorPos2DZsourcePos2Da™  The data only contains 2D location information for the optode positions. It is highly recommended that data is used which contains 3D location information for the optode positions. With only 2D locations it can not be guaranteed that MNE functions will behave correctly and produce accurate results. If it is not possible to include 3D positions in your data, please consider using the set_montage() function.znirs/probe/detectorPos2Dznirs/probe/sourcePos2D)ZaxiszYNo optode location information is provided. MNE requires at least 2D location informationr?   r@   rK   z/wavelengthIndexÚ_ú Zfnirs_cw_amplituder%   z/dataTypeLabelr:   ZdodZfnirs_od)Úch_typesznirs/metaDataTags/SubjectIDZ
first_nameZlastNameznirs/metaDataTags/z/nirs/metaDataTags/lastNameÚ	last_nameZ
middleNamez/nirs/metaDataTags/middleNameZmiddle_nameZsexz/nirs/metaDataTags/sex>   ÚmÚ1ÚMÚMale>   ÚFÚFemaleÚfÚ2>   Ú0Úu)Úsubject_infoZ
LengthUnit)ÚmriÚmegZ	fsaverageé   )r#   r\   r]   ZMNE_coordFramez!/nirs/metaDataTags/MNE_coordFrameÚchsÚlocé   é	   Úcoord_frame)r$   ZlandmarkPos3Dznirs/probe/z/nirs/probe/landmarkPos3Dz/nirs/probe/landmarkLabels)NNNN)s   lpas   al)s   nasion)s   rpas   arZEEGZ03d)ÚnasionÚlpaÚrpaÚhpiZ
dig_ch_posrc   c                    s$   g | ]}ˆ d  | d dd… ‘qS )r_   r`   r   r   r   )r)   Úidx)Úinfor   r   r+   U  s   ÿF)r
   )Úkindr   Úidentrc   Údigz"/nirs/metaDataTags/MeasurementDatez"/nirs/metaDataTags/MeasurementTime)z%Y-%m-%d%H:%M:%SZz%Y-%m-%d%H:%M:%SznExtraction of measurement date from SNIRF file failed. The date is being set to January 1st, 2000, instead of iÐ  )ÚtzinfoÚ	meas_dateZDateOfBirthz/nirs/metaDataTags/DateOfBirthz(\d+)-(\d+)-(\d+)r[   Úbirthday)Ú	filenamesÚ
last_sampsr
   Zstimz/nirs/z/dataz/nameç      ð?)Zemit_warning)AZpreprocessing.nirsr!   r   r   r	   ri   ÚFiler   Ú_get_metadata_strrC   rD   rE   ÚitemÚRuntimeErrorÚshapeÚ_extract_sampling_rateÚlenÚkeysÚsortedÚuniqueÚappendZzerosÚAssertionErrorr(   rB   Ústrr<   ÚlowerÚreplacer   r   ZFIFFV_SUBJ_SEX_MALEZFIFFV_SUBJ_SEX_FEMALEZFIFFV_SUBJ_SEX_UNKNOWNÚupdateÚ_get_lengthunit_scalingr   ÚeyeZFIFFV_COORD_HEADZFIFFV_COORD_UNKNOWNÚ	enumerateÚdictr   r   Úranger   r   ZFIFFV_POINT_EEGr   Z_unlockÚdatetimeÚstrptimeÚ
ValueErrorÚtimezoneÚutcr3   Ú	fullmatchÚgroupsÚsuperr   Ú__init__r   Z
atleast_2dÚsizeZset_annotations)CÚselfr   r   r   r
   r!   Úh5pyZmanafacturerZsnirf_data_typerq   Úsampling_rateZfnirs_wavelengthsr5   ZchannelsZchannels_idxÚsourcesZ	detectorsZdetPos3DZsrcPos3DZdetPos2DZsrcPos2DZchnamesrO   ZchanZsrc_idxZdet_idxZwve_idxZch_nameZdt_idÚsuffixr[   ÚnamesÚlnrQ   r>   Úlength_unitZlength_scalingrM   Zhead_trc   rh   ZmidpointZdiglocsZdignamerd   re   rf   rg   Zextra_psZdignrl   Zch_locsZfidÚiiZch_locZstr_dateZstr_timeZstr_datetimeZdt_codern   Z	str_birthZbirth_matchedro   Zannotr8   ÚdataÚdesc©Ú	__class__)r/   rG   ri   r   r�   R   sb   
 þþ

ÿ

ÿ
 ÿ ÿ
ÿÿÿÿÿÿ

ÿÿþ
ÿÿþ

ÿÿþþ
ÿ

ÿÿþ
þÿ





     ÿ


ÿÿÿÿÿÿÿ((ÿÿ
ÿ
þ
ÿÿ 


ÿ   ý

ÿü

ÿÿÿ
ÿÿÿ ÿ

ÿ
þ
þ
ÿ

ÿÿ$zRawSNIRF.__init__c              	   C   sL   ddl }| | jd d¡�}	|	d ||… j}
W 5 Q R X t||
|||ƒ dS )z#Read a segment of data from a file.r   Nr   r&   )r“   rs   Z
_filenamesÚTr   )r’   r›   rh   ÚfiÚstartÚstopZcalsZmultr“   rG   Úoner   r   r   Ú_read_segment_fileŸ  s    zRawSNIRF._read_segment_file)r   FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r�   r¤   Ú__classcell__r   r   r�   r   r   =   s       ÿ  Nr   c                 C   s   | j dkr| tj } | S )Nr   )rw   rC   Znewaxis)Zarrr   r   r   rB   ª  s    

rB   c                 C   s0   ddddœ}| |kr||  S t d| › d�ƒ‚dS )z5MNE expects time in seconds, return required scaling.éè  r$   )Úmsr>   r   zThe time unit ú^ is not supported by MNE. Please report this error as a GitHub issue to inform the developers.N©rv   )Ú	time_unitÚscalingsr   r   r   Ú_get_timeunit_scaling°  s    r°   c                 C   s0   ddddœ}| |kr||  S t d| › d�ƒ‚dS )z3MNE expects distance in m, return required scaling.r$   éd   rª   )rQ   ÚcmÚmmzThe length unit r¬   Nr­   )r™   r¯   r   r   r   rƒ   »  s    rƒ   c                 C   s’   t  |  d¡¡}d}t|ƒdkr6d|d |d   }n>t jt  |¡dd�}tt  |¡ƒdkrldt  |¡ }ntdƒ t| d	ƒ}t	|ƒ}||9 }|S )
z,Extract the sample rate from the time field.znirs/data1/timer   r   rr   r$   r^   )ZdecimalszQMNE does not currently support reading SNIRF files with non-uniform sampled data.ZTimeUnit)
rC   rD   rE   ry   ÚaroundÚdiffr|   r   rt   r°   )rG   Z	time_datar”   Zfs_diffr®   Ztime_unit_scalingr   r   r   rx   Æ  s    
rx   c                 C   sH   |t  |  d¡¡krd S |  d|› �¡}tt  |¡ƒ}t|d dƒ}|S )Nznirs/metaDataTagsz/nirs/metaDataTags/r   zutf-8)rC   rD   rE   rB   r   )rG   Úfieldr›   r   r   r   rt   Þ  s    rt   )r   FN)&r3   ÚnumpyrC   rˆ   Úbaser   Z	meas_infor   r   Úutilsr   Úannotationsr   r	   r
   r   r   r   r   Ú	constantsr   Z_digitizationr   Z
transformsr   r   Z	nirx.nirxr   Z_freesurferr   r   r    r   rB   r°   rƒ   rx   rt   r   r   r   r   Ú<module>   s0    "  n