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