123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- function [optSettings, optResults] = loadOptResults(varargin)
- % Loads the weights and dose distribution corresponding to a given input
- % filename. The input filename has the following format:
- %bemal
- % [S,R] = loadOptResults(optimizerFolder,inputFileName) loads all of the
- % files from
- % the linlsq optimization associated with inputFileName. DVHs are
- % calculated for all of the associated dose files.
- % [S,R] = loadOptResults(optimizerFolder,inputFileName,'last') loads only the last
- % dose and beamlet weights files, and calculates the DVHs for each
- % tissue type only for those files.
- %
- % inputFileName has the following format:
- % Niterations
- % 2000
- % Nperbatch
- % 50
- % prescription_filename
- % input0/prescription.txt
- % initial_beam_weights_filename
- % input0/init_beam_weights.img
- % beamlet_header_file
- % beamletbatches0/beamlet_header.txt
- % dose_batch_base_name
- % output0/dosebatch
- % dose_batch_extension
- % img
- % weight_batch_base_name
- % output0/weightbatch
- % weight_batch_extension
- % img
- % obj_func_name
- % output0/objFunc.img
- %
- % Where all paths are relative to the directory containing the
- % inputFileName argument.
- %
- % RTF 1/6/07
- warning off;
- % constants
- Ndvhbins = 1000; % number of bins to use for the cumulative DVH calculation
- if length(varargin) == 1
- error('Too few input arguments');
- elseif length(varargin) == 2
- optimizerFolder = varargin{1};
- optInputFile = varargin{2};
- readAllOutputFiles = 1;
- elseif length(varargin) == 3
- optimizerFolder = varargin{1};
- optInputFile = varargin{2};
- if strcmp(deblank(lower(varargin{3})),'last')
- readAllOutputFiles = 0;
- else
- readAllOutputFiles = 1;
- end
- else
- error('Too many input arguments');
- end
- % Extract the folder name that contains the input file
- inputFileNameRev = fliplr(optInputFile); % flip the input filename around
- % pop off the reversed file name
- [fileNameRev,inputFolderRev] = strtok(inputFileNameRev,{'/','\'});
- inputFolder = fliplr(inputFolderRev);
- if isempty(inputFolder) % input folder is the current folder
- inputFolder = [pwd '/'];
- end
- % get the patient header
- headerRev = fliplr(optimizerFolder);
- % pop off patient name
- [headerNameRev,optFolderRev] = strtok(headerRev,{'/','\'});
- patientHeader = fliplr(headerNameRev);
- [optSettings,missingInfo] = loadOptSettings(optimizerFolder,optInputFile); % load the optimization settings
- if numel(missingInfo)
- fprintf('Information missing from optimization files:\n');
- for k=1:numel(missingInfo)
- fprintf('%s\n',missingInfo{k});
- end
- fprintf('\n');
- end
- % find the dose grid size
- if isfield(optSettings,'beamletInfo') && isfield(optSettings.beamletInfo,'beamletDim')
- siz = optSettings.beamletInfo.beamletDim;
- elseif isfield(optSettings,'prescInfo') && isfield(optSettings.prescInfo,'presc') ...
- && isfield(optSettings.prescInfo.presc,'siz')
- siz = optSettings.prescInfo.presc.siz;
- else
- siz = [];
- end
- if isfield(optSettings,'optInfo') && isfield(optSettings.optInfo,'Niterations') ...
- && isfield(optSettings.optInfo,'Nperbatch') && isfield(optSettings.optInfo,'outputFolder')...
- && isfield(optSettings.optInfo,'doseBatchBaseName') && isfield(optSettings.optInfo,'doseBatchExtension')...
- && isfield(optSettings.optInfo,'weightBatchBaseName') && isfield(optSettings.optInfo,'weightBatchExtension')
- % find which dose and weights files are present
- % must 'ls' the opt_output folder. One file contains the objective
- % function, while the others are either dose batches or weight batch
- % files.
- % xmo: MUST use mod verision of ls in *nix
- atmp = lsl(optSettings.optInfo.outputFolder);
- btmp = size(atmp);
- if btmp(1)>4
- Nbatches = ceil((btmp(1) - 3)/2);
- elseif btmp(1)==4
- Nbatches = 1;
- else
- error('No dose batches found');
- end
- % Nbatches = ceil(optSettings.optInfo.Niterations/optSettings.optInfo.Nperbatch)+1; % extra '1' is for initial guess
- doseFileNames = cell(1,Nbatches);
- doseFileExist = zeros(1,Nbatches); % flags to test for existence of files
- weightFileNames = cell(1,Nbatches);
- weightFileExist = zeros(1,Nbatches);
- % Dave's new implementation
- k=0;
- for t=1:btmp(1)
- if ~isempty(findstr(optSettings.optInfo.doseBatchBaseName,mat2str(atmp(t,:))));
- k=k+1;
- batchname = strtrim(strrep(mat2str(atmp(t,:)),'''',''));
- str = strrep(strtok(batchname,'.'),optSettings.optInfo.doseBatchBaseName,'');
- batchNames{k} = str;
- doseFileNames{k} = [optSettings.optInfo.outputFolder '/' ...
- strtrim(strrep(mat2str(atmp(t,:)),'''','')) ];
- weightFileNames{k} = strrep(doseFileNames{k},optSettings.optInfo.doseBatchBaseName,optSettings.optInfo.weightBatchBaseName);
- end
- end
- for k=1:Nbatches
- % ryans implementation
- % doseFileNames{k} = [optSettings.optInfo.outputFolder '/' ...
- % optSettings.optInfo.doseBatchBaseName ...
- % num2str((k-1)*optSettings.optInfo.Nperbatch) '.' ...
- % optSettings.optInfo.doseBatchExtension];
- % weightFileNames{k} = [optSettings.optInfo.outputFolder '/' ...
- % optSettings.optInfo.weightBatchBaseName ...
- % num2str((k-1)*optSettings.optInfo.Nperbatch) '.' ...
- % optSettings.optInfo.weightBatchExtension];
- fid = fopen(doseFileNames{k},'rb');
- if fid == -1 % batch file doesn't exist
- doseFileExist(k) = 0;
- else
- fclose(fid);
- doseFileExist(k) = 1; % mark that file exists
- end
- fid = fopen(weightFileNames{k},'rb');
- if fid == -1 % batch file doesn't exist
- weightFileExist(k) = 0;
- else
- fclose(fid);
- weightFileExist(k) = 1; % mark that file exists
- end
- end
- optResults = [];
- % assign names to optResults structure array
- optResults.batchNames = batchNames;
- if readAllOutputFiles == 1
- optResults.dose = {};
- optResults.weights = {};
- % read in the appropriate dose files
- for k=1:length(doseFileNames)
- if doseFileExist(k) == 1
- fid = fopen(doseFileNames{k},'rb');
- dose = fread(fid,'float=>float');
- fclose(fid);
- if numel(siz) == 3 % reshape dose if siz definedre
- dose = reshape(dose,siz);
- end
- optResults.dose{k} = dose;
- end
- end
- % read in the appropriate weights files
- for k=1:length(weightFileNames)
- if weightFileExist(k) == 1
- fid = fopen(weightFileNames{k},'rb');
- weights = fread(fid,'float=>float');
- fclose(fid);
- optResults.weights{k} = weights;
- end
- end
- else % read in only the last dose and weights files
- for k=length(doseFileNames):-1:0
- if doseFileExist(k) == 1 % found last dose file
- break;
- end
- end
- fid = fopen(doseFileNames{k},'rb');
- dose = fread(fid,'float=>float');
- fclose(fid);
- if numel(siz) == 3
- dose = reshape(dose,siz);
- end
- optResults.dose = dose;
- fid = fopen(weightFileNames{k},'rb');
- weights = fread(fid,'float=>float');
- fclose(fid);
- optResults.weights = weights;
- end
- % load DVH information
- if isfield(optSettings,'prescInfo') & isfield(optSettings.prescInfo,'presc') ...
- & isfield(optSettings.prescInfo.presc,'tissue') ...
- & isfield(optSettings.prescInfo.presc.tissue,'ind')
- optResults.presc = optSettings.prescInfo.presc;
- if readAllOutputFiles == 1
- % calculate a max dose vector
- for k=1:length(optResults.dose)
- dmax(k) = 1.1*max(optResults.dose{k}(:));
- end
- % calculate DVHs for each tissue, for each batch number
- for m=1:length(optResults.presc.tissue)
- tissMask = zeros(optResults.presc.siz,'int8');
- tissMask(optResults.presc.tissue(m).ind) = 1;
- for k=1:length(optResults.dose)
- dvhbins = [0:Ndvhbins-1]*dmax(k)/Ndvhbins;
- optResults.presc.tissue(m).dvhbins{k} = dvhbins;
- optResults.presc.tissue(m).dvh{k} ...
- = single(dvh(optResults.dose{k},tissMask,dvhbins))';
- end
- end
- else
- dmax = 1.1*max(optResults.dose(:));
- % calculate DVHs and EVHs for each tissue
- for m=1:length(optResults.presc.tissue)
- tissMask = zeros(optResults.presc.siz,'int8');
- tissMask(optResults.presc.tissue(m).ind) = 1;
- dvhbins = [0:Ndvhbins-1]*dmax/Ndvhbins;
- optResults.presc.tissue(m).dvhbins = dvhbins;
- optResults.presc.tissue(m).dvh ...
- = single(dvh(optResults.dose,tissMask,dvhbins))';
- % calculate the EDVH if presc is non-zero
- if sum(optResults.presc.tissue(m).dMinus) > 0
- % extract dose voxels
- doseRatio = zeros(optResults.presc.siz);
- doseRatio(optResults.presc.tissue(m).ind) = ...
- optResults.dose(optResults.presc.tissue(m).ind)./ ...
- optResults.presc.tissue(m).dMinus*100;
- % remove and Infs and NaNs
- doseRatio(isinf(doseRatio)) = 0;
- doseRatio(isnan(doseRatio)) = 0;
- % calculate edvh
- edvhbins = [0:Ndvhbins-1]*max(doseRatio(:))/Ndvhbins;
- optResults.presc.tissue(m).edvhbins = edvhbins;
- optResults.presc.tissue(m).edvh = ...
- single(dvh(doseRatio,tissMask,edvhbins))';
- end
- end
- end
- else
- fprintf('Unable to load DVH information: not enough prescription fields available.\n\n');
- end
- else
- fprintf('Unable to load beamlet weights and dose distributions: not enough fields available.\n\n');
- end
- % load the objective function
- if isfield(optSettings,'optInfo') & isfield(optSettings.optInfo,'outputFolder') ...
- & isfield(optSettings.optInfo,'objFuncFileName')
- fid = fopen([optSettings.optInfo.outputFolder '/' optSettings.optInfo.objFuncFileName],'rb');
- if fid ~= -1
- optResults.objFunc = fread(fid,'float=>float');
- fclose(fid);
- end
- else
- fprintf('Unable to load objective function file: not enough fields available.');
- end
- % sort all the loaded cell arrays based on batchNames
- batch_indices = cellfun(@str2num, optResults.batchNames);
- [delme perm_vector] = sort(batch_indices);
- optResults.batchNames = optResults.batchNames(perm_vector);
- optResults.dose = optResults.dose(perm_vector);
- optResults.weights = optResults.weights(perm_vector);
- % added 7/16/2020 -- allows saving of longer optimizations
- optResults.dose = {optResults.dose{1}, optResults.dose{end}};
- % save file to matlab_files folder
- savefile = fullfile(optimizerFolder, 'matlab_files', 'optResults.mat');
- save(savefile,'optSettings','optResults');
|