3
dJ&                 @   sZ  d dl jZd dlZd dlZd dlmZ ddl	m
Z
 ddlmZmZmZmZ ddlmZmZmZmZmZ e
jd	Zeree ed
krd dlmZmZ eeee Zx,eD ]$\ZZejddZeeee e< qW [n
ej d G dd deZ!G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd deZ&dddZ'd ddZ(dS )!    N)LooseVersion   )logging   )traitsTraitedSpecFile	isdefined   )	HAVE_DIPYdipy_versiondipy_to_nipype_interfaceget_dipy_workflowsDipyBaseInterfaceznipype.interfacez0.15)denoisemaskZFlow zUWe advise you to upgrade DIPY version. This upgrade will open access to more functionc               @   sD   e Zd ZeddddZejejejejddZej	dddddZ
d	S )
ResampleInputSpecTz*The input 4D diffusion-weighted image file)exists	mandatorydesczspecify the new voxel zooms. If no vox_size is set, then isotropic regridding will be performed, with spacing equal to the smallest current zoom.)r   r
   z8order of the interpolator (0 = nearest, 1 = linear, etc.)r   
usedefaultr   N)__name__
__module____qualname__r   in_filer   TupleFloatvox_sizeIntinterp r!   r!   C/tmp/pip-build-7vycvbft/nipype/nipype/interfaces/dipy/preprocess.pyr   %   s   r   c               @   s   e Zd ZeddZdS )ResampleOutputSpecT)r   N)r   r   r   r   out_filer!   r!   r!   r"   r#   <   s   r#   c               @   s0   e Zd ZdZeZeZdd Zdd Z	dd Z
dS )	ResampleaY  
    An interface to reslicing diffusion datasets.
    See
    http://nipy.org/dipy/examples_built/reslice_datasets.html#example-reslice-datasets.

    Example
    -------

    >>> import nipype.interfaces.dipy as dipy
    >>> reslice = dipy.Resample()
    >>> reslice.inputs.in_file = 'diffusion.nii'
    >>> reslice.run() # doctest: +SKIP
    c             C   sR   | j j}d }t| j jr | j j}tj| j }t| j j|||d t	j
d| |S )N)order	new_zoomsr$   zResliced image saved as %s)inputsr    r	   r   opabspath_gen_outfilenameresample_proxyr   IFLOGGERinfo)selfruntimer&   r   r$   r!   r!   r"   _run_interfaceR   s    zResample._run_interfacec             C   s"   | j  j }tj| j |d< |S )Nr$   )_outputsgetr)   r*   r+   )r/   outputsr!   r!   r"   _list_outputsa   s    zResample._list_outputsc             C   sH   t jt j| jj\}}|dkr6t j|\}}|| }t jd||f S )Nz.gzz%s_reslice%s)r)   splitextbasenamer(   r   r*   )r/   fnamefextfext2r!   r!   r"   r+   f   s
    zResample._gen_outfilenameN)r   r   r   __doc__r   
input_specr#   output_specr1   r5   r+   r!   r!   r!   r"   r%   @   s   r%   c               @   s~   e Zd ZeddddZedddZejdddddd	Zed
ddZ	edddZ
ejddddZejddddZejddZdS )DenoiseInputSpecTz*The input 4D diffusion-weighted image file)r   r   r   z
brain mask)r   r   ricianZgaussianznoise distribution model)r   r   r   z.mask in which the mean signal will be computed)r   r   z>mask in which the standard deviation of noise will be computedr
   zpatch radius)r   r      block_radiuszmanually set an SNR)r   N)r   r   r   r   r   in_maskr   Enumnoise_modelsignal_mask
noise_maskr   patch_radiusrA   r   snrr!   r!   r!   r"   r>   n   s"   
r>   c               @   s   e Zd ZeddZdS )DenoiseOutputSpecT)r   N)r   r   r   r   r$   r!   r!   r!   r"   rI      s   rI   c               @   s0   e Zd ZdZeZeZdd Zdd Z	dd Z
dS )	Denoisea^  
    An interface to denoising diffusion datasets [Coupe2008]_.
    See
    http://nipy.org/dipy/examples_built/denoise_nlmeans.html#example-denoise-nlmeans.

    .. [Coupe2008] Coupe P et al., `An Optimized Blockwise Non Local Means
      Denoising Filter for 3D Magnetic Resonance Images
      <https://doi.org/10.1109%2FTMI.2007.906087>`_,
      IEEE Transactions on Medical Imaging, 27(4):425-441, 2008.


    Example
    -------

    >>> import nipype.interfaces.dipy as dipy
    >>> denoise = dipy.Denoise()
    >>> denoise.inputs.in_file = 'diffusion.nii'
    >>> denoise.run() # doctest: +SKIP
    c       	      C   s  t j| j }td | jjdkd}t| jjrHtj	t
j| jjj|d< t| jjr`| jj|d< t| jjrx| jj|d< d }t| jjr| jj}d }t| jjrtj	t
j| jjj}d }t| jjrtj	t
j| jjj}t| jj|||||d\}}tjd|t| |S )Nr?   )r   r?   r   rG   rA   )rH   smasknmaskr$   z,Denoised image saved as %s, estimated SNR=%s)r)   r*   r+   dictr(   rD   r	   rB   npZ
asanyarraynbloadZdataobjrG   rA   rH   rE   rF   nlmeans_proxyr   r-   r.   str)	r/   r0   r$   settingsrH   rE   rF   _sr!   r!   r"   r1      s4    zDenoise._run_interfacec             C   s"   | j  j }tj| j |d< |S )Nr$   )r2   r3   r)   r*   r+   )r/   r4   r!   r!   r"   r5      s    zDenoise._list_outputsc             C   sH   t jt j| jj\}}|dkr6t j|\}}|| }t jd||f S )Nz.gzz%s_denoise%s)r)   r6   r7   r(   r   r*   )r/   r8   r9   r:   r!   r!   r"   r+      s
    zDenoise._gen_outfilenameN)r   r   r   r;   r>   r<   rI   r=   r1   r5   r+   r!   r!   r!   r"   rJ      s   $rJ   c             C   sH  ddl m} |dkrXtjtj| \}}|dkrFtj|\}}|| }tjd||f }tj| }|jj	 }	|j
tjd}
|j}|	j dd }|dkrtj|j }ttjd
| }tj||kr| S ||
||||d\}}tj|	j }|d |dd< |	jt| |	j|j |	jd	 tj|j|	j ||	j| ||fS )zR
    Performs regridding of an image to set isotropic voxel sizes using dipy.
    r   )resliceNz.gzz./%s_reslice%s)dtyper   )r&   mm)r   )Zdipy.align.reslicerV   r)   r6   r7   r*   rO   rP   headercopy	get_fdatarN   Zfloat32affineZ	get_zoomsarraymintupleZonesallZ	set_zoomsZset_data_shapeshapeZset_xyzt_unitsNifti1Imageastypeget_data_dtypeto_filename)r   r&   r'   r$   rV   r8   r9   r:   imghdrdatar\   Zim_zoomsZminzoomZdata2Zaffine2Z	tmp_zoomsr!   r!   r"   r,      s4    


r,   c             C   s   ddl m} ddlm} ddlm} |dkrptjtj| \}	}
|
dkr^tj|	\}	}||
 }
tj	d|	|
f }t
j| }|j}|j }|j}|jdk r|d	tjf }tj|}|j d
k rtdd}|j dk rd|j  }||9 }|d }|dkrtj|}d||tj|dk< ||jtjddjtj}|dkrtj|tjd}|d }|dkrtj|}d||tj||dk dk< |j|\}}|j||t|d }tj|}tj|tjd}d|||k< d||dk< n,tj|}d||dk< d||dk < |jt}||ddjtj}tj|}d}|dk	rL|g|j d  }d}ng }xvt|j d D ]d}|d	|f }|rtj!||dk }tj"||dk }|j#||  |||| f||d	|f< q`W tj|}|| }t
j$|j|j% ||j&| ||fS )z5
    Uses non-local means to denoise 4D datasets
    r   )nlmeans)binary_erosion)ndimageNz.gzz./%s_denoise%s   .g-C6?zThere is no signal in the imageg      ?g     @@r
   g     @U@r   )Z
iterations)rW   r   
   g        TF).r   rn   )'Zdipy.denoise.nlmeansri   Zscipy.ndimage.morphologyrj   Zscipyrk   r)   r6   r7   r*   rO   rP   rY   r[   r\   ndimrN   ZnewaxisZ
nan_to_nummaxRuntimeErrorZ
zeros_likeZ
percentilerc   Zuint8Z	ones_likelabelsumrangeZargmaxZsqueezeboolra   ZmeanZstdappendrb   rd   re   )r   rS   rH   rK   rL   r$   ri   rj   rk   r8   r9   r:   rf   rg   rh   ZaffZdfZb0ZbmaskZlabel_imZ	nb_labelssizesZmaxidxZdenZest_snridrU   nr!   r!   r"   rQ      sz    












 
rQ   )r   NN)NNNN))os.pathpathr)   ZnibabelrO   numpyrN   distutils.versionr   r   r   baser   r   r   r	   r   r   r   r   r   	getLoggerr-   Zdipy.workflowsr   r   Zl_wkflwnameobjreplacenew_nameglobalsr.   r   r#   r%   r>   rI   rJ   r,   rQ   r!   r!   r!   r"   <module>   s0   

.I
&