|
183 | 183 | "source": [
|
184 | 184 | "# Segment spinal cord on TFL data (B1+ mapping) ⏳\n",
|
185 | 185 | "\n",
|
186 |
| - "for subject in subjects:\n", |
| 186 | + "# Only do this for subjects without MSSM in their name (https://github.com/spinal-cord-7t/coil-qc-code/issues/153)\n", |
| 187 | + "subjects_without_MSSM = [subject for subject in subjects if \"MSSM\" not in subject]\n", |
| 188 | + "\n", |
| 189 | + "for subject in subjects_without_MSSM:\n", |
187 | 190 | " os.chdir(os.path.join(path_data, subject, \"fmap\"))\n",
|
188 | 191 | " fname_manual_seg = os.path.join(path_labels, subject, \"fmap\", f\"{subject}_acq-anat_TB1TFL_label-SC_seg.nii.gz\")\n",
|
189 | 192 | " if os.path.exists(fname_manual_seg):\n",
|
|
218 | 221 | "source": [
|
219 | 222 | "# Register TFL data (B1+ mapping) to the MP2RAGE scan ⏳\n",
|
220 | 223 | "\n",
|
221 |
| - "for subject in subjects:\n", |
| 224 | + "# for subject in subjects:\n", |
| 225 | + "for subject in ['sub-MSSM1', 'sub-MSSM2', 'sub-MSSM3']:\n", |
222 | 226 | " os.chdir(os.path.join(path_data, subject, \"fmap\"))\n",
|
223 | 227 | " if subject in ['sub-MSSM1', 'sub-MSSM2', 'sub-MSSM3']:\n",
|
224 | 228 | " # https://github.com/spinal-cord-7t/coil-qc-code/issues/43\n",
|
225 |
| - " !sct_register_multimodal -i {subject}_acq-famp_TB1TFL.nii.gz -iseg {subject}_acq-anat_TB1TFL_seg.nii.gz -d ../anat/{subject}_inv-1_part-mag_MP2RAGE_crop.nii.gz -dseg ../anat/{subject}_UNIT1_seg_crop.nii.gz -param step=1,type=seg,algo=centermass -qc \"{path_qc}\"\n", |
| 229 | + " # https://github.com/spinal-cord-7t/coil-qc-code/issues/153\n", |
| 230 | + " !sct_register_multimodal -i {subject}_acq-famp_TB1TFL.nii.gz -d ../anat/{subject}_inv-1_part-mag_MP2RAGE_crop.nii.gz -dseg ../anat/{subject}_UNIT1_seg_crop.nii.gz -identity 1 -qc \"{path_qc}\"\n", |
226 | 231 | " else:\n",
|
227 | 232 | " !sct_register_multimodal -i {subject}_acq-anat_TB1TFL.nii.gz -iseg {subject}_acq-anat_TB1TFL_seg.nii.gz -d ../anat/{subject}_inv-1_part-mag_MP2RAGE_crop.nii.gz -dseg ../anat/{subject}_UNIT1_seg_crop.nii.gz -param step=1,type=seg,algo=centermass -qc \"{path_qc}\""
|
228 | 233 | ]
|
|
314 | 319 | "id": "d165a15c",
|
315 | 320 | "metadata": {},
|
316 | 321 | "source": [
|
317 |
| - "### Warp MP2RAGE segmentation and vertebral levels to fmap metrics" |
| 322 | + "### Warp MP2RAGE vertebral levels to fmap metrics" |
318 | 323 | ]
|
319 | 324 | },
|
320 | 325 | {
|
|
324 | 329 | "metadata": {},
|
325 | 330 | "outputs": [],
|
326 | 331 | "source": [
|
327 |
| - "# Warping spinal cord segmentation and vertebral level to each flip angle and SNR map\n", |
| 332 | + "# Warping vertebral level to each flip angle and SNR map\n", |
328 | 333 | "\n",
|
329 | 334 | "for subject in subjects:\n",
|
330 | 335 | " os.chdir(os.path.join(path_data, subject, \"fmap\"))\n",
|
331 | 336 | " \n",
|
332 |
| - " # Warping SC segmentation and vertebral levels to TFL fmaps \n", |
| 337 | + " # For MSSM subjects, we also need to warp the SC segmentation\n", |
333 | 338 | " if subject in ['sub-MSSM1', 'sub-MSSM2', 'sub-MSSM3']:\n",
|
334 |
| - " #https://github.com/spinal-cord-7t/coil-qc-code/issues/43\n", |
| 339 | + " # Warping spinal cord segmentation to TFL data\n", |
| 340 | + " !sct_apply_transfo -i ../anat/{subject}_UNIT1_seg_crop.nii.gz -d {subject}_acq-famp_TB1TFL.nii.gz -w warp_{subject}_inv-1_part-mag_MP2RAGE_crop2{subject}_acq-famp_TB1TFL.nii.gz -x linear -o {subject}_acq-anat_TB1TFL_seg.nii.gz\n", |
| 341 | + " # Setting type to 'famp' for command below (https://github.com/spinal-cord-7t/coil-qc-code/issues/43)\n", |
335 | 342 | " type = 'famp'\n",
|
336 | 343 | " else:\n",
|
337 | 344 | " type = 'anat'\n",
|
| 345 | + " # Warping vertebral levels to TFL data\n", |
338 | 346 | " !sct_apply_transfo -i ../anat/{subject}_UNIT1_seg_labeled_crop.nii.gz -d {subject}_acq-famp_TB1TFL.nii.gz -w warp_{subject}_inv-1_part-mag_MP2RAGE_crop2{subject}_acq-{type}_TB1TFL.nii.gz -x nn -o {subject}_acq-anat_TB1TFL_seg_labeled-UNIT1reg.nii.gz\n",
|
339 |
| - " !sct_qc -i {subject}_acq-{type}_TB1TFL.nii.gz -s {subject}_acq-anat_TB1TFL_seg_labeled-UNIT1reg.nii.gz -p sct_label_vertebrae -qc {path_qc} -qc-subject {subject}\n", |
| 347 | + " # !sct_qc -i {subject}_acq-{type}_TB1TFL.nii.gz -s {subject}_acq-anat_TB1TFL_seg_labeled-UNIT1reg.nii.gz -p sct_label_vertebrae -qc {path_qc} -qc-subject {subject}\n", |
340 | 348 | " \n",
|
341 | 349 | " # Warping SC segmentation and vertebral levels to DREAM fmaps \n",
|
342 | 350 | " !sct_apply_transfo -i ../anat/{subject}_UNIT1_seg_crop.nii.gz -d {subject}_acq-famp_TB1DREAM.nii.gz -w warp_{subject}_UNIT1_crop2{subject}_acq-famp_TB1DREAM.nii.gz -x linear -o {subject}_acq-famp_TB1DREAM_seg.nii.gz\n",
|
343 |
| - " !sct_qc -i {subject}_acq-famp_TB1DREAM.nii.gz -s {subject}_acq-famp_TB1DREAM_seg.nii.gz -p sct_deepseg_sc -qc {path_qc} -qc-subject {subject}\n", |
| 351 | + " # !sct_qc -i {subject}_acq-famp_TB1DREAM.nii.gz -s {subject}_acq-famp_TB1DREAM_seg.nii.gz -p sct_deepseg_sc -qc {path_qc} -qc-subject {subject}\n", |
344 | 352 | " !sct_apply_transfo -i ../anat/{subject}_UNIT1_seg_labeled_crop.nii.gz -d {subject}_acq-famp_TB1DREAM.nii.gz -w warp_{subject}_UNIT1_crop2{subject}_acq-famp_TB1DREAM.nii.gz -x nn -o {subject}_acq-famp_TB1DREAM_seg_labeled-UNIT1reg.nii.gz\n",
|
345 |
| - " !sct_qc -i {subject}_acq-famp_TB1DREAM.nii.gz -s {subject}_acq-famp_TB1DREAM_seg_labeled-UNIT1reg.nii.gz -p sct_label_vertebrae -qc {path_qc} -qc-subject {subject}\n", |
| 353 | + " # !sct_qc -i {subject}_acq-famp_TB1DREAM.nii.gz -s {subject}_acq-famp_TB1DREAM_seg_labeled-UNIT1reg.nii.gz -p sct_label_vertebrae -qc {path_qc} -qc-subject {subject}\n", |
346 | 354 | " \n",
|
347 | 355 | " # Warping SC segmentation and vertebral level to SNR maps\n",
|
348 | 356 | " !sct_apply_transfo -i ../anat/{subject}_UNIT1_seg_labeled_crop.nii.gz -d {subject}_acq-coilQaSagLarge_SNR_T0000.nii.gz -w warp_{subject}_inv-1_part-mag_MP2RAGE_crop2{subject}_acq-coilQaSagLarge_SNR_T0000.nii.gz -x nn -o {subject}_acq-coilQaSagLarge_SNR_T0000_seg_labeled-UNIT1reg.nii.gz\n",
|
349 |
| - " !sct_qc -i {subject}_acq-coilQaSagLarge_SNR_T0000.nii.gz -s {subject}_acq-coilQaSagLarge_SNR_T0000_seg_labeled-UNIT1reg.nii.gz -p sct_label_vertebrae -qc {path_qc} -qc-subject {subject}" |
| 357 | + " # !sct_qc -i {subject}_acq-coilQaSagLarge_SNR_T0000.nii.gz -s {subject}_acq-coilQaSagLarge_SNR_T0000_seg_labeled-UNIT1reg.nii.gz -p sct_label_vertebrae -qc {path_qc} -qc-subject {subject}" |
350 | 358 | ]
|
351 | 359 | },
|
352 | 360 | {
|
|
814 | 822 | "# figure types\n",
|
815 | 823 | "fig_types = [\"TFL B1+ [nT/V]\", \"DREAM B1+ [nT/V]\", \"SNR_90\"]\n",
|
816 | 824 | " \n",
|
817 |
| - "for data_type, data_stats_type, fig_type in zip(data,data_stats,fig_types):\n", |
| 825 | + "for data_type, data_stats_type, fig_type in zip(data, data_stats, fig_types):\n", |
818 | 826 | " \n",
|
819 | 827 | " avg_data = {'CRMBM': 0, 'UCL': 0, 'MNI': 0, 'MGH': 0, 'MPI': 0, 'NTNU': 0, 'MSSM': 0}\n",
|
820 | 828 | " \n",
|
|
823 | 831 | " axs = gs.subplots(sharex=True, sharey=True)\n",
|
824 | 832 | " fig.set_size_inches(16, 6)\n",
|
825 | 833 | "\n",
|
826 |
| - " \n", |
827 | 834 | " j = 0\n",
|
828 |
| - " i = 0\n", |
829 |
| - " \n", |
| 835 | + " i = 0 \n", |
830 | 836 | " for k, site in enumerate(sites): \n",
|
831 | 837 | " l = 0\n",
|
832 | 838 | " while i < (j+3):\n",
|
833 |
| - "\n", |
834 | 839 | " axs[k].plot(data_type[site][subjects[i]],color=sub_colors[l], linestyle=sub_linestyles[l])\n",
|
835 |
| - "\n", |
836 | 840 | " avg_data[site] += data_type[site][subjects[i]]\n",
|
837 |
| - " \n", |
838 | 841 | " l += 1\n",
|
839 | 842 | " i += 1\n",
|
840 |
| - " \n", |
841 | 843 | " j += 3\n",
|
842 | 844 | " \n",
|
843 | 845 | " avg_data[site] = avg_data[site]/3\n",
|
|
861 | 863 | " for ax in axs.flat:\n",
|
862 | 864 | " ax.label_outer()\n",
|
863 | 865 | "\n",
|
864 |
| - "\n", |
865 | 866 | " plt.show()\n",
|
866 | 867 | "\n",
|
867 | 868 | " \n"
|
|
0 commit comments