Skip to content

Commit 874c4ce

Browse files
authored
Merge pull request #1321 from oesteban/fix/1000
[ENH] Template-based masking of EPI boldrefs
2 parents a0460f9 + 7535a08 commit 874c4ce

File tree

17 files changed

+230
-56
lines changed

17 files changed

+230
-56
lines changed

.circleci/config.yml

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -742,14 +742,22 @@ workflows:
742742
- get_regression_data:
743743
filters:
744744
branches:
745-
ignore: /docs?\/.*/
745+
ignore:
746+
- /docs?\/.*/
747+
- /ds005\/.*/
748+
- /ds054\/.*/
749+
- /ds210\/.*/
746750

747751
- build_docs:
748752
requires:
749753
- build
750754
filters:
751755
branches:
752-
ignore: /tests?\/.*/
756+
ignore:
757+
- /tests?\/.*/
758+
- /ds005\/.*/
759+
- /ds054\/.*/
760+
- /ds210\/.*/
753761
tags:
754762
only: /.*/
755763

@@ -770,7 +778,11 @@ workflows:
770778
- get_regression_data
771779
filters:
772780
branches:
773-
ignore: /docs?\/.*/
781+
ignore:
782+
- /docs?\/.*/
783+
- /ds005\/.*/
784+
- /ds054\/.*/
785+
- /ds210\/.*/
774786
tags:
775787
only: /.*/
776788

@@ -783,6 +795,8 @@ workflows:
783795
ignore:
784796
- /docs?\/.*/
785797
- /tests?\/.*/
798+
- /ds054\/.*/
799+
- /ds210\/.*/
786800
tags:
787801
only: /.*/
788802

@@ -795,6 +809,8 @@ workflows:
795809
ignore:
796810
- /docs?\/.*/
797811
- /tests?\/.*/
812+
- /ds005\/.*/
813+
- /ds210\/.*/
798814
tags:
799815
only: /.*/
800816

@@ -808,6 +824,8 @@ workflows:
808824
ignore:
809825
- /docs?\/.*/
810826
- /tests?\/.*/
827+
- /ds005\/.*/
828+
- /ds054\/.*/
811829
tags:
812830
only: /.*/
813831

.circleci/ds005_outputs.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ fmriprep/sub-01/func
3636
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_AROMAnoiseICs.csv
3737
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-confounds_regressors.tsv
3838
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-MELODIC_mixing.tsv
39-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-preproc_bold.dtseries.json
40-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-preproc_bold.dtseries.nii
39+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_bold.dtseries.json
40+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_bold.dtseries.nii
4141
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsaverage5_hemi-L.func.gii
4242
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsaverage5_hemi-R.func.gii
4343
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_boldref.nii.gz
@@ -52,8 +52,8 @@ fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-T1w_label-aseg_ds
5252
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_AROMAnoiseICs.csv
5353
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_desc-confounds_regressors.tsv
5454
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_desc-MELODIC_mixing.tsv
55-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_desc-preproc_bold.dtseries.json
56-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_desc-preproc_bold.dtseries.nii
55+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_bold.dtseries.json
56+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_bold.dtseries.nii
5757
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-fsaverage5_hemi-L.func.gii
5858
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-fsaverage5_hemi-R.func.gii
5959
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-02_space-MNI152NLin2009cAsym_boldref.nii.gz

.circleci/ds005_partial_outputs.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ fmriprep/sub-01/func
3636
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_AROMAnoiseICs.csv
3737
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-confounds_regressors.tsv
3838
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-MELODIC_mixing.tsv
39-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-preproc_bold.dtseries.json
40-
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_desc-preproc_bold.dtseries.nii
39+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_bold.dtseries.json
40+
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_bold.dtseries.nii
4141
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsaverage5_hemi-L.func.gii
4242
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-fsaverage5_hemi-R.func.gii
4343
fmriprep/sub-01/func/sub-01_task-mixedgamblestask_run-01_space-MNI152NLin2009cAsym_boldref.nii.gz

docker/scripts/get_templates.sh

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22

33
MNI_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/580705eb594d9001ed622649"
44
MNI_SHA256="608b1d609255424d51300e189feacd5ec74b04e244628303e802a6c0b0f9d9db"
5-
ASYM_09C_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/580705089ad5a101f17944a9"
6-
ASYM_09C_SHA256="a24699ba0d13f72d0f8934cc211cb80bfd9c9a077b481d9b64295cf5275235a9"
5+
ASYM_09C_TEMPLATE_OLD="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/580705089ad5a101f17944a9"
6+
ASYM_09C_SHA256_OLD="a24699ba0d13f72d0f8934cc211cb80bfd9c9a077b481d9b64295cf5275235a9"
7+
ASYM_09C_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/5b0dbce20f461a000db8fa3d"
8+
ASYM_09C_SHA256="2851302474359c2c48995155aadb48b861e5dcf87aefda71af8010f671e8ed66"
79
OASIS_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/584123a29ad5a1020913609d"
810
OASIS_SHA256="d87300e91346c16f55baf6f54f5f990bc020b61e8d5df9bcc3abb0cc4b943113"
9-
NKI_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/59cd90f46c613b02b3d79782"
10-
NKI_SHA256="4bba067f6675d15be96b205cb227e18a540673fd7e4577e13feedcef3a6f0ec5"
11+
NKI_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/5bc3fad82aa873001bc5a553"
12+
NKI_SHA256="9c08713d067bcf13baa61b01a9495e526b55d1f148d951da01e082679f076fa9"
1113
OASIS_DKT31_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/5b16f17aeca4a80012bd7542"
1214
OASIS_DKT31_SHA256="623fa7141712b1a7263331dba16eb069a4443e9640f52556c89d461611478145"
15+
EPI_TEMPLATE="https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/5bc12155ac011000176bff82"
16+
EPI_SHA256="fcd6980ef98c9d7622c6dc2a7747ff51ba3909d98e2a740df9a8265d50920d1b"
1317

1418
GET(){
1519
URL=$1; SHA256=$2;
@@ -28,6 +32,8 @@ GET(){
2832
set -e
2933
echo "Getting MNI template"
3034
GET "$MNI_TEMPLATE" "$MNI_SHA256"
35+
echo "Getting (deprecated version of) MNI152NLin2009cAsym template"
36+
GET "$ASYM_09C_TEMPLATE_OLD" "$ASYM_09C_SHA256_OLD"
3137
echo "Getting MNI152NLin2009cAsym template"
3238
GET "$ASYM_09C_TEMPLATE" "$ASYM_09C_SHA256"
3339
echo "Getting OASIS template"
@@ -36,4 +42,6 @@ echo "Getting NKI template"
3642
GET "$NKI_TEMPLATE" "$NKI_SHA256"
3743
echo "Getting OASIS DKT31 template"
3844
GET "$OASIS_DKT31_TEMPLATE" "$OASIS_DKT31_SHA256"
45+
echo "Getting fMRIPrep's BOLDref template"
46+
GET "$EPI_TEMPLATE" "$EPI_SHA256"
3947
echo "Done!"

docs/environment.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ dependencies:
2929
- svgutils
3030
- nitime
3131
- nilearn
32-
- niworkflows>=0.4.2
32+
- niworkflows==0.4.4

fmriprep/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
'pybids==0.6.5',
9999
'nitime',
100100
'nipype>=1.1.3',
101-
'niworkflows>=0.4.4',
101+
'niworkflows==0.4.4',
102102
'statsmodels',
103103
'seaborn',
104104
'indexed_gzip>=0.8.2',
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"winsorize_upper_quantile": 0.98,
3+
"winsorize_lower_quantile": 0.05,
4+
"float": true,
5+
"metric": ["Mattes"],
6+
"metric_weight": [1],
7+
"radius_or_number_of_bins": [64],
8+
"transforms": ["Affine"],
9+
"transform_parameters": [[0.1]],
10+
"number_of_iterations": [[200]],
11+
"convergence_window_size": [10],
12+
"convergence_threshold": [1e-09],
13+
"sampling_strategy": ["Random", "Random"],
14+
"smoothing_sigmas": [[2]],
15+
"sigma_units": ["mm", "mm", "mm"],
16+
"shrink_factors": [[2]],
17+
"sampling_percentage": [0.2],
18+
"use_histogram_matching": [true],
19+
"use_estimate_learning_rate_once": [true]
20+
}

fmriprep/interfaces/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
ReadSidecarJSON, DerivativesDataSink, BIDSDataGrabber, BIDSFreeSurferDir, BIDSInfo
66
)
77
from .images import (
8-
IntraModalMerge, ValidateImage, TemplateDimensions, Conform
8+
IntraModalMerge, ValidateImage, TemplateDimensions, Conform, MatchHeader
99
)
1010
from .freesurfer import (
1111
StructuralReference, MakeMidthickness, FSInjectBrainExtracted,

fmriprep/interfaces/images.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,53 @@ def _run_interface(self, runtime):
479479
return runtime
480480

481481

482+
class MatchHeaderInputSpec(BaseInterfaceInputSpec):
483+
reference = File(exists=True, mandatory=True,
484+
desc='NIfTI file with reference header')
485+
in_file = File(exists=True, mandatory=True,
486+
desc='NIfTI file which header will be checked')
487+
488+
489+
class MatchHeaderOutputSpec(TraitedSpec):
490+
out_file = File(exists=True, desc='NIfTI file with fixed header')
491+
492+
493+
class MatchHeader(SimpleInterface):
494+
input_spec = MatchHeaderInputSpec
495+
output_spec = MatchHeaderOutputSpec
496+
497+
def _run_interface(self, runtime):
498+
refhdr = nb.load(self.inputs.reference).header.copy()
499+
imgnii = nb.load(self.inputs.in_file)
500+
imghdr = imgnii.header.copy()
501+
502+
imghdr['dim_info'] = refhdr['dim_info'] # dim_info is lost sometimes
503+
504+
# Set qform
505+
qform = refhdr.get_qform()
506+
qcode = int(refhdr['qform_code'])
507+
if not np.allclose(qform, imghdr.get_qform()):
508+
LOGGER.warning(
509+
'q-forms of reference and mask are substantially different')
510+
imghdr.set_qform(qform, qcode)
511+
512+
# Set sform
513+
sform = refhdr.get_sform()
514+
scode = int(refhdr['sform_code'])
515+
if not np.allclose(sform, imghdr.get_sform()):
516+
LOGGER.warning(
517+
's-forms of reference and mask are substantially different')
518+
imghdr.set_sform(sform, scode)
519+
520+
out_file = fname_presuffix(self.inputs.in_file, suffix='_hdr',
521+
newpath=runtime.cwd)
522+
523+
imgnii.__class__(imgnii.get_data(), imghdr.get_best_affine(),
524+
imghdr).to_filename(out_file)
525+
self._results['out_file'] = out_file
526+
return runtime
527+
528+
482529
def reorient(in_file, newpath=None):
483530
"""Reorient Nifti files to RAS"""
484531
out_file = fname_presuffix(in_file, suffix='_ras', newpath=newpath)

fmriprep/workflows/bold/base.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,8 @@ def init_func_preproc_wf(bold_file, ignore, freesurfer,
394394
]),
395395
])
396396

397-
# The first reference uses T2 contrast enhancement
398-
bold_reference_wf = init_bold_reference_wf(
399-
omp_nthreads=omp_nthreads, enhance_t2=True)
397+
# Generate a tentative boldref
398+
bold_reference_wf = init_bold_reference_wf(omp_nthreads=omp_nthreads)
400399

401400
# Top-level BOLD splitter
402401
bold_split = pe.Node(FSLSplit(dimension='t'), name='bold_split',
@@ -924,7 +923,7 @@ def init_func_derivatives_wf(output_dir, output_spaces, template, freesurfer,
924923
CiftiNameSource(), iterfield=['variant'], name='name_cifti',
925924
mem_gb=DEFAULT_MEMORY_MIN_GB, run_without_submitting=True)
926925
cifti_bolds = pe.MapNode(
927-
DerivativesDataSink(base_directory=output_dir, desc='preproc', compress=False),
926+
DerivativesDataSink(base_directory=output_dir, compress=False),
928927
iterfield=['in_file', 'suffix'], name='cifti_bolds',
929928
run_without_submitting=True, mem_gb=DEFAULT_MEMORY_MIN_GB)
930929
cifti_key = pe.MapNode(DerivativesDataSink(

0 commit comments

Comments
 (0)