3
d8                 @   s  d dl 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mZm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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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G d*d+ d+eZ G d,d- d-eZ!G d.d/ d/eZ"G d0d1 d1eZ#G d2d3 d3eZ$G d4d5 d5eZ%G d6d7 d7eZ&G d8d9 d9eZ'G d:d; d;eZ(G d<d= d=eZ)G d>d? d?eZ*G d@dA dAeZ+G dBdC dCeZ,G dDdE dEeZ-G dFdG dGe
Z.G dHdI dIeZ/G dJdK dKeZ0G dLdM dMe
Z1G dNdO dOeZ2G dPdQ dQeZ3G dRdS dSe
Z4G dTdU dUeZ5G dVdW dWeZ6G dXdY dYe
Z7dS )Z    N   )split_filename   )
CommandLineInputSpecCommandLinetraitsTraitedSpecFile	DirectoryStdOutCommandLineStdOutCommandLineInputSpec	isdefinedInputMultiPathc               @   sN   e Zd ZeddddddZeddddZedddd	d
dZejddddZ	dS )DTIFitInputSpecTz%s   zvoxel-order data filename)existsargstr	mandatorypositiondescz
-bgmask %szProvides the name of a file containing a background mask computed using, for example, FSL bet2 program. The mask file contains zero in background voxels and non-zero in foreground.)r   r   r   r   z>Camino scheme file (b values / vectors, see camino.fsl2scheme)z
-nonlinearr   zYUse non-linear fitting instead of the default linear regression to the log measurements. )r   r   r   N)
__name__
__module____qualname__r	   in_filebgmaskscheme_filer   BoolZ
non_linear r   r   >/tmp/pip-build-7vycvbft/nipype/nipype/interfaces/camino/dti.pyr      s(   r   c               @   s   e Zd ZedddZdS )DTIFitOutputSpecTz%path/name of 4D volume in voxel order)r   r   N)r   r   r   r	   tensor_fittedr   r   r   r   r   7   s   r   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )DTIFita  
    Reads diffusion MRI data, acquired using the acquisition scheme detailed in the scheme file,
    from the data file.

    Use non-linear fitting instead of the default linear regression to the log measurements.
    The data file stores the diffusion MRI data in voxel order with the measurements stored
    in big-endian format and ordered as in the scheme file.
    The default input data type is four-byte float.
    The default output data type is eight-byte double.
    See modelfit and camino for the format of the data file and scheme file.
    The program fits the diffusion tensor to each voxel and outputs the results,
    in voxel order and as big-endian eight-byte doubles, to the standard output.
    The program outputs eight values in each voxel:
    [exit code, ln(S(0)), D_xx, D_xy, D_xz, D_yy, D_yz, D_zz].
    An exit code of zero indicates no problems.
    For a list of other exit codes, see modelfit(1).
    The entry S(0) is an estimate of the signal at q=0.

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> fit = cmon.DTIFit()
    >>> fit.inputs.scheme_file = 'A.scheme'
    >>> fit.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> fit.run()                  # doctest: +SKIP

    Zdtfitc             C   s$   | j  j }tjj| j |d< |S )Nr    )output_specgetospathabspath_gen_outfilename)selfoutputsr   r   r   _list_outputs\   s    zDTIFit._list_outputsc             C   s   t | jj\}}}|d S )Nz_DT.Bdouble)r   inputsr   )r(   _namer   r   r   r'   a   s    zDTIFit._gen_outfilenameN)r   r   r   __doc___cmdr   
input_specr   r"   r*   r'   r   r   r   r   r!   ;   s   r!   c               @   s   e Zd ZedddddZejddddd	d
ddddddddddZejdddddddddd	Zejdddddddddd	Z	eddd d!Z
ed"dd#d$Zd%S )&DTMetricInputSpecTz-inputfile %szvoxel-order data filename)r   r   r   r   famdrdl1l2l3trraZ2dfaZclcpcsz-stat %sz Specifies the metric to compute.)r   r   r   doublefloatlongintshortcharz-inputdatatype %sz*Specifies the data type of the input data.)r   
usedefaultr   z-outputdatatype %sz+Specifies the data type of the output data.z
-header %szA Nifti .nii or .nii.gz file containing the header information. Usually this will be the header of the raw data file from which the diffusion tensors were reconstructed.)r   r   r   z-outputfile %szOutput name. Output will be a .nii.gz file if data_header is provided andin voxel order with outputdatatype datatype (default: double) otherwise.)r   genfiler   N)r   r   r   r	   
eigen_datar   Enummetricinputdatatypeoutputdatatypedata_header
outputfiler   r   r   r   r1   f   sb   r1   c               @   s   e Zd ZedddZdS )DTMetricOutputSpecTz0Diffusion Tensor statistics of the chosen metric)r   r   N)r   r   r   r	   metric_statsr   r   r   r   rK      s   rK   c               @   s<   e Zd ZdZdZeZeZdd Z	dd Z
dd Zd	d
 ZdS )DTMetrica  
    Computes tensor metric statistics based on the eigenvalues l1 >= l2 >= l3
    typically obtained from ComputeEigensystem.

    The full list of statistics is:

     - <cl> = (l1 - l2) / l1 , a measure of linearity
     - <cp> = (l2 - l3) / l1 , a measure of planarity
     - <cs> = l3 / l1 , a measure of isotropy
       with: cl + cp + cs = 1
     - <l1> = first eigenvalue
     - <l2> = second eigenvalue
     - <l3> = third eigenvalue
     - <tr> = l1 + l2 + l3
     - <md> = tr / 3
     - <rd> = (l2 + l3) / 2
     - <fa> = fractional anisotropy. (Basser et al, J Magn Reson B 1996)
     - <ra> = relative anisotropy (Basser et al, J Magn Reson B 1996)
     - <2dfa> = 2D FA of the two minor eigenvalues l2 and l3
       i.e. sqrt( 2 * [(l2 - <l>)^2 + (l3 - <l>)^2] / (l2^2 + l3^2) )
       with: <l> = (l2 + l3) / 2


    Example
    -------
    Compute the CP planar metric as float data type.

    >>> import nipype.interfaces.camino as cam
    >>> dtmetric = cam.DTMetric()
    >>> dtmetric.inputs.eigen_data = 'dteig.Bdouble'
    >>> dtmetric.inputs.metric = 'cp'
    >>> dtmetric.inputs.outputdatatype = 'float'
    >>> dtmetric.run()                  # doctest: +SKIP

    Zdtshapec             C   s$   | j  j }tjj| j |d< |S )NrL   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*      s    zDTMetric._list_outputsc             C   s   | j  S )N)_gen_outputfile)r(   r   r   r   r'      s    zDTMetric._gen_outfilenamec             C   s   | j j}t|s| jd}|S )NrJ   )r+   rJ   r   _gen_filename)r(   rJ   r   r   r   rN      s    
zDTMetric._gen_outputfilec             C   s`   |dkr\t | jj\}}}| jj}| jj}t| jjrH|d | d }n|d | d | }|S )NrJ   r,   z.nii.gzz.B)r   r+   rD   rF   rH   r   rI   )r(   r-   r,   rF   datatypefilenamer   r   r   rO      s    zDTMetric._gen_filenameN)r   r   r   r.   r/   r1   r0   rK   r"   r*   r'   rN   rO   r   r   r   r   rM      s   #rM   c            
   @   s
  e Zd Zdd Zeje ddddZeddddd	Zejd
ddddddddZ	eddddd	Z
e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Zejd d!dZed"dd#dZejd$d%dZejejd&d'd'd(d)Zejejd*d+d+d,d)Zejd-d.dZd/S )0ModelFitInputSpecc                 sb   ddddddg ddd	d
ddddddddddg} ddg} }|j | |j  fdd| D  |S )zf
        Generate all possible permutations of < multi - tensor > < single - tensor > options
        dtZrestoreZalgdtZnldt_posZnldtZldt_wtdZcylcylZ	cylcyl_eqZposposZ	pospos_eqZposcylZ	poscyl_eqZ	cylcylcylZcylcylcyl_eqZ	posposposZpospospos_eqZ	posposcylZposposcyl_eqZ	poscylcylZposcylcyl_eqZadcZ
ball_stickc                s"   g | ]} D ]}|d  | qqS ) r   ).0ZmultiZsingle)single_tensorr   r   
<listcomp>  s    z8ModelFitInputSpec._gen_model_options.<locals>.<listcomp>)extend)Zmulti_tensorotherZ
model_listr   )rV   r   _gen_model_options   s*    
z$ModelFitInputSpec._gen_model_optionsz	-model %sTz*Specifies the model to be fit to the data.)r   r   r   z-inputfile %szvoxel-order data filename)r   r   r   r   r=   rA   r@   r?   r>   r<   z-inputdatatype %szSpecifies the data type of the input file. The input file must have BIG-ENDIAN ordering. By default, the input type is ``float``.)r   r   z-schemefile %sz>Camino scheme file (b values / vectors, see camino.fsl2scheme)z-outputfile %szFilename of the output file.z-outliermap %sz]Specifies the name of the file to contain the outlier map generated by the RESTORE algorithm.)r   r   r   z-noisemap %szSpecifies the name of the file to contain the estimated noise variance on the diffusion-weighted signal, generated by a weighted tensor fit. The data type of this file is big-endian double.z-residualmap %sa)  Specifies the name of the file to contain the weighted residual errors after computing a weighted linear tensor fit. One value is produced per measurement, in voxel order. The data type of this file is big-endian double. Images of the residuals for each measurement can be extracted with shredder.z	-sigma %Gz]Specifies the standard deviation of the noise in the data. Required by the RESTORE algorithm.z-bgthresh %Ga&  Sets a threshold on the average q=0 measurement to separate foreground and background. The program does not process background voxels, but outputs the same number of values in background voxels and foreground voxels. Each value is zero in background voxels apart from the exit code which is -1.z
-bgmask %szProvides the name of a file containing a background mask computed using, for example, FSL's bet2 program. The mask file contains zero in background voxels and non-zero in foreground.z-csfthresh %GzSets a threshold on the average q=0 measurement to determine which voxels are CSF. This program does not treat CSF voxels any different to other voxels.z-fixedmod %s   a  Specifies <M> <N> <Q> <tau> a spherical acquisition scheme with M measurements with q=0 and N measurements with :math:`|q|=Q` and diffusion time tau. The N measurements with :math:`|q|=Q` have unique directions. The program reads in the directions from the files in directory PointSets.)r   minlenmaxlenr   z-fixedbvalue %sr   zAs above, but specifies <M> <N> <b>. The resulting scheme is the same whether you specify b directly or indirectly using -fixedmodq.z-tau %GzSets the diffusion time separately. This overrides the diffusion time specified in a scheme file or by a scheme index for both the acquisition scheme and in the data synthesis.N)r   r   r   rZ   r   rE   modelr	   r   rG   r   rJ   ZoutlierZnoisemapZresidualmapFloatsigmaZbgthreshr   ZcfthreshListZ	fixedmodqZfixedbvaluetaur   r   r   r   rR      s   rR   c               @   s   e Zd ZedddZdS )ModelFitOutputSpecTz'output file of 4D volume in voxel order)r   r   N)r   r   r   r	   fitted_datar   r   r   r   rc     s   rc   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )ModelFita"  
    Fits models of the spin-displacement density to diffusion MRI measurements.

    This is an interface to various model fitting routines for diffusion MRI data that
    fit models of the spin-displacement density function. In particular, it will fit the
    diffusion tensor to a set of measurements as well as various other models including
    two or three-tensor models. The program can read input data from a file or can
    generate synthetic data using various test functions for testing and simulations.

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> fit = cmon.ModelFit()
    >>> fit.model = 'dt'
    >>> fit.inputs.scheme_file = 'A.scheme'
    >>> fit.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> fit.run()                  # doctest: +SKIP

    Zmodelfitc             C   s$   | j  j }tjj| j |d< |S )Nrd   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*     s    zModelFit._list_outputsc             C   s   t | jj\}}}|d S )Nz_fit.Bdouble)r   r+   r   )r(   r,   r-   r   r   r   r'     s    zModelFit._gen_outfilenameN)r   r   r   r.   r/   rR   r0   rc   r"   r*   r'   r   r   r   r   re     s   re   c            	   @   s   e Zd ZejejdddddddZejejdddddddZejd	dd
dZej	ddddZ
ejddddZejdddZejdddZejdddZej	ddddZejddddZedddddZdS ) DTLUTGenInputSpecaz  Index to one-tensor LUTs. This is the ratio L1/L3 and L2 / L3.The LUT is square, with half the values calculated (because L2 / L3 cannot be less than L1 / L3 by definition).The minimum must be >= 1. For comparison, a ratio L1 / L3 = 10 with L2 / L3 = 1 corresponds to an FA of 0.891, and L1 / L3 = 15 with L2 / L3 = 1 corresponds to an FA of 0.929. The default range is 1 to 10.z
-lrange %sr   r   NA)r   r   r\   r]   r   unitszjIndex to two-tensor LUTs. This is the fractional anisotropy of the two tensors. The default is 0.3 to 0.94z
-frange %sz-step %fa  Distance between points in the LUT.For example, if lrange is 1 to 10 and the step is 0.1, LUT entries will be computed at L1 / L3 = 1, 1.1, 1.2 ... 10.0 and at L2 / L3 = 1.0, 1.1 ... L1 / L3.For single tensor LUTs, the default step is 0.2, for two-tensor LUTs it is 0.02.)r   rh   r   z-samples %dz_The number of synthetic measurements to generate at each point in the LUT. The default is 2000.z-snr %fzThe signal to noise ratio of the unweighted (q = 0) measurements.This should match the SNR (in white matter) of the images that the LUTs are used with.z-binghamz7Compute a LUT for the Bingham PDF. This is the default.)r   r   z-acgzCompute a LUT for the ACG PDF.z-watsonz!Compute a LUT for the Watson PDF.z-inversion %dzQIndex of the inversion to use. The default is 1 (linear single tensor inversion).z	-trace %GzsTrace of the diffusion tensor(s) used in the test function in the LUT generation. The default is 2100E-12 m^2 s^-1.z-schemefile %sTz=The scheme file of the images to be processed using this LUT.)r   r   r   r   N)r   r   r   r   ra   r_   ZlrangeZfrangestepIntZsamplesZsnrr   binghamacgwatson	inversiontracer	   r   r   r   r   r   rf     s\   rf   c               @   s   e Zd ZedddZdS )DTLUTGenOutputSpecTzLookup Table)r   r   N)r   r   r   r	   dtLUTr   r   r   r   rp     s   rp   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )DTLUTGena  
    Calibrates the PDFs for PICo probabilistic tractography.

    This program needs to be run once for every acquisition scheme.
    It outputs a lookup table that is used by the dtpicoparams program to find PICo PDF
    parameters for an image.
    The default single tensor LUT contains parameters of the Bingham distribution and is
    generated by supplying a scheme file and an estimated signal to noise in white matter
    regions of the (q=0) image.
    The default inversion is linear (inversion index 1).

    Advanced users can control several options, including the extent and resolution of the LUT,
    the inversion index, and the type of PDF. See dtlutgen(1) for details.

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> dtl = cmon.DTLUTGen()
    >>> dtl.inputs.snr = 16
    >>> dtl.inputs.scheme_file = 'A.scheme'
    >>> dtl.run()                  # doctest: +SKIP

    Zdtlutgenc             C   s$   | j  j }tjj| j |d< |S )Nrq   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*   "  s    zDTLUTGen._list_outputsc             C   s   t | jj\}}}|d S )Nz.dat)r   r+   r   )r(   r,   r-   r   r   r   r'   '  s    zDTLUTGen._gen_outfilenameN)r   r   r   r.   r/   rf   r0   rp   r"   r*   r'   r   r   r   r   rr     s   rr   c            	   @   s   e Zd ZeddddddZejdddd	d
dddZeeddddddZ	ejddddddddZ
ejdddZejddddZejddddZd S )!PicoPDFsInputSpecTz< %sr   zvoxel-order data filename)r   r   r   r   r   rS   multitensorZpdsz-inputmodel %sr   zinput model type)r   r   r   rB   )r   z-luts %saE  Files containing the lookup tables.For tensor data, one lut must be specified for each type of inversion used in the image (one-tensor, two-tensor, three-tensor).For pds, the number of LUTs must match -numpds (it is acceptable to use the same LUT several times - see example, above).These LUTs may be generated with dtlutgen.)r   r   r   rk   rm   rl   z-pdf %sr[   a[  Specifies the PDF to use. There are three choices:

  * watson - The Watson distribution. This distribution is rotationally symmetric.
  * bingham - The Bingham distributionn, which allows elliptical probability density contours.
  * acg - The Angular Central Gaussian distribution, which also allows elliptical probability
    density contours.

z
-directmapzOnly applicable when using pds as the inputmodel. Use direct mapping between the eigenvalues and the distribution parameters instead of the log of the eigenvalues.)r   r   z-maxcomponents %drg   zThe maximum number of tensor components in a voxel (default 2) for multitensor data.Currently, only the default is supported, but future releases may allow the input of three-tensor data using this option.)r   rh   r   z
-numpds %da&  The maximum number of PDs in a voxel (default 3) for PD data.This option determines the size of the input and output voxels.This means that the data file may be large enough to accomodate three or more PDs,but does not mean that any of the voxels are classified as containing three or more PDs.N)r   r   r   r	   r   r   rE   
inputmodelr   Zlutspdfr   Z	directmaprj   maxcomponentsnumpdsr   r   r   r   rs   ,  sL   	rs   c               @   s   e Zd ZedddZdS )PicoPDFsOutputSpecTz%path/name of 4D volume in voxel order)r   r   N)r   r   r   r	   pdfsr   r   r   r   ry   u  s   ry   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )PicoPDFsaq  
    Constructs a spherical PDF in each voxel for probabilistic tractography.

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> pdf = cmon.PicoPDFs()
    >>> pdf.inputs.inputmodel = 'dt'
    >>> pdf.inputs.luts = ['lut_file']
    >>> pdf.inputs.in_file = 'voxel-order_data.Bfloat'
    >>> pdf.run()                  # doctest: +SKIP

    Zpicopdfsc             C   s$   | j  j }tjj| j |d< |S )Nrz   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*     s    zPicoPDFs._list_outputsc             C   s   t | jj\}}}|d S )Nz_pdfs.Bdouble)r   r+   r   )r(   r,   r-   r   r   r   r'     s    zPicoPDFs._gen_outfilenameN)r   r   r   r.   r/   rs   r0   ry   r"   r*   r'   r   r   r   r   r{   y  s   r{   c               @   s~  e Zd ZedddddZedddddZejd	d
ddddddddddddddZejdddddddZ	ejdddd d!d"Z
ejd#d$gd%d&Zejd'd(d)d*d"Zejd+d,d"Zejd-d.d/d0Zejd1d.d2d0Zejejd3d4d5d5d6d7Zejejd8d9d5d5d:d7Zejd;d<d"Zejd=d>d"Zejd?d@gdAd&ZejdBdCd"ZedDddEdFZejd'd(dGdHdId"ZedJdQddKdLZedMdNdRdOdZdPS )STrackInputSpecTz-inputfile %sr   zinput data file)r   r   r   r   z-seedfile %sr   z	seed filerS   rt   ZsfpeakpicoZrepbs_dtZrepbs_multitensor	ballstickZ	wildbs_dt
bayesdiracZbayesdirac_dtbedpostx_dyadbedpostxz-inputmodel %szinput model type)r   r   rB   ZfactZeulerZrk4z-tracker %sa  The tracking algorithm controls streamlines are generated from the data. The choices are: - FACT, which follows the local fibre orientation in each voxel. No interpolation is used.- EULER, which uses a fixed step size along the local fibre orientation. With nearest-neighbour interpolation, this method may be very similar to FACT, except that the step size is fixed, whereas FACT steps extend to the boundary of the next voxel (distance variable depending on the entry and exit points to the voxel).- RK4: Fourth-order Runge-Kutta method. The step size is fixed, however the eventual direction of the step is determined by taking and averaging a series of partial steps.nnZprob_nnZlinearz-interpolator %sa  The interpolation algorithm determines how the fiber orientation(s) are defined at a given continuous point within the input image. Interpolators are only used when the tracking algorithm is not FACT. The choices are: - NN: Nearest-neighbour interpolation, just uses the local voxel data directly.- PROB_NN: Probabilistic nearest-neighbor interpolation,  similar  to the method pro- posed by Behrens et al [Magnetic Resonance in Medicine, 50:1077-1088, 2003]. The data is not interpolated, but at each point we randomly choose one of the 8 voxels sur- rounding a point. The probability of choosing a particular voxel is based on how close the point is to the centre of that voxel.- LINEAR: Linear interpolation of the vector field containing the principal directions at each point.)r   r   z-stepsize %ftrackerz9Step size for EULER and RK4 tracking. The default is 1mm.)r   requiresr   r=   r<   z-inputdatatype %szinput file typez-gzipz$save the output image in gzip formatz-maxcomponents %drg   zThe maximum number of tensor components in a voxel. This determines the size of the input file and does not say anything about the voxel classification. The default is 2 if the input model is multitensor and 1 if the input model is dt.)r   rh   r   z
-numpds %da  The maximum number of PDs in a voxel for input models sfpeak and pico. The default is 3 for input model sfpeak and 1 for input model pico. This option determines the size of the voxels in the input file and does not affect tracking. For tensor data, use the -maxcomponents option.zdata dimensions in voxelsz-datadims %sr   Zvoxels)r   r   r\   r]   rh   zvoxel dimensions in mmz-voxeldims %smmz-ipthresh %fa  Curvature threshold for tracking, expressed as the minimum dot product between two streamline orientations calculated over the length of a voxel. If the dot product between the previous and current directions is less than this threshold, then the streamline terminates. The default setting will terminate fibres that curve by more than 80 degrees. Set this to -1.0 to disable curvature checking completely.z-curvethresh %fzCurvature threshold for tracking, expressed as the maximum angle (in degrees) between between two streamline orientations calculated over the length of a voxel. If the angle is greater than this, then the streamline terminates.z-curveinterval %fcurvethresha  Interval over which the curvature threshold should be evaluated, in mm. The default is 5mm. When using the default curvature threshold of 90 degrees, this means that streamlines will terminate if they curve by more than  90  degrees over a path length of 5mm.z-anisthresh %fzMTerminate fibres that enter a voxel with lower anisotropy than the threshold.z-anisfile %szFile containing the anisotropy map. This is required to apply an anisotropy threshold with non tensor data. If the map issupplied it is always used, even in tensor data.)r   r   r   Zooglz-outputtracts %szoutput tract file typez-outputfile %szoutput data file)r   r   rC   r   Fz-outputroot %szroot directory for outputNr   )r   r   r   r	   r   Z	seed_filer   rE   ru   r   Zinterpolatorr_   ZstepsizerG   r   gziprj   rw   rx   ra   Z	data_dimsZ
voxel_dimsZipthreshr   ZcurveintervalZ
anisthreshZanisfileZoutputtractsout_fileZoutput_rootr   r   r   r   r|     s   			
r|   c               @   s   e Zd ZedddZdS )TrackOutputSpecTz+output file containing reconstructed tracts)r   r   N)r   r   r   r	   trackedr   r   r   r   r   l  s   r   c               @   s4   e Zd ZdZdZeZeZdd Z	dd Z
dd Zd	S )
Tracka  
    Performs tractography using one of the following models:
    dt', 'multitensor', 'pds', 'pico', 'bootstrap', 'ballstick', 'bayesdirac'

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> track = cmon.Track()
    >>> track.inputs.inputmodel = 'dt'
    >>> track.inputs.in_file = 'data.Bfloat'
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.run()                  # doctest: +SKIP

    trackc             C   sF   | j  j }t| jjr*tjj| jj}ntjj| j }||d< |S )Nr   )	r"   r#   r   r+   r   r$   r%   r&   r'   )r(   r)   Zout_file_pathr   r   r   r*     s    zTrack._list_outputsc             C   s   |dkr| j  S d S d S )Nr   )r'   )r(   r-   r   r   r   rO     s    zTrack._gen_filenamec             C   s,   t | jjsd}nt| jj\}}}|d S )Nr   Z_tracked)r   r+   r   r   )r(   r-   r,   r   r   r   r'     s    zTrack._gen_outfilenameN)r   r   r   r.   r/   r|   r0   r   r"   r*   rO   r'   r   r   r   r   r   p  s   	r   c                   s"   e Zd ZdZd fdd	Z  ZS )TrackDTaG  
    Performs streamline tractography using tensor data

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> track = cmon.TrackDT()
    >>> track.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.run()                 # doctest: +SKIP

    Nc                s   d|d< t t| j|f|S )NrS   ru   )superr   __init__)r(   commandr+   )	__class__r   r   r     s    zTrackDT.__init__)N)r   r   r   r.   r   __classcell__r   r   )r   r   r     s   r   c               @   s0   e Zd ZejddddddZejddd	d
ZdS )TrackPICoInputSpecrk   rm   rl   z-pdf %szASpecifies the model for PICo parameters. The default is "bingham.)r   r   z-iterations %drg   zJNumber of streamlines to generate at each seed point. The default is 5000.)r   rh   r   N)r   r   r   r   rE   rv   rj   
iterationsr   r   r   r   r     s   r   c                   s&   e Zd ZdZeZd fdd	Z  ZS )	TrackPICoa[  
    Performs streamline tractography using Probabilistic Index of Connectivity (PICo).

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> track = cmon.TrackPICo()
    >>> track.inputs.in_file = 'pdfs.Bfloat'
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.run()                  # doctest: +SKIP

    Nc                s   d|d< t t| j|f|S )Nr}   ru   )r   r   r   )r(   r   r+   )r   r   r   r     s    zTrackPICo.__init__)N)r   r   r   r.   r   r0   r   r   r   r   )r   r   r     s   r   c               @   s,   e Zd ZedddddZejddddZd	S )
TrackBedpostxDeterInputSpecz-bedpostxdir %sTz$Directory containing bedpostx output)r   r   r   r   z-bedpostxminf %drg   zvZeros out compartments in bedpostx data with a mean volume fraction f of less than min_vol_frac.  The default is 0.01.)r   rh   r   N)r   r   r   r
   bedpostxdirr   r_   min_vol_fracr   r   r   r   r     s   r   c                   s&   e Zd ZdZeZd fdd	Z  ZS )TrackBedpostxDetera  
    Data from FSL's bedpostx can be imported into Camino for deterministic tracking.
    (Use TrackBedpostxProba for bedpostx probabilistic tractography.)

    The tracking is based on the vector images dyads1.nii.gz, ... , dyadsN.nii.gz,
    where there are a maximum of N compartments (corresponding to each fiber
    population) in each voxel.

    It also uses the N images mean_f1samples.nii.gz, ..., mean_fNsamples.nii.gz,
    normalized such that the sum of all compartments is 1. Compartments where the
    mean_f is less than a threshold are discarded and not used for tracking.
    The default value is 0.01. This can be changed with the min_vol_frac option.

    Example
    -------
    >>> import nipype.interfaces.camino as cam
    >>> track = cam.TrackBedpostxDeter()
    >>> track.inputs.bedpostxdir = 'bedpostxout'
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.run()                  # doctest: +SKIP

    Nc                s   d|d< t t| j|f|S )Nr   ru   )r   r   r   )r(   r   r+   )r   r   r   r     s    zTrackBedpostxDeter.__init__)N)r   r   r   r.   r   r0   r   r   r   r   )r   r   r     s   r   c               @   s<   e Zd ZedddddZejddddZejd	dd
dZ	dS )TrackBedpostxProbaInputSpecz-bedpostxdir %sTz$Directory containing bedpostx output)r   r   r   r   z-bedpostxminf %drg   zvZeros out compartments in bedpostx data with a mean volume fraction f of less than min_vol_frac.  The default is 0.01.)r   rh   r   z-iterations %dzGNumber of streamlines to generate at each seed point. The default is 1.N)
r   r   r   r
   r   r   r_   r   rj   r   r   r   r   r   r     s   r   c                   s&   e Zd ZdZeZd fdd	Z  ZS )TrackBedpostxProbaa!  
    Data from FSL's bedpostx can be imported into Camino for probabilistic tracking.
    (Use TrackBedpostxDeter for bedpostx deterministic tractography.)

    The tracking uses the files merged_th1samples.nii.gz, merged_ph1samples.nii.gz,
    ... , merged_thNsamples.nii.gz, merged_phNsamples.nii.gz where there are a
    maximum of N compartments (corresponding to each fiber population) in each
    voxel. These images contain M samples of theta and phi, the polar coordinates
    describing the "stick" for each compartment. At each iteration, a random number
    X between 1 and M is drawn and the Xth samples of theta and phi become the
    principal directions in the voxel.

    It also uses the N images mean_f1samples.nii.gz, ..., mean_fNsamples.nii.gz,
    normalized such that the sum of all compartments is 1. Compartments where the
    mean_f is less than a threshold are discarded and not used for tracking.
    The default value is 0.01. This can be changed with the min_vol_frac option.

    Example
    -------
    >>> import nipype.interfaces.camino as cam
    >>> track = cam.TrackBedpostxProba()
    >>> track.inputs.bedpostxdir = 'bedpostxout'
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.inputs.iterations = 100
    >>> track.run()                  # doctest: +SKIP

    Nc                s   d|d< t t| j|f|S )Nr   ru   )r   r   r   )r(   r   r+   )r   r   r   r   ?  s    zTrackBedpostxProba.__init__)N)r   r   r   r.   r   r0   r   r   r   r   )r   r   r      s   r   c               @   s   e Zd ZedddddZejddddZejd	d
ddddZ	ejdddZ
ejdddddZejdddZejdddZeddddZejdddddZd S )!TrackBayesDiracInputSpecz-schemefile %sTz:The scheme file corresponding to the data being processed.)r   r   r   r   z-iterations %drg   zJNumber of streamlines to generate at each seed point. The default is 5000.)r   rh   r   rk   rm   rl   z-pdf %szYSpecifies the model for PICo priors (not the curvature priors). The default is 'bingham'.)r   r   z-pointset %sa  Index to the point set to use for Bayesian likelihood calculation. The index
specifies a set of evenly distributed points on the unit sphere, where each point x
defines two possible step directions (x or -x) for the streamline path. A larger
number indexes a larger point set, which gives higher angular resolution at the
expense of computation time. The default is index 1, which gives 1922 points, index 0
gives 1082 points, index 2 gives 3002 points.Z	cylsymmdtr~   z-datamodel %szModel of the data for Bayesian tracking. The default model is "cylsymmdt", a diffusion
tensor with cylindrical symmetry about e_1, ie L1 >= L_2 = L_3. The other model is
"ballstick", the partial volume model (see ballstickfit).z-curvepriork %GzConcentration parameter for the prior distribution on fibre orientations given the fibre
orientation at the previous step. Larger values of k make curvature less likely.z-curvepriorg %GzConcentration parameter for the prior distribution on fibre orientations given
the fibre orientation at the previous step. Larger values of g make curvature less likely.z-extpriorfile %szPath to a PICo image produced by picopdfs. The PDF in each voxel is used as a prior for
the fibre orientation in Bayesian tracking. The prior image must be in the same space
as the diffusion data.)r   r   r   r=   r<   z-extpriordatatype %sz5Datatype of the prior image. The default is "double".N)r   r   r   r	   r   r   rj   r   rE   rv   ZpointsetZ	datamodelr_   ZcurvepriorkZcurvepriorgZextpriorfileZextpriordatatyper   r   r   r   r   D  sL   r   c                   s&   e Zd ZdZeZd fdd	Z  ZS )TrackBayesDiraca  
    Perform streamline tractography using a Bayesian tracking with Dirac priors.

    Example
    -------

    >>> import nipype.interfaces.camino as cmon
    >>> track = cmon.TrackBayesDirac()
    >>> track.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.inputs.scheme_file = 'bvecs.scheme'
    >>> track.run()                  # doctest: +SKIP

    Nc                s   d|d< t t| j|f|S )Nr   ru   )r   r   r   )r(   r   r+   )r   r   r   r     s    zTrackBayesDirac.__init__)N)r   r   r   r.   r   r0   r   r   r   r   )r   r   r     s   r   c                   s"   e Zd ZdZd fdd	Z  ZS )TrackBallStickaX  
    Performs streamline tractography using ball-stick fitted data

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> track = cmon.TrackBallStick()
    >>> track.inputs.in_file = 'ballstickfit_data.Bfloat'
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.run()                  # doctest: +SKIP

    Nc                s   d|d< t t| j|f|S )Nr~   ru   )r   r   r   )r(   r   r+   )r   r   r   r     s    zTrackBallStick.__init__)N)r   r   r   r.   r   r   r   r   )r   r   r     s   r   c               @   s`   e Zd ZedddddZejddddZejd	d
dZej	eddddddZ
eddddZdS )TrackBootstrapInputSpecz-schemefile %sTz:The scheme file corresponding to the data being processed.)r   r   r   r   z-iterations %drg   z5Number of streamlines to generate at each seed point.)r   rh   r   z-inversion %szrTensor reconstruction algorithm for repetition bootstrapping.
Default is 1 (linear reconstruction, single tensor).)r   r   )r   z-bsdatafile %sziSpecifies files containing raw data for repetition bootstrapping.
Use -inputfile for wild bootstrap data.)r   r   r   z
-bgmask %szProvides the name of a file containing a background mask computed using, for example,
FSL's bet2 program.
The mask file contains zero in background voxels and non-zero in foreground.)r   r   r   N)r   r   r   r	   r   r   rj   r   rn   ra   Zbsdatafilesr   r   r   r   r   r     s*   r   c                   s&   e Zd ZdZeZd fdd	Z  ZS )TrackBootstrapa  
    Performs bootstrap streamline tractography using mulitple scans of the same subject

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> track = cmon.TrackBootstrap()
    >>> track.inputs.inputmodel='repbs_dt'
    >>> track.inputs.scheme_file = 'bvecs.scheme'
    >>> track.inputs.bsdatafiles = ['fitted_data1.Bfloat', 'fitted_data2.Bfloat']
    >>> track.inputs.seed_file = 'seed_mask.nii'
    >>> track.run()                  # doctest: +SKIP

    Nc                s   t t| j|f|S )N)r   r   r   )r(   r   r+   )r   r   r   r     s    zTrackBootstrap.__init__)N)r   r   r   r.   r   r0   r   r   r   r   )r   r   r     s   r   c            
   @   s   e Zd ZeddddddZeddddd	Zed
dddZejddddddZ	ejdddddddddZ
ejdddddddddZdS )ComputeMeanDiffusivityInputSpecTz< %sr   zTensor-fitted data filename)r   r   r   r   r   z%sr   z>Camino scheme file (b values / vectors, see camino.fsl2scheme))r   r   r   r   z> %s)r   r   rC   rS   	twotensorthreetensorz-inputmodel %szSpecifies the model that the input tensor data contains parameters for.
By default, the program assumes that the input data
contains a single diffusion tensor in each voxel.)r   r   rA   r@   r?   r>   r=   r<   z-inputdatatype %sz*Specifies the data type of the input file.z-outputdatatype %sz+Specifies the data type of the output data.Nr   )r   r   r   r	   r   r   r   r   rE   ru   rG   rH   r   r   r   r   r     sH   r   c               @   s   e Zd ZedddZdS ) ComputeMeanDiffusivityOutputSpecTzMean Diffusivity Map)r   r   N)r   r   r   r	   r3   r   r   r   r   r   .  s   r   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )ComputeMeanDiffusivityaU  
    Computes the mean diffusivity (trace/3) from diffusion tensors.

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> md = cmon.ComputeMeanDiffusivity()
    >>> md.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> md.inputs.scheme_file = 'A.scheme'
    >>> md.run()                  # doctest: +SKIP

    r3   c             C   s$   | j  j }tjj| j |d< |S )Nr3   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*   D  s    z$ComputeMeanDiffusivity._list_outputsc             C   s   t | jj\}}}|d S )Nz_MD.img)r   r+   r   )r(   r,   r-   r   r   r   r'   I  s    z'ComputeMeanDiffusivity._gen_outfilenameN)r   r   r   r.   r/   r   r0   r   r"   r*   r'   r   r   r   r   r   2  s   r   c            
   @   sx   e Zd ZeddddddZeddddd	Zejd
ddddddZejdddddddddZ	ejdddddddddZ
dS )$ComputeFractionalAnisotropyInputSpecTz< %sr   zTensor-fitted data filename)r   r   r   r   r   z%sr   z>Camino scheme file (b values / vectors, see camino.fsl2scheme))r   r   r   r   rS   r   r   rt   z-inputmodel %szSpecifies the model that the input tensor data contains parameters for.
By default, the program assumes that the input data
contains a single diffusion tensor in each voxel.)r   r   rA   r@   r?   r>   r=   r<   z-inputdatatype %sz*Specifies the data type of the input file.z-outputdatatype %sz+Specifies the data type of the output data.N)r   r   r   r	   r   r   r   rE   ru   rG   rH   r   r   r   r   r   N  sH   r   c               @   s   e Zd ZedddZdS )%ComputeFractionalAnisotropyOutputSpecTzFractional Anisotropy Map)r   r   N)r   r   r   r	   r2   r   r   r   r   r     s   r   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )ComputeFractionalAnisotropya  
    Computes the fractional anisotropy of tensors.

    Reads diffusion tensor (single, two-tensor or three-tensor) data from the standard input,
    computes the fractional anisotropy (FA) of each tensor and outputs the results to the
    standard output. For multiple-tensor data the program outputs the FA of each tensor,
    so for three-tensor data, for example, the output contains three fractional anisotropy
    values per voxel.

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> fa = cmon.ComputeFractionalAnisotropy()
    >>> fa.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> fa.inputs.scheme_file = 'A.scheme'
    >>> fa.run()                  # doctest: +SKIP

    r2   c             C   s$   | j  j }tjj| j |d< |S )Nr2   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*     s    z)ComputeFractionalAnisotropy._list_outputsc             C   s   t | jj\}}}|d S )Nz_FA.Bdouble)r   r+   r   )r(   r,   r-   r   r   r   r'     s    z,ComputeFractionalAnisotropy._gen_outfilenameN)r   r   r   r.   r/   r   r0   r   r"   r*   r'   r   r   r   r   r     s   r   c            
   @   sx   e Zd ZeddddddZeddddd	Zejd
ddddddZejdddddddddZ	ejdddddddddZ
dS )ComputeTensorTraceInputSpecTz< %sr   zTensor-fitted data filename)r   r   r   r   r   z%sr   z>Camino scheme file (b values / vectors, see camino.fsl2scheme))r   r   r   r   rS   r   r   rt   z-inputmodel %szSpecifies the model that the input tensor data contains parameters for.
By default, the program assumes that the input data
contains a single diffusion tensor in each voxel.)r   r   rA   r@   r?   r>   r=   r<   z-inputdatatype %sz*Specifies the data type of the input file.z-outputdatatype %sz+Specifies the data type of the output data.N)r   r   r   r	   r   r   r   rE   ru   rG   rH   r   r   r   r   r     sH   r   c               @   s   e Zd ZedddZdS )ComputeTensorTraceOutputSpecTzTrace of the diffusion tensor)r   r   N)r   r   r   r	   ro   r   r   r   r   r     s   r   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )ComputeTensorTracea  
    Computes the trace of tensors.

    Reads diffusion tensor (single, two-tensor or three-tensor) data from the standard input,
    computes the trace of each tensor, i.e., three times the mean diffusivity, and outputs
    the results to the standard output. For multiple-tensor data the program outputs the
    trace of each tensor, so for three-tensor data, for example, the output contains three
    values per voxel.

    Divide the output by three to get the mean diffusivity.

    Example
    -------
    >>> import nipype.interfaces.camino as cmon
    >>> trace = cmon.ComputeTensorTrace()
    >>> trace.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> trace.inputs.scheme_file = 'A.scheme'
    >>> trace.run()                 # doctest: +SKIP

    Ztrdc             C   s$   | j  j }tjj| j |d< |S )Nro   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*     s    z ComputeTensorTrace._list_outputsc             C   s   t | jj\}}}|d S )Nz_TrD.img)r   r+   r   )r(   r,   r-   r   r   r   r'     s    z#ComputeTensorTrace._gen_outfilenameN)r   r   r   r.   r/   r   r0   r   r"   r*   r'   r   r   r   r   r     s   r   c               @   sv   e Zd ZeddddddZejdddd	d
Zejddd
Z	ejdddddddddd	Z
ejdddddddddd	ZdS )ComputeEigensystemInputSpecTz< %sr   zTensor-fitted data filename)r   r   r   r   r   rS   rt   z-inputmodel %sz?Specifies the model that the input data contains parameters for)r   r   z-maxcomponents %dzEThe maximum number of tensor components in a voxel of the input data.r<   r=   r>   r?   r@   rA   z-inputdatatype %szSpecifies the data type of the input data. The data type can be any of the following strings: "char", "short", "int", "long", "float" or "double".Default is double data type)r   rB   r   z-outputdatatype %sz+Specifies the data type of the output data.N)r   r   r   r	   r   r   rE   ru   rj   rw   rG   rH   r   r   r   r   r     sD   r   c               @   s   e Zd ZedddZdS )ComputeEigensystemOutputSpecTzTrace of the diffusion tensor)r   r   N)r   r   r   r	   eigenr   r   r   r   r   5  s   r   c               @   s,   e Zd ZdZdZeZeZdd Z	dd Z
dS )ComputeEigensystemay  
    Computes the eigensystem from tensor fitted data.

    Reads diffusion tensor (single, two-tensor, three-tensor or multitensor) data from the
    standard input, computes the eigenvalues and eigenvectors of each tensor and outputs the
    results to the standard output. For multiple-tensor data the program outputs the
    eigensystem of each tensor. For each tensor the program outputs: {l_1, e_11, e_12, e_13,
    l_2, e_21, e_22, e_33, l_3, e_31, e_32, e_33}, where l_1 >= l_2 >= l_3 and e_i = (e_i1,
    e_i2, e_i3) is the eigenvector with eigenvalue l_i. For three-tensor data, for example,
    the output contains thirty-six values per voxel.

    Example
    -------

    >>> import nipype.interfaces.camino as cmon
    >>> dteig = cmon.ComputeEigensystem()
    >>> dteig.inputs.in_file = 'tensor_fitted_data.Bdouble'
    >>> dteig.run()                  # doctest: +SKIP
    Zdteigc             C   s$   | j  j }tjj| j |d< |S )Nr   )r"   r#   r$   r%   r&   r'   )r(   r)   r   r   r   r*   R  s    z ComputeEigensystem._list_outputsc             C   s&   t | jj\}}}| jj}|d | S )Nz_eig.B)r   r+   r   rH   )r(   r,   r-   rP   r   r   r   r'   W  s    z#ComputeEigensystem._gen_outfilenameN)r   r   r   r.   r/   r   r0   r   r"   r*   r'   r   r   r   r   r   9  s   r   )8r$   Zutils.filemanipr   baser   r   r   r   r	   r
   r   r   r   r   r   r   r!   r1   rK   rM   rR   rc   re   rf   rp   rr   rs   ry   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s\   0#+FC #P'I W-$N(43"3$3