Source code for portpy.photon.utils.load_data

import os
import numpy as np
from scipy.sparse import csr_matrix
import h5py


[docs]def load_data(meta_data: dict, pat_dir: str, load_inf_matrix_full: bool) -> dict: """ Takes meta_data and the location of the data as inputs and returns the full data. The meta_data only includes light-weight data from the .json files (e.g., beam IDs, angles, structure names,..). Large numeric data (e.g., influence matrix, voxel coordinates) are stored in .h5 files. :param load_inf_matrix_full: whether to load full influence matrix from the data :param meta_data: meta_data containing light weight data from json file :param pat_dir: patient folder directory containing all the data e.g. if options['loadInfluenceMatrixFull']=True, it will load full influence matrix :return: a dict of data """ if not load_inf_matrix_full: meta_data['beams_dict']['influenceMatrixFull_File'] = [None] * len( meta_data['beams_dict']['influenceMatrixFull_File']) meta_data = load_file(meta_data=meta_data, pat_dir=pat_dir) # recursive function to load data from .h5 files return meta_data
[docs]def load_file(meta_data: dict, pat_dir: str): """ This recursive function loads the data from .h5 files and merge them with the meta_data and returns a dictionary including all the data (meta_data+actual numeric data) :param meta_data: meta_data containing leight weight data from json file :param pat_dir: patient folder directory :return: """ for key in meta_data.copy(): item = meta_data[key] if type(item) is dict: meta_data[key] = load_file(item, pat_dir) elif key == 'beamlets': # added this part to check if there are beamlets since beamlets are list of dictionary if type(item[0]) is dict: for ls in range(len(item)): load_file(item[ls], pat_dir) # meta_data[key] = ls_data elif key.endswith('_File'): success = 1 for i in range(np.size(meta_data[key])): dataFolder = pat_dir if meta_data[key][i] is not None: if meta_data[key][i].startswith('Beam_'): dataFolder = os.path.join(dataFolder, 'Beams') if type(meta_data[key]) is not list: if meta_data[key].startswith('Beam_'): # added this for beamlets dataFolder = os.path.join(dataFolder, 'Beams') file_tag = meta_data[key].split('.h5') else: file_tag = meta_data[key][i].split('.h5') filename = os.path.join(dataFolder, file_tag[0] + '.h5') with h5py.File(filename, "r") as f: if file_tag[1] in f: if key[0:-5] == 'optimizationVoxIndices': vox = f[file_tag[1]][:].ravel() meta_data.setdefault(key[0:-5], []).append(vox.astype(int)) elif key[0:-5] == 'BEV_2d_structure_mask': orgs = f[file_tag[1]].keys() organ_mask_dict = dict() for j in orgs: organ_mask_dict[j] = f[file_tag[1]][j][:] # organ_mask_dict['Mask'].append(f[file_tag[1]][j][:].T) meta_data.setdefault(key[0:-5], []).append(organ_mask_dict) elif key[0:-5] == 'BEV_structure_contour_points': orgs = f[file_tag[1]].keys() organ_mask_dict = dict() for j in orgs: segments = f[file_tag[1]][j].keys() for seg in segments: organ_mask_dict.setdefault(j, []).append(f[file_tag[1]][j][seg][:]) # organ_mask_dict[j] = f[file_tag[1]][j][seg][:].T # organ_mask_dict['Mask'].append(f[file_tag[1]][j][:].T) meta_data.setdefault(key[0:-5], []).append(organ_mask_dict) # meta_data.setdefault(key[0:-5], []).append(f[file_tag[1]][j][:].T) else: meta_data.setdefault(key[0:-5], []).append(f[file_tag[1]][:]) if key[0:-5] == 'influenceMatrixSparse': infMatrixSparseForBeam = meta_data[key[0:-5]][i] meta_data[key[0:-5]][i] = csr_matrix( (infMatrixSparseForBeam[:, 2], (infMatrixSparseForBeam[:, 0].astype(int), infMatrixSparseForBeam[:, 1].astype(int)))) else: print('Problem reading data: {}'.format(meta_data[key][i])) success = 0 if success: del meta_data[key] return meta_data