DDMR / Datasets /irca_pre_processing.py
andreped's picture
Renamed module to ddmr
a27d55f
import os, sys
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir) # PYTHON > 3.3 does not allow relative referencing
import h5py
import numpy as np
import zipfile
import re
import dicom2nifti as d2n
import nibabel as nib
from ddmr.utils.nifti_utils import save_nifti
from ddmr.utils.misc import try_mkdir
from tqdm import tqdm
import shutil
IRCA_PATH = '/mnt/EncryptedData1/Users/javier/vessel_registration/3Dirca/'
SEGMENTATIONS = ('venoussystem', 'venacava', 'portalvein', 'liver', 'livertumor')
SEGS_VESSELS = ('venoussystem', 'venacava', 'portalvein')
SEGS_PARENCH = ('liver',)
SEGS_TUMOR = ('livertumor', 'tumor', 'liverkyst', 'livercyst')
SEGMENTATIONS = (SEGS_PARENCH + SEGS_VESSELS + SEGS_TUMOR)
DEST_FOLDER = os.path.join(IRCA_PATH, 'nifti3')
ZIP_EXT = '.zip'
NIFTI_EXT = '.nii.gz'
H5_EXT = '.hd5'
PATIENT_DICOM = 'PATIENT_DICOM'
TEMP = 'temp'
SEGS_DICOM = 'MASKS_DICOM'
CONVERTED_FILE = 'none' + NIFTI_EXT
VOL_FILE = 'volume-{:04d}' + NIFTI_EXT
SEG_FILE = 'segmentation-{:04d}' + NIFTI_EXT
SEG_TO_CT_ORIENTATION_MAT = np.eye(4)
SEG_TO_CT_ORIENTATION_MAT[0] = -1
def merge_segmentations(file_list):
nib_file = nib.concat_images(file_list)
np_file = np.asarray(nib_file.dataobj)
np_file = np.sign(np.sum(np_file, -1)) * np.max(np_file)
return nib.Nifti1Image(np_file, nib_file.affine)
if __name__ == '__main__':
# 1. List of folders
folder_list = [os.path.join(IRCA_PATH, d) for d in os.listdir(IRCA_PATH) if d.lower().startswith('3dircadb1.')]
folder_list.sort()
try_mkdir(DEST_FOLDER)
folder_iter = tqdm(folder_list)
for pat_dir in folder_iter:
pat_dir = folder_list[13]
i = int(pat_dir.split('.')[-1])
# 2. Unzip PATIENT_DICOM.zip
temp_folder = os.path.join(pat_dir, TEMP)
folder_iter.set_description('Volume DICOM: Unzipping PATIENT_DICOM.zip')
zipfile.ZipFile(os.path.join(pat_dir, PATIENT_DICOM + ZIP_EXT)).extractall(temp_folder)
folder_iter.set_description('Volume DICOM: Converting DICOM to Nifti')
d2n.convert_directory(os.path.join(temp_folder, PATIENT_DICOM), os.path.join(temp_folder, PATIENT_DICOM))
os.rename(os.path.join(temp_folder, PATIENT_DICOM, CONVERTED_FILE), os.path.join(DEST_FOLDER, VOL_FILE.format(i)))
folder_iter.set_description('Volume DICOM: CT stored in: ' + os.path.join(DEST_FOLDER, VOL_FILE.format(i)))
# os.rename also moves the file to the destination path. So the original one ceases to exist
# 3. Unzip MASKS_DICOM.zip
folder_iter.set_description('Segmentations DICOM: Unzipping MASKS_DICOM.zip')
zipfile.ZipFile(os.path.join(pat_dir, SEGS_DICOM + ZIP_EXT)).extractall(temp_folder)
seg_nib = list()
seg_ves = list()
seg_par = list()
seg_tumor = list()
seg_dirs = list()
for root, dir_list, file_list in os.walk(os.path.join(temp_folder, SEGS_DICOM)):
for fold in dir_list:
if fold.startswith(SEGMENTATIONS):
# if 'liverkyst' in fold:
# continue
# else:
seg_dirs.append(fold)
seg_dirs.sort()
for fold in seg_dirs:
folder_iter.set_description('Segmentations DICOM: Converting ' + fold)
d2n.convert_directory(os.path.join(temp_folder, SEGS_DICOM, fold),
os.path.join(temp_folder, SEGS_DICOM))
os.rename(os.path.join(temp_folder, SEGS_DICOM, CONVERTED_FILE),
os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
if fold.startswith(SEGS_VESSELS):
seg_ves.append(os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
elif fold.startswith(SEGS_TUMOR):
seg_tumor.append(os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
elif fold.startswith(SEGS_PARENCH):
seg_par.append(os.path.join(temp_folder, SEGS_DICOM, fold + '_nifti_' + NIFTI_EXT))
else:
continue
folder_iter.set_description('Segmentations DICOM: Concatenating segmentations')
# Merge the vessel segmentations
segs_to_merge = tuple()
if len(seg_par) > 1:
segs_to_merge += (merge_segmentations(seg_par),)
else:
segs_to_merge += tuple(seg_par) # seg_par is a list
if len(seg_ves) > 1:
segs_to_merge += (merge_segmentations(seg_ves),)
else:
segs_to_merge += tuple(seg_ves) # seg_ves is a list
if len(seg_tumor) > 1:
segs_to_merge += (merge_segmentations(seg_tumor),)
else:
segs_to_merge += tuple(seg_tumor) # seg_tumor is a list
# # Merge the tumors segmentations
# if len(seg_tumor):
# segs_to_merge.append(merge_segmentations(seg_tumor))
# else:
# print('No tumors found in ' + pat_dir)
# Merge with the parenchyma and save
folder_iter.set_description('Segmentations DICOM: Saving segmentations')
if len(segs_to_merge) > 1:
nib.save(nib.concat_images(segs_to_merge, check_affines=True), os.path.join(DEST_FOLDER, SEG_FILE.format(i)))
else:
nib.save(segs_to_merge[0], os.path.join(DEST_FOLDER, SEG_FILE.format(i)))
folder_iter.set_description('Segmentations DICOM: Segmentation stored in ' + os.path.join(DEST_FOLDER, SEG_FILE.format(i)))
shutil.rmtree(temp_folder)
folder_iter.set_description('Temporal file deleted')
# 4. Load DICOM and transform to nifti
# 5. Store as nifty in hd5