123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542 |
- function num_batches = helicalDosecalcSetup7_fullRO(patient_dir, OptGoals, beamlet_dir)
- iso = [0 0 0];
- SAD = 85;
- pitch = 0.86;
- str = inputdlg({'Enter number of calc cores', 'Enter number of angles (51 default)', ...
- 'Enter number of beamlets (64 default)'}, 'input', [1,35], {'1', '51', '64'});
- num_batches = str2double(str{1});
- N_angles = str2double(str{2});
- Mxp = str2double(str{3});
- Nyp = 1;
- xpmin = -20.0;
- xpmax = 20.0;
- ypmin = -1.25;
- ypmax = 1.25;
- executable_path = mfilename('fullpath');
- executable_path = [fileparts(fileparts(executable_path)), '\WiscPlanEXE\RyanCsphoton.x86.exe']
- kernel_file = 'Kernels.mat';
- geometry_file = fullfile(patient_dir, 'matlab_files\Geometry.mat');
- load(geometry_file);
- 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 for beamlet calc. ');
- if okay ~= 1
- msgbox('Plan creation aborted');
- return;
- end
- targetMask = zeros(size(Geometry.data));
- targetMask(Geometry.ROIS{target_idx}.ind) = 1;
- targetMaskZ = sum(sum(targetMask,1),2);
- zBow = (find(targetMaskZ>0, 1, 'first')-1)*Geometry.voxel_size(3) + Geometry.start(3) + ypmin;
- zStern = (find(targetMaskZ>0, 1, 'last')+1)*Geometry.voxel_size(3) + Geometry.start(3) + ypmax;
- [subi, subj, subk] = ind2sub(size(Geometry.data), Geometry.ROIS{target_idx}.ind);
- iso = [Geometry.start(1)+Geometry.voxel_size(1)*mean(subi) ...
- Geometry.start(2)+Geometry.voxel_size(2)*mean(subj) 0];
- Condor_flag = 1;
- ptvInd = target_idx;
- fieldWidth = ypmax - ypmin;
- Nrot = ceil(abs(zBow - zStern)/(pitch*fieldWidth));
- Nphi = Nrot * N_angles;
- phi = [0:Nphi-1]/Nphi *2*pi*Nrot;
- for scenario_i = 1:numel(OptGoals.sss_scene_list)
- patient_dir = [beamlet_dir '\scenario' num2str(scenario_i)];
- mkdir(patient_dir)
- condor_folder = patient_dir;
- winxp_folder = 'winxp';
-
- input_folder = '.';
- output_folder = '.';
-
-
- condor_exectuable_name = 'convolutionCondor';
- winxp_executable_name = 'convolution.exe';
- matlab_executable_name = 'convolution_mex';
-
-
- beamspec_folder = 'beamspecfiles';
- beamspec_batches_folder = 'beamspecbatches';
- beamspec_batch_base_name = 'beamspecbatch';
- kernel_folder = 'kernelfiles';
- kernel_filenames_condor = 'kernelFilenamesCondor.txt';
- kernel_filenames_winxp = 'kernelFilenamesWinXP.txt';
-
- beamlet_batch_base_name = 'beamletbatch';
- geometry_header_filename = 'geometryHeader.txt';
- geometry_density_filename = 'density.bin';
-
-
- if xpmin >= xpmax
- error('xpmin must be less than xpmax.');
- end
- if ypmin >= ypmax
- error('ypmin must be less than ypmax.');b
- end
-
-
-
- if Mxp <= 0 || Nyp <= 0 || Nphi <= 0
- error('Mxp, Nyp, and Nphi must be greater than zero.');
- end
- if SAD < 50
- error('It is recommended that the SAD be greater than 50 cm.');
- end
-
-
-
- del_xp = (xpmax - xpmin)/Mxp;
- del_yp = (ypmax - ypmin)/Nyp;
-
-
- xp = [xpmin:del_xp:xpmax-del_xp] + del_xp/2;
- yp = [ypmin:del_yp:ypmax-del_yp] + del_yp/2;
- [M,N,Q] = size(Geometry.rhomw);
- START = single(Geometry.start - iso);
- INC = single(Geometry.voxel_size);
-
-
-
-
-
-
-
- tumorMask = zeros(size(Geometry.rhomw),'single');
- tumorMask(Geometry.ROIS{ptvInd}.ind) = 1;
- BW = bwdist(tumorMask);
- tumorMaskExp = tumorMask;
- tumorMaskExp(BW <= 4) = 1;
- P = zeros(Mxp,Nphi);
- fprintf('Checking beam''s eye view ...\n');
- for p=1:Nphi
-
- ir = [-sin(phi(p)); cos(phi(p)); 0];
- jr = [0 0 1]';
-
- kr = [cos(phi(p)); sin(phi(p)); 0];
- for m=1:Mxp
- point1 = single(-kr*SAD + [0 0 zBow + pitch*fieldWidth*phi(p)/(2*pi)]');
- point2 = single(point1 + (SAD*kr + ir*xp(m))*10);
- [indVisited,deffVisited] = singleRaytraceClean(tumorMaskExp,START,INC,point1,point2);
- if ~isempty(indVisited)
- P(m,p) = max(deffVisited);
- end
- end
- end
- fprintf('Finished checking BEV\n');
-
- load(kernel_file);
- Geometry.rhomw(Geometry.rhomw < 0) = 0;
- Geometry.rhomw(Geometry.rhomw < 0.0013) = 0.0013;
-
- f = fieldnames(Kernels);
- for k=1:length(f)
- if isnumeric(getfield(Kernels,f{k}))
- Kernels = setfield(Kernels,f{k},single(getfield(Kernels,f{k})));
- end
- end
- f = fieldnames(Geometry);
- for k=1:length(f)
- if isnumeric(getfield(Geometry,f{k}))
- Geometry = setfield(Geometry,f{k},single(getfield(Geometry,f{k})));
- end
- end
-
- Geometry.start_nominal = single(Geometry.start - iso);
-
-
-
-
-
- shift = OptGoals.sss_scene_list{scenario_i};
- iso = [iso(1)+Geometry.voxel_size(1)*shift(1) ...
- iso(2)+Geometry.voxel_size(2)*shift(2) ...
- iso(3)+Geometry.voxel_size(3)*shift(3)];
- Geometry.start = Geometry.start_nominal- iso;
-
- Nbeam = Nphi*Mxp*Nyp;
- batch_num = 0;
-
- clear batches;
- batch_num = 0;
- batches = cell(1,Nrot);
- rotNum = 0;
-
- for k=1:Nphi
-
- beam.SAD = single(SAD);
-
- beam.ip = single([-sin(phi(k)) cos(phi(k)) 0]);
- beam.jp = single([0 0 1]);
- beam.kp = single([cos(phi(k)) sin(phi(k)) 0]);
- beam.y_vec = single(-beam.kp*SAD + [0 0 zBow + pitch*fieldWidth*phi(k)/(2*pi)]);
- rotNumOld = rotNum;
- rotNum = floor(k/51) + 1;
- if rotNum - rotNumOld > 0
- beam_num = 0;
- end
- for m=1:Mxp
-
- if P(m,k) > 0
- num = m + (k-1)*Mxp - 1;
- beam_num = beam_num + 1;
-
- beam.del_xp = single(del_xp);
- beam.del_yp = single(del_yp);
- beam.xp = single(xp(m));
- beam.yp = single(0);
- beam.num = single(num);
- batches{rotNum}{beam_num} = beam;
- end
- end
- end
-
- all_beams = horzcat(batches{:});
- num_beams_per_batch = ceil(numel(all_beams)/num_batches);
- batches = cell(num_batches,1);
- for k = 1:(num_batches)
- beams_idx = 1+num_beams_per_batch*(k-1):num_beams_per_batch*k;
- beams_idx (beams_idx>numel(all_beams)) = [];
- batches{k} = all_beams(beams_idx);
- end
-
-
-
- if Condor_flag == 1
-
- err = rmdir(fullfile(condor_folder,beamspec_batches_folder),'s');
- err = rmdir(fullfile(condor_folder,kernel_folder),'s');
-
- mkdir([condor_folder '/' input_folder '/' beamspec_batches_folder]);
-
- save_kernels(Kernels,[condor_folder '/' input_folder '/' kernel_folder]);
- fprintf(['Successfully saved Condor kernels to ' input_folder '/' kernel_folder '\n']);
-
- kernel_filenames_CHTC = 'kernelFilenamesCHTC.txt';
- kernel_filenames_condor = 'kernelFilenamesCondor.txt';
- fid = fopen([condor_folder '/' input_folder '/' kernel_filenames_condor],'w');
- fid2 = fopen([condor_folder '/' input_folder '/' kernel_filenames_CHTC],'w');
- fprintf(fid,'kernel_header\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'kernel_header.txt'));
- fprintf(fid2,'kernel_header\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'kernel_header.txt');
- fprintf(fid,'kernel_radii\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'radii.bin'));
- fprintf(fid2,'kernel_radii\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'radii.bin');
- fprintf(fid,'kernel_angles\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'angles.bin'));
- fprintf(fid2,'kernel_angles\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'angles.bin');
- fprintf(fid,'kernel_energies\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'energies.bin'));
- fprintf(fid2,'kernel_energies\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'energies.bin');
- fprintf(fid,'kernel_primary\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'primary.bin'));
- fprintf(fid2,'kernel_primary\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'primary.bin');
- fprintf(fid,'kernel_first_scatter\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'first_scatter.bin'));
- fprintf(fid2,'kernel_first_scatter\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'first_scatter.bin');
- fprintf(fid,'kernel_second_scatter\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'second_scatter.bin'));
- fprintf(fid2,'kernel_second_scatter\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'second_scatter.bin');
- fprintf(fid,'kernel_multiple_scatter\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'multiple_scatter.bin'));
- fprintf(fid2,'kernel_multiple_scatter\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'multiple_scatter.bin');
- fprintf(fid,'kernel_brem_annih\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'brem_annih.bin'));
- fprintf(fid2,'kernel_brem_annih\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'brem_annih.bin');
- fprintf(fid,'kernel_total\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'total.bin'));
- fprintf(fid2,'kernel_total\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'total.bin');
- fprintf(fid,'kernel_fluence\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'fluence.bin'));
- fprintf(fid2,'kernel_fluence\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'fluence.bin');
- fprintf(fid,'kernel_mu\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'mu.bin'));
- fprintf(fid2,'kernel_mu\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'mu.bin');
- fprintf(fid,'kernel_mu_en\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,kernel_folder,'mu_en.bin'));
- fprintf(fid2,'kernel_mu_en\n');
- fprintf(fid2, '%s/%s\n', kernel_folder,'mu_en.bin');
- fclose(fid);
- end
-
- condor_submit_file = 'convolutionSubmit.txt';
- geometry_filenames_condor = 'geometryFilenamesCondor.txt';
- geometry_filenames_CHTC = 'geometryFilenamesCHTC.txt';
-
- if length(find(Geometry.rhomw > 20)) || length(find(Geometry.rhomw < 0))
- error('Double check the Geometry structure, it may still be in Hounsfield units!');
- end
- geometry_folder = 'geometryfiles';
- batch_output_folder = 'batchoutput';
- beamlet_batches_folder = 'beamletbatches';
- if Condor_flag == 1
- mkdir([condor_folder '/' output_folder '/' beamlet_batches_folder]);
- mkdir([condor_folder '/' output_folder '/' batch_output_folder]);
- save_geometry(Geometry,[condor_folder '/' input_folder '/' geometry_folder],geometry_header_filename,geometry_density_filename);
- fprintf(['Successfully saved Condor geometry to ' input_folder '/' geometry_folder '\n']);
-
- fid = fopen([condor_folder '/' input_folder '/' geometry_filenames_condor],'w');
- fid2 = fopen([condor_folder '/' input_folder '/' geometry_filenames_CHTC],'w');
- fprintf(fid,'geometry_header\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,geometry_folder,geometry_header_filename));
- fprintf(fid2,'geometry_header\n');
- fprintf(fid2, '%s/%s\n', geometry_folder,'geometryHeader.txt');
- fprintf(fid,'geometry_density\n');
-
- fprintf(fid,'%s\n',fullfile(patient_dir,input_folder,geometry_folder,geometry_density_filename));
- fprintf(fid2,'geometry_density\n');
- fprintf(fid2, '%s/%s\n', geometry_folder,'density.bin');
- fclose(fid);
-
-
- for k = 1:numel(batches)
- fid = fopen(fullfile(condor_folder,sprintf('run%d.cmd',k-1)), 'w');
- fprintf(fid, '"%s" "%s" "%s" "%s" "%s"', executable_path,...
- fullfile(patient_dir, kernel_filenames_condor),...
- fullfile(patient_dir, geometry_filenames_condor),...
- fullfile(patient_dir, 'beamspecbatches', sprintf('beamspecbatch%d.txt',k-1)),...
- fullfile(patient_dir, sprintf('batch_dose%d.bin',k-1)));
- fclose(fid);
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fid = fopen([condor_folder '/' condor_submit_file],'w');
- fprintf(fid,'###############################################################\n');
- fprintf(fid,'# Condor submission script for convolution/superposition code\n');
- fprintf(fid,'###############################################################\n\n');
- fprintf(fid,'copy_to_spool = false\n');
- fprintf(fid,['Executable = ' condor_exectuable_name '\n']);
- fprintf(fid,['Arguments = ' kernel_filenames_CHTC ' ' geometry_filenames_CHTC ' ' beamspec_batch_base_name '$(Process).txt ' 'batch_dose$(Process).bin\n']);
- fprintf(fid,['Transfer_input_files = ' kernel_folder ',' geometry_folder ',' beamspec_batches_folder '/' beamspec_batch_base_name '$(Process).txt' ',' kernel_filenames_CHTC ',' geometry_filenames_CHTC '\n']);
- fprintf(fid,['Request_memory = 1000' '\n']);
- fprintf(fid,['Request_disk = 500000' '\n']);
- fprintf(fid,['Output = $(Cluster).out' '\n']);
- fprintf(fid,['Log = $(Cluster).log' '\n']);
- fprintf(fid,['Error = $(Cluster).err' '\n']);
- fprintf(fid,['Queue ' num2str(num_batches) '\n']);
-
- end
-
- for n=1:numel(batches)
- batch = batches{n};
- if Condor_flag == 1
- save_beamspec_batch(batch,[condor_folder '/' input_folder '/' beamspec_batches_folder],[beamspec_batch_base_name num2str(n-1) '.txt']);
- end
- end
- all_beams{1}.Mxp = Mxp;
- all_beams{1}.N_angles = N_angles;
- all_beams{1}.num_batches = num_batches;
- save([condor_folder '\all_beams.mat'], 'all_beams');
-
-
-
-
-
-
- strBeamlet = '';
- while(1)
- if strcmpi('y',strBeamlet)
- break;
- elseif strcmpi('n',strBeamlet)
- break;
- end
- strBeamlet = 'y';
- end
- t = datetime('now');
- disp(['Calculating ' num2str(size(all_beams, 2)) ' beamlets in ' num2str(size(batches, 1))...
- ' batches. Start: ' datestr(t)])
- if(strcmpi('y',strBeamlet))
- for k = 1:numel(batches)
- system([fullfile(patient_dir,sprintf('run%d.cmd',k-1)) ' &']);
- end
- end
- end
- end
|