Skip to content

Commit 31fe6c9

Browse files
committed
add tests for fine sampling dose engine
1 parent 33c5b55 commit 31fe6c9

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

test/doseCalc/test_FSPB.m

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
function test_suite = test_FSPB
2+
3+
test_functions=localfunctions();
4+
5+
initTestSuite;
6+
7+
function test_getSubsamplingPBEngineFromPln
8+
% Single gaussian lateral model
9+
testData.pln = struct('radiationMode','protons','machine','Generic');
10+
testData.pln.propDoseCalc.engine = 'SubsamplingPB';
11+
engine = DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.getEngineFromPln(testData.pln);
12+
assertTrue(isa(engine,'DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine'));
13+
14+
function test_loadMachineForSubsamplingPB
15+
possibleRadModes = DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.possibleRadiationModes;
16+
for i = 1:numel(possibleRadModes)
17+
machine = DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.loadMachine(possibleRadModes{i},'Generic');
18+
assertTrue(isstruct(machine));
19+
assertTrue(isfield(machine, 'meta'));
20+
assertTrue(isfield(machine.meta, 'radiationMode'));
21+
assertTrue(strcmp(machine.meta.radiationMode, possibleRadModes{i}));
22+
end
23+
24+
25+
function test_calcDoseSubsamplingPBprotonsFitCircle
26+
testData = load('protons_testData.mat');
27+
28+
assertTrue(DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.isAvailable(testData.pln));
29+
30+
testData.pln.propDoseCalc.engine = 'SubsamplingPB';
31+
testData.pln.propDoseCalc.dosimetricLateralCutOff = 0.995;
32+
testData.pln.propDoseCalc.geometricLateralCutOff = 50;
33+
testData.pln.propDoseCalc.fineSampling.method = 'fitCircle';
34+
35+
for N = [2,3,8]
36+
testData.pln.propDoseCalc.fineSampling.N = N;
37+
38+
resultGUI = matRad_calcDoseForward(testData.ct, testData.cst, testData.stf, testData.pln, ones(sum([testData.stf(:).totalNumOfBixels]),1));
39+
40+
assertTrue(isequal(fieldnames(resultGUI),fieldnames(testData.resultGUI)));
41+
assertTrue(isequal(testData.ct.cubeDim, size(resultGUI.physicalDose)));
42+
assertElementsAlmostEqual(resultGUI.physicalDose,testData.resultGUI.physicalDose,'relative',1e-2,1e-2);
43+
end
44+
45+
function test_calcDoseSubsamplingPBprotonsFitSquare
46+
testData = load('protons_testData.mat');
47+
48+
assertTrue(DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.isAvailable(testData.pln));
49+
50+
testData.pln.propDoseCalc.engine = 'SubsamplingPB';
51+
testData.pln.propDoseCalc.dosimetricLateralCutOff = 0.995;
52+
testData.pln.propDoseCalc.geometricLateralCutOff = 50;
53+
testData.pln.propDoseCalc.fineSampling.method = 'fitSquare';
54+
55+
for N = [2,3]
56+
testData.pln.propDoseCalc.fineSampling.N = N;
57+
resultGUI = matRad_calcDoseForward(testData.ct, testData.cst, testData.stf, testData.pln, ones(sum([testData.stf(:).totalNumOfBixels]),1));
58+
59+
assertTrue(isequal(fieldnames(resultGUI),fieldnames(testData.resultGUI)));
60+
assertTrue(isequal(testData.ct.cubeDim, size(resultGUI.physicalDose)));
61+
assertElementsAlmostEqual(resultGUI.physicalDose,testData.resultGUI.physicalDose,'relative',1e-2,1e-2);
62+
end
63+
64+
function test_calcDoseSubsamplingPBprotonsRusso
65+
testData = load('protons_testData.mat');
66+
67+
testData.pln.propDoseCalc.fineSampling.N = 10;
68+
testData.pln.propDoseCalc.fineSampling.sigmaSub = 2;
69+
testData.pln.propDoseCalc.fineSampling.method = 'russo';
70+
71+
resultGUI = matRad_calcDoseForward(testData.ct, testData.cst, testData.stf, testData.pln, ones(sum([testData.stf(:).totalNumOfBixels]),1));
72+
73+
assertTrue(isequal(fieldnames(resultGUI),fieldnames(testData.resultGUI)));
74+
assertTrue(isequal(testData.ct.cubeDim, size(resultGUI.physicalDose)));
75+
assertElementsAlmostEqual(resultGUI.physicalDose,testData.resultGUI.physicalDose,'relative',1e-2,1e-2);
76+
77+
function test_calcDoseSubsamplingPBhelium
78+
testData = load('helium_testData.mat');
79+
assertTrue(DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.isAvailable(testData.pln));
80+
81+
testData.pln.propDoseCalc.engine = 'SubsamplingPB';
82+
testData.pln.propDoseCalc.dosimetricLateralCutOff = 0.995;
83+
testData.pln.propDoseCalc.geometricLateralCutOff = 50;
84+
testData.pln.propDoseCalc.fineSampling.N = 10;
85+
testData.pln.propDoseCalc.fineSampling.sigmaSub = 2;
86+
testData.pln.propDoseCalc.fineSampling.method = 'russo';
87+
resultGUI = matRad_calcDoseForward(testData.ct, testData.cst, testData.stf, testData.pln, ones(sum([testData.stf(:).totalNumOfBixels]),1));
88+
89+
assertTrue(isequal(fieldnames(resultGUI),fieldnames(testData.resultGUI)));
90+
assertTrue(isequal(testData.ct.cubeDim, size(resultGUI.physicalDose)));
91+
assertElementsAlmostEqual(resultGUI.physicalDose,testData.resultGUI.physicalDose,'relative',1e-2,1e-2);
92+
93+
function test_calcDoseSubsamplingPBcarbon
94+
testData = load('carbon_testData.mat');
95+
assertTrue(DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.isAvailable(testData.pln));
96+
97+
testData.pln.propDoseCalc.engine = 'SubsamplingPB';
98+
testData.pln.propDoseCalc.dosimetricLateralCutOff = 0.995;
99+
testData.pln.propDoseCalc.geometricLateralCutOff = 50;
100+
testData.pln.propDoseCalc.fineSampling.N = 10;
101+
testData.pln.propDoseCalc.fineSampling.sigmaSub = 2;
102+
testData.pln.propDoseCalc.fineSampling.method = 'russo';
103+
resultGUI = matRad_calcDoseForward(testData.ct, testData.cst, testData.stf, testData.pln, ones(sum([testData.stf(:).totalNumOfBixels]),1));
104+
105+
assertTrue(isequal(fieldnames(resultGUI),fieldnames(testData.resultGUI)));
106+
assertTrue(isequal(testData.ct.cubeDim, size(resultGUI.physicalDose)));
107+
assertElementsAlmostEqual(resultGUI.physicalDose,testData.resultGUI.physicalDose,'relative',1e-2,1e-2);
108+
109+
110+
function test_nonSupportedSettings
111+
% Radiation mode other than protons not implemented
112+
testData = load('photons_testData.mat');
113+
testData.pln.propDoseCalc.engine = 'SubsamplingPB';
114+
assertFalse(DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.isAvailable(testData.pln));
115+
116+
% Invalid machine without radiation mode field
117+
testData.pln.machine = 'Empty';
118+
testData.pln.propDoseCalc.engine = 'SubsamplingPB';
119+
assertExceptionThrown(@() DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.isAvailable(testData.pln));
120+
assertFalse(DoseEngines.matRad_ParticleFineSamplingPencilBeamEngine.isAvailable(testData.pln,[]));
121+
122+
123+
124+

0 commit comments

Comments
 (0)