3
d:                 @   s   d Z ddljZddlZddlZddlmZ ddl	m
Z
mZmZmZmZmZ ddgZd	ayddlZdd
lmZ W n ek
r   daY nX dd Zdd ZG dd deZG dd deZG dd deZdd Zd ddZdefddZefddZdd ZdS )!z Base interfaces for dipy     N   )logging   )traitsFile	isdefinedLibraryBaseInterfaceBaseInterfaceInputSpecTraitedSpecWorkflowZCombinedWorkflowT)IntrospectiveArgumentParserFc               C   s   t  S )zCheck if dipy is available.)	HAVE_DIPY r   r   =/tmp/pip-build-7vycvbft/nipype/nipype/interfaces/dipy/base.pyno_dipy   s    r   c               C   s   t  r
dS tjS )zCheck dipy version.N)r   dipy__version__r   r   r   r   dipy_version#   s    r   c               @   s   e Zd ZdZdZdS )DipyBaseInterfacez0A base interface for py:mod:`dipy` computations.r   N)__name__
__module____qualname____doc__Z_pkgr   r   r   r   r   +   s   r   c               @   sR   e Zd ZeddddZeddddZeddddZejddddZ	ej
d	d
ZdS )DipyBaseInterfaceInputSpecTzinput diffusion data)exists	mandatorydesczinput b-values tablezinput b-vectors tablei  zb0 threshold)
usedefaultr   zoutput prefix for file names)r   N)r   r   r   r   in_filein_bvalin_bvecr   Intb0_thresStr
out_prefixr   r   r   r   r   1   s
   r   c               @   s&   e Zd ZdZeZdd ZdddZdS )DipyDiffusionInterfacez0A base interface for py:mod:`dipy` computations.c             C   sB   t j| jj}t j| jjj}ddlm} |||}| jj|_	|S )Nr   )gradient_table)
npZloadtxtinputsr   r    TZdipy.core.gradientsr&   r"   Zb0_threshold)selfZbvalZbvecr&   Zgtabr   r   r   _get_gradient_table>   s    

z*DipyDiffusionInterface._get_gradient_tableNc             C   sr   t jt j| jj\}}|dkr6t j|\}}|| }t| jjsNt j|}n| jj}|d krb|}|d | | S )Nz.gz_)opsplitextbasenamer(   r   r   r$   abspath)r*   nameextfnameZfextZfext2r$   r   r   r   _gen_filenameH   s    z$DipyDiffusionInterface._gen_filename)N)r   r   r   r   r   
input_specr+   r4   r   r   r   r   r%   9   s   
r%   c             C   s   t j| }dd |jj D S )zReturn optional arguments of a function.

    Parameters
    ----------
    func: callable

    Returns
    -------
    dict

    c             S   s&   i | ]\}}|j tjjk	r|j |qS r   )defaultinspect	Parameterempty).0kvr   r   r   
<dictcomp>f   s   z$get_default_args.<locals>.<dictcomp>)r7   	signature
parametersitems)funcr>   r   r   r   get_default_argsY   s    
rB   c             C   s(  | j  } td| k}d| kr.d| kr.tj|fS d| krHd| krHtj|fS d| krbd| krbtj|fS d| kr|d| kr|tj|fS d| krd| krtj|fS d| kr| rtj|fS d| kr|rt	|fS d| krtj
|fS d| krtj|fS d| k rtj|fS d| krtj|fS dj| d	 }t|d
S )z!Convert DIPY type to Traits type.optionalvariablestringintfloatboolcomplexz)Error during convert_to_traits_type({0}).zUnknown DIPY type.N)lowerrH   r   ZListStrZListIntZ	ListFloatZListBoolZListComplexr#   r   r!   ZFloatZBoolComplexformatIOError)	dipy_typeis_fileis_mandatorymsgr   r   r   convert_to_traits_typem   s6    











rR   c             C   s   i }|dk	rx|D ]}|d |d |d   }}}t d|kpBd|k}t||\}	}
|jtjkrt|dkr|	|d |d d|
d	||< q|	|d |
d
||< q|	|d |d ddd||< qW tt| |f|}|S )ak  Create IN/Out interface specifications dynamically.

    Parameters
    ----------
    class_name: str
        The future class name(e.g, (MyClassInSpec))
    params: list of tuple
        dipy argument list
    BaseClass: TraitedSpec object
        parent class

    Returns
    -------
    newclass: object
        new nipype interface specification class

    Nr      r   filesZout_r   T)r   r   r   )r   r   )r   r   r   rU   rU   )rH   rR   r   r	   lentypestr)
class_nameparams	BaseClassattrpr1   rN   r   rO   Ztraits_typerP   newclassr   r   r   create_interface_specs   s    
r_   c                s   t  }  }|j| tt|jj }dd t|j|D }t|jt|j	 }dd t|j	||d D }|j
| }	tdj| |	td}
tdj| |td} fdd	}d
d }tt| |f|
|||d}|S )a  Construct a class in order to respect nipype interface specifications.

    This convenient class factory convert a DIPY Workflow to a nipype
    interface.

    Parameters
    ----------
    cls_name: string
        new class name
    dipy_flow: Workflow class type.
        It should be any children class of `dipy.workflows.workflow.Worflow`
    BaseClass: object
        nipype instance object

    Returns
    -------
    newclass: object
        new nipype interface specification class

    c             S   s   g | ]\}}||f qS r   r   )r:   argsvalr   r   r   
<listcomp>   s    z,dipy_to_nipype_interface.<locals>.<listcomp>c             S   s   g | ]\}}||f qS r   r   )r:   r`   ra   r   r   r   rb      s   Nz{}InputSpec)r[   z{}OutputSpecc                s      }| j j }|jf | d S )N)r(   getrun)r*   Zruntimeflowr`   )	dipy_flowr   r   _run_interface   s    
z0dipy_to_nipype_interface.<locals>._run_interfacec             S   sB   | j  j }|jdd}x$|j D ]\}}tj||||< q"W |S )Nout_dir.)Z_outputsrc   r@   r-   join)r*   outputsrh   keyvaluesr   r   r   _list_outputs   s
    z/dipy_to_nipype_interface.<locals>._list_outputs)r5   output_specrg   z_list_outputs:)r   Zadd_workflowlistrB   rd   rm   zipZoptional_parametersrV   output_parametersZpositional_parametersr_   rL   r	   r
   rW   rX   )Zcls_namerf   r[   parserre   Zdefault_valuesZoptional_paramsstartrr   Zinput_parametersr5   ro   rg   rn   r^   r   )rf   r   dipy_to_nipype_interface   s2    


ru   c                s    fddt j D S )a  Search for DIPY workflow class.

    Parameters
    ----------
    module : object
        module object

    Returns
    -------
    l_wkflw : list of tuple
        This a list of tuple containing 2 elements:
        Worflow name, Workflow class obj

    Examples
    --------
    >>> from dipy.workflows import align  # doctest: +SKIP
    >>> get_dipy_workflows(align)  # doctest: +SKIP

    c                s6   g | ].\}}t j|rt| jr|tkr||fqS r   )r7   isclass
issubclassr   SKIP_WORKFLOWS_LIST)r:   mobj)moduler   r   rb     s   
z&get_dipy_workflows.<locals>.<listcomp>)r7   
getmembers)r{   r   )r{   r   get_dipy_workflows   s    
r}   )F) r   os.pathpathr-   r7   numpyr'    r   baser   r   r   r   r	   r
   rx   r   r   Zdipy.workflows.baser   ImportErrorr   r   r   r   r%   rB   rR   r_   ru   r}   r   r   r   r   <module>   s,   
 

 
")H