| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | function RDXTPS_optimSetup(Nbeamlets, patient_dir, Geometry)% Sets up a dose prescription and creates the optimizer input files for% proton plans.if isempty(patient_dir)    patient_dir = uifile('getdir', 'Select the patient directory');endif isempty(Geometry)    load(fullfile(patient_dir, 'matlab_files', 'Geometry.mat'));end%% Setup dialog boxprompt = {...    sprintf('Maximum number of iterations:'), ...    sprintf('Save result every ? interations:'), ...    sprintf('Modulation factor:\n(typically 5 for SS, 2 for DET)') ...    };defAns = {'2000', '200', '5'};%% Prompt input dialoganswer = inputdlg(prompt, 'Optimization parameters', 1, defAns);Niterations = str2double(answer{1});Nperbatch = str2double(answer{2});modFactor = str2double(answer{3});%%optSettings = [];% set up the optimization: % All folder specified relative to optimizer executableoptSettings.optInfo.saveOptInfo = 'yes';optSettings.optInfo.Niterations = Niterations;  % total number of iterationsoptSettings.optInfo.Nperbatch = Nperbatch;     % number of iterations per batchoptSettings.optInfo.optFolder = patient_dir;optSettings.optInfo.inputFile = 'optInput.txt'; % goes in the optimizer folderoptSettings.optInfo.inputFolder = 'opt_input';optSettings.optInfo.outputFolder = 'opt_output';optSettings.optInfo.modFactor = modFactor;% Flag telling the optimizer whether to calculate an initial guess itself% or to read in the initial guess fileoptSettings.initialGuessInfo.calcInitialGuessFlag = 1; % DCW - the initial guess only works with beamlets stored in the matlab% format as is done with the old matlab dose calculator.  thus for this% application, initial guess will always be set to 'no'.% initial guess calculation sometimes time consuming, turn off with flag: calculateInitialGuess = 'no';  optSettings.prescInfo.savePresc = 'yes';optSettings.beamletInfo.saveBeamletHeader = 'yes';optSettings.beamletInfo.beamletFolder = 'beamlet_batch_files';optSettings.beamletInfo.Nbeamlets = Nbeamlets;optSettings.beamletInfo.Nbeamletbatches = 1;%--------------------------------------------------------------------------% DCW 10-13-07% XMO 11-06-09ROI_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('Optimization setup aborted');%     return;% end% parameters set to 1 if ROI is target, 0 otherwiseprescTable = cell(length(Geometry.ROIS),13);for roi_ind = 1:length(Geometry.ROIS)    prescTable{roi_ind,1} = Geometry.ROIS{roi_ind}.name;    prescTable{roi_ind,2} = Geometry.ROIS{roi_ind}.name;    % set all parameters to zero    for iloop = 3:13        prescTable{roi_ind,iloop} = 0;    end    % set default values for target    if roi_ind == target_idx        prescTable{roi_ind, 3} = 100;   % alpha        prescTable{roi_ind, 4} = 1;     % max dose penalty        prescTable{roi_ind, 5} = 60;    % max dose        prescTable{roi_ind, 6} = 1;     % min dose penalty        prescTable{roi_ind, 7} = 60;    % min dose        prescTable{roi_ind,12} = 60;    % DVH under dose (prescription dose)        prescTable{roi_ind,13} = 98;    % DVH under dose V (prescription volume)    endend%--------------------------------------------------------------------------% % load downsampled geometry file% load(geometryFile);% size of CT grid[M,N,Q] = size(Geometry.rhomw);% Create the prescription structurepresc = [];   % erase the old prescription structure, if it existspresc.siz = [M N Q];  % dimensions of the prescription and tissue masksROIFlags = zeros(1,size(prescTable,1));  % flags to ensure all ROIs are found% assign the parameters to the prescription structurefor j=1:size(prescTable,1)    % pull out the prescription indices for each tissue    tissName = prescTable{j,2};  % current tissue name    % find the current tissue in the Geometry.ROIS cells    for k=1:length(Geometry.ROIS)        if strcmp(tissName,strrep(Geometry.ROIS{k}.name,'%',''))            ind = Geometry.ROIS{k}.ind;  % extract ROI indices            break;        end    end        presc.tissue(j).name = prescTable{j,1};    presc.tissue(j).ind = ind;    presc.tissue(j).alpha = prescTable{j,3};    presc.tissue(j).betaPlus = prescTable{j,4};    presc.tissue(j).dPlus = single(zeros(size(ind)) + prescTable{j,5});    presc.tissue(j).betaMinus = prescTable{j,6};    presc.tissue(j).dMinus = single(zeros(size(ind)) + prescTable{j,7});    presc.tissue(j).betaVPlus = prescTable{j,8};    presc.tissue(j).dVPlus = prescTable{j,9};    presc.tissue(j).vPlus = prescTable{j,10};    presc.tissue(j).betaVMinus = prescTable{j,11};    presc.tissue(j).dVMinus = prescTable{j,12};    presc.tissue(j).vMinus = prescTable{j,13};    presc.tissue(j).dPlus = single(zeros(size(ind)) + prescTable{j,5});    presc.tissue(j).dMinus = single(zeros(size(ind)) + prescTable{j,7});    ROIFlags(j) = 1;end% ensure that all of the ROIS were foundif sum(ROIFlags) ~= length(ROIFlags)    error('Missed one or more ROIS.\n');else    fprintf('All ROIs located successfully for downsampled prescription\n');endoptSettings.prescInfo.presc = presc;optSettings.beamletInfo.beamletDim = [M N Q];RDX_linlsqOptimization(optSettings);
 |