1+ function test_suite = test_HongPB
2+
3+ test_functions= localfunctions();
4+
5+ initTestSuite ;
6+
7+ function test_getHongPBEngineFromPln
8+ % Single gaussian lateral model
9+ testData.pln = struct(' radiationMode' ,' protons' ,' machine' ,' Generic' );
10+ testData.pln.propDoseCalc.engine = ' HongPB' ;
11+ engine = DoseEngines .matRad_ParticleHongPencilBeamEngine .getEngineFromPln(testData .pln );
12+ assertTrue(isa(engine ,' DoseEngines.matRad_ParticleHongPencilBeamEngine' ));
13+
14+ function test_loadMachineForHongPB
15+ possibleRadModes = DoseEngines .matRad_ParticleHongPencilBeamEngine .possibleRadiationModes ;
16+ for i = 1 : numel(possibleRadModes )
17+ machine = DoseEngines .matRad_ParticleHongPencilBeamEngine .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+ function test_calcDoseHongPBprotons
25+ testData = load(' protons_testData.mat' );
26+
27+ assertTrue(DoseEngines .matRad_ParticleHongPencilBeamEngine .isAvailable(testData .pln ));
28+
29+ testData.pln.propDoseCalc.engine = ' HongPB' ;
30+ testData.pln.propDoseCalc.dosimetricLateralCutOff = 0.995 ;
31+ testData.pln.propDoseCalc.geometricLateralCutOff = 50 ;
32+ resultGUI = matRad_calcDoseForward(testData .ct , testData .cst , testData .stf , testData .pln , ones(sum([testData .stf(: ).totalNumOfBixels]),1 ));
33+
34+ assertTrue(isequal(fieldnames(resultGUI ),fieldnames(testData .resultGUI )));
35+ assertTrue(isequal(testData .ct .cubeDim , size(resultGUI .physicalDose )));
36+ assertElementsAlmostEqual(resultGUI .physicalDose ,testData .resultGUI .physicalDose ,' relative' ,1e-2 );
37+
38+ function test_calcDoseHongPBhelium
39+ testData = load(' helium_testData.mat' );
40+ assertTrue(DoseEngines .matRad_ParticleHongPencilBeamEngine .isAvailable(testData .pln ));
41+
42+ testData.pln.propDoseCalc.engine = ' HongPB' ;
43+ testData.pln.propDoseCalc.dosimetricLateralCutOff = 0.995 ;
44+ testData.pln.propDoseCalc.geometricLateralCutOff = 50 ;
45+ resultGUI = matRad_calcDoseForward(testData .ct , testData .cst , testData .stf , testData .pln , ones(sum([testData .stf(: ).totalNumOfBixels]),1 ));
46+
47+ assertTrue(isequal(fieldnames(resultGUI ),fieldnames(testData .resultGUI )));
48+ assertTrue(isequal(testData .ct .cubeDim , size(resultGUI .physicalDose )));
49+ assertElementsAlmostEqual(resultGUI .physicalDose ,testData .resultGUI .physicalDose ,' relative' ,1e-2 );
50+
51+ function test_calcDoseHongPBcarbon
52+ testData = load(' carbon_testData.mat' );
53+ assertTrue(DoseEngines .matRad_ParticleHongPencilBeamEngine .isAvailable(testData .pln ));
54+
55+ testData.pln.propDoseCalc.engine = ' HongPB' ;
56+ testData.pln.propDoseCalc.dosimetricLateralCutOff = 0.995 ;
57+ testData.pln.propDoseCalc.geometricLateralCutOff = 50 ;
58+ resultGUI = matRad_calcDoseForward(testData .ct , testData .cst , testData .stf , testData .pln , ones(sum([testData .stf(: ).totalNumOfBixels]),1 ));
59+
60+ assertTrue(isequal(fieldnames(resultGUI ),fieldnames(testData .resultGUI )));
61+ assertTrue(isequal(testData .ct .cubeDim , size(resultGUI .physicalDose )));
62+ assertElementsAlmostEqual(resultGUI .physicalDose ,testData .resultGUI .physicalDose ,' relative' ,1e-2 );
63+
64+
65+ function test_nonSupportedSettings
66+ % Radiation mode other than protons not implemented
67+ testData = load(' photons_testData.mat' );
68+ testData.pln.propDoseCalc.engine = ' HongPB' ;
69+ assertFalse(DoseEngines .matRad_ParticleHongPencilBeamEngine .isAvailable(testData .pln ));
70+
71+ % Invalid machine without radiation mode field
72+ testData.pln.machine = ' Empty' ;
73+ testData.pln.propDoseCalc.engine = ' HongPB' ;
74+ assertExceptionThrown(@() DoseEngines .matRad_ParticleHongPencilBeamEngine .isAvailable(testData .pln ));
75+ assertFalse(DoseEngines .matRad_ParticleHongPencilBeamEngine .isAvailable(testData .pln ,[]));
76+
77+
78+
79+
0 commit comments