Source code for portpy.photon.utils.load_metadata
import json
import os
from natsort import natsorted
from pathlib import Path
[docs]def list_to_dict(json_data):
"""
A recursive function which constructs dictionary from list
:param json_data: data in json or list format
:return: data in dictionary format
"""
json_dict = {}
if type(json_data) is list:
for i in range(len(json_data)):
elem = json_data[i]
if type(elem) is list:
json_dict[i] = list_to_dict(elem)
else:
for key in elem:
json_dict.setdefault(key, []).append(elem[key])
else:
json_dict = json_data.copy()
return json_dict
[docs]def load_metadata(pat_dir: str) -> dict:
"""Loads metadata of a patient located in path and returns the metadata as a dictionary
The data are loaded from the following .Json files:
1- StructureSet_MetaData.json
including data about the structures (e.g., PTV, Kidney, Lung)
2- OptimizationVoxels_MetaData.json
including patient voxel data (3D cubic voxels of patient body)
3- CT_MetaData.json
including patient CT scan data (e.g., size, resolution, ct hounsfield units)
4- PlannerBeams.json
including the indices of the beams_dict selected by an expert planner based on the geometry/shape/location of tumor/healthy-tissues
5- ClinicalCriteria_MetaData.json
including clinically relevant metrics used to evaluate a plan (e.g., Kidney mean dose_1d <= 20Gy, Cord max dose_1d <= 10 Gy)
6- Beams.json
including beam information (e.g., gantry angle, collimator angle)
:param pat_dir: full path of patient folder
:return: a dictionary including all metadata
"""
meta_data = dict() # initialization
# read information regarding the structures
fname = os.path.join(pat_dir, 'StructureSet_MetaData.json')
# Opening JSON file
f = open(fname)
jsondata = json.load(f)
meta_data['structures'] = list_to_dict(jsondata)
# read information regarding the voxels
fname = os.path.join(pat_dir, 'OptimizationVoxels_MetaData.json')
# Opening JSON file
f = open(fname)
jsondata = json.load(f)
meta_data['opt_voxels'] = list_to_dict(jsondata)
# read information regarding the CT voxels
fname = os.path.join(pat_dir, 'CT_MetaData.json')
if os.path.isfile(fname):
# Opening JSON file
f = open(fname)
jsondata = json.load(f)
meta_data['ct'] = list_to_dict(jsondata)
# read information regarding beam angles selected by an expert planner
fname = os.path.join(pat_dir, 'PlannerBeams.json')
if os.path.isfile(fname):
# Opening JSON file
f = open(fname)
jsondata = json.load(f)
meta_data['planner_beam_ids'] = list_to_dict(jsondata)
# read information regarding the clinical evaluation metrics
fname = os.path.join(pat_dir, 'ClinicalCriteria_MetaData.json')
# Opening JSON file
f = open(fname)
jsondata = json.load(f)
meta_data['clinical_criteria'] = list_to_dict(jsondata)
# read information regarding the beams_dict
beamFolder = os.path.join(pat_dir, 'Beams')
beamsJson = [pos_json for pos_json in os.listdir(beamFolder) if pos_json.endswith('.json')]
beamsJson = natsorted(beamsJson)
meta_data['beams_dict'] = dict()
# the information for each beam is stored in an individual .json file, so we loop through them
for i in range(len(beamsJson)):
fname = os.path.join(beamFolder, beamsJson[i])
f = open(fname)
jsondata = json.load(f)
for key in jsondata:
meta_data['beams_dict'].setdefault(key, []).append(jsondata[key])
# dataMeta['beamsMetaData'][key].append(json_data[key])
meta_data['patient_folder_path'] = pat_dir
return meta_data
[docs]def load_config_planner_metadata(patient_id):
# load planner_plan config metadata
fname = os.path.join(Path(__file__).parents[2], 'config_files', 'planner_plan', patient_id, 'planner_plan.json')
# fname = os.path.join('..', 'config_files', 'planner_plan', patient_id, 'planner_plan.json')
# Opening JSON file
f = open(fname)
planner_metadata = json.load(f)
return planner_metadata
[docs]def load_config_clinical_criteria(protocol_type, protocol_name):
# load planner_plan config metadata
fname = os.path.join(Path(__file__).parents[2], 'config_files', 'clinical_criteria',
protocol_type, protocol_name + '.json')
# fname = os.path.join('..', 'config_files', 'planner_plan', patient_id, 'planner_plan.json')
# Opening JSON file
f = open(fname)
metadata = json.load(f)
return metadata