From 9e2320365467f7c3d35d43de4b1cc8dad3636975 Mon Sep 17 00:00:00 2001 From: oesteban Date: Wed, 20 Nov 2019 19:15:45 -0800 Subject: [PATCH 1/3] ENH: Upgrade SDCFlows to new API (1.0.0rc1) Closes #1884. --- fmriprep/cli/run.py | 7 +- fmriprep/data/reports-spec.yml | 134 +++++++++++++++++++++++ fmriprep/workflows/bold/base.py | 136 ++++++++++++------------ fmriprep/workflows/fieldmap/__init__.py | 7 +- fmriprep/workflows/fieldmap/base.py | 4 +- fmriprep/workflows/fieldmap/unwarp.py | 4 +- setup.cfg | 7 +- 7 files changed, 217 insertions(+), 82 deletions(-) create mode 100644 fmriprep/data/reports-spec.yml diff --git a/fmriprep/cli/run.py b/fmriprep/cli/run.py index f5db79596..cb2b7b98a 100755 --- a/fmriprep/cli/run.py +++ b/fmriprep/cli/run.py @@ -489,7 +489,9 @@ def main(): # Generate reports phase failed_reports = generate_reports( - subject_list, output_dir, work_dir, run_uuid, packagename='fmriprep') + subject_list, output_dir, work_dir, run_uuid, + config=pkgrf('fmriprep', 'data/reports-spec.yml'), + packagename='fmriprep') write_derivative_description(bids_dir, output_dir / 'fmriprep') if failed_reports and not opts.notrack: @@ -638,12 +640,15 @@ def build_workflow(opts, retval): # Called with reports only if opts.reports_only: + from pkg_resources import resource_filename as pkgrf + build_log.log(25, 'Running --reports-only on participants %s', ', '.join(subject_list)) if opts.run_uuid is not None: run_uuid = opts.run_uuid retval['run_uuid'] = run_uuid retval['return_code'] = generate_reports( subject_list, output_dir, work_dir, run_uuid, + config=pkgrf('fmriprep', 'data/reports-spec.yml'), packagename='fmriprep') return retval diff --git a/fmriprep/data/reports-spec.yml b/fmriprep/data/reports-spec.yml new file mode 100644 index 000000000..2258f5523 --- /dev/null +++ b/fmriprep/data/reports-spec.yml @@ -0,0 +1,134 @@ +package: niworkflows +sections: +- name: Summary + reportlets: + - bids: {datatype: anat, desc: summary, suffix: T1w} +- name: Anatomical + reportlets: + - bids: + datatype: anat + desc: conform + extension: [.html] + suffix: T1w + - bids: {datatype: anat, suffix: dseg} + caption: This panel shows the template T1-weighted image (if several T1w images + were found), with contours delineating the detected brain mask and brain tissue + segmentations. + subtitle: Brain mask and brain tissue segmentation of the T1w + - bids: {datatype: anat, space: .*, suffix: T1w, regex_search: True} + caption: Spatial normalization of the T1w image to the {space} template. + description: Results of nonlinear alignment of the T1w reference one or more template + space(s). Hover on the panels with the mouse pointer to transition between both + spaces. + static: false + subtitle: Spatial normalization of the anatomical T1w reference + - bids: {datatype: anat, desc: reconall, suffix: T1w} + caption: Surfaces (white and pial) reconstructed with FreeSurfer (recon-all) + overlaid on the participant's T1w template. + subtitle: Surface reconstruction +- name: Functional + ordering: session,task,run + reportlets: + - bids: {datatype: func, desc: summary, suffix: bold} + - bids: {datatype: func, desc: validation, suffix: bold} + - bids: {datatype: func, desc: fieldmap, suffix: bold} + caption: The estimated fieldmap was aligned to the corresponding EPI reference + with a rigid-registration process of the magintude part of the fieldmap, + using antsRegistration. + Overlaid on top of the co-registration results, the displacements along the + phase-encoding direction are represented in arbitrary units. + Please note that the color scale is centered around zero (i.e. full transparency), + but the extremes might be different (i.e., the maximum of red colors could be + orders of magnitude above or below the minimum of blue colors.) + static: false + subtitle: Estimated fieldmap and alignment to the corresponding EPI reference + - bids: {datatype: func, desc: sdc, suffix: bold} + caption: Results of performing susceptibility distortion correction (SDC) on the + EPI + static: false + subtitle: Susceptibility distortion correction + - bids: {datatype: func, desc: forcedsyn, suffix: bold} + caption: The dataset contained some fieldmap information, but the argument --force-syn + was used. The higher-priority SDC method was used. Here, we show the results + of performing SyN-based SDC on the EPI for comparison. + static: false + subtitle: Experimental fieldmap-less susceptibility distortion correction + - bids: {datatype: func, desc: flirtnobbr, suffix: bold} + caption: FSL flirt was used to generate transformations from EPI + space to T1 Space - BBR refinement rejected. Note that Nearest Neighbor interpolation + is used in the reportlets in order to highlight potential spin-history and other + artifacts, whereas final images are resampled using Lanczos interpolation. + static: false + subtitle: Alignment of functional and anatomical MRI data (volume based) + - bids: {datatype: func, desc: coreg, suffix: bold} + caption: mri_coreg (FreeSurfer) was used to generate transformations + from EPI space to T1 Space - bbregister refinement rejected. Note + that Nearest Neighbor interpolation is used in the reportlets in order to highlight + potential spin-history and other artifacts, whereas final images are resampled + using Lanczos interpolation. + static: false + subtitle: Alignment of functional and anatomical MRI data (volume based) + - bids: {datatype: func, desc: flirtbbr, suffix: bold} + caption: FSL flirt was used to generate transformations from EPI-space + to T1w-space - The white matter mask calculated with FSL fast (brain + tissue segmentation) was used for BBR. Note that Nearest Neighbor interpolation + is used in the reportlets in order to highlight potential spin-history and other + artifacts, whereas final images are resampled using Lanczos interpolation. + static: false + subtitle: Alignment of functional and anatomical MRI data (surface driven) + - bids: {datatype: func, desc: bbregister, suffix: bold} + caption: bbregister was used to generate transformations from EPI-space + to T1w-space. Note that Nearest Neighbor interpolation is used in the reportlets + in order to highlight potential spin-history and other artifacts, whereas final + images are resampled using Lanczos interpolation. + static: false + subtitle: Alignment of functional and anatomical MRI data (surface driven) + - bids: {datatype: func, desc: rois, suffix: bold} + caption: Brain mask calculated on the BOLD signal (red contour), along with the + masks used for a/tCompCor.
The aCompCor mask (magenta contour) is a conservative + CSF and white-matter mask for extracting physiological and movement confounds. +
The fCompCor mask (blue contour) contains the top 5% most variable voxels + within a heavily-eroded brain-mask. + subtitle: Brain mask and (temporal/anatomical) CompCor ROIs + - bids: + datatype: func + desc: '[at]compcor' + extension: [.html] + suffix: bold + - bids: {datatype: func, desc: 'compcorvar', suffix: bold} + caption: The cumulative variance explained by the first k components of the + t/aCompCor decomposition, plotted for all values of k. + The number of components that must be included in the model in order to + explain some fraction of variance in the decomposition mask can be used + as a feature selection criterion for confound regression. + subtitle: Variance explained by t/aCompCor components + - bids: {datatype: func, desc: carpetplot, suffix: bold} + caption: Summary statistics are plotted, which may reveal trends or artifacts + in the BOLD data. Global signals calculated within the whole-brain (GS), within + the white-matter (WM) and within cerebro-spinal fluid (CSF) show the mean BOLD + signal in their corresponding masks. DVARS and FD show the standardized DVARS + and framewise-displacement measures for each time point.
A carpet plot + shows the time series for all voxels within the brain mask. Voxels are grouped + into cortical (blue), and subcortical (orange) gray matter, cerebellum (green) + and white matter and CSF (red), indicated by the color map on the left-hand + side. + subtitle: BOLD Summary + - bids: {datatype: func, desc: 'confoundcorr', suffix: bold} + caption: | + Left: Heatmap summarizing the correlation structure among confound variables. + (Cosine bases and PCA-derived CompCor components are inherently orthogonal.) + Right: magnitude of the correlation between each confound time series and the + mean global signal. Strong correlations might be indicative of partial volume + effects and can inform decisions about feature orthogonalization prior to + confound regression. + subtitle: Correlations among nuisance regressors + - bids: {datatype: func, desc: aroma, suffix: bold} + caption: | + Maps created with maximum intensity projection (glass brain) with a + black brain outline. Right hand side of each map: time series (top in seconds), + frequency spectrum (bottom in Hertz). Components classified as signal are plotted + in green; noise components in red. + subtitle: ICA Components classified by AROMA +- name: About + reportlets: + - bids: {datatype: anat, desc: about, suffix: T1w} diff --git a/fmriprep/workflows/bold/base.py b/fmriprep/workflows/bold/base.py index 4bf2cbec8..a334e6784 100755 --- a/fmriprep/workflows/bold/base.py +++ b/fmriprep/workflows/bold/base.py @@ -20,9 +20,10 @@ from nipype.interfaces import utility as niu from niworkflows.engine.workflows import LiterateWorkflow as Workflow -from niworkflows.interfaces.cifti import GenerateCifti +from niworkflows.interfaces.utility import KeySelect from niworkflows.interfaces.utils import DictMerge + from ...config import DEFAULT_MEMORY_MIN_GB from ...utils.meepi import combine_meepi_source @@ -271,7 +272,7 @@ def init_func_preproc_wf( """ from ...config import NONSTANDARD_REFERENCES - from ..fieldmap.base import init_sdc_wf # Avoid circular dependency (#1066) + from sdcflows.workflows.base import init_sdc_estimate_wf, fieldmap_wrangler # Filter out standard spaces to a separate dict std_spaces = OrderedDict([ @@ -307,12 +308,18 @@ def init_func_preproc_wf( 'SliceTiming': [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9], 'PhaseEncodingDirection': 'j', } - fmaps = [{ - 'suffix': 'phasediff', - 'phasediff': 'sub-03/ses-2/fmap/sub-03_ses-2_run-1_phasediff.nii.gz', - 'magnitude1': 'sub-03/ses-2/fmap/sub-03_ses-2_run-1_magnitude1.nii.gz', - 'magnitude2': 'sub-03/ses-2/fmap/sub-03_ses-2_run-1_magnitude2.nii.gz', - }] + fmaps = { + 'phasediff': [{ + 'phases': [ + ('sub-03/ses-2/fmap/sub-03_ses-2_run-1_phasediff.nii.gz', { + 'EchoTime1': 0.0, 'EchoTime2': 0.00246 + }) + ], + 'magnitude': [ + ('sub-03/ses-2/fmap/sub-03_ses-2_run-1_magnitude1.nii.gz', {}), + ('sub-03/ses-2/fmap/sub-03_ses-2_run-1_magnitude2.nii.gz', {})] + }] + } run_stc = True multiecho = False else: @@ -342,22 +349,9 @@ def init_func_preproc_wf( metadata = layout.get_metadata(ref_file) # Find fieldmaps. Options: (phase1|phase2|phasediff|epi|fieldmap|syn) - fmaps = [] + fmaps = None if 'fieldmaps' not in ignore: - for fmap in layout.get_fieldmap(ref_file, return_list=True): - if fmap['suffix'] == 'phase': - LOGGER.warning("""\ -Found phase1/2 type of fieldmaps, which are not currently supported. \ -fMRIPrep will discard them for susceptibility distortion correction. \ -Please, follow up on this issue at \ -https://github.com/poldracklab/fmriprep/issues/1655.""") - else: - fmap['metadata'] = layout.get_metadata(fmap[fmap['suffix']]) - fmaps.append(fmap) - - # Run SyN if forced or in the absence of fieldmap correction - if force_syn or (use_syn and not fmaps): - fmaps.append({'suffix': 'syn'}) + fmaps = fieldmap_wrangler(layout, ref_file, use_syn=use_syn, force_syn=force_syn) # Short circuits: (True and True and (False or 'TooShort')) == 'TooShort' run_stc = ("SliceTiming" in metadata and @@ -497,7 +491,7 @@ def init_func_preproc_wf( # apply BOLD registration to T1w bold_t1_trans_wf = init_bold_t1_trans_wf(name='bold_t1_trans_wf', freesurfer=freesurfer, - use_fieldwarp=(bool(fmaps) or use_syn), + use_fieldwarp=bool(fmaps), multiecho=multiecho, mem_gb=mem_gb['resampled'], omp_nthreads=omp_nthreads, @@ -519,7 +513,7 @@ def init_func_preproc_wf( mem_gb=mem_gb['resampled'], omp_nthreads=omp_nthreads, use_compression=not low_mem, - use_fieldwarp=(bool(fmaps) or use_syn), + use_fieldwarp=bool(fmaps), name='bold_bold_trans_wf' ) bold_bold_trans_wf.inputs.inputnode.name_source = ref_file @@ -550,31 +544,8 @@ def init_func_preproc_wf( boldbuffer.iterables = ('bold_file', bold_file) # SDC (SUSCEPTIBILITY DISTORTION CORRECTION) or bypass ########################## - bold_sdc_wf = init_sdc_wf( - fmaps, metadata, omp_nthreads=omp_nthreads, - debug=debug, fmap_demean=fmap_demean, fmap_bspline=fmap_bspline) - # If no standard space is given, use the default for SyN-SDC - if not volume_std_spaces or 'MNI152NLin2009cAsym' in volume_std_spaces: - bold_sdc_wf.inputs.inputnode.template = 'MNI152NLin2009cAsym' - else: - bold_sdc_wf.inputs.inputnode.template = next(iter(volume_std_spaces)) - - if not fmaps: - LOGGER.warning('SDC: no fieldmaps found or they were ignored (%s).', - ref_file) - elif fmaps[0]['suffix'] == 'syn': - LOGGER.warning( - 'SDC: no fieldmaps found or they were ignored. ' - 'Using EXPERIMENTAL "fieldmap-less SyN" correction ' - 'for dataset %s.', ref_file) - else: - LOGGER.log(25, 'SDC: fieldmap estimation of type "%s" intended for %s found.', - fmaps[0]['suffix'], ref_file) - - # Overwrite ``out_path_base`` of sdcflows' DataSinks - for node in bold_sdc_wf.list_node_names(): - if node.split('.')[-1].startswith('ds_'): - bold_sdc_wf.get_node(node).interface.out_path_base = 'fmriprep' + bold_sdc_wf = init_sdc_estimate_wf(fmaps, metadata, + omp_nthreads=omp_nthreads, debug=debug) # MULTI-ECHO EPI DATA ############################################# if multiecho: @@ -639,24 +610,16 @@ def init_func_preproc_wf( (bold_reg_wf, summary, [('outputnode.fallback', 'fallback')]), # SDC (or pass-through workflow) (inputnode, bold_sdc_wf, [ - ('joint_template', 'inputnode.templates'), - ('joint_std2anat_xfm', 'inputnode.std2anat_xfm')]), - (inputnode, bold_sdc_wf, [('t1w_brain', 'inputnode.t1_brain')]), + ('t1w_brain', 'inputnode.t1w_brain')]), (bold_reference_wf, bold_sdc_wf, [ - ('outputnode.ref_image', 'inputnode.bold_ref'), - ('outputnode.ref_image_brain', 'inputnode.bold_ref_brain'), - ('outputnode.bold_mask', 'inputnode.bold_mask')]), - # For t2s_coreg, replace EPI-to-T1w registration inputs - (bold_sdc_wf if not t2s_coreg else bold_t2s_wf, bold_reg_wf, [ - ('outputnode.bold_ref_brain', 'inputnode.ref_bold_brain')]), - (bold_sdc_wf if not t2s_coreg else bold_t2s_wf, bold_t1_trans_wf, [ - ('outputnode.bold_ref_brain', 'inputnode.ref_bold_brain'), - ('outputnode.bold_mask', 'inputnode.ref_bold_mask')]), + ('outputnode.ref_image', 'inputnode.epi_file'), + ('outputnode.ref_image_brain', 'inputnode.epi_brain'), + ('outputnode.bold_mask', 'inputnode.epi_mask')]), (bold_sdc_wf, bold_t1_trans_wf, [ ('outputnode.out_warp', 'inputnode.fieldwarp')]), (bold_sdc_wf, bold_bold_trans_wf, [ ('outputnode.out_warp', 'inputnode.fieldwarp'), - ('outputnode.bold_mask', 'inputnode.bold_mask')]), + ('outputnode.epi_mask', 'inputnode.bold_mask')]), (bold_sdc_wf, summary, [('outputnode.method', 'distortion_correction')]), # Connect bold_confounds_wf (inputnode, bold_confounds_wf, [('t1w_tpms', 'inputnode.t1w_tpms'), @@ -682,6 +645,24 @@ def init_func_preproc_wf( (outputnode, summary, [('confounds', 'confounds_file')]), ]) + if not t2s_coreg: + workflow.connect([ + (bold_sdc_wf, bold_reg_wf, [ + ('outputnode.epi_brain', 'inputnode.ref_bold_brain')]), + (bold_sdc_wf, bold_t1_trans_wf, [ + ('outputnode.epi_brain', 'inputnode.ref_bold_brain'), + ('outputnode.epi_mask', 'inputnode.ref_bold_mask')]), + ]) + else: + workflow.connect([ + # For t2s_coreg, replace EPI-to-T1w registration inputs + (bold_t2s_wf, bold_reg_wf, [ + ('outputnode.bold_ref_brain', 'inputnode.ref_bold_brain')]), + (bold_t2s_wf, bold_t1_trans_wf, [ + ('outputnode.bold_ref_brain', 'inputnode.ref_bold_brain'), + ('outputnode.bold_mask', 'inputnode.ref_bold_mask')]), + ]) + # for standard EPI data, pass along correct file if not multiecho: workflow.connect([ @@ -708,9 +689,9 @@ def init_func_preproc_wf( ]) if fmaps: - from ..fieldmap.unwarp import init_fmap_unwarp_report_wf + from sdcflows.workflows.outputs import init_sdc_unwarp_report_wf # Report on BOLD correction - fmap_unwarp_report_wf = init_fmap_unwarp_report_wf() + fmap_unwarp_report_wf = init_sdc_unwarp_report_wf() workflow.connect([ (inputnode, fmap_unwarp_report_wf, [ ('t1w_dseg', 'inputnode.in_seg')]), @@ -719,7 +700,7 @@ def init_func_preproc_wf( (bold_reg_wf, fmap_unwarp_report_wf, [ ('outputnode.itk_t1_to_bold', 'inputnode.in_xfm')]), (bold_sdc_wf, fmap_unwarp_report_wf, [ - ('outputnode.bold_ref', 'inputnode.in_post')]), + ('outputnode.epi_corrected', 'inputnode.in_post')]), ]) # Overwrite ``out_path_base`` of unwarping DataSinks @@ -727,8 +708,23 @@ def init_func_preproc_wf( if node.split('.')[-1].startswith('ds_'): fmap_unwarp_report_wf.get_node(node).interface.out_path_base = 'fmriprep' - if force_syn and fmaps[0]['suffix'] != 'syn': - syn_unwarp_report_wf = init_fmap_unwarp_report_wf( + for node in bold_sdc_wf.list_node_names(): + if node.split('.')[-1].startswith('ds_'): + bold_sdc_wf.get_node(node).interface.out_path_base = 'fmriprep' + + if 'syn' in fmaps: + sdc_select_std = pe.Node( + KeySelect(fields=['std2anat_xfm']), + name='sdc_select_std', run_without_submitting=True) + sdc_select_std.inputs.key = 'MNI152NLin2009cAsym' + workflow.connect([ + (inputnode, sdc_select_std, [('joint_std2anat_xfm', 'std2anat_xfm'), + ('joint_template', 'keys')]), + (sdc_select_std, bold_sdc_wf, [('std2anat_xfm', 'inputnode.std2anat_xfm')]), + ]) + + if fmaps.get('syn') is True: # SyN forced + syn_unwarp_report_wf = init_sdc_unwarp_report_wf( name='syn_unwarp_report_wf', forcedsyn=True) workflow.connect([ (inputnode, syn_unwarp_report_wf, [ @@ -738,7 +734,7 @@ def init_func_preproc_wf( (bold_reg_wf, syn_unwarp_report_wf, [ ('outputnode.itk_t1_to_bold', 'inputnode.in_xfm')]), (bold_sdc_wf, syn_unwarp_report_wf, [ - ('outputnode.syn_bold_ref', 'inputnode.in_post')]), + ('outputnode.syn_ref', 'inputnode.in_post')]), ]) # Overwrite ``out_path_base`` of unwarping DataSinks @@ -939,7 +935,7 @@ def init_func_preproc_wf( ]) if cifti_output: - from niworkflows.interfaces.utility import KeySelect + from niworkflows.interfaces.cifti import GenerateCifti bold_surf_wf.__desc__ += """\ *Grayordinates* files [@hcppipelines], which combine surface-sampled data and volume-sampled data, were also generated. diff --git a/fmriprep/workflows/fieldmap/__init__.py b/fmriprep/workflows/fieldmap/__init__.py index b16f398f5..9848ba356 100644 --- a/fmriprep/workflows/fieldmap/__init__.py +++ b/fmriprep/workflows/fieldmap/__init__.py @@ -41,15 +41,14 @@ """ -from .base import init_sdc_wf -from .unwarp import init_sdc_unwarp_wf, init_fmap_unwarp_report_wf +from .base import init_sdc_estimate_wf +from .unwarp import init_sdc_unwarp_wf from .pepolar import init_pepolar_unwarp_wf from .syn import init_syn_sdc_wf __all__ = [ - 'init_sdc_wf', + 'init_sdc_estimate_wf', 'init_sdc_unwarp_wf', - 'init_fmap_unwarp_report_wf', 'init_pepolar_unwarp_wf', 'init_syn_sdc_wf', ] diff --git a/fmriprep/workflows/fieldmap/base.py b/fmriprep/workflows/fieldmap/base.py index 0ef618e40..ea2a6ee4e 100644 --- a/fmriprep/workflows/fieldmap/base.py +++ b/fmriprep/workflows/fieldmap/base.py @@ -33,6 +33,6 @@ """ -from sdcflows.workflows.base import init_sdc_wf +from sdcflows.workflows.base import init_sdc_estimate_wf -__all__ = ['init_sdc_wf'] +__all__ = ['init_sdc_estimate_wf'] diff --git a/fmriprep/workflows/fieldmap/unwarp.py b/fmriprep/workflows/fieldmap/unwarp.py index 670c8a098..256ffe0db 100644 --- a/fmriprep/workflows/fieldmap/unwarp.py +++ b/fmriprep/workflows/fieldmap/unwarp.py @@ -16,6 +16,6 @@ displacements field map -- a nifti warp file compatible with ANTs (mm) """ -from sdcflows.workflows.unwarp import init_sdc_unwarp_wf, init_fmap_unwarp_report_wf +from sdcflows.workflows.unwarp import init_sdc_unwarp_wf -__all__ = ['init_sdc_unwarp_wf', 'init_fmap_unwarp_report_wf'] +__all__ = ['init_sdc_unwarp_wf'] diff --git a/setup.cfg b/setup.cfg index a44d332ce..2fa5210c1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,7 +22,7 @@ python_requires = >=3.5 install_requires = indexed_gzip >=0.8.8 nibabel >=2.2.1 - nipype ~= 1.3.1 + nipype >=1.3.1 nitime niworkflows ~= 1.0.1 numpy @@ -30,8 +30,8 @@ install_requires = psutil >=5.4 pybids ~= 0.9.4 pyyaml - sdcflows ~= 0.1.4 - smriprep ~= 0.4.0rc5 + sdcflows @ git+https://github.com/oesteban/sdcflows.git@cf28b970aeac9bf2611b7330f53725c8ed81edb1 + smriprep ~= 0.4.0 tedana >=0.0.5 templateflow ~= 0.4.1 test_requires = @@ -79,6 +79,7 @@ fmriprep = data/boilerplate.bib data/itkIdentityTransform.txt data/flirtsch/bbr.sch + data/reports-spec.yml VERSION [options.entry_points] From 46cb0b0115eb32350e3c08aa9b7f3dd4ed874187 Mon Sep 17 00:00:00 2001 From: oesteban Date: Wed, 27 Nov 2019 07:57:09 -0800 Subject: [PATCH 2/3] docs: remove duplicated references [skip ds005][skip ds054][skip ds210][skip tests] We need to start looking into intersphinx and how we are going to coordinate fMRIPrep's documentation and helper packages' documentation. --- docs/sdc.rst | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/docs/sdc.rst b/docs/sdc.rst index 3b1d03e57..bbf77170e 100644 --- a/docs/sdc.rst +++ b/docs/sdc.rst @@ -95,24 +95,3 @@ References Correction for geometric distortion in echo planar images from B0 field variations Magn. Reson. Med., 34 (1) (1995), pp. 65-73, doi:`10.1002/mrm.1910340111 `_. - -.. [Hutton2002] Hutton et al., Image Distortion Correction in fMRI: A Quantitative - Evaluation, NeuroImage 16(1):217-240, 2002. doi:`10.1006/nimg.2001.1054 - `_. - -.. [Huntenburg2014] Huntenburg, J. M. (2014) Evaluating Nonlinear - Coregistration of BOLD EPI and T1w Images. Berlin: Master - Thesis, Freie Universität. `PDF - `_. - -.. [Treiber2016] Treiber, J. M. et al. (2016) Characterization and Correction - of Geometric Distortions in 814 Diffusion Weighted Images, - PLoS ONE 11(3): e0152472. doi:`10.1371/journal.pone.0152472 - `_. - -.. [Wang2017] Wang S, et al. (2017) Evaluation of Field Map and Nonlinear - Registration Methods for Correction of Susceptibility Artifacts - in Diffusion MRI. Front. Neuroinform. 11:17. - doi:`10.3389/fninf.2017.00017 - `_. - From 9f14abaf757e191929a17c52d53ef56058799d69 Mon Sep 17 00:00:00 2001 From: oesteban Date: Mon, 2 Dec 2019 14:20:39 -0800 Subject: [PATCH 3/3] pin(sdcflows): update to sdcflows ~= 1.0.0 --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 2fa5210c1..4410bfef5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,7 +30,7 @@ install_requires = psutil >=5.4 pybids ~= 0.9.4 pyyaml - sdcflows @ git+https://github.com/oesteban/sdcflows.git@cf28b970aeac9bf2611b7330f53725c8ed81edb1 + sdcflows ~= 1.0.0 smriprep ~= 0.4.0 tedana >=0.0.5 templateflow ~= 0.4.1