-
Notifications
You must be signed in to change notification settings - Fork 0
/
ALGT_SSD.pl
148 lines (85 loc) · 3.04 KB
/
ALGT_SSD.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
%% ALGT_SSD Case 4.2.7
%%
%% Verification test of the DWS beam SSD calculation
%%
%% Copyright (C) 2003 DG Lane
:- consult(pl/geom).
:- consult(pl/vrml).
:- consult(pl/io_basics).
:- consult(pl/coord_sys).
:- set_prolog_flag(optimise, true).
%% ok_ssd/3
%%
%% predicate that asserts the computed SSD is corect
ok_ssd(Beam, Mesh, SSD) :-
member([gantryAngle, GantryAngle], Beam),
format_log(' Gantry angle = ~p ~n', [GantryAngle]),
member([couchAngle, CouchAngle], Beam),
format_log(' Couch angle = ~p ~n', [CouchAngle]),
transform_from(Beam, iecBeam, dicomPatient, Xform),
mat_prod(Xform, [[0,0,0,1]], [SourcePos_hg]),
mat_prod(Xform, [[0,0,-1,0]], [SourceDir_hg]),
append(SourcePos, [_], SourcePos_hg),
format_log(' Source Position (DICOM Patient CS) = ~p~n', [SourcePos]),
append(SourceDir, [_], SourceDir_hg),
format_log(' Source Dir (DICOM Patient CS) = ~p~n', [SourceDir]),
ray_mesh_intersect([SourcePos, SourceDir], Mesh, Intersect),
format_log(' Intersection point at = ~p ~n', [Intersect]),
vec_diff(SourcePos, Intersect, Offset),
vec_length(Offset, ComputedSSD),
format_log(' Computed SSD = ~p ~n', [ComputedSSD]),
format_log(' Test SSD = ~p ~n', [SSD]),
flag(positional_tolerance, EpsPos, EpsPos),
is_approx_equal(SSD, ComputedSSD, EpsPos),
format_log(' SSD value is OK~n', []).
%% test case execution
:- open_log,
format_log('~n~n**** Test case 4.2.7: ALGT_SSD ****~n', _),
read_string(' Patient / Study / Beam', _),
read_string(' Plan LOID', Loid),
read_number(' Beam Number', Beam_Number),
%% form the command string for the execution
sformat(Args, '-p ~s -b ~d', [Loid, Beam_Number]),
sformat(Cmd, '../bin/ALGT_SSD.exe ~s', [Args]),
%% put files in temp directory
chdir('temp'),
%% shell the command
shell(Cmd, _),
%% done with directory
chdir('..'),
%% prepare the intersection polygons
%% read and parse the parameter file
format_log('~n Reading parameters...', []),
read_file_to_codes('temp/ALGT_SSD.dat', C_beam, []),
phrase(format3_parameters(Beam), C_beam),
format_log('done.~n', []),
%% assert in to database
assert(current_beam(Beam)),
%% prepare the mesh
%% read and parse the file
format_log('~n Reading surface mesh...', []),
read_file_to_codes('temp/ALGT_SSD_Ext1_format2.wrl', C_surf, []),
phrase(vrml_file(Verts, _, IFCVerts, _), C_surf),
format_log('done.~n', []),
%% convert to internal mesh format
vrmlmesh_is_mesh([Verts, IFCVerts], Mesh),
%% output statistics on original mesh
write_mesh_stats('Surface', [Mesh]),
%% assert in to database
assert(current_mesh(Mesh)),
repeat,
% obtain testing parameters
format_log('~n', []),
read_number(' Positional Tolerance', EpsPos),
flag(positional_tolerance, _, EpsPos),
% begin test
write_test_time('begins'),
member(['SSD', SSD], Beam),
ok_ssd(Beam, Mesh, SSD),
% end test
write_test_time('ends'),
%% remove from database
retract(current_beam(Beam)),
retract(current_mesh(Mesh)),
format_log('**** TEST ALGT_SSD PASSED ****~n', []),
close_log.