| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 | function [Geometry patient_dir] = RDXTPS_geometry_setup_wizard_ASP()%PLAN_SETUP_WIZARD Wizard to guide through plan creating% Usage:%   [ Geometry ] = dicomrt2geometry ( [input_dir] )% Input:%   input_dir = directory contains DicomRT data%   [] = prompt to select input_dir% Output:%   Geometry = Ryan's Geometry struct used with RDX TPS%% This function imports DicomRT data set and create RDX TPS compatible Geometry % struct.%% TODO: Switch from filename based Dicom identification to StudyID based.%% See also readPinnGeometry.m%% Author: Xiaohu Mototal_num_steps = 4;hWaitbar = waitbar(0);set(hWaitbar, 'Unit', 'normalized');op = get(hWaitbar, 'OuterPosition');set(hWaitbar, 'OuterPosition', op + [0 0.2 0 0]);%% -----===== DicomRT Import =====-----waitbar(0/total_num_steps, hWaitbar, 'Step 1: Import DicomRT');% try    Geometry = dicomrt2geometry();% catch EXCEPTION_DICOMRT2GEOMETRY%     msgbox('Failed to import DicomRT');%     delete(hWaitbar);%     rethrow(EXCEPTION_DICOMRT2GEOMETRY);% endif isempty(Geometry)    msgbox('Failed to import DicomRT');    delete(hWaitbar);    return;end%% -----===== BTV and Ring creation =====-----waitbar(1/total_num_steps, hWaitbar, 'Step 2: Assign target and BTV margin');ROI_names = cellfun(@(c)c.name, Geometry.ROIS, 'UniformOutput', false);[target_idx okay] = listdlg('ListString', ROI_names, ...    'SelectionMode', 'single', 'Name', 'Target Selection', ...    'PromptString', 'Please select the target ROI. ');if okay ~= 1    msgbox('Plan creation aborted');    delete(hWaitbar);    return;end[BTV_margin_answer] = inputdlg({sprintf('Please enter the BTV margin (cm):\n(default 0.6 cm or 1 sigma, enter 0 to skip)')}, ...    'BTV margin specification', 1, {'0.6'});if isempty(BTV_margin_answer)    BTV_margin = 0.6;else    BTV_margin = str2double(BTV_margin_answer{1});end% target_idx and BTV_margin are set. Expand PTV to BTVPTVmask = false(size(Geometry.rhomw));% for target_idx = target_indices        PTVmask(Geometry.ROIS{target_idx}.ind) = 1;% endif BTV_margin > 0    if exist('BTV_margin', 'var') && BTV_margin >= min(Geometry.voxel_size)        bwD = bwdistsc(PTVmask, Geometry.voxel_size);        Geometry.BTV = bwD <= BTV_margin;    endend% Create btvGeometry.ROIS{end+1} = Geometry.ROIS{end};Geometry.ROIS{end}.name = 'BTV';Geometry.ROIS{end}.num_curves = 0;Geometry.ROIS{end}.curves = {};Geometry.ROIS{end}.ind = find(Geometry.BTV);Geometry.ROIS{end}.visible = false;% Create ring[ring_margin_answer] = inputdlg({sprintf('Please enter the ring margin (cm):')}, ...    'Ring margin specification', 1, {'1'});if isempty(ring_margin_answer)    ring_margin = 1;else    ring_margin = str2double(ring_margin_answer{1});endbwD = bwdistsc(PTVmask, Geometry.voxel_size);Geometry.Ring = bwD <= ring_margin; % default ring radius 3 cmGeometry.Ring = xor(Geometry.Ring, PTVmask);Geometry.ROIS{end+1} = Geometry.ROIS{end};Geometry.ROIS{end}.name = 'Ring';Geometry.ROIS{end}.num_curves = 0;Geometry.ROIS{end}.curves = {};Geometry.ROIS{end}.ind = find(Geometry.Ring);Geometry.ROIS{end}.visible = false;% % Create high comformity ring structure for adaptive step size% [HCRing_margin_answer] = inputdlg({sprintf('Please enter the HC ring margin (cm):\n(default 1.2 cm or 2 sigma, enter 0 to skip)')}, ...%     'HCRing margin specification', 1, {'1.2'});% if isempty(HCRing_margin_answer)%     HCRing_margin = 1.2;% else%     HCRing_margin = str2double(HCRing_margin_answer{1});% end% % if HCRing_margin > 0%     bwD = bwdistsc(~Geometry.BTV, Geometry.voxel_size);%     % shrinked BTV from original BTV, such that original_BTV > target_VOI > shrinked_BTV%     Geometry.SBTV = bwD >= HCRing_margin;%     Geometry.HCRing = xor(Geometry.BTV, Geometry.SBTV);% end%% -----===== Save geometry files =====-----waitbar(2/total_num_steps, hWaitbar, 'Step 3: Save geometry files');% patient_dir = uifile('getdir', 'Save the patient data to directory');% !!! Grozomahpatient_dir = 'C:\010-work\003_localGit\WiscPlan_v2\WiscPlanPhotonkV125\PatientData';% make directoriesmkdir(patient_dir);mkdir(fullfile(patient_dir, 'beamlet_batch_files'));mkdir(fullfile(patient_dir, 'geometry_files'));mkdir(fullfile(patient_dir, 'matlab_files'));mkdir(fullfile(patient_dir, 'opt_input'));mkdir(fullfile(patient_dir, 'opt_output'));waitbar(2.33/total_num_steps, hWaitbar, 'Step 3: Save matlab geometry files');% Save matlab geometry filesave(fullfile(patient_dir, 'matlab_files', 'Geometry.mat'), 'Geometry');waitbar(2.66/total_num_steps, hWaitbar, 'Step 3: Save raw geometry files');% Write binary geometry filesfid = fopen(fullfile(patient_dir, 'geometry_files', 'rhomw.bin'), 'w');fwrite(fid, Geometry.rhomw, 'single');fclose(fid);fid = fopen(fullfile(patient_dir, 'geometry_files', 'Smw.bin'), 'w');fwrite(fid, Geometry.Smw, 'single');fclose(fid);fid = fopen(fullfile(patient_dir, 'geometry_files', 'Fmw2.bin'), 'w');fwrite(fid, Geometry.Fmw2, 'single');fclose(fid);fid = fopen(fullfile(patient_dir, 'geometry_files', 'target_mask.bin'), 'w');fwrite(fid, Geometry.BTV, 'single');fclose(fid);% fid = fopen(fullfile(patient_dir, 'geometry_files', 'target_mask_SBTV.bin'), 'w');% fwrite(fid, Geometry.SBTV, 'single');% fclose(fid);% % fid = fopen(fullfile(patient_dir, 'geometry_files', 'target_mask_HCRing.bin'), 'w');% fwrite(fid, Geometry.HCRing, 'single');% fclose(fid);% hWaitbar = waitbar(1/total_num_steps, 'Step 4, Create optimization geometry');delete(hWaitbar);msgbox(['Plan geometry created successfully in ' '"' patient_dir '"']);
 |