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