0001 function matRad_plotPlan3D(axesHandle,pln,stf)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 if ishold(axesHandle)
0038 wasHold = true;
0039 else
0040 wasHold = false;
0041 hold(axesHandle,'on');
0042 end
0043
0044
0045 beamColor = [255 20 147]/255;
0046
0047
0048 if nargin < 3 || isempty(stf)
0049 visFieldExtent = 50;
0050 visFieldPoints_bev = [-visFieldExtent 0 -visFieldExtent; ...
0051 visFieldExtent 0 -visFieldExtent; ...
0052 visFieldExtent 0 visFieldExtent; ...
0053 -visFieldExtent 0 visFieldExtent;
0054 -visFieldExtent 0 -visFieldExtent];
0055
0056 visFieldPoints_bev = visFieldPoints_bev ./ 2;
0057 visFieldPoints_bev = visFieldPoints_bev';
0058
0059 fileName = [pln.radiationMode '_' pln.machine];
0060
0061 try
0062 load([fileparts(mfilename('fullpath')) filesep 'basedata' filesep fileName]);
0063 SAD = machine.meta.SAD;
0064 catch
0065 if strcmp(pln.radiationMode,'protons') || strcmp(pln.radiationMode,'carbon')
0066 SAD = 10000;
0067 else
0068 SAD = 1500;
0069 end
0070 end
0071
0072
0073 beamVector = [0 SAD 0];
0074
0075
0076 for beamIx = 1:pln.propStf.numOfBeams
0077 rotMat = matRad_getRotationMatrix(pln.propStf.gantryAngles(beamIx),pln.propStf.couchAngles(beamIx));
0078 beamIsoCenter = pln.propStf.isoCenter(beamIx,:);
0079 currBeamVector = rotMat*beamVector';
0080 currBeamSource = beamIsoCenter - currBeamVector';
0081 currBeamOuterTarget = beamIsoCenter + currBeamVector';
0082
0083
0084 line('XData',[currBeamSource(1) beamIsoCenter(1)],'YData',[currBeamSource(2) beamIsoCenter(2)],'ZData',[currBeamSource(3) beamIsoCenter(3)],'Parent',axesHandle,'LineWidth',2,'Color',beamColor);
0085 line('XData',[currBeamOuterTarget(1) beamIsoCenter(1)],'YData',[currBeamOuterTarget(2) beamIsoCenter(2)],'ZData',[currBeamOuterTarget(3) beamIsoCenter(3)],'Parent',axesHandle,'LineWidth',2,'Color',beamColor,'LineStyle',':');
0086
0087
0088 for v = 1:size(visFieldPoints_bev,2)
0089 visFieldPoints_world(1:3,v) = rotMat*visFieldPoints_bev(1:3,v) + beamIsoCenter';
0090
0091
0092 if v==1
0093 continue;
0094 end
0095
0096
0097
0098
0099 line('XData',[currBeamSource(1) visFieldPoints_world(1,v)],'YData',[currBeamSource(2) visFieldPoints_world(2,v)],'ZData',[currBeamSource(3) visFieldPoints_world(3,v)],'Parent',axesHandle,'LineWidth',1,'Color',beamColor);
0100
0101 currPointVector = visFieldPoints_world(1:3,v) - currBeamSource';
0102 currPointOuterTarget = currPointVector + visFieldPoints_world(1:3,v);
0103 line('XData',[currPointOuterTarget(1) visFieldPoints_world(1,v)],'YData',[currPointOuterTarget(2) visFieldPoints_world(2,v)],'ZData',[currPointOuterTarget(3) visFieldPoints_world(3,v)],'Parent',axesHandle,'LineWidth',1,'Color',beamColor,'LineStyle',':');
0104
0105
0106 line('XData',[visFieldPoints_world(1,v) visFieldPoints_world(1,v-1)],...
0107 'YData',[visFieldPoints_world(2,v) visFieldPoints_world(2,v-1)],...
0108 'ZData',[visFieldPoints_world(3,v) visFieldPoints_world(3,v-1)],...
0109 'Parent',axesHandle,'LineWidth',2,'Color',beamColor);
0110 end
0111 end
0112 else
0113 for fieldIx = 1:numel(stf)
0114 beamTarget = stf(fieldIx).isoCenter;
0115 beamSource = stf(fieldIx).sourcePoint + stf(fieldIx).isoCenter;
0116
0117 rotMat = matRad_getRotationMatrix(pln.propStf.gantryAngles(fieldIx),pln.propStf.couchAngles(fieldIx));
0118
0119 bixelWidth = stf(fieldIx).bixelWidth;
0120
0121 rayPos = [stf(fieldIx).ray(:).rayPos_bev];
0122 rayPos = reshape(rayPos,[3 numel(rayPos)/3])';
0123
0124
0125
0126 symmMaxExtent = max([abs(min(rayPos)); abs(max(rayPos))]);
0127
0128 symmMaxExtent = symmMaxExtent ./ bixelWidth;
0129
0130 symmMaxExtent = 2*symmMaxExtent + [1 0 1];
0131
0132 symmMaxExtent = symmMaxExtent + [2 0 2];
0133
0134
0135 rayMat = zeros(symmMaxExtent(1),symmMaxExtent(3));
0136 for rayIx = 1:size(rayPos,1)
0137 centerMat = (size(rayMat)-1) ./ 2 + 1;
0138 el2D = rayPos(rayIx,[1 3]);
0139 el2D = el2D ./ bixelWidth;
0140 el2DIx = centerMat + el2D;
0141 rayMat(el2DIx(1),el2DIx(2)) = 1;
0142 end
0143
0144 fieldContour2D = contourc(rayMat,1);
0145
0146
0147 cColumn = 1;
0148 contourIx = 0;
0149
0150
0151 while cColumn <= size(fieldContour2D,2)
0152 contourIx = contourIx + 1;
0153
0154
0155 fieldContour3D(contourIx).level = fieldContour2D(1,cColumn);
0156 fieldContour3D(contourIx).numVertices = fieldContour2D(2,cColumn);
0157 fieldContour3D(contourIx).coord_bev = [ fieldContour2D(2,cColumn+1:cColumn+fieldContour3D(contourIx).numVertices); ...
0158 zeros(1,fieldContour3D(contourIx).numVertices);
0159 fieldContour2D(1,cColumn+1:cColumn+fieldContour3D(contourIx).numVertices)]; ...
0160
0161 fieldContour3D(contourIx).coord_bev = bsxfun(@minus,fieldContour3D(contourIx).coord_bev,symmMaxExtent'./2) * bixelWidth;
0162
0163
0164
0165
0166
0167 for v = 1:fieldContour3D(contourIx).numVertices
0168 fieldContour3D(contourIx).coord(1:3,v) = rotMat * fieldContour3D(contourIx).coord_bev(1:3,v) + beamTarget';
0169
0170 line('XData',[beamSource(1) fieldContour3D(contourIx).coord(1,v)],'YData',[beamSource(2) fieldContour3D(contourIx).coord(2,v)],'ZData',[beamSource(3) fieldContour3D(contourIx).coord(3,v)],'Parent',axesHandle,'LineWidth',1,'Color',beamColor);
0171 end
0172
0173
0174 line('XData',fieldContour3D(contourIx).coord(1,:),'YData',fieldContour3D(contourIx).coord(2,:),'ZData',fieldContour3D(contourIx).coord(3,:),'Parent',axesHandle,'LineWidth',2,'Color',beamColor);
0175
0176 cColumn = cColumn + fieldContour3D(contourIx).numVertices + 1;
0177 end
0178
0179 end
0180 end
0181
0182 if ~wasHold
0183 hold(axesHandle,'off');
0184 end
0185
0186 end