3
df                 @   sB  d dl jZd dl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mZmZmZmZ ddlmZ e	jd	Zd
d Zdd Zdd Zdd Zdd Zd0ddZdd Zdd Zd1ddZ dd Z!d d! Z"d2d"d#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(G d.d/ d/eZ)dS )3    N   )logging)split_filename   )BaseInterfaceBaseInterfaceInputSpectraitsFileTraitedSpecInputMultiPathOutputMultiPath	isdefined   )have_cmpznipype.interfacec             C   sH   t | tjjjsDt| \}}}|dkr2tj| } n|dkrDtj| } | S )Nz.pckz.graphml)
isinstancenxclassesgraphGraphr   read_gpickleZread_graphml)ntwk_ext r   ;/tmp/pip-build-7vycvbft/nipype/nipype/interfaces/cmtk/nx.pyread_unknown_ntwk   s    
r   c             C   s:   | j  }t|j }x |D ]}| j|d |d  qW | S )Nr   r   )copylistedgesremove_edge)r   Zntwktmpr   edger   r   r   remove_all_edges%   s
    
r!   c       	      C   s6  ddl }|j }t| j }t| j }x|D ]~}i }|j| j|  d| j| krf| j| d |d< |jt|f| d|jt| kr.d|kr.t|d |jt| d< q.W x~|D ]t}i }| j|d  |d  }|j	t|d t|d f| d|jt|d  t|d  krFt|d |jt|d  t|d  d< d|jt|d  t|d  krt|d |jt|d  t|d  d< d	|jt|d  t|d  krt|d	 |jt|d  t|d  d	< d
|jt|d  t|d  krt|d
 |jt|d  t|d  d
< qW |S )zv
    GEXF Networks can be read in Gephi, however, the keys for the node and edge IDs must be converted to strings
    r   NZ	dn_fsnamelabelZdn_positionr   Zfiber_length_meanZfiber_length_stdZnumber_of_fibersvalue)
networkxr   r   nodesr   updateadd_nodestrr    add_edge)	origr   r   r%   r   nodeZnewnodedatar    datar   r   r   fix_keys_for_gexf-   s8    
 $($($(".r-   c             C   s@   i }x6| D ].}x(|D ] }||kr| | ||  ||< qW q
W |S )zV
    Combines two dictionaries and adds the values for those keys that are shared
    r   )Zin_dict1Zin_dict2Zbothkey1key2r   r   r   add_dicts_by_keyS   s    

r0   c             C   s  ddl }ddlj}ddlj}tjd| g }t| dkrHt| d }nt	j
t| d }tjdt| | t|}tjd|j  t|}	|	j }
x"t| D ]\}}|j|}tjd||j  t|j }x|D ]x}i }|j|d  |d  }d|d	< |	j|d |d r8i }|	j|d  |d  }t||}|	j|d |d f| qW t|j }xT|D ]L}i }|	j| }d
|j| kr|d
 |j| d
  |d
< |	j|f| qfW qW t|	j }t|	j }tjd|	j  |j }i }xV|D ]N}|	j| }|}d
|kr2|d
 t|  |d
< ||	j| d
< |j|f| qW i }t	j|j |j f|d	< x|D ]}|	j|d  |d  }|	j|d  |d  d	 |krx4t|j D ]$}|d	ks|| t|  ||< qW ||	j|d  |d < |j|d |d f| |	j|d  |d  d	 |d	 |d d  |d d < qjW tjd|j  |j }x|D ]|}|j|d  |d  }x^t|j D ]N}|d	kst	j|j |j f||< || || |d d  |d d < qW qbW xlt|j D ]\}i }|d | d }|j|j| || ||< |j|j|| tjd||j| qW |d }|j||j| tjd|j| t |}|d }|j!||j| tjd|j| ||fS )z
    Sums the edges of input networks and divides by the number of networks
    Writes the average network as .pck and .gexf and returns the name of the written networks
    r   Nz&Creating average network for group: %sr   g       @zZNumber of networks: %i, an edge must occur in at least %i to remain in the average networkz)%i nodes found in network resolution filezFile %s has %i edgescountr#   zTotal network has %i edgesz4After thresholding, the average network has %i edgesr   z_average.matz(Saving average network for key: %s as %sz_average.pckzSaving average network as %sz_average.gexf)"r$   os.pathpathscipy.ioioifloggerinfolenr   nproundnumber_of_nodesr!   r   	enumerater   number_of_edgesr   r   r    has_edger0   r)   r%   r'   r   zeroskeysappendabspathsavematwrite_gpickler-   Z
write_gexf)in_filesntwk_res_filegroup_idr   opsiomatlab_network_listZavg_ntwkZcount_to_keep_edger   Zcounting_ntwkindexsubjecttmpr   r    r,   currentr%   r+   newdataZ	edge_dictkeyZ	avg_edgesnetwork_namer   r   r   average_networks_   s    










 
(


0rR   Fc             C   s  t jd i }t jd tjt| j j |d< t jd tjttj| j |d< t jd tjttj	| j |d< t jd tjttj
| j |d	< t jd
 tjttj| j |d< t jd tjttj| j |d< t jd tjttj| j |d< t jd tjttj| j |d< t jd tj| }tj| j df}x|D ]}|d }d||< qhW ||d< |rt jd tjttj| j |d< t jd tjttj| j |d< |S )z*
    These return node-based measures
    zComputing node measures:z...Computing degree...degreez...Computing load centrality...load_centralityz&...Computing betweenness centrality...betweenness_centralityz!...Computing degree centrality...degree_centralityz$...Computing closeness centrality...closeness_centralityz...Computing triangles...	trianglesz...Computing clustering...
clusteringz...Computing k-core numbercore_numberz"...Identifying network isolates...r   isolatesz!...Calculating node clique numbernode_clique_numberz/...Computing number of cliques for each node...number_of_cliques)r6   r7   r9   arrayr   rS   valuesr   rT   rU   rV   rW   rX   rY   rZ   r[   r?   r;   r\   r]   )r   calculate_cliquesmeasuresZisolate_listZ	binarizedr#   r   r   r   compute_node_measures   sF    













rb   c             C   s   t jd i }|S )z*
    These return edge-based measures
    zComputing edge measures:)r6   r7   )r   ra   r   r   r   compute_edge_measures  s    
rc   c             C   s*   t jd i }t jd tj| |d< |S )z
    Returns a dictionary
    z-Computing measures which return a dictionary:z%...Computing rich club coefficient...Zrich_club_coef)r6   r7   r   Zrich_club_coefficient)r   ra   r   r   r   compute_dict_measures  s
    

rd   Tc             C   s:  t jd i }t jd tj| |d< t jd tj| |d< t jd tj| |d< t jd tj| |d	< t jd
 tj| |d< t jd tj| |d< t jd tj	| |d< t jd tj
| |d< tj| rt jd tj| ||d< n$t jd tjtj| d ||d< |r6t jd tj| |d< |S )z,
    Returns a single value per network
    z!Computing single valued measures:z6...Computing degree assortativity (pearson number) ...Zdegree_pearsonrz$...Computing degree assortativity...Zdegree_assortativityz...Computing transitivity...transitivityz....Computing number of connected_components...number_connected_componentsz...Computing graph density...Zgraph_densityz...Recording number of edges...r=   z...Recording number of nodes...r;   z"...Computing average clustering...average_clusteringz....Calculating average shortest path length...average_shortest_path_lengthr   z#...Computing graph clique number...graph_clique_number)r6   r7   r   Z&degree_pearson_correlation_coefficientZ degree_assortativity_coefficientre   rf   Zdensityr=   r;   rg   Zis_connectedrh   Zconnected_component_subgraphsri   )r   weightedr`   ra   r   r   r   compute_singlevalued_measures  s<    













rk   c             C   s   i }|S )Nr   )r   ra   r   r   r   compute_network_measuresE  s    rl   c             C   sf   t j }i }xT|jddD ]D\}}t|dks| t|d  |d< |j| |jt|f| qW |S )NT)r,   r   r   r#   )r   r   r%   intr&   r'   )Z
node_arrayr   Z	node_ntwkrO   idxr,   r   r   r   add_node_dataP  s    
ro   c       
      C   s   |j  }i }xt| D ]\}}xtdtjtj| | D ]}| ||f dks:| ||f |d< |d |ksv|d |kr:|j|d |d r|j|d  |d  }	|j|d |d  |j	|	 |j
|d |d f| q:W qW |S )Nr   r#   r   )r   r<   ranger9   maxshaper>   r    r   r&   r)   )
Z
edge_arrayr   ZaboveZbelowZ	edge_ntwkr,   xrowyZold_edge_dictr   r   r   add_edge_data[  s     
 rv   c               @   s   e Zd Zeddd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ddZedddZedddZedddZeddddZdS )NetworkXMetricsInputSpecTzInput network)exists	mandatorydesck_corez4Computed k-core network stored as a NetworkX pickle.)
usedefaultrz   k_shellz5Computed k-shell network stored as a NetworkX pickle.k_crustz5Computed k-crust network stored as a NetworkX pickle.z^Some network metrics can be calculated while considering only a binarized version of the graphFzVComputing clique-related measures (e.g. node clique number) can be very time consumingz)Output node metrics in MATLAB .mat format)Zgenfilerz   z)Output edge metrics in MATLAB .mat formatZextra_measureszINetwork measures for group 1 that return dictionaries stored as a Pickle.N)__name__
__module____qualname__r	   in_file
out_k_coreout_k_shellout_k_crustr   ZBooltreat_as_weighted_graphcompute_clique_related_measuresout_global_metrics_matlabout_node_metrics_matlabout_edge_metrics_matlabout_pickled_extra_measuresr   r   r   r   rw   k  s>   


rw   c               @   s   e Zd ZeeddZeeddZeddZeddZeddZ	eeddZ
eeddZeed	dZed
dZeddZeddZeddZeeddZdS )NetworkXMetricsOutputSpeczOutput gpickled network files)rz   z,Output network metrics in MATLAB .mat formatz+Output global metrics in MATLAB .mat formatz)Output node metrics in MATLAB .mat formatz)Output edge metrics in MATLAB .mat formatz9Output gpickled network files for all node-based measuresz9Output gpickled network files for all edge-based measureszKOutput gpickled network files for the k-core, k-shell, and k-crust networksz4Computed k-core network stored as a NetworkX pickle.z5Computed k-shell network stored as a NetworkX pickle.z5Computed k-crust network stored as a NetworkX pickle.zLNetwork measures for the group that return dictionaries, stored as a Pickle.zSNetwork measures for the group that return dictionaries, stored as matlab matrices.N)r   r   r   r   r	   gpickled_network_filesmatlab_matrix_filesglobal_measures_matlabnode_measures_matlabedge_measures_matlabnode_measure_networksedge_measure_networks
k_networksr{   r}   r~   pickled_extra_measuresmatlab_dict_measuresr   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 )	NetworkXMetricsa(  
    Calculates and outputs NetworkX-based measures for an input network

    Example
    -------
    >>> import nipype.interfaces.cmtk as cmtk
    >>> nxmetrics = cmtk.NetworkXMetrics()
    >>> nxmetrics.inputs.in_file = 'subj1.pck'
    >>> nxmetrics.run()                 # doctest: +SKIP

    c             C   s  dd l j}t at at at at atj	| j
j}| j
j}| j
j}t|||}t| j
jrntj| j
j}ntj| jdd}|j||dd tj| t||}xJt|j D ]:}	t||	 |}
tj| j|	d}tj|
| tj| qW t| j
jrtj| j
j}ntj| jdd}|j||dd tj| tjt t|}xLt|j D ]<}	t||	 |}
tj| j|	d}tj|
| tj| qZW t| j
jrtj| j
j}ntj| jdd}|j||dd tj| tjt t|}xt|j D ]}	|	d	kr(tj| j| j
j d}|	d
krHtj| j| j
j!d}|	dkrhtj| j| j
j"d}tj||	 | tj| qW tjt tj| j| j
j#d}t$|}t%j&dtj| t'|d}t(j)|| W d Q R X t%j&dt t a*xt+|j D ]\}}	xvt+||	 j D ]b\}}|dkrNt,j-|}t,j-||	 | }n0t,j|t,j-|}t,j-||	 | }t,j||}qW t,j.||f}tj| j|	d}i }|||	< |j||dd t*j| qW |S )Nr   globalmetricsmatcolumn)Zoned_aspcknodemetricsedgemetricsr{   r}   r~   z0Saving extra measure file to %s in Pickle formatwzSaving MATLAB measures as %s)/r4   r5   r   gpickled	nodentwks	edgentwkskntwksZmatlabr   r   inputsr   r   r   rk   r   r   rH   rB   _gen_outfilenamerC   rA   rb   r@   ro   rD   r   extendrc   rv   r   rl   r   r   r   r   rd   r6   r7   openpickledumpdictsr<   r9   r^   Zvstack)selfruntimerI   r   r`   rj   Zglobal_measuresZglobal_out_fileZnode_measuresrP   Znewntwkout_fileZnode_out_fileZedge_measuresZedge_out_fileZntwk_measuresr   Zdict_measuresforn   ZidxdZkeydZnparraykeysZnparrayvaluesr_   ZnparrayZnpdictr   r   r   _run_interface  s    













zNetworkXMetrics._run_interfacec             C   s   | j  j }tj| j| jjd|d< tj| j| jjd|d< tj| j| jjd|d< t	|d< t
|d< t|d< t|d< t|d	< tj| jd
d|d< tj| jdd|d< tj| jdd|d< |d |d |d g|d< tj| j| jjd|d< |S )Nr   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )output_specgetrH   rB   r   r   r   r   r   r   r   r   r   r   r   )r   outputsr   r   r   _list_outputs3  s0    zNetworkXMetrics._list_outputsc             C   s   |d | S )N.r   )r   namer   r   r   r   r   V  s    z NetworkXMetrics._gen_outfilenameN)r   r   r   __doc__rw   
input_specr   r   r   r   r   r   r   r   r   r     s   m#r   c               @   sP   e Zd ZeedddddZedddZejdddd	Z	ed
dZ
eddZdS )AverageNetworksInputSpecT)rx   z Networks for a group of subjects)ry   rz   zParcellation files from Connectome Mapping Toolkit. This is not necessary, but if included, the interface will output the statistical maps as networkx graphs.)rx   rz   Zgroup1zID for group)r|   rz   z(Average network saved as a NetworkX .pck)rz   z%Average network saved as a .gexf fileN)r   r   r   r   r	   rE   resolution_network_filer   StrrG   out_gpickled_groupavgout_gexf_groupavgr   r   r   r   r   Z  s   
r   c               @   s.   e Zd ZeddZeddZeeddZdS )AverageNetworksOutputSpecz(Average network saved as a NetworkX .pck)rz   z%Average network saved as a .gexf fileN)r   r   r   r	   gpickled_groupavggexf_groupavgr   matlab_groupavgsr   r   r   r   r   h  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 )	AverageNetworksa  
    Calculates and outputs the average network given a set of input NetworkX gpickle files

    This interface will only keep an edge in the averaged network if that edge is present in
    at least half of the input networks.

    Example
    -------
    >>> import nipype.interfaces.cmtk as cmtk
    >>> avg = cmtk.AverageNetworks()
    >>> avg.inputs.in_files = ['subj1.pck', 'subj2.pck']
    >>> avg.run()                 # doctest: +SKIP

    c             C   s>   t | jjr| jj}n| jjd }t| jj|| jj\}a|S )Nr   )r   r   r   rE   rR   rG   rJ   )r   r   rF   rQ   r   r   r   r     s    
zAverageNetworks._run_interfacec             C   s   | j  j }t| jjs8tj| j| jjd d|d< ntj| jj|d< t| jj	svtj| j| jjd d|d< ntj| jj	|d< t
|d< |S )NZ_averager   r   Zgexfr   r   )r   r   r   r   r   rH   rB   r   rG   r   rJ   )r   r   r   r   r   r     s    zAverageNetworks._list_outputsc             C   s   |d | S )Nr   r   )r   r   r   r   r   r   r     s    z AverageNetworks._gen_outfilenameN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   p  s   r   )F)TF)r   r   )*r2   r3   rH   r   numpyr9   r$   r    r   Zutils.filemanipr   baser   r   r   r	   r
   r   r   r   r   	getLoggerr6   r   r!   r-   r0   rR   rb   rc   rd   rk   rl   ro   rv   rw   r   r   r   r   r   r   r   r   r   <module>   s6   
(


&u
/
(
+  %