123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- function [D_full, w_fin, Geometry, optGoal] = NLP_beamlet_optimizer
- N_fcallback1 = 5000;
- N_fcallback2 = 200000;
- patient = 'temp';
- goalsName= 'ROI_goals_DP';
- switch patient
- case 'temp'
- patient_dir = 'C:\000-temp\DELETEME';
- DP_dir = '\\Mpufs5\data_wnx1\_Data\Avastin\AV009\PF_RODP_analysis'
- case 'avastin_009'
- patient_dir = 'C:\010-work\003_localGit\WiscPlan_v2\data\PatData_Avastin009';
- DP_dir = '\\Mpufs5\data_wnx1\_Data\Avastin\AV009\PF_RODP_analysis';
- case 'gbm_005'
- patient_dir = 'C:\010-work\003_localGit\WiscPlan_v2\data\PatData_ausGli_005_16beam_2';
- DP_dir = '\\Mpufs5\data_wnx1\_Data\Glioma_aus\FET_FGL005\B1\Processed';
- case 'gbm_015'
- patient_dir = 'C:\010-work\003_localGit\WiscPlan_v2\data\PatData_ausGli_015';
- DP_dir = '\\Mpufs5\data_wnx1\_Data\Glioma_aus\FET_FGL015\B1\Processed';
- case 'gbm_022'
- patient_dir = 'C:\010-work\003_localGit\WiscPlan_v2\data\PatData_ausGli_022';
- DP_dir = '\\Mpufs5\data_wnx1\_Data\Glioma_aus\FET_FGL022\B1\Processed';
- case 'avastin_009'
- otherwise
- error('invalid case')
- end
- fprintf('starting NLP optimization process... \n')
- load([patient_dir '\matlab_files\Geometry.mat'])
- load([DP_dir '\RODP_files\' goalsName '.mat']);
- optGoal = ROI_goals.optGoal;
- optGoal_beam = ROI_goals.optGoal_beam;
- optGoal_idx = ROI_goals.optGoal_idx;
- targetMinMax_idx = ROI_goals.targetMinMax_idx;
- [beamlets, beamlets_joined, numBeamlet, numBeam, beam_i_list] = get_beam_lets(Geometry, patient_dir);
- RO_params=0;
- optGoal_beam = make_robust_optGoal(optGoal_beam, RO_params, beamlets_joined);
- optGoal = make_robust_optGoal(optGoal, RO_params, beamlets);
- w0_beams = ones(numBeam,1);
- w0_beams = mean(optGoal_beam{1}.target ./ (optGoal_beam{1}.beamlets_pruned*w0_beams+0.1)) * w0_beams;
- w0_beams = w0_beams + (2*rand(size(w0_beams))-1) *0.1 .*w0_beams;
- w0_beams = double(w0_beams);
- fun1 = @(x) get_penalty(x, optGoal_beam);
- fun2 = @(x) get_penalty(x, optGoal);
- A = [];
- b = [];
- Aeq = [];
- beq = [];
- lb = zeros(1, numBeamlet);
- lb_beam = zeros(1, numBeam);
- ub = [];
- nonlcon = [];
- options = optimoptions('fmincon');
- options.MaxFunctionEvaluations = N_fcallback1;
- options.Display = 'iter';
- options.PlotFcn = 'optimplotfval';
- fprintf('\n running initial optimizer:')
- tic
- w_beam = fmincon(fun1,w0_beams,A,b,Aeq,beq,lb_beam,ub,nonlcon,options);
- fprintf(' done!:')
- w_beamlets = ones(numBeamlet,1);
- numBeam=numel(unique(beam_i_list));
- for beam_i = 1:numBeam
-
- w_beamlets(beam_i_list == beam_i) = w_beam(beam_i);
- end
- w_beamlets = w_beamlets + (2*rand(size(w_beamlets))-1) *0.1 .*w_beamlets;
- w_beamlets = 1.1* w_beamlets;
- options.MaxFunctionEvaluations = N_fcallback2;
- fprintf('\n running full optimizer:')
- w_fin = fmincon(fun2,w_beamlets,A,b,Aeq,beq,lb,ub,nonlcon,options);
- fprintf(' done!:')
- t=toc;
- disp(['Optimization time for beamlets = ',num2str(t)]);
- D_full = reshape(beamlets * w_fin, size(Geometry.data));
- NLP_result.dose = D_full;
- NLP_result.weights = w_fin;
- save([patient_dir '\matlab_files\NLP_result.mat'], 'NLP_result');
- plot_DVH(D_full, optGoal, optGoal_idx, targetMinMax_idx)
- colorwash(Geometry.data, D_full, [-500, 500], [0, 110]);
- end
- function penalty = get_penalty(x, optGoal)
-
-
-
- NumScenarios = optGoal{1}.NbrRandScenarios * optGoal{1}.NbrSystSetUpScenarios * optGoal{1}.NbrRangeScenarios;
- fobj = zeros(NumScenarios,1);
- sc_i = 1;
-
- for nrs_i = 1:optGoal{1}.NbrRandScenarios
- for sss_i = 1 :optGoal{1}.NbrSystSetUpScenarios
- for rrs_i = 1:optGoal{1}.NbrRangeScenarios
- fobj(sc_i)=eval_f(x, optGoal, nrs_i, sss_i, rrs_i);
- sc_i = sc_i + 1;
- end
- end
- end
-
- penalty=max(fobj);
- end
- function penalty = eval_f(x, optGoal, nrs_i, sss_i, rrs_i)
- penalty = 0;
-
- for goal_i = 1:numel(optGoal)
- switch optGoal{goal_i}.function
-
- case 'min'
-
- d_penalty = 1.0e0 * sum(max(0, ...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target) -...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned * x)));
- case 'max'
-
- d_penalty = 1.0e0 * sum(max(0, ...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned * x)-...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target)));
- case 'min_sq'
-
- temp1=min(0, (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned * x)-...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target));
- d_penalty = 1.0e0 * sum(temp1.^2);
- case 'max_sq'
-
- temp1=max(0, (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned * x)-...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target));
- d_penalty = 1.0e0 * sum(temp1.^2);
- case 'LeastSquare'
-
-
- d_penalty = 1.0e-1* sum(((...
- optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned * x) - ...
- optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target).^2);
- case 'min_perc_Volume'
-
- perc_vox = numel(find((optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target) -...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned * x) > 0)) ...
- / numel(optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target);
- d_penalty = 3.0e5 * min(perc_vox-0.05, 0)
-
- case 'max_perc_Volume'
-
- perc_vox = numel(find((optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target) -...
- (optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned * x) < 0)) ...
- / numel(optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target);
- d_penalty = 3.0e4 * min(perc_vox-0.05, 0)
-
- end
- penalty = penalty + d_penalty * optGoal{goal_i}.opt_weight;
- end
- end
- function optGoal = make_robust_optGoal(optGoal, RO_params, beamlets);
-
-
-
-
-
-
-
-
-
-
-
- shift_mag = 2;
- nrs_scene_list={[0,0,0]};
-
-
-
- sss_scene_list={[0,0,0], [-shift_mag,0,0], [shift_mag,0,0], [0,-shift_mag,0], [0,shift_mag,0], [0,0,-1], [0,0,1]};
-
- rrs_scene_list={[0,0,0]};
- [targetIn, meta] = nrrdread('C:\010-work\003_localGit\WiscPlan_v2\data\archive\CDP_data\CDP5_DP_target.nrrd');
-
- for i = 1:numel(optGoal)
- optGoal{i}.NbrRandScenarios =numel(nrs_scene_list);
- optGoal{i}.NbrSystSetUpScenarios=numel(sss_scene_list);
- optGoal{i}.NbrRangeScenarios =numel(rrs_scene_list);
- end
-
- for goal_i = 1:numel(optGoal)
-
- idx=optGoal{goal_i}.ROI_idx;
- targetImg1=zeros(optGoal{goal_i}.imgDim);
- targetImg1(idx)=1;
-
-
- for nrs_i = 1:optGoal{goal_i}.NbrRandScenarios
-
- targetImg2=targetImg1;
-
-
- for sss_i = 1 :optGoal{goal_i}.NbrSystSetUpScenarios
-
- [targetImg3 idxValid]=get_RO_sss(targetImg2, sss_scene_list{sss_i});
-
-
- for rrs_i = 1:optGoal{goal_i}.NbrRangeScenarios
-
- targetImg4=targetImg3;
-
-
-
- ROI_idx=[];
- ROI_idx=find(targetImg4>0);
-
- if isfield(optGoal{goal_i}, 'target_alpha')
- target = optGoal{goal_i}.target;
- target = target(idxValid);
- else
- target = ones(numel(ROI_idx), 1) .* optGoal{goal_i}.D_final;
- end
-
-
- beamlets_pruned = beamlets(ROI_idx, :);
-
-
- optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.ROI_idx = ROI_idx;
- optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.beamlets_pruned = beamlets_pruned;
- optGoal{goal_i}.nrs{nrs_i}.sss{sss_i}.rrs{rrs_i}.target = target;
- end
- end
- end
- end
- end
- function [targetImg3 ia]=get_RO_sss(targetImg2, sss_scene_shift);
-
-
- targetImg3 = imtranslate(targetImg2,sss_scene_shift);
-
-
-
- imgValid = imtranslate(targetImg3,-sss_scene_shift);
- imgInvalid = (targetImg2-imgValid);
-
- idx_1 = find(targetImg2);
- idx_2 = find(imgInvalid);
-
- [idxValid,ia] = setdiff(idx_1,idx_2);
-
- [C,ia, ib] = intersect(idx_1,idxValid);
-
- end
|