123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- function [optSettings,missingInfo] = loadOptSettings(optimizerFolder,optInputFile)
- optSettings = [];
- missingInfo = {};
- fid = fopen([optimizerFolder '/' optInputFile],'r');
- if fid == -1
- error(['Unable to open ' optimizerFolder '/' optInputFile]);
- end
- optSettings = [];
- fileText = {};
- while 1
- tline = fgetl(fid);
- if ~ischar(tline)
- break;
- end
- fileText{end+1} = tline;
- end
- fclose(fid);
- inputFileNameRev = fliplr(optInputFile);
- [fileNameRev,inputFolderRev] = strtok(inputFileNameRev,{'/','\'});
- inputFolder = fliplr(inputFolderRev);
- if isempty(inputFolder) % input folder is the current folder
- inputFolder = pwd;
- end
- optSettings.optInfo.inputFile = fliplr(fileNameRev);
- % Field Name subfield conversion function
- fieldFunctions = {'Niterations' 'optInfo' 'str2num'
- 'Nperbatch' 'optInfo' 'str2num'
- 'prescFile' 'prescInfo' ''
- 'initBeamWeightFile' 'initialGuessInfo' ''
- 'beamletHeaderFileName' 'beamletInfo' ''
- 'doseBatchBaseName' 'optInfo' ''
- 'doseBatchExtension' 'optInfo' ''
- 'weightBatchBaseName' 'optInfo' ''
- 'weightBatchExtension' 'optInfo' ''
- 'objFuncFileName' 'optInfo' ''
- 'modFactor' 'optInfo' 'str2num'
- 'calcInitialGuessFlag' 'initialGuessInfo' 'str2num'};
- for k=1:length(fileText)
- for m=1:size(fieldFunctions,1)
- if strcmp(deblank(fileText{k}),fieldFunctions{m,1})
- eval(['optSettings.' fieldFunctions{m,2} '.' fieldFunctions{m,1} ' = ' fieldFunctions{m,3} '(''' fileText{k+1} ''');']);
- end
- end
- end
- for k=1:size(fieldFunctions,1)
- if ~isfield(optSettings,fieldFunctions{k,2}) | ~eval(['isfield(optSettings.' fieldFunctions{k,2} ',''' fieldFunctions{k,1} ''')'])
- missingInfo{end+1} = ['Missing: optSettings.' fieldFunctions{k,2} '.' fieldFunctions{k,1}];
- end
- end
- if isfield(optSettings,'optInfo') & isfield(optSettings.optInfo,'doseBatchBaseName')
- doseBatchBaseNameRev = fliplr(optSettings.optInfo.doseBatchBaseName);
- [fileNameRev,outputFolderRev] = strtok(doseBatchBaseNameRev,{'/','\'});
- optSettings.optInfo.outputFolder = fliplr(outputFolderRev);
- optSettings.optInfo.outputFolder(:,end) = []; % delete last character, which is a '/' or '\'
- optSettings.optInfo.doseBatchBaseName = fliplr(fileNameRev);
- end
- % get the weightBatchBaseName
- if isfield(optSettings,'optInfo') & isfield(optSettings.optInfo,'weightBatchBaseName')
- doseBatchBaseNameRev = fliplr(optSettings.optInfo.weightBatchBaseName);
- [fileNameRev,outputFolderRev] = strtok(doseBatchBaseNameRev,{'/','\'});
- optSettings.optInfo.weightBatchBaseName = fliplr(fileNameRev);
- end
- % find the input folder
- if isfield(optSettings,'prescInfo') & isfield(optSettings.prescInfo,'prescFile')
- prescFileRev = fliplr(optSettings.prescInfo.prescFile);
- [fileNameRev,inputFolderRev] = strtok(prescFileRev,{'/','\'});
- optSettings.optInfo.inputFolder = fliplr(inputFolderRev);
- optSettings.optInfo.inputFolder(:,end) = []; % delete last character, which is a '/' or '\'
- optSettings.prescInfo.prescFile = fliplr(fileNameRev);
- end
- % get the initial beam weights file name
- if isfield(optSettings,'initialGuessInfo') & isfield(optSettings.initialGuessInfo,'initBeamWeightFile')
- initBeamWeightFileRev = fliplr(optSettings.initialGuessInfo.initBeamWeightFile);
- [fileNameRev,inputFolderRev] = strtok(initBeamWeightFileRev,{'/','\'});
- optSettings.initialGuessInfo.initBeamWeightFile = fliplr(fileNameRev);
- end
- % trim off the objective function filename
- if isfield(optSettings,'optInfo') & isfield(optSettings.optInfo,'objFuncFileName')
- prescFileRev = fliplr(optSettings.optInfo.objFuncFileName);
- [fileNameRev,inputFolderRev] = strtok(prescFileRev,{'/','\'});
- optSettings.optInfo.objFuncFileName = fliplr(fileNameRev);
- end
- % get the beamletFolder and beamletHeader
- if isfield(optSettings,'beamletInfo') & isfield(optSettings.beamletInfo,'beamletHeaderFileName')
- beamletHeaderFileNameRev = fliplr(optSettings.beamletInfo.beamletHeaderFileName);
- [fileNameRev,beamletFolderRev] = strtok(beamletHeaderFileNameRev,{'/','\'});
- optSettings.beamletInfo.beamletFolder = fliplr(beamletFolderRev);
- optSettings.beamletInfo.beamletFolder(:,end) = []; % delete last character, which is a '/' or '\'
- optSettings.beamletInfo.beamletHeaderFileName = fliplr(fileNameRev);
- end
- % open the prescription file if it has been specified properly
- if isfield(optSettings,'optInfo') & isfield(optSettings,'prescInfo') ...
- & isfield(optSettings.optInfo,'inputFolder') & isfield(optSettings.prescInfo,'prescFile')
-
- prescFile = [optSettings.optInfo.inputFolder '/' optSettings.prescInfo.prescFile];
- fid = fopen([prescFile],'r');
- if fid == -1
- missingInfo{end+1} = ['Unable to open prescription file: ' prescFile];
- else
-
- fileText = {};
- while 1
- tline = fgetl(fid);
- if ~ischar(tline)
- break;
- end
- fileText{end+1} = tline;
- end
- fclose(fid);
- if ~strcmp(deblank(fileText{1}),'Ntissue')
- error('First line of prescription file must be ''Ntissue''');
- else
- Ntissue = str2num(fileText{2});
- end
- k = 5;
-
-
- for m=1:Ntissue
- tissNum = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).name = fileText{k};
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).alpha = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).betaVPlus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).dVPlus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).vPlus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).betaVMinus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).dVMinus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).vMinus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).betaPlus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).dosePlusFileName = fileText{k};
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).betaMinus = str2num(fileText{k});
- k = k + 2;
- optSettings.prescInfo.presc.tissue(m).doseMinusFileName = fileText{k};
-
- fid = fopen(optSettings.prescInfo.presc.tissue(m).dosePlusFileName,'rb');
- siz = fread(fid,3,'int');
- Nind = fread(fid,1,'int');
- ind = fread(fid,Nind,'int=>int');
- dat = fread(fid,Nind,'float=>float');
- fclose(fid);
- optSettings.prescInfo.presc.tissue(m).ind = ind + 1;
- optSettings.prescInfo.presc.tissue(m).dPlus = dat;
-
- fid = fopen(optSettings.prescInfo.presc.tissue(m).doseMinusFileName,'rb');
- siz = fread(fid,3,'int')';
- Nind = fread(fid,1,'int');
- ind = fread(fid,Nind,'int=>int');
- dat = fread(fid,Nind,'float=>float');
- fclose(fid);
- optSettings.prescInfo.presc.tissue(m).ind = ind + 1;
- optSettings.prescInfo.presc.tissue(m).dMinus = dat;
- k = k + 3;
- end
- optSettings.prescInfo.presc.siz = siz;
- end
- end
- if isfield(optSettings,'initialGuessInfo') & isfield(optSettings.initialGuessInfo,'initBeamWeightFile') ...
- & isfield(optSettings,'optInfo') & isfield(optSettings.optInfo,'inputFolder')
- if ~isfield(optSettings.initialGuessInfo,'calcInitialGuessFlag') ...
- || (isfield(optSettings.initialGuessInfo,'calcInitialGuessFlag') & optSettings.initialGuessInfo.calcInitialGuessFlag == 0)
- fid = fopen([optimizerFolder '/' optSettings.optInfo.inputFolder '/' optSettings.initialGuessInfo.initBeamWeightFile]);
- if fid == -1
- missingInfo{end+1} = ['Unable to open initial guess file for beam weights: ' optSettings.initialGuessInfo.initBeamWeightFile];
- else
- optSettings.initialGuessInfo.w0 = fread(fid,'float');
- fclose(fid);
- end
- end
- end
- if isfield(optSettings,'beamletInfo') & isfield(optSettings.beamletInfo,'beamletFolder') ...
- & isfield(optSettings.beamletInfo,'beamletFolder')
- beamletHeaderFile = [optSettings.beamletInfo.beamletFolder '/' optSettings.beamletInfo.beamletHeaderFileName];
- fid = fopen(beamletHeaderFile,'r');
- if fid == -1
- missingInfo{end+1} = ['Unable to open beamlet header file: ' beamletHeaderFile];
- else
-
- fileText = {};
- while 1
- tline = fgetl(fid);
- if ~ischar(tline)
- break;
- end
- fileText{end+1} = tline;
- end
- fclose(fid);
- fieldFunctions = { ...
- 'beamletDim' 'beamletInfo' 'str2num'
- 'Nbeamlets' 'beamletInfo' 'str2num'
- 'Nbeamletbatches' 'beamletInfo' 'str2num'
- 'beamletFolder' 'beamletInfo' ''
- 'beamletBatchBaseName' 'beamletInfo' ''
- 'beamletBatchExtension' 'beamletInfo' '' };
-
- for k=1:length(fileText)
- for m=1:size(fieldFunctions,1)
- if strcmp(deblank(fileText{k}),fieldFunctions{m,1})
- eval(['optSettings.' fieldFunctions{m,2} '.' fieldFunctions{m,1} ' = ' fieldFunctions{m,3} '(''' fileText{k+1} ''');']);
- end
- end
- end
-
- for k=1:size(fieldFunctions,1)
- if ~isfield(optSettings,fieldFunctions{k,2}) | ~eval(['isfield(optSettings.' fieldFunctions{k,2} ',''' fieldFunctions{k,1} ''')'])
- missingInfo{end+1} = ['Missing: optSettings.' fieldFunctions{k,2} '.' fieldFunctions{k,1}];
- end
- end
- end
- end
|