123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- 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 Mo
- total_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);
- % end
- if 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 BTV
- PTVmask = false(size(Geometry.rhomw));
- % for target_idx = target_indices
- PTVmask(Geometry.ROIS{target_idx}.ind) = 1;
- % end
- if 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;
- end
- end
- % Create btv
- Geometry.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});
- end
- bwD = bwdistsc(PTVmask, Geometry.voxel_size);
- Geometry.Ring = bwD <= ring_margin; % default ring radius 3 cm
- Geometry.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');
- load('WiscPlan_preferences.mat')
- patient_dir = uigetdir(WiscPlan_preferences.patientDataPath, 'Save the patient data to directory');
- Geometry.data_dir = patient_dir;
- WiscPlan_preferences.patientDataPath = patient_dir;
- thisDir = mfilename('fullpath');
- idcs = strfind(thisDir,'\');
- prefsdir = thisDir(1:idcs(end-1)-1);
- save([prefsdir '\WiscPlan_preferences.mat'], 'WiscPlan_preferences');
- % patient_dir = uifile('getdir', 'Save the patient data to directory');
- % !!! Grozomah
- % patient_dir = 'C:\010-work\003_localGit\WiscPlan_v2\data\PatientData';
- % make directories
- mkdir(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'));
- Geometry.patient_dir = patient_dir;
- waitbar(2.33/total_num_steps, hWaitbar, 'Step 3: Save matlab geometry files');
- % Save matlab geometry file
- save(fullfile(patient_dir, 'matlab_files', 'Geometry.mat'), 'Geometry');
- waitbar(2.66/total_num_steps, hWaitbar, 'Step 3: Save raw geometry files');
- % Write binary geometry files
- fid = 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 '"']);
|