0001 function jacob = matRad_constraintJacobian(optiProb,w,dij,cst)
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
0038
0039 optiProb.BP = optiProb.BP.compute(dij,w);
0040 d = optiProb.BP.GetResult();
0041
0042
0043 jacob = sparse([]);
0044
0045
0046 DoseProjection{1} = sparse([]);
0047 mAlphaDoseProjection{1} = sparse([]);
0048 mSqrtBetaDoseProjection{1} = sparse([]);
0049 voxelID = [];
0050 constraintID = [];
0051 scenID2 = [];
0052
0053
0054 for i = 1:size(cst,1)
0055
0056
0057 if ~isempty(cst{i,4}{1}) && ( isequal(cst{i,3},'OAR') || isequal(cst{i,3},'TARGET') )
0058
0059
0060
0061 for j = 1:numel(cst{i,6})
0062
0063 obj = cst{i,6}{j};
0064
0065
0066
0067 if isa(obj,'DoseConstraints.matRad_DoseConstraint')
0068
0069
0070 if (~isequal(obj.name, 'max dose constraint') && ~isequal(obj.name, 'min dose constraint') &&...
0071 ~isequal(obj.name, 'max mean dose constraint') && ~isequal(obj.name, 'min mean dose constraint') && ...
0072 ~isequal(obj.name, 'min EUD constraint') && ~isequal(obj.name, 'max EUD constraint')) && ...
0073 (isa(optiProb.BP,'matRad_EffectProjection') && ~isa(optiProb.BP,'matRad_VariableRBEProjection'))
0074
0075 doses = obj.getDoseParameters();
0076
0077 effect = cst{i,5}.alphaX*doses + cst{i,5}.betaX*doses.^2;
0078
0079 obj = obj.setDoseParameters(effect);
0080 end
0081
0082
0083
0084
0085 d_i = d{1}(cst{i,4}{1});
0086
0087
0088 jacobSub = obj.computeDoseConstraintJacobian(d_i);
0089
0090 nConst = size(jacobSub,2);
0091
0092
0093
0094
0095
0096
0097 if isa(optiProb.BP,'matRad_DoseProjection') && ~isempty(jacobSub) || isa(optiProb.BP,'matRad_ConstantRBEProjection')
0098
0099 startIx = size(DoseProjection{1},2) + 1;
0100
0101 DoseProjection{1} = [DoseProjection{1},sparse(dij.doseGrid.numOfVoxels,nConst)];
0102
0103
0104 DoseProjection{1}(cst{i,4}{1},startIx:end) = jacobSub;
0105
0106 elseif isa(optiProb.BP,'matRad_EffectProjection') && ~isempty(jacobSub)
0107
0108 if isa(optiProb.BP,'matRad_VariableRBEProjection')
0109 scaledEffect = (dij.gamma(cst{i,4}{1}) + d_i);
0110 jacobSub = jacobSub./(2*dij.bx(cst{i,4}{1}) .* scaledEffect);
0111 end
0112
0113 startIx = size(mAlphaDoseProjection{1},2) + 1;
0114
0115
0116
0117 mAlphaDoseProjection{1} = [mAlphaDoseProjection{1},sparse(dij.doseGrid.numOfVoxels,nConst)];
0118 mAlphaDoseProjection{1}(cst{i,4}{1},startIx:end) = jacobSub;
0119
0120
0121
0122
0123 mSqrtBetaDoseProjection{1} = [mSqrtBetaDoseProjection{1}, sparse(repmat(cst{i,4}{1},nConst,1),repmat(1:numel(cst{i,4}{1}),1,nConst),2*reshape(jacobSub',[],1),dij.doseGrid.numOfVoxels,nConst*numel(cst{i,4}{1}))];
0124
0125 if isempty(constraintID)
0126 newID = 1;
0127 else
0128 newID = constraintID(end)+1;
0129 end
0130
0131 voxelID = [voxelID;repmat(cst{i,4}{1},nConst,1)];
0132 constraintID = [constraintID, ...
0133 reshape(ones(numel(cst{i,4}{1}),1)*[newID:newID+nConst-1],[1 nConst*numel(cst{i,4}{1})])];
0134
0135 end
0136
0137
0138
0139
0140 for c = 1:size(jacobSub,2)
0141 jacobVec = jacobSub(:,c);
0142
0143 if isa(optiProb.BP,'matRad_DoseProjection') && ~isempty(jacobVec) || isa(optiProb.BP,'matRad_ConstantRBEProjection')
0144
0145 DoseProjection{1} = [DoseProjection{1},sparse(cst{i,4}{1},1,jacobVec,dij.doseGrid.numOfVoxels,1)];
0146
0147 elseif isa(optiProb.BP,'matRad_EffectProjection') && ~isempty(jacobVec)
0148
0149 if isa(optiProb.BP,'matRad_VariableRBEProjection')
0150 scaledEffect = (dij.gamma(cst{i,4}{1}) + d_i);
0151 jacobVec = jacobVec./(2*dij.bx(cst{i,4}{1}).*scaledEffect);
0152 end
0153
0154 mAlphaDoseProjection{1} = [mAlphaDoseProjection{1},sparse(cst{i,4}{1},1,jacobVec,dij.doseGrid.numOfVoxels,1)];
0155 mSqrtBetaDoseProjection{1} = [mSqrtBetaDoseProjection{1},...
0156 sparse(cst{i,4}{1},1:numel(cst{i,4}{1}),2*jacobVec,dij.doseGrid.numOfVoxels,numel(cst{i,4}{1}))];
0157
0158 voxelID = [voxelID ;cst{i,4}{1}];
0159
0160 if isempty(constraintID)
0161 lastID = 0;
0162 else
0163 lastID = constraintID(end);
0164 end
0165 constraintID = [constraintID, repmat(1 + lastID,1,numel(cst{i,4}{1}))];
0166
0167 end
0168 end
0169
0170 end
0171
0172 end
0173
0174 end
0175
0176 end
0177
0178
0179 if isa(optiProb.BP,'matRad_DoseProjection')
0180
0181 if ~isempty(DoseProjection{1})
0182 jacob = DoseProjection{1}' * dij.physicalDose{1};
0183 end
0184
0185 elseif isa(optiProb.BP,'matRad_ConstantRBEProjection')
0186
0187 if ~isempty(DoseProjection{1})
0188 jacob = DoseProjection{1}' * dij.RBE * dij.physicalDose{1};
0189 end
0190
0191 elseif isa(optiProb.BP,'matRad_EffectProjection')
0192
0193 if ~isempty(mSqrtBetaDoseProjection{1}) && ~isempty(mAlphaDoseProjection{1})
0194 mSqrtBetaDoseProjection{1} = mSqrtBetaDoseProjection{1}' * dij.mSqrtBetaDose{1} * w;
0195 mSqrtBetaDoseProjection{1} = sparse(voxelID,constraintID,mSqrtBetaDoseProjection{1},...
0196 size(mAlphaDoseProjection{1},1),size(mAlphaDoseProjection{1},2));
0197
0198 jacob = mAlphaDoseProjection{1}' * dij.mAlphaDose{1} +...
0199 mSqrtBetaDoseProjection{1}' * dij.mSqrtBetaDose{1};
0200
0201 end
0202 end
0203 end