| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | function [dosecalcSetup patient_dir] = RDXTPS_dosecalcSetup(dosecalcSetup, patient_dir, Geometry)if nargin < 1     dosecalcSetup = [];elseif ~isempty(dosecalcSetup)    inpAns = {...        dosecalcSetup.treat_mode, ...        num2str(dosecalcSetup.det_margin), ...        num2str(dosecalcSetup.spread_parameters), ...        num2str(dosecalcSetup.spacing_parameters(:)'), ...        num2str(dosecalcSetup.aperture_size), ...        num2str(dosecalcSetup.beam_angles)};endif nargin < 2    patient_dir = [];end%%prompt = {...    sprintf('All unit in cm\n\nTreatment mode (SS or DET):'), ...    sprintf('DET margin (default 0.1):'), ...    sprintf('Beam width (1 Gaussian sigma), typically 0.3 to 1.0:'), ...    sprintf('Spot spacing, typically <= 1 sigma:\n(3 numbers seperated by space, the last one along beam direction)'), ...    sprintf('Cutoff distance (aperture size) of the dose calculation grid:'), ...    sprintf('Gantry angles (any scalar or vector in MATLAB syntax):\ne.g. -30 0 30 or -180:10:180\n0 is PA') ...    sprintf('Couch angles (any scalar or vector in MATLAB syntax):\ne.g. -30 0 30 or -180:10:180\n0 for coplanar beam') ...    };defAns = {...    'SS', ...    '0.1', ...    '0.6', ...    '0.5 0.5 0.3', ...    '4', ...    '-90 90', ...    '0 0'};%% Prompt input dialogif isempty(dosecalcSetup)    answer = inputdlg(prompt, 'Dose calculation parameters', 1, defAns);else    answer = inputdlg(prompt, 'Dose calculation parameters', 1, inpAns);end%% TODO if hit cancel%% Convert answer to structdosecalcSetup.treat_mode = answer{1};dosecalcSetup.det_margin = str2double(answer{2});dosecalcSetup.spread_parameters = str2double(answer{3});dosecalcSetup.spacing_parameters = sscanf(answer{4}, '%f%f%f');dosecalcSetup.aperture_size = str2double(answer{5});dosecalcSetup.beam_angles = eval(['[' answer{6} ']']);dosecalcSetup.couch_angles = eval(['[' answer{7} ']']);%% Check input data integritydosecalcSetup.treat_mode = strtrim(dosecalcSetup.treat_mode);if ~strcmpi(dosecalcSetup.treat_mode, 'SS') && ~strcmpi(dosecalcSetup.treat_mode, 'DET')    msgbox('Unknow treatment mode specified');endif isempty(dosecalcSetup.det_margin) || dosecalcSetup.det_margin < 0 || dosecalcSetup.det_margin > 10    msgbox('DET margin out of range');endif isempty(dosecalcSetup.spread_parameters) || dosecalcSetup.spread_parameters < 0 || dosecalcSetup.spread_parameters > 10    msgbox('Beam width out of range');endif isempty(dosecalcSetup.spacing_parameters) || any(dosecalcSetup.spacing_parameters < 0) || any(dosecalcSetup.spacing_parameters > 10)    msgbox('Spot spacing out of range');endif isempty(dosecalcSetup.aperture_size) || dosecalcSetup.aperture_size < 0 || dosecalcSetup.aperture_size > 100    msgbox('Aperture out of range');endif isempty(dosecalcSetup.beam_angles) || any(~isnumeric(dosecalcSetup.beam_angles))    msgbox('Gantry angle out of range');end%% Choose output directoryif isempty(patient_dir)    patient_dir = uifile('getdir', 'Select the patient directory');endtry    load(fullfile(patient_dir, 'matlab_files', 'Geometry.mat'));catch    msgbox('Error loading Geometry file');    return;end%% prepare variables for input filegeometry_rhomw_filename     = fullfile(patient_dir, 'geometry_files', 'rhomw.bin');geometry_Smw_filename       = fullfile(patient_dir, 'geometry_files', 'Smw.bin');geometry_tumormask_filename = fullfile(patient_dir, 'geometry_files', 'target_mask.bin');geometry_Fmw2_filename      = fullfile(patient_dir, 'geometry_files', 'Fmw2.bin');batch_dose = fullfile(patient_dir, 'batch_dose.bin');beam_spec = fullfile(patient_dir, 'beam_spec_DAVE.txt');% size of the CT data grid[M,N,Q] = size(Geometry.rhomw);% voxel sizedx = double(Geometry.voxel_size(1));dy = double(Geometry.voxel_size(2));dz = double(Geometry.voxel_size(3));% grid start locationx0 = double(Geometry.start(1));y0 = double(Geometry.start(2));z0 = double(Geometry.start(3));% tumor zstart, zend. NOT used any moretumor_zstart = 0;tumor_zend = 1;read_beamspec = 0;write_beamspec = 1;use_scale2D = 1;Mxp = 512;Nyp = 512;SAD = 100;num_energies = 576;pencil_beam_filenames_file = 'pencil_beam_files/pencil_beam_filenames.txt';pencil_beam_path = 'pencil_beam_files';    sig_xp = dosecalcSetup.spread_parameters;sig_yp = dosecalcSetup.spread_parameters;xSpace = dosecalcSetup.spacing_parameters(1);ySpace = dosecalcSetup.spacing_parameters(2);zSpace = dosecalcSetup.spacing_parameters(3);del_xp = dosecalcSetup.aperture_size;del_yp = dosecalcSetup.aperture_size;num_angles = numel(dosecalcSetup.beam_angles);phi = dosecalcSetup.beam_angles;couch_phi = dosecalcSetup.couch_angles;%% write input filefprintf('Generating input file.\n');fid = fopen(fullfile(patient_dir, 'dosecalc_input.txt'), 'w');fprintf(fid,'#######################################################################\n');fprintf(fid,['## Proton dose calculator input file for: ' patient_dir '\n']);fprintf(fid,'#######################################################################\n\n');fprintf(fid,'# Text entries not preceeded by comments must not be changed!!\n\n');fprintf(fid,'# GEOMETRY DATA\n\n');fprintf(fid,'# CT density grid file\n');fprintf(fid,'rhomw_grid_file\n');fprintf(fid,'%s\n\n',geometry_rhomw_filename);fprintf(fid,'# Stopping power ratio grid file\n');fprintf(fid,'Smw_grid_file\n');fprintf(fid,'%s\n\n',geometry_Smw_filename);fprintf(fid,'# Tumor mask file\n');fprintf(fid,'mask_file\n');fprintf(fid,'%s\n\n',geometry_tumormask_filename);fprintf(fid,'# Grid containing 2D scaling F^2 factors\n');fprintf(fid,'Fmw2_grid_file\n');fprintf(fid,'%s\n\n',geometry_Fmw2_filename);fprintf(fid,'# Output dose file\n');fprintf(fid,'batch_dose_file\n');fprintf(fid,'%s\n\n',batch_dose);fprintf(fid,'# Beam specification file\n');fprintf(fid,'beam_spec_file\n');fprintf(fid,'%s\n\n',beam_spec);fprintf(fid,'# Data grid dimensions (Xdim,Ydim,Zdim)\n');fprintf(fid,'grid_dimensions\n');fprintf(fid,'%d %d %d\n\n',M,N,Q);fprintf(fid,'# Voxel dimensions (dx,dy,dz) [cm]\n');fprintf(fid,'voxel_dimensions\n');fprintf(fid,'%f %f %f\n\n',dx,dy,dz);fprintf(fid,'# Grid start coordinates (shifted) (x0,y0,z0) [cm]\n');fprintf(fid,'start_coordinates\n');fprintf(fid,'%f %f %f\n\n',x0,y0,z0);fprintf(fid,'# Tumor Z coordinates (tumor_zstart, tumor_zend) [cm]\n');fprintf(fid,'tumor_coordinates\n');fprintf(fid,'%f %f\n\n',tumor_zstart,tumor_zend);fprintf(fid,'# USER DEFINED BEAM DATA\n\n');fprintf(fid,'# Calculation mode\n');fprintf(fid,'treat_mode\n');fprintf(fid,'%s\n\n', dosecalcSetup.treat_mode);fprintf(fid,'# DET margin\n');fprintf(fid,'det_margin\n');fprintf(fid,'%f\n\n', dosecalcSetup.det_margin);fprintf(fid,'# Load beam specification file [1 for yes, 0 for no]\n');fprintf(fid,'read_beam_spec_file\n');fprintf(fid,'%d\n\n',read_beamspec);fprintf(fid,'# Write beam specification file [1 for yes, 0 for no]\n');fprintf(fid,'write_beam_spec_file\n');fprintf(fid,'%d\n\n',write_beamspec);fprintf(fid,'# Use 2D scaling method [1 for yes, 0 for no]\n');fprintf(fid,'use_2D_scaling\n');fprintf(fid,'%d\n\n',use_scale2D); fprintf(fid,'# Gaussian spread parameters (sig_xp,sig_yp) [cm]\n');fprintf(fid,'spread_parameters\n');fprintf(fid,'%f %f\n\n',sig_xp,sig_yp);fprintf(fid,'# Gaussian spacing parameters (xSpace,ySpace,zSpace) [cm]\n');fprintf(fid,'spacing_parameters\n');fprintf(fid,'%f %f %f\n\n',xSpace,ySpace,zSpace);fprintf(fid,'# Rectangular aperture size in beams eye view (del_xp,del_yp) [cm]\n');fprintf(fid,'aperture_size\n');fprintf(fid,'%f %f\n\n',del_xp,del_yp);fprintf(fid,'# Number of beam angles\n');fprintf(fid,'num_beam_angles\n');fprintf(fid,'%d\n\n',num_angles);fprintf(fid,'# Beam angles for calculation [degrees]\n');fprintf(fid,'gantry_angles\n');fprintf(fid,'%f\n',phi);fprintf(fid,'\n');fprintf(fid,'# Couch angles for calculation [degrees]\n');fprintf(fid,'couch_angles\n');fprintf(fid,'%f\n',couch_phi);fprintf(fid,'\n');fprintf(fid,'# Number of beamlets filling each beam angle aperture (Mxp,Nyp)\n');fprintf(fid,'number_beamlets\n');fprintf(fid,'%d %d\n\n',Mxp,Nyp);fprintf(fid,'# Source to axis distance (SAD) [cm]\n');fprintf(fid,'SAD\n');fprintf(fid,'%f\n\n',SAD);fprintf(fid,'# PENCIL BEAM DATA\n\n');fprintf(fid,'# Number of pencil beam energies\n');fprintf(fid,'number_energies\n');fprintf(fid,'%d\n\n',num_energies);fprintf(fid,'# Pencil beam filenames file\n');fprintf(fid,'pencil_beam_filenames\n');fprintf(fid,'%s\n\n',pencil_beam_filenames_file);fprintf(fid,'# Location of pencil beam files\n');fprintf(fid,'pencil_beam_path\n');fprintf(fid,'%s\n',pencil_beam_path);fclose(fid);% save data to matlab structuresave(fullfile(patient_dir, 'matlab_files', 'dosecalcSetup.mat'), 'dosecalcSetup');
 |