3
md                 @   s   d dl jZd dlZd dlmZmZmZm	Z	 d dl
mZmZmZmZ G dd deZG dd deZdd	 Z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S )    N)WorkflowMapNodeNodeIdentityInterface)TraitedSpecFileOutputMultiPath	isdefinedc               @   s    e Zd ZdZdd Zdd ZdS )InputWrapperz?Implements connections between DataGrabber and workflow inputs.c             C   s   || _ || _|| _|| _d S )N)wf	subj_node	grab_nodein_node)selfworkflowsubject_nodeZgrabber_nodeZ
input_node r   5/tmp/pip-build-7vycvbft/fitz/fitz/tools/graphutils.py__init__   s    zInputWrapper.__init__c             C   s   | j j| jd| jd t| jjdr:| j j| jd| jd | jjj }| jjj }x*|D ]"}||krX| j j| j|| j| qXW dS )z:Connect stereotyped inputs to the input IdentityInterface.
subject_idN)	r   connectr   r   hasattrr   inputsoutputsget)r   Zgrabbedr   fieldr   r   r   connect_inputs   s    


zInputWrapper.connect_inputsN)__name__
__module____qualname____doc__r   r   r   r   r   r   r
   	   s   r
   c               @   s<   e Zd ZdZdd ZdddZdd	 Zd
d ZdddZdS )OutputWrapperz=Implements connections between workflow outputs and DataSink.c             C   s   || _ || _|| _|| _d S )N)r   r   	sink_nodeout_node)r   r   r   r"   Zoutput_noder   r   r   r   '   s    zOutputWrapper.__init__run_%dr + 1c             C   s   t | j}t| j}x|D ]}|jt | qW g }xHtt|D ]8}td| }	x&|D ]}
|jd|
|f ||	 f qXW qBW t| j	j
jr| j	j
jj| n
|| j	j
_dS )zAFind mapnode names and add datasink substitutions to sort by run.z(%s)z_%s%dN)find_mapnodesr   find_nested_workflowsextendreversedrangeevalappendr	   r"   r   substitutions)r   Zn_runsZtemplate_patternZtemplate_argsmapnode_namesnested_workflowsr   r-   rZ
templ_argsnamer   r   r   set_mapnode_substitutions.   s    



z'OutputWrapper.set_mapnode_substitutionsc             C   s.   t | jjjr | jjjj| n
|| jj_dS )z=Safely set subsitutions implemented with regular expressions.N)r	   r"   r   Zregexp_substitutionsr(   )r   Zsub_listr   r   r   add_regexp_substitutionsI   s    z&OutputWrapper.add_regexp_substitutionsc             C   sp   | j j| jd| jd g }x&| jjd D ]}|jd| df q(W t| jjjrb| jjjj	| n
|| jj_dS )z*Store results by subject at highest level.r   	container   z/_subject_id_%s//N)
r   r   r   r"   	iterablesr,   r	   r   r-   r(   )r   Z	subj_subssr   r   r   set_subject_containerP   s    
z#OutputWrapper.set_subject_containerNc             C   sL   | j jj }|dkrdn|d }x&|D ]}| jj| j || j||  q&W dS )z0Connect the outputs of a workflow to a datasink.N@z.@)r#   r   r   r   r   r"   )r   dir_namer   prefixr   r   r   r   sink_outputs`   s
    
zOutputWrapper.sink_outputs)r$   r%   )N)	r   r   r   r    r   r2   r3   r9   r=   r   r   r   r   r!   %   s    
r!   c             C   s8   g }t j| j}x"|D ]}t|tr|j|j qW |S )z1Given a workflow, return a list of MapNode names.)nxnodes_graph
isinstancer   r,   r1   )r   r.   wf_nodesnoder   r   r   r&   i   s    

r&   c             C   s6   g }t j| j}x |D ]}t|tr|j| qW |S )z/Given a workflow, find nested workflow objects.)r>   r?   r@   rA   r   r,   )r   r/   rB   rC   r   r   r   r'   t   s    

r'   c             C   s   t tdgdd| fdddS )z=Generate a source node with iterables over a subject_id list.r   )fieldsTZsubj_source)r7   	overwriter1   )r   r   )Zsubject_listr   r   r   make_subject_source   s    rF   c               @   s   e Zd ZeddZdS )SingleInFileT)existsN)r   r   r   r   in_filer   r   r   r   rG      s   rG   c               @   s   e Zd ZeddZdS )SingleOutFileT)rH   N)r   r   r   r   out_filer   r   r   r   rJ      s   rJ   c               @   s   e Zd ZeeddZdS )ManyOutFilesT)rH   N)r   r   r   r   r   Z	out_filesr   r   r   r   rL      s   rL   c                s    fdd}|S )z6Return a _list_outputs function for a single out_file.c                s   | j  j }tj |d< |S )NrK   )Z_outputsr   opabspath)r   r   )fnamer   r   _list_outputs   s    z$list_out_file.<locals>._list_outputsr   )rO   rP   r   )rO   r   list_out_file   s    rQ   )os.pathpathrM   Znetworkxr>   Znipyper   r   r   r   Znipype.interfaces.baser   r   r   r	   objectr
   r!   r&   r'   rF   rG   rJ   rL   rQ   r   r   r   r   <module>   s   
D