Skip to content

Commit de565dc

Browse files
authored
Merge pull request #51 from oesteban/enh/phdiff-better-demean-demode
ENH: Do not use legacy demean function from old nipype workflows
2 parents be7058e + 3d1757c commit de565dc

File tree

2 files changed

+58
-15
lines changed

2 files changed

+58
-15
lines changed

.circleci/config.yml

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -224,20 +224,12 @@ jobs:
224224
paths:
225225
- /tmp/docker
226226
- run:
227-
name: Set-up a Docker registry
228-
command: |
229-
docker run -d -p 5000:5000 --restart=always --name=registry \
230-
-v /tmp/docker:/var/lib/registry registry:2
231-
- run:
232-
name: Pull images from local registry
233-
command: |
234-
docker pull localhost:5000/sdcflows
235-
docker tag localhost:5000/sdcflows poldracklab/sdcflows:latest
236-
- run:
237-
name: Refresh work directory?
227+
name: Refreshing cached intermediate results
238228
command: |
229+
cd /tmp/src/sdcflows
230+
COMMIT_MSG=$( git log --format=oneline -n 1 $CIRCLE_SHA1 )
239231
set +e
240-
do_refresh="$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[fresh[ _]?workdir\]' )"
232+
do_refresh="$( echo "${COMMIT_MSG}" | grep -i -E '\[fresh[ _]?workdir\]' )"
241233
set -e
242234
if [[ "x${do_refresh}" = "x" ]]; then
243235
echo "Did not refresh the workdir."
@@ -247,6 +239,23 @@ jobs:
247239
cd /tmp/work
248240
tar xzfv /tmp/data/workdir.tar.gz
249241
fi
242+
243+
wipe_dir=$( echo "${COMMIT_MSG}" | sed -n 's/.*\[wipe \([a-zA-Z0-9_\*]*\)\].*/\1/p' )
244+
if [[ "x${wipe_dir}" != "x" ]]; then
245+
path=/tmp/work/${wipe_dir}
246+
echo "Found tag [wipe ${wipe_dir}] - clearing up $path ..."
247+
rm -rf ${path}
248+
fi
249+
- run:
250+
name: Set-up a Docker registry
251+
command: |
252+
docker run -d -p 5000:5000 --restart=always --name=registry \
253+
-v /tmp/docker:/var/lib/registry registry:2
254+
- run:
255+
name: Pull images from local registry
256+
command: |
257+
docker pull localhost:5000/sdcflows
258+
docker tag localhost:5000/sdcflows poldracklab/sdcflows:latest
250259
- run:
251260
name: Run tests
252261
no_output_timeout: 2h

sdcflows/workflows/phdiff.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919

2020
from nipype.interfaces import ants, fsl, utility as niu
2121
from nipype.pipeline import engine as pe
22-
from niflow.nipype1.workflows.dmri.fsl.utils import (
23-
demean_image, cleanup_edge_pipeline)
22+
from niflow.nipype1.workflows.dmri.fsl.utils import cleanup_edge_pipeline
2423
from niworkflows.engine.workflows import LiterateWorkflow as Workflow
2524
from niworkflows.interfaces.images import IntraModalMerge
2625
from niworkflows.interfaces.masks import BETRPT
@@ -125,7 +124,7 @@ def init_phdiff_wf(omp_nthreads, name='phdiff_wf'):
125124
denoise = pe.Node(fsl.SpatialFilter(operation='median', kernel_shape='sphere',
126125
kernel_size=3), name='denoise')
127126

128-
demean = pe.Node(niu.Function(function=demean_image), name='demean')
127+
demean = pe.Node(niu.Function(function=_demean), name='demean')
129128

130129
cleanup_wf = cleanup_edge_pipeline(name="cleanup_wf")
131130

@@ -171,3 +170,38 @@ def _recenter(in_file):
171170
newpath=getcwd())
172171
nb.Nifti1Image(data, nii.affine, nii.header).to_filename(out_file)
173172
return out_file
173+
174+
175+
def _demean(in_file, in_mask=None, usemode=True):
176+
"""
177+
Subtract the median (since it is robuster than the mean) from a map.
178+
179+
Parameters
180+
----------
181+
usemode : bool
182+
Use the mode instead of the median (should be even more robust
183+
against outliers).
184+
185+
"""
186+
from os import getcwd
187+
import numpy as np
188+
import nibabel as nb
189+
from nipype.utils.filemanip import fname_presuffix
190+
191+
nii = nb.load(in_file)
192+
data = nii.get_fdata(dtype='float32')
193+
194+
msk = np.ones_like(data, dtype=bool)
195+
if in_mask is not None:
196+
msk[nb.load(in_mask).get_fdata(dtype='float32') < 1e-4] = False
197+
198+
if usemode:
199+
from scipy.stats import mode
200+
data[msk] -= mode(data[msk], axis=None)[0][0]
201+
else:
202+
data[msk] -= np.median(data[msk], axis=None)
203+
204+
out_file = fname_presuffix(in_file, suffix='_demean',
205+
newpath=getcwd())
206+
nb.Nifti1Image(data, nii.affine, nii.header).to_filename(out_file)
207+
return out_file

0 commit comments

Comments
 (0)