Skip to content
This repository was archived by the owner on Jan 27, 2025. It is now read-only.

Commit e903e40

Browse files
committed
sty: lint notebook
1 parent efc305e commit e903e40

File tree

1 file changed

+112
-72
lines changed

1 file changed

+112
-72
lines changed

docs/notebooks/bold_realignment.ipynb

Lines changed: 112 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,19 @@
66
"metadata": {},
77
"outputs": [],
88
"source": [
9-
"import nibabel as nb\n",
10-
"import numpy as np\n",
11-
"from pathlib import Path\n",
12-
"from shutil import rmtree, copy, move\n",
13-
"from importlib import reload\n",
149
"import asyncio\n",
15-
"import nest_asyncio\n",
16-
"\n",
17-
"from scipy.ndimage import binary_dilation\n",
18-
"from skimage.morphology import ball\n",
10+
"from pathlib import Path\n",
11+
"from shutil import copy, move\n",
1912
"\n",
13+
"import nest_asyncio\n",
14+
"import nibabel as nb\n",
2015
"import nitransforms as nt\n",
16+
"import numpy as np\n",
2117
"from nipreps.synthstrip.wrappers.nipype import SynthStrip\n",
2218
"from nipype.interfaces.afni import Volreg\n",
19+
"from scipy.ndimage import binary_dilation\n",
20+
"from skimage.morphology import ball\n",
21+
"\n",
2322
"from eddymotion.registration import ants as erants\n",
2423
"\n",
2524
"nest_asyncio.apply()"
@@ -31,8 +30,8 @@
3130
"metadata": {},
3231
"outputs": [],
3332
"source": [
34-
"DATA_PATH = Path('/data/datasets/')\n",
35-
"WORKDIR = Path.home() / 'tmp' / 'eddymotiondev' / 'ismrm25'\n",
33+
"DATA_PATH = Path(\"/data/datasets/\")\n",
34+
"WORKDIR = Path.home() / \"tmp\" / \"eddymotiondev\" / \"ismrm25\"\n",
3635
"WORKDIR.mkdir(parents=True, exist_ok=True)\n",
3736
"\n",
3837
"OUTPUT_DIR = Path(\"/data/derivatives\") / \"eddymotion-ismrm25-exp2\"\n",
@@ -46,7 +45,8 @@
4645
"outputs": [],
4746
"source": [
4847
"bold_runs = [\n",
49-
" Path(line) for line in (DATA_PATH / \"ismrm_sample.txt\").read_text().splitlines()\n",
48+
" Path(line)\n",
49+
" for line in (DATA_PATH / \"ismrm_sample.txt\").read_text().splitlines()\n",
5050
" if line.strip()\n",
5151
"]"
5252
]
@@ -65,46 +65,48 @@
6565
" nii = nb.load(DATA_PATH / bold_run)\n",
6666
" average = nii.get_fdata().mean(-1)\n",
6767
" avg_path.parent.mkdir(exist_ok=True, parents=True)\n",
68-
" nii.__class__(\n",
69-
" average,\n",
70-
" nii.affine,\n",
71-
" nii.header\n",
72-
" ).to_filename(avg_path)\n",
68+
" nii.__class__(average, nii.affine, nii.header).to_filename(avg_path)\n",
7369
"\n",
74-
" bmask_path = OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_label-brain_mask.nii.gz\"\n",
70+
" bmask_path = (\n",
71+
" OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_label-brain_mask.nii.gz\"\n",
72+
" )\n",
7573
" if not bmask_path.exists():\n",
7674
" bmsk_results = SynthStrip(\n",
7775
" in_file=str(avg_path),\n",
7876
" use_gpu=True,\n",
7977
" ).run(cwd=str(WORKDIR))\n",
8078
" copy(bmsk_results.outputs.out_mask, bmask_path)\n",
8179
"\n",
82-
" dilmask_path = avg_path.parent / f\"{avg_path.name.rsplit('_', 1)[0]}_label-braindilated_mask.nii.gz\"\n",
80+
" dilmask_path = (\n",
81+
" avg_path.parent / f\"{avg_path.name.rsplit('_', 1)[0]}_label-braindilated_mask.nii.gz\"\n",
82+
" )\n",
8383
"\n",
8484
" if not dilmask_path.exists():\n",
8585
" niimsk = nb.load(bmask_path)\n",
8686
" niimsk.__class__(\n",
87-
" binary_dilation(niimsk.get_fdata() > 0.0, ball(4)).astype(\"uint8\"),\n",
88-
" niimsk.affine,\n",
89-
" niimsk.header,\n",
90-
" ).to_filename(dilmask_path)\n",
87+
" binary_dilation(niimsk.get_fdata() > 0.0, ball(4)).astype(\"uint8\"),\n",
88+
" niimsk.affine,\n",
89+
" niimsk.header,\n",
90+
" ).to_filename(dilmask_path)\n",
9191
"\n",
92-
" oned_matrix_path = avg_path.parent / f\"{avg_path.name.rsplit('_', 1)[0]}_desc-hmc_xfm.txt\"\n",
93-
" realign_output = avg_path.parent / f\"{avg_path.name.rsplit('_', 1)[0]}_desc-realigned_bold.nii.gz\"\n",
92+
" oned_matrix_path = avg_path.parent / f\"{avg_path.name.rsplit('_', 1)[0]}_desc-hmc_xfm.txt\"\n",
93+
" realign_output = (\n",
94+
" avg_path.parent / f\"{avg_path.name.rsplit('_', 1)[0]}_desc-realigned_bold.nii.gz\"\n",
95+
" )\n",
9496
"\n",
9597
" if not realign_output.exists():\n",
9698
" volreg_results = Volreg(\n",
9799
" in_file=str(DATA_PATH / bold_run),\n",
98100
" in_weight_volume=str(dilmask_path),\n",
99-
" args='-Fourier -twopass',\n",
101+
" args=\"-Fourier -twopass\",\n",
100102
" zpad=4,\n",
101-
" outputtype='NIFTI_GZ',\n",
103+
" outputtype=\"NIFTI_GZ\",\n",
102104
" oned_matrix_save=f\"{oned_matrix_path}.aff12.1D\",\n",
103105
" out_file=str(realign_output),\n",
104106
" num_threads=12,\n",
105107
" ).run(cwd=str(WORKDIR))\n",
106108
"\n",
107-
" move(volreg_results.outputs.oned_matrix_save, oned_matrix_path)\n"
109+
" move(volreg_results.outputs.oned_matrix_save, oned_matrix_path)"
108110
]
109111
},
110112
{
@@ -173,73 +175,92 @@
173175
"metadata": {},
174176
"outputs": [],
175177
"source": [
176-
"\n",
177-
"def plot_profile(image_path, axis=None, indexing=None, cmap='gray', label=None, figsize=(15, 1.7)):\n",
178+
"def plot_profile(image_path, axis=None, indexing=None, cmap=\"gray\", label=None, figsize=(15, 1.7)):\n",
178179
" \"\"\"Plots a single image slice on a given axis or a new figure if axis is None.\"\"\"\n",
179180
" # Load the image\n",
180181
" image_data = nb.load(image_path).get_fdata()\n",
181-
" \n",
182+
"\n",
182183
" # Define default indexing if not provided\n",
183184
" if indexing is None:\n",
184-
" indexing = (image_data.shape[0] // 2, 3 * image_data.shape[1] // 4, slice(None), slice(None))\n",
185-
" \n",
185+
" indexing = (\n",
186+
" image_data.shape[0] // 2,\n",
187+
" 3 * image_data.shape[1] // 4,\n",
188+
" slice(None),\n",
189+
" slice(None),\n",
190+
" )\n",
191+
"\n",
186192
" # If no axis is provided, create a new figure and axis\n",
187193
" if axis is None:\n",
188194
" fig, axis = plt.subplots(figsize=figsize)\n",
189195
" else:\n",
190196
" fig = None # If axis is provided, we won't manage the figure\n",
191-
" \n",
197+
"\n",
192198
" # Display the image on the specified axis with aspect='auto' and the colormap\n",
193-
" axis.imshow(image_data[indexing], aspect='auto', cmap=cmap)\n",
194-
" \n",
199+
" axis.imshow(image_data[indexing], aspect=\"auto\", cmap=cmap)\n",
200+
"\n",
195201
" # Turn off the axis for a cleaner look\n",
196-
" axis.axis('off')\n",
197-
" \n",
202+
" axis.axis(\"off\")\n",
203+
"\n",
198204
" if label:\n",
199205
" # Annotate the plot with the provided label\n",
200-
" axis.text(0.02, 0.95, label, color='white', fontsize=12, ha='left', va='top', transform=axis.transAxes)\n",
201-
" \n",
206+
" axis.text(\n",
207+
" 0.02,\n",
208+
" 0.95,\n",
209+
" label,\n",
210+
" color=\"white\",\n",
211+
" fontsize=12,\n",
212+
" ha=\"left\",\n",
213+
" va=\"top\",\n",
214+
" transform=axis.transAxes,\n",
215+
" )\n",
216+
"\n",
202217
" # If we created the figure, show it\n",
203218
" if fig is not None:\n",
204219
" plt.show()\n",
205-
" \n",
220+
"\n",
206221
" return fig\n",
207222
"\n",
223+
"\n",
208224
"# def plot_combined_profile(images, indexing=None, figsize=(15, 1.7), cmap='gray', labels=None):\n",
209225
"# # Create a figure with three subplots in a vertical layout and specified figure size\n",
210226
"# n_images = len(images)\n",
211227
"\n",
212228
"# nplots = n_images * len(indexing or [True])\n",
213229
"# figsize = (figsize[0], figsize[1] * nplots)\n",
214230
"# fig, axes = plt.subplots(nplots, 1, figsize=figsize, constrained_layout=True)\n",
215-
" \n",
231+
"\n",
216232
"# if labels is None or isinstance(labels, str):\n",
217233
"# labels = (labels, ) * nplots\n",
218-
" \n",
234+
"\n",
219235
"# if indexing is None or len(indexing) == 0:\n",
220236
"# indexing = [None]\n",
221-
" \n",
237+
"\n",
222238
"# for i, idx in enumerate(indexing):\n",
223239
"# for j in range(len(images)):\n",
224240
"# ax = axes[i * n_images + j]\n",
225241
"# plot_profile(images[j], axis=ax, indexing=idx, cmap=cmap, label=labels[j])\n",
226-
" \n",
242+
"\n",
227243
"# return fig\n",
228244
"\n",
229-
"def plot_combined_profile(images, afni_fd, eddymotion_fd, indexing=None, figsize=(15, 1.7), cmap='gray', labels=None):\n",
245+
"\n",
246+
"def plot_combined_profile(\n",
247+
" images, afni_fd, eddymotion_fd, indexing=None, figsize=(15, 1.7), cmap=\"gray\", labels=None\n",
248+
"):\n",
230249
" # Calculate the number of profile plots\n",
231250
" n_images = len(images)\n",
232251
" nplots = n_images * len(indexing or [True])\n",
233252
" total_height = figsize[1] * nplots + 2 # Adjust figure height for FD plot\n",
234253
"\n",
235254
" # Create a figure with one extra row for the FD plot, setting `sharex=True` for shared x-axis\n",
236-
" fig, axes = plt.subplots(nplots + 1, 1, figsize=(figsize[0], total_height), constrained_layout=True, sharex=True)\n",
255+
" fig, axes = plt.subplots(\n",
256+
" nplots + 1, 1, figsize=(figsize[0], total_height), constrained_layout=True, sharex=True\n",
257+
" )\n",
237258
"\n",
238259
" # Plot the framewise displacement on the first axis\n",
239260
" fd_axis = axes[0]\n",
240261
" timepoints = np.arange(len(afni_fd)) # Assuming afni_fd and eddymotion_fd have the same length\n",
241-
" fd_axis.plot(timepoints, afni_fd, label='AFNI 3dVolreg FD', color='blue')\n",
242-
" fd_axis.plot(timepoints, eddymotion_fd, label='eddymotion FD', color='orange')\n",
262+
" fd_axis.plot(timepoints, afni_fd, label=\"AFNI 3dVolreg FD\", color=\"blue\")\n",
263+
" fd_axis.plot(timepoints, eddymotion_fd, label=\"eddymotion FD\", color=\"orange\")\n",
243264
" fd_axis.set_ylabel(\"FD (mm)\")\n",
244265
" fd_axis.legend(loc=\"upper right\")\n",
245266
" fd_axis.set_xticks([]) # Hide x-ticks to keep x-axis clean\n",
@@ -251,13 +272,13 @@
251272
" # Set indexing if not provided\n",
252273
" if indexing is None or len(indexing) == 0:\n",
253274
" indexing = [None]\n",
254-
" \n",
275+
"\n",
255276
" # Plot each profile slice below the FD plot\n",
256277
" for i, idx in enumerate(indexing):\n",
257278
" for j in range(len(images)):\n",
258279
" ax = axes[i * n_images + j + 1] # Shift index by 1 to account for FD plot\n",
259280
" plot_profile(images[j], axis=ax, indexing=idx, cmap=cmap, label=labels[j])\n",
260-
" \n",
281+
"\n",
261282
" return fig"
262283
]
263284
},
@@ -278,7 +299,10 @@
278299
}
279300
],
280301
"source": [
281-
"plot_combined_profile((DATA_PATH / bold_runs[15], afni_realigned[15], afni_realigned[15]), labels=(\"hmc1\", \"original\", \"hmc2\"));"
302+
"plot_combined_profile(\n",
303+
" (DATA_PATH / bold_runs[15], afni_realigned[15], afni_realigned[15]),\n",
304+
" labels=(\"hmc1\", \"original\", \"hmc2\"),\n",
305+
");"
282306
]
283307
},
284308
{
@@ -299,8 +323,12 @@
299323
],
300324
"source": [
301325
"datashape = nb.load(DATA_PATH / bold_runs[15]).shape\n",
302-
"plot_profile(DATA_PATH / bold_runs[15], afni_realigned[15], afni_realigned[15],\n",
303-
" indexing=(slice(None), 3 * datashape[1] // 4, datashape[2] // 2, slice(None)));"
326+
"plot_profile(\n",
327+
" DATA_PATH / bold_runs[15],\n",
328+
" afni_realigned[15],\n",
329+
" afni_realigned[15],\n",
330+
" indexing=(slice(None), 3 * datashape[1] // 4, datashape[2] // 2, slice(None)),\n",
331+
");"
304332
]
305333
},
306334
{
@@ -309,7 +337,6 @@
309337
"metadata": {},
310338
"outputs": [],
311339
"source": [
312-
"from eddymotion.estimator import EddyMotionEstimator\n",
313340
"from eddymotion.model.base import AverageModel\n",
314341
"from eddymotion.utils import random_iterator"
315342
]
@@ -424,7 +451,9 @@
424451
" workdir = WORKDIR / bold_run.parent\n",
425452
" workdir.mkdir(parents=True, exist_ok=True)\n",
426453
" data_path = DATA_PATH / bold_run\n",
427-
" brainmask_path = OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_label-brain_mask.nii.gz\"\n",
454+
" brainmask_path = (\n",
455+
" OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_label-brain_mask.nii.gz\"\n",
456+
" )\n",
428457
"\n",
429458
" nii = nb.load(data_path)\n",
430459
" hdr = nii.header.copy()\n",
@@ -449,6 +478,7 @@
449478
"outputs": [],
450479
"source": [
451480
"from nitransforms.resampling import apply\n",
481+
"\n",
452482
"from eddymotion.registration.utils import displacement_framewise\n",
453483
"\n",
454484
"afni_fd = {}\n",
@@ -472,13 +502,14 @@
472502
" ]\n",
473503
"\n",
474504
" nii = nb.load(DATA_PATH / bold_run)\n",
475-
" nitransforms_fd[str(bold_run)] = np.array([\n",
476-
" displacement_framewise(nii, xfm)\n",
477-
" for xfm in xfms\n",
478-
" ])\n",
505+
" nitransforms_fd[str(bold_run)] = np.array([displacement_framewise(nii, xfm) for xfm in xfms])\n",
479506
"\n",
480507
" hmc_xfm = nt.linear.LinearTransformsMapping(xfms)\n",
481-
" out_nitransforms = OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-nitransforms_bold.nii.gz\"\n",
508+
" out_nitransforms = (\n",
509+
" OUTPUT_DIR\n",
510+
" / bold_run.parent\n",
511+
" / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-nitransforms_bold.nii.gz\"\n",
512+
" )\n",
482513
" if not out_nitransforms.exists():\n",
483514
" apply(\n",
484515
" hmc_xfm,\n",
@@ -487,20 +518,21 @@
487518
" ).to_filename(out_nitransforms)\n",
488519
"\n",
489520
" afni_xfms = nt.linear.load(\n",
490-
" OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-hmc_xfm.txt\"\n",
521+
" OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-hmc_xfm.txt\"\n",
522+
" )\n",
523+
" afni_fd[str(bold_run)] = np.array(\n",
524+
" [displacement_framewise(nii, afni_xfms[i]) for i in range(len(afni_xfms))]\n",
491525
" )\n",
492-
" afni_fd[str(bold_run)] = np.array([\n",
493-
" displacement_framewise(nii, afni_xfms[i])\n",
494-
" for i in range(len(afni_xfms))\n",
495-
" ])\n",
496526
"\n",
497-
" out_afni = OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-afni_bold.nii.gz\"\n",
527+
" out_afni = (\n",
528+
" OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-afni_bold.nii.gz\"\n",
529+
" )\n",
498530
" if not out_afni.exists():\n",
499531
" apply(\n",
500532
" afni_xfms,\n",
501533
" spatialimage=nii,\n",
502534
" reference=nii,\n",
503-
" ).to_filename(out_afni)\n"
535+
" ).to_filename(out_afni)"
504536
]
505537
},
506538
{
@@ -1681,8 +1713,16 @@
16811713
"\n",
16821714
" for bold_run in bold_runs:\n",
16831715
" original = DATA_PATH / bold_run\n",
1684-
" nitransforms = OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-nitransforms_bold.nii.gz\"\n",
1685-
" afni = OUTPUT_DIR / bold_run.parent / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-realigned_bold.nii.gz\"\n",
1716+
" nitransforms = (\n",
1717+
" OUTPUT_DIR\n",
1718+
" / bold_run.parent\n",
1719+
" / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-nitransforms_bold.nii.gz\"\n",
1720+
" )\n",
1721+
" afni = (\n",
1722+
" OUTPUT_DIR\n",
1723+
" / bold_run.parent\n",
1724+
" / f\"{bold_run.name.rsplit('_', 1)[0]}_desc-realigned_bold.nii.gz\"\n",
1725+
" )\n",
16861726
"\n",
16871727
" datashape = nb.load(original).shape\n",
16881728
"\n",
@@ -1691,7 +1731,7 @@
16911731
" afni_fd[str(bold_run)],\n",
16921732
" nitransforms_fd[str(bold_run)],\n",
16931733
" labels=(\"3dVolreg\", str(bold_run), \"eddymotion\"),\n",
1694-
" indexing=(None, (slice(None), 3 * datashape[1] // 4, datashape[2] // 2, slice(None)))\n",
1734+
" indexing=(None, (slice(None), 3 * datashape[1] // 4, datashape[2] // 2, slice(None))),\n",
16951735
" )\n",
16961736
"\n",
16971737
" # Save the figure\n",
@@ -1701,7 +1741,7 @@
17011741
" plt.close(fig)\n",
17021742
"\n",
17031743
" index_file.write(f\"<li><a href={out_svg.relative_to(OUTPUT_DIR)}>{bold_run}</a></li>\\n\")\n",
1704-
" \n",
1744+
"\n",
17051745
" index_file.write(\"</ul>\\n</body></html>\")"
17061746
]
17071747
},

0 commit comments

Comments
 (0)