Explorar o código

actually added the files needed to make WiscPlan run

pferjancic %!s(int64=7) %!d(string=hai) anos
pai
achega
0974f46fb9
Modificáronse 2 ficheiros con 196 adicións e 0 borrados
  1. 26 0
      nrrd2ROI.m
  2. 170 0
      nrrd2geometry.m

+ 26 - 0
nrrd2ROI.m

@@ -0,0 +1,26 @@
+function Geometry=nrrd2ROI(Geometry, patient_dir)
+
+    %% -----===== Get ROI mask =====-----
+    while true
+        newRoi = questdlg('Do you want to load another ROI?','New ROI','Yes','No','No')
+        switch newRoi
+            case 'Yes'
+                [TRGT_in, TRGT_path, ~] = uigetfile(['C:\010-work\003_localGit\WiscPlan_v2\PhantomData\','*.nrrd']);
+                if TRGT_in==0 % no file selected, no change to CT data
+                    warning('No file selected!')
+                else 
+                    [TRGT_img, meta]=nrrdread([TRGT_path, TRGT_in]);
+                end
+            Geometry.ROIS{end+1}.ind = find(TRGT_img>0);
+            str = input('Enter ROI name: \n','s');
+            Geometry.ROIS{end}.name= str;
+            
+            
+            save(fullfile(patient_dir, 'matlab_files', 'Geometry.mat'), 'Geometry');
+            
+            
+            case 'No'
+                break
+        end
+    end
+end

+ 170 - 0
nrrd2geometry.m

@@ -0,0 +1,170 @@
+
+
+function [Geometry patient_dir] = nrrd2geometry
+    
+    %% -----===== Get CT files =====-----
+%     [IMG_in, IMG_path, ~] = uigetfile(['C:\010-work\003_localGit\WiscPlan_v2\PhantomData\', '*.nrrd']);
+    
+    IMG_in = 'test_ct.nrrd';
+    IMG_path = 'C:\010-work\003_localGit\WiscPlan_v2\PhantomData\';
+    
+    total_num_steps = 4;
+    hWaitbar = waitbar(0);
+    
+    % geometry_file important parts:
+    % Geometry.ROIS - actually only to get the binary mask of the target
+    % Geometry.data - CT image in HU
+    % Geometry.voxel_size - self explanatory
+    % Geometry.start - self explanatory
+    
+    % these are derived from above:
+    % +Geometry.rhomw - CT image with values in relative water density 
+    % +Geometry.Smw - very similair to rhomw
+    % +Geometry.Fmw2
+    % +Geometry.BTV
+    % +Geometry.ring
+    
+    if IMG_in==0 % no file selected, no change to CT data
+        warning('No file selected!')
+    else 
+        [Geometry.data, meta]=nrrdread([IMG_path, IMG_in]);
+    end
+    
+    % Geometry.rhomw
+    Geometry.rhomw = CT2dens(Geometry.data, 'pinn');
+    Geometry.rhomw(Geometry.rhomw < 0.0012) = 0.0012;
+    [Geometry.Smw Geometry.Fmw2] = dens2mstp(Geometry.rhomw);
+    
+    % Geometry.voxel_size
+    VoxSizeString = meta.spacedirections;
+    C=textscan(VoxSizeString(2:end-1), '%f', 9,'Delimiter',{',',') ('});
+    C= C{1};
+    Geometry.voxel_size = [C(1), C(5), C(9)];
+    
+    % Geometry.start
+    StartString = meta.spaceorigin;
+    C=textscan(StartString(2:end-1), '%f', 3,'Delimiter',',');
+    Geometry.start=C{1};
+    Geometry.start=Geometry.start';
+    
+    % Geometry.ROIS
+    
+    %% -----===== Get mask/contour files =====-----
+%     [TRGT_in, TRGT_path, ~] = uigetfile(['C:\010-work\003_localGit\WiscPlan_v2\PhantomData\','*.nrrd']);
+    TRGT_in = 'test_seg.nrrd';
+    TRGT_path = 'C:\010-work\003_localGit\WiscPlan_v2\PhantomData\';
+    
+    if TRGT_in==0 % no file selected, no change to CT data
+        warning('No file selected!')
+    else 
+        [TRGT_img, meta]=nrrdread([TRGT_path, TRGT_in]);
+    end
+    Geometry.ROIS{1}.ind = find(TRGT_img>0);
+    Geometry.ROIS{1}.name= 'Target';
+
+    
+        %% -----===== Save geometry files =====-----
+%     patient_dir = uifile('getdir', 'Save the patient data to directory');
+    patient_dir = 'C:\010-work\003_localGit\WiscPlan_v2\WiscPlanPhotonkV125\PatientData\';
+    
+    % make directories
+    mkdir(patient_dir);
+    mkdir(fullfile(patient_dir, 'beamlet_batch_files'));
+    mkdir(fullfile(patient_dir, 'geometry_files'));
+    mkdir(fullfile(patient_dir, 'matlab_files'));
+    mkdir(fullfile(patient_dir, 'opt_input'));
+    mkdir(fullfile(patient_dir, 'opt_output'));
+
+    %% -----===== BTV and Ring creation =====-----
+    waitbar(1/total_num_steps, hWaitbar, 'Step 2: Assign target and BTV margin');
+    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. ');
+    if okay ~= 1
+        msgbox('Plan creation aborted');
+        delete(hWaitbar);
+        return;
+    end
+
+    [BTV_margin_answer] = inputdlg({sprintf('Please enter the BTV margin (cm):\n(default 0.6 cm or 1 sigma, enter 0 to skip)')}, ...
+        'BTV margin specification', 1, {'0.6'});
+    if isempty(BTV_margin_answer)
+        BTV_margin = 0.6;
+    else
+        BTV_margin = str2double(BTV_margin_answer{1});
+    end
+
+    % target_idx and BTV_margin are set. Expand PTV to BTV
+    PTVmask = false(size(Geometry.rhomw));
+    % for target_idx = target_indices
+            PTVmask(Geometry.ROIS{target_idx}.ind) = 1;
+    % end
+    if BTV_margin > 0
+        if exist('BTV_margin', 'var') && BTV_margin >= min(Geometry.voxel_size)
+            bwD = bwdistsc(PTVmask, Geometry.voxel_size);
+            Geometry.BTV = bwD <= BTV_margin;
+        end
+    end
+
+    % Create btv
+    Geometry.ROIS{end+1} = Geometry.ROIS{end};
+    Geometry.ROIS{end}.name = 'BTV';
+    Geometry.ROIS{end}.num_curves = 0;
+    Geometry.ROIS{end}.curves = {};
+    Geometry.ROIS{end}.ind = find(Geometry.BTV);
+    Geometry.ROIS{end}.visible = false;
+
+    % Create ring
+    [ring_margin_answer] = inputdlg({sprintf('Please enter the ring margin (cm):')}, ...
+        'Ring margin specification', 1, {'1'});
+    if isempty(ring_margin_answer)
+        ring_margin = 1;
+    else
+        ring_margin = str2double(ring_margin_answer{1});
+    end
+    bwD = bwdistsc(PTVmask, Geometry.voxel_size);
+    Geometry.Ring = bwD <= ring_margin; % default ring radius 3 cm
+    Geometry.Ring = xor(Geometry.Ring, PTVmask);
+    Geometry.ROIS{end+1} = Geometry.ROIS{end};
+    Geometry.ROIS{end}.name = 'Ring';
+    Geometry.ROIS{end}.num_curves = 0;
+    Geometry.ROIS{end}.curves = {};
+    Geometry.ROIS{end}.ind = find(Geometry.Ring);
+    Geometry.ROIS{end}.visible = false;
+
+    
+    
+    waitbar(2.33/total_num_steps, hWaitbar, 'Step 3: Save matlab geometry files');
+    % Save matlab geometry file
+    save(fullfile(patient_dir, 'matlab_files', 'Geometry.mat'), 'Geometry');
+
+    waitbar(2.66/total_num_steps, hWaitbar, 'Step 3: Save raw geometry files');
+    % Write binary geometry files
+    fid = fopen(fullfile(patient_dir, 'geometry_files', 'rhomw.bin'), 'w');
+    fwrite(fid, Geometry.rhomw, 'single');
+    fclose(fid);
+    
+    fid = fopen(fullfile(patient_dir, 'geometry_files', 'Smw.bin'), 'w');
+    fwrite(fid, Geometry.Smw, 'single');
+    fclose(fid);
+
+    fid = fopen(fullfile(patient_dir, 'geometry_files', 'Fmw2.bin'), 'w');
+    fwrite(fid, Geometry.Fmw2, 'single');
+    fclose(fid);
+
+    fid = fopen(fullfile(patient_dir, 'geometry_files', 'target_mask.bin'), 'w');
+    fwrite(fid, Geometry.BTV, 'single');
+    fclose(fid);
+
+
+    % hWaitbar = waitbar(1/total_num_steps, 'Step 4, Create optimization geometry');
+
+    delete(hWaitbar);
+    waitfor(msgbox(['Plan geometry created successfully in ' '"' patient_dir '"']));
+    
+    
+    
+
+end