{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"This script can be used for converting data from DICOM to NIFTI. You can choose `data_type` from `['FLAIR', 'T1w', 'T1wCE', 'T2w']`","metadata":{}},{"cell_type":"code","source":"\"\"\"Script for converting DICOM to nifti\"\"\"\n\nimport concurrent.futures\nimport logging\nimport os\nimport warnings\nfrom functools import partial\nfrom pathlib import Path\nfrom typing import Union\n\nimport SimpleITK as sitk\nfrom tqdm import tqdm\n\nlogger = logging.getLogger(__name__)\n\n\ndef convert_dicom_folder(\n    dicom_dir: str,\n    nifti_dir: str,\n    data_type: str,\n    max_workers: int\n):\n    dicom_dir = Path(dicom_dir)\n    nifti_dir = Path(nifti_dir)\n    \n    nifti_dir.mkdir(exist_ok=True)\n\n    if data_type not in ['FLAIR', 'T1w', 'T1wCE', 'T2w']:\n        raise ValueError(f'Bad data type: {data_type}!')\n\n    pattern = os.path.join('**', data_type)\n    folders_to_convert = list(dicom_dir.rglob(pattern=pattern))\n\n    convert_dicom_partial = partial(\n        convert_dicom_file_and_fix_align, output_folder=nifti_dir, compression=True\n    )\n\n    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:\n        list(\n            tqdm(\n                executor.map(convert_dicom_partial, folders_to_convert),\n                total=len(folders_to_convert),\n                disable=False,\n                postfix='Converting DICOM to nifti...',\n            )\n        )\n\n\ndef convert_dicom_file_and_fix_align(\n    dicom_directory: Union[str, Path],\n    output_folder: Union[str, Path],\n    compression: bool = True,\n) -> None:\n    dicom_directory = Path(dicom_directory).expanduser()\n    output_folder = Path(output_folder).expanduser()\n\n    image = load_dicom(dicom_directory=dicom_directory)\n\n    res_file_path = get_nii_filepath(\n        dicom_directory=dicom_directory,\n        output_folder=output_folder,\n        compression=compression,\n    )\n\n    sitk.WriteImage(\n        image=image, fileName=str(res_file_path), useCompression=compression\n    )\n\n\ndef load_dicom(dicom_directory: Union[str, Path]) -> sitk.Image:\n    sitk.ProcessObject_SetGlobalWarningDisplay(False)\n\n    series_ids = sitk.ImageSeriesReader.GetGDCMSeriesIDs(directory=str(dicom_directory))\n    series_file_names = sitk.ImageSeriesReader.GetGDCMSeriesFileNames(\n        str(dicom_directory), series_ids[0]\n    )\n    series_reader = sitk.ImageSeriesReader()\n    series_reader.SetFileNames(series_file_names)\n    series_reader.LoadPrivateTagsOn()\n    image = series_reader.Execute()\n\n    return image\n\n\ndef get_nii_filepath(\n    dicom_directory: Path,\n    output_folder: Path,\n    compression: bool = True,\n) -> Path:\n    sequence_type = str(dicom_directory).split(os.sep)[-1]\n    sequence_id = str(dicom_directory).split(os.sep)[-2]\n\n    res_file_name = f'{sequence_id}_{sequence_type}.nii'\n    if compression:\n        res_file_name += '.gz'\n\n    res_file_path = output_folder.joinpath(res_file_name)\n\n    return res_file_path","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-09-20T18:36:29.748692Z","iopub.execute_input":"2021-09-20T18:36:29.750789Z","iopub.status.idle":"2021-09-20T18:36:29.774366Z","shell.execute_reply.started":"2021-09-20T18:36:29.750730Z","shell.execute_reply":"2021-09-20T18:36:29.773433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if __name__ == '__main__':\n    warnings.filterwarnings('ignore')\n\n    convert_dicom_folder(\n        dicom_dir='../input/rsna-miccai-brain-tumor-radiogenomic-classification/train',\n        nifti_dir='./nifti_result',\n        data_type='FLAIR',\n        max_workers=8\n    )","metadata":{"execution":{"iopub.status.busy":"2021-09-20T18:36:33.372980Z","iopub.execute_input":"2021-09-20T18:36:33.373877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}