U
    f»{jO?  ã                   @   sF  d dl ZddlmZ ddl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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!m"Z"m#Z# ddl$m%Z% ed%dd„ƒZ&edddœdd„ƒZ'ed&dd„ƒZ(ed'dd„ƒZ)dd„ Z*ed(dd„ƒZ+ed)dd „ƒZ,edd!d"g dfd#d$„ƒZ-dS )*é    Né   )ÚEpochs)Úcheck_fnameÚloggerÚverboseÚ_check_optionÚ_check_fname)ÚFIFF)Ú	fiff_open)Ú
pick_typesÚpick_types_forward)Ú
ProjectionÚ_has_eeg_average_ref_projÚ
_read_projÚmake_projectorÚmake_eeg_average_ref_projÚ_write_proj)Ústart_and_end_file)Úmake_fixed_length_events)Úparallel_func)Ú_check_n_samples)Úis_fixed_orientÚ_subject_from_forwardÚconvert_forward_solution)Ú	_make_stcc              	   C   s8   t | ddƒ t| ƒ\}}}|�}t||ƒ}W 5 Q R X |S )aT  Read projections from a FIF file.

    Parameters
    ----------
    fname : str
        The name of file containing the projections vectors. It should end with
        -proj.fif or -proj.fif.gz.
    %(verbose)s

    Returns
    -------
    projs : list
        The list of projection vectors.

    See Also
    --------
    write_proj
    Ú
projection©z	-proj.fifz-proj.fif.gzz	_proj.fifz_proj.fif.gz)r   r
   r   )Úfnamer   ÚffÚtreeÚ_ÚfidÚprojs© r#   úG/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/proj.pyÚ	read_proj   s
    r%   F)Ú	overwriter   c             	   C   s:   t | |d�} t| ddƒ t| ƒ�}t||ƒ W 5 Q R X dS )a‰  Write projections to a FIF file.

    Parameters
    ----------
    fname : str
        The name of file containing the projections vectors. It should end with
        -proj.fif or -proj.fif.gz.
    projs : list
        The list of projection vectors.
    %(overwrite)s

        .. versionadded:: 1.0
    %(verbose)s

        .. versionadded:: 1.0

    See Also
    --------
    read_proj
    )r&   r   r   N)r   r   r   r   )r   r"   r&   r   r!   r#   r#   r$   Ú
write_proj4   s    
r'   Úseparatec               	      s\  ddl m} t|dddd�}	t|dddd�}
t|ddddd	�}td
|ddgƒ |dkr¨||krftdƒ‚d
ddg}d}t|dddd�}	|dkr²t|	ƒdkr²t d¡ d}n
dddg}|dkrÔt|	ƒdkrÔt d¡ d}|dkröt|
ƒdkröt d¡ d}|dk�rt|ƒdk�rt d¡ d}|d ‰ ‡ fdd„|	|
|fD ƒ\}}}g }t|||g|	|
|g|||g|ƒD ]ð\}}}}|dk�r€�qf| | d d …|f }|j	|dd�\}}}|d d …d |…f }|| 
¡  }|d |… }tt|j|ƒƒD ]n\}\}}t|d |tjd d …f d|jd�}d|||d f }t d| ¡ td||tj|d�}| |¡ �qä�qf|S )Nr   ©ÚlinalgÚgradFÚbads)ÚmegÚref_megÚexcludeÚmagT)r-   Úeegr.   r/   r-   r(   ÚcombinedzAn_grad (%d) must be equal to n_mag (%d) when using meg="combined"Ú r1   zBNo MEG channels found for joint estimation. Forcing n_grad=n_mag=0ZplanarZaxialz*No gradiometers found. Forcing n_grad to 0z*No magnetometers found. Forcing n_mag to 0z)No EEG channels found. Forcing n_eeg to 0Úch_namesc                 3   s    | ]}‡ fd d„|D ƒV  qdS )c                    s   g | ]}ˆ | ‘qS r#   r#   )Ú.0Úk©r4   r#   r$   Ú
<listcomp>t   s     z+_compute_proj.<locals>.<genexpr>.<listcomp>Nr#   )r5   Úindr7   r#   r$   Ú	<genexpr>t   s   ÿz _compute_proj.<locals>.<genexpr>)Úfull_matricesr   )Z	col_namesÚ	row_namesÚdataZnrowZncolz%s-%s-PCA-%02dzAdding projection: %s)Zactiver=   ÚdescÚkindZexplained_var)Úscipyr*   r   r   Ú
ValueErrorÚlenr   ÚinfoÚzipÚsvdÚsumÚ	enumerateÚTÚdictÚnpÚnewaxisÚsizer   r	   ZFIFFV_PROJ_ITEM_FIELDÚappend) r=   rC   Ún_gradÚn_magÚn_eegÚdesc_prefixr-   r   r*   Zgrad_indZmag_indZeeg_indÚkindsZ
grad_namesZ	mag_namesZ	eeg_namesr"   Únr9   Únamesr>   Zdata_indÚUZSexp2r    Zexp_varr6   ÚuÚvarZ	proj_dataZ	this_descÚprojr#   r7   r$   Ú_compute_projQ   s|    
ÿ






ÿÿ
ý
  ÿ   þrY   é   c           
   	   C   sŽ   t | |ƒ}| j}	|	dks,tt|	 ¡ ƒƒdkr2d}	n*t|	 ¡ ƒdkrXtt|	 ¡ ƒd ƒ}	nd}	|dkrvd|	| j| jf }t	|| j
|||||d�S )a'  Compute SSP (signal-space projection) vectors on epoched data.

    %(compute_ssp)s

    Parameters
    ----------
    epochs : instance of Epochs
        The epochs containing the artifact.
    n_grad : int
        Number of vectors for gradiometers.
    n_mag : int
        Number of vectors for magnetometers.
    n_eeg : int
        Number of vectors for EEG channels.
    %(n_jobs)s
        Number of jobs to use to compute covariance.
    desc_prefix : str | None
        The description prefix to use. If None, one will be created based on
        the event_id, tmin, and tmax.
    meg : str
        Can be 'separate' (default) or 'combined' to compute projectors
        for magnetometers and gradiometers separately or jointly.
        If 'combined', ``n_mag == n_grad`` is required and the number of
        projectors computed for MEG will be ``n_mag``.

        .. versionadded:: 0.18
    %(verbose)s

    Returns
    -------
    projs: list
        List of projection vectors.

    See Also
    --------
    compute_proj_raw, compute_proj_evoked
    Nr   Ú0r   zMultiple-eventsz%s-%-.3f-%-.3f©r-   )Ú_compute_cov_epochsÚevent_idrB   ÚlistÚkeysÚstrÚvaluesÚtminÚtmaxrY   rC   )
ÚepochsrN   rO   rP   Ún_jobsrQ   r-   r   r=   r^   r#   r#   r$   Úcompute_proj_epochs’   s    )
ÿrg   c                    sp   t tj|ƒ\}‰ }|‡ fdd„| D ƒƒ}t|ƒ}|dkr@tdƒ‚| jd t| jƒ }}t|| |ƒ t|ƒ}|S )zCompute epochs covariance.c                 3   s   | ]}ˆ ||j ƒV  qd S )N)rH   )r5   Úe©Zp_funr#   r$   r:   Ì   s     z&_compute_cov_epochs.<locals>.<genexpr>r   zNo good epochs foundZnchan)	r   rJ   ÚdotrB   ÚRuntimeErrorrC   Útimesr   rF   )re   rf   Úparallelr=   Zn_epochsZn_chanZ	n_samplesr#   ri   r$   r]   É   s    r]   c              	   C   sJ   t  | j| jj¡}|dkr2d| jd | jd f }t|| j|||||d�S )aÿ  Compute SSP (signal-space projection) vectors on evoked data.

    %(compute_ssp)s

    Parameters
    ----------
    evoked : instance of Evoked
        The Evoked obtained by averaging the artifact.
    n_grad : int
        Number of vectors for gradiometers.
    n_mag : int
        Number of vectors for magnetometers.
    n_eeg : int
        Number of vectors for EEG channels.
    desc_prefix : str | None
        The description prefix to use. If None, one will be created based on
        tmin and tmax.

        .. versionadded:: 0.17
    meg : str
        Can be 'separate' (default) or 'combined' to compute projectors
        for magnetometers and gradiometers separately or jointly.
        If 'combined', ``n_mag == n_grad`` is required and the number of
        projectors computed for MEG will be ``n_mag``.

        .. versionadded:: 0.18
    %(verbose)s

    Returns
    -------
    projs : list
        List of projection vectors.

    See Also
    --------
    compute_proj_raw, compute_proj_epochs
    Nz%-.3f-%-.3fr   éÿÿÿÿr\   )rJ   rj   r=   rH   rl   rY   rC   )ZevokedrN   rO   rP   rQ   r-   r   r=   r#   r#   r$   Úcompute_proj_evoked×   s    (ÿro   c                 C   sX  |dk	ržt  || jd  ¡| jd  }t| d|||ƒ}t| jddddddd�}t| |dd|d| jd   |||dd	d
�
}t||	ƒ}|j}|sœ| j| jd  }n”t|  	|¡d dƒ}|rÄ|  	|¡d n| j}t
|| jƒ}| dd…||…f \}}t|| |jd ƒ t  ||j¡}| j}|| jd  }|| jd  }d||f }t|||||||
d�}|S )aU  Compute SSP (signal-space projection) vectors on continuous data.

    %(compute_ssp)s

    Parameters
    ----------
    raw : instance of Raw
        A raw object to use the data from.
    start : float
        Time (in sec) to start computing SSP.
    stop : float
        Time (in sec) to stop computing SSP.
        None will go to the end of the file.
    duration : float
        Duration (in sec) to chunk data into for SSP
        If duration is None, data will not be chunked.
    n_grad : int
        Number of vectors for gradiometers.
    n_mag : int
        Number of vectors for magnetometers.
    n_eeg : int
        Number of vectors for EEG channels.
    reject : dict | None
        Epoch rejection configuration (see Epochs).
    flat : dict | None
        Epoch flat configuration (see Epochs).
    %(n_jobs)s
        Number of jobs to use to compute covariance.
    meg : str
        Can be 'separate' (default) or 'combined' to compute projectors
        for magnetometers and gradiometers separately or jointly.
        If 'combined', ``n_mag == n_grad`` is required and the number of
        projectors computed for MEG will be ``n_mag``.

        .. versionadded:: 0.18
    %(verbose)s

    Returns
    -------
    projs: list
        List of projection vectors.

    See Also
    --------
    compute_proj_epochs, compute_proj_evoked
    NZsfreqiç  Tr,   )r-   r1   ZeogZecgZemgr/   ç        ç      ð?F)rc   rd   ÚpicksÚrejectÚflatZbaselinerX   r   zRaw-%-.3f-%-.3fr\   )rJ   ÚroundrC   r   r   r   r]   Zn_timesÚmaxZtime_as_indexÚminr   Úshaperj   rH   rY   )ÚrawÚstartÚstopÚdurationrN   rO   rP   rs   rt   rf   r-   r   Úeventsrr   re   r=   rC   rl   rQ   r"   r#   r#   r$   Úcompute_proj_raw  sB    2 ÿ
   ý
ÿr~   r+   Úfixedc              
   C   s:  ddl m} td|dddgƒ td|dd	d
ddddgƒ t| dd�rLtdƒ‚|dkrft| dd|d�} nt| |d|d�} t| ddddd� | d r˜t| ƒr tdƒ‚| d d }|dkrì|dksÄt|ƒsÔt	| d ƒg}ng }|dkrä|n|| }dddg}	|dk	�rPt
|| d d dd�\}
}}||	k�r4t |
|¡}n|dk�rftd||f ƒ‚n||	k�rftd| ƒ‚|j\}}|d }t |¡}t|ƒD �]R}|dd…d| d|d   …f }|d	k�rÊ|j|ddd!�}|dk�râ|d ||< nú| |dd…d"f ¡}|d	k�r|||< nÐ|d
k�r(||d  ||< n´|dk�rHd#||d   ||< n”|dk�r~| t |dd…d"f |¡¡}|| ||< n^| t |
|dd…d"f ¡¡}|dk�r´|| ||< n(|dk�rÐd#||  ||< ntd$| ƒ‚�qŠ|d%k�rø|t |¡ }t| ƒ}d&d'„ | d( D ƒ}t|dd…tjf || d( jd)d#|d*�S )+aë  Compute sensitivity map.

    Such maps are used to know how much sources are visible by a type
    of sensor, and how much projections shadow some sources.

    Parameters
    ----------
    fwd : Forward
        The forward operator.
    projs : list
        List of projection vectors.
    ch_type : 'grad' | 'mag' | 'eeg'
        The type of sensors to use.
    mode : str
        The type of sensitivity map computed. See manual. Should be 'free',
        'fixed', 'ratio', 'radiality', 'angle', 'remaining', or 'dampening'
        corresponding to the argument --map 1, 2, 3, 4, 5, 6 and 7 of the
        command mne_sensitivity_map.
    exclude : list of str | str
        List of channels to exclude. If empty do not exclude any (default).
        If 'bads', exclude channels in fwd['info']['bads'].
    %(verbose)s

    Returns
    -------
    stc : SourceEstimate | VolSourceEstimate
        The sensitivity map as a SourceEstimate or VolSourceEstimate instance
        for visualization.
    r   r)   Úch_typer1   r+   r0   ÚmodeÚfreer   ÚratioZ	radialityZangleÚ	remainingZ	dampeningT)Úorigz1fwd should must be computed with free orientationF)r-   r1   r/   )Úsurf_oriZforce_fixedÚcopyr   r†   z>Error converting solution, please notify mne-python developersZsolr=   NrC   r<   )Zinclude_activez@No valid projectors found for channel type %s, cannot compute %sz%No projectors used, cannot compute %sé   r   )r;   Z
compute_uvrZ   rq   zUnknown mode type (got %s))r   r‚   c                 S   s   g | ]}|d  ‘qS )Zvertnor#   )r5   Úsr#   r#   r$   r8   Ë  s     z#sensitivity_map.<locals>.<listcomp>Úsrcrp   )rc   ZtstepÚsubject)r@   r*   r   r   rA   r   r   rk   r   r   r   rJ   rj   rx   ÚemptyÚrangerE   Znormrv   r   r   rK   r?   )Zfwdr"   r€   r�   r/   r   r*   ZgainZeeg_aveZresidual_typesrX   ZncomprU   Z	n_sensorsZ	n_dipolesZn_locationsÚsensitivity_mapr6   Zggr‰   ÚgzÚcoÚpr‹   Zverticesr#   r#   r$   rŽ   X  sŽ       ÿ ÿ

ÿ

ÿ


 









  ÿrŽ   )N)r(   N)rZ   rZ   rZ   NNr(   N)rZ   rZ   rZ   Nr(   N)r   Nr   rZ   rZ   r   NNNr(   N).ÚnumpyrJ   re   r   Úutilsr   r   r   r   r   Zio.constantsr	   Zio.openr
   Zio.pickr   r   Zio.projr   r   r   r   r   r   Zio.writer   Úeventr   rm   r   Zcovr   Úforwardr   r   r   Zsource_estimater   r%   r'   rY   rg   r]   ro   r~   rŽ   r#   r#   r#   r$   Ú<module>   sZ       ÿ@      ÿ6    ÿ.           þQÿ