|
19 | 19 | """
|
20 | 20 |
|
21 | 21 | from nipype.pipeline import engine as pe
|
22 |
| -from nipype.interfaces import utility as niu, fsl, ants |
23 |
| -from niflow.nipype1.workflows.dmri.fsl.utils import demean_image, cleanup_edge_pipeline |
| 22 | +from nipype.interfaces import utility as niu, fsl |
24 | 23 | from niworkflows.engine.workflows import LiterateWorkflow as Workflow
|
25 |
| -from niworkflows.interfaces.bids import DerivativesDataSink |
26 | 24 | from niworkflows.interfaces.images import IntraModalMerge
|
27 |
| -from niworkflows.interfaces.masks import BETRPT |
28 | 25 |
|
29 |
| -from ..interfaces.fmap import ( |
30 |
| - FieldEnhance, FieldToRadS, FieldToHz |
31 |
| -) |
| 26 | +from .gre import init_fmap_postproc_wf, init_magnitude_wf |
32 | 27 |
|
33 | 28 |
|
34 | 29 | def init_fmap_wf(omp_nthreads, fmap_bspline, name='fmap_wf'):
|
@@ -81,70 +76,28 @@ def init_fmap_wf(omp_nthreads, fmap_bspline, name='fmap_wf'):
|
81 | 76 | outputnode = pe.Node(niu.IdentityInterface(fields=['fmap', 'fmap_ref', 'fmap_mask']),
|
82 | 77 | name='outputnode')
|
83 | 78 |
|
84 |
| - # Merge input magnitude images |
85 |
| - magmrg = pe.Node(IntraModalMerge(), name='magmrg') |
| 79 | + magnitude_wf = init_magnitude_wf(omp_nthreads=omp_nthreads) |
| 80 | + workflow.connect([ |
| 81 | + (inputnode, magnitude_wf, [('magnitude', 'inputnode.magnitude')]), |
| 82 | + (magnitude_wf, outputnode, [('outputnode.fmap_mask', 'fmap_mask'), |
| 83 | + ('outputnode.fmap_ref', 'fmap_ref')]), |
| 84 | + ]) |
| 85 | + |
86 | 86 | # Merge input fieldmap images
|
87 | 87 | fmapmrg = pe.Node(IntraModalMerge(zero_based_avg=False, hmc=False),
|
88 | 88 | name='fmapmrg')
|
89 |
| - |
90 |
| - # de-gradient the fields ("bias/illumination artifact") |
91 |
| - n4_correct = pe.Node(ants.N4BiasFieldCorrection(dimension=3, copy_header=True), |
92 |
| - name='n4_correct', n_procs=omp_nthreads) |
93 |
| - bet = pe.Node(BETRPT(generate_report=True, frac=0.6, mask=True), |
94 |
| - name='bet') |
95 |
| - ds_report_fmap_mask = pe.Node(DerivativesDataSink( |
96 |
| - desc='brain', suffix='mask'), name='ds_report_fmap_mask', |
97 |
| - run_without_submitting=True) |
| 89 | + applymsk = pe.Node(fsl.ApplyMask(), name='applymsk') |
| 90 | + fmap_postproc_wf = init_fmap_postproc_wf(omp_nthreads=omp_nthreads, |
| 91 | + fmap_bspline=fmap_bspline) |
98 | 92 |
|
99 | 93 | workflow.connect([
|
100 |
| - (inputnode, magmrg, [('magnitude', 'in_files')]), |
101 | 94 | (inputnode, fmapmrg, [('fieldmap', 'in_files')]),
|
102 |
| - (magmrg, n4_correct, [('out_file', 'input_image')]), |
103 |
| - (n4_correct, bet, [('output_image', 'in_file')]), |
104 |
| - (bet, outputnode, [('mask_file', 'fmap_mask'), |
105 |
| - ('out_file', 'fmap_ref')]), |
106 |
| - (inputnode, ds_report_fmap_mask, [('fieldmap', 'source_file')]), |
107 |
| - (bet, ds_report_fmap_mask, [('out_report', 'in_file')]), |
| 95 | + (fmapmrg, applymsk, [('out_file', 'in_file')]), |
| 96 | + (magnitude_wf, applymsk, [('outputnode.fmap_mask', 'mask_file')]), |
| 97 | + (applymsk, fmap_postproc_wf, [('out_file', 'inputnode.fmap')]), |
| 98 | + (magnitude_wf, fmap_postproc_wf, [ |
| 99 | + ('outputnode.fmap_mask', 'inputnode.fmap_mask'), |
| 100 | + ('outputnode.fmap_ref', 'inputnode.fmap_ref')]), |
| 101 | + (fmap_postproc_wf, outputnode, [('outputnode.out_fmap', 'fmap')]), |
108 | 102 | ])
|
109 |
| - |
110 |
| - if fmap_bspline: |
111 |
| - # despike_threshold=1.0, mask_erode=1), |
112 |
| - fmapenh = pe.Node(FieldEnhance(unwrap=False, despike=False), |
113 |
| - name='fmapenh', mem_gb=4, n_procs=omp_nthreads) |
114 |
| - |
115 |
| - workflow.connect([ |
116 |
| - (bet, fmapenh, [('mask_file', 'in_mask'), |
117 |
| - ('out_file', 'in_magnitude')]), |
118 |
| - (fmapmrg, fmapenh, [('out_file', 'in_file')]), |
119 |
| - (fmapenh, outputnode, [('out_file', 'fmap')]), |
120 |
| - ]) |
121 |
| - |
122 |
| - else: |
123 |
| - torads = pe.Node(FieldToRadS(), name='torads') |
124 |
| - prelude = pe.Node(fsl.PRELUDE(), name='prelude') |
125 |
| - tohz = pe.Node(FieldToHz(), name='tohz') |
126 |
| - |
127 |
| - denoise = pe.Node(fsl.SpatialFilter(operation='median', kernel_shape='sphere', |
128 |
| - kernel_size=3), name='denoise') |
129 |
| - demean = pe.Node(niu.Function(function=demean_image), name='demean') |
130 |
| - cleanup_wf = cleanup_edge_pipeline(name='cleanup_wf') |
131 |
| - |
132 |
| - applymsk = pe.Node(fsl.ApplyMask(), name='applymsk') |
133 |
| - |
134 |
| - workflow.connect([ |
135 |
| - (bet, prelude, [('mask_file', 'mask_file'), |
136 |
| - ('out_file', 'magnitude_file')]), |
137 |
| - (fmapmrg, torads, [('out_file', 'in_file')]), |
138 |
| - (torads, tohz, [('fmap_range', 'range_hz')]), |
139 |
| - (torads, prelude, [('out_file', 'phase_file')]), |
140 |
| - (prelude, tohz, [('unwrapped_phase_file', 'in_file')]), |
141 |
| - (tohz, denoise, [('out_file', 'in_file')]), |
142 |
| - (denoise, demean, [('out_file', 'in_file')]), |
143 |
| - (demean, cleanup_wf, [('out', 'inputnode.in_file')]), |
144 |
| - (bet, cleanup_wf, [('mask_file', 'inputnode.in_mask')]), |
145 |
| - (cleanup_wf, applymsk, [('outputnode.out_file', 'in_file')]), |
146 |
| - (bet, applymsk, [('mask_file', 'mask_file')]), |
147 |
| - (applymsk, outputnode, [('out_file', 'fmap')]), |
148 |
| - ]) |
149 |
| - |
150 | 103 | return workflow
|
0 commit comments