1 //  Copyright (c) 2016, Novartis Institutes for BioMedical Research Inc.
2 //  All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 //     * Redistributions of source code must retain the above copyright
9 //       notice, this list of conditions and the following disclaimer.
10 //     * Redistributions in binary form must reproduce the above
11 //       copyright notice, this list of conditions and the following
12 //       disclaimer in the documentation and/or other materials provided
13 //       with the distribution.
14 //     * Neither the name of Novartis Institutes for BioMedical Research Inc.
15 //       nor the names of its contributors may be used to endorse or promote
16 //       products derived from this software without specific prior written
17 //       permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 //
31 #include <RDGeneral/test.h>
32 #include "RDFreeSASA.h"
33 
34 #include <GraphMol/RDKitBase.h>
35 #include <GraphMol/QueryAtom.h>
36 #include <GraphMol/SmilesParse/SmilesParse.h>
37 #include <GraphMol/FileParsers/FileParsers.h>
38 
39 using namespace RDKit;
40 
41 struct ExpectedClasses {
42   unsigned int idx;
43   int cls;
44   const char *clsname;
45   double radius;
46 };
47 
48 ExpectedClasses ExpectedProtor1d3z[] = {
49     {0, 1, "Polar", 1.64},    {1, 0, "Apolar", 1.88},
50     {2, 0, "Apolar", 1.61},   {3, 1, "Polar", 1.42},
51     {4, 0, "Apolar", 1.88},   {5, 0, "Apolar", 1.88},
52     {6, 1, "Polar", 1.77},    {7, 0, "Apolar", 1.88},
53     {8, 1, "Polar", 1.64},    {9, 0, "Apolar", 1.88},
54     {10, 0, "Apolar", 1.61},  {11, 1, "Polar", 1.42},
55     {12, 0, "Apolar", 1.88},  {13, 0, "Apolar", 1.88},
56     {14, 0, "Apolar", 1.61},  {15, 1, "Polar", 1.42},
57     {16, 1, "Polar", 1.64},   {17, 1, "Polar", 1.64},
58     {18, 0, "Apolar", 1.88},  {19, 0, "Apolar", 1.61},
59     {20, 1, "Polar", 1.42},   {21, 0, "Apolar", 1.88},
60     {22, 0, "Apolar", 1.88},  {23, 0, "Apolar", 1.88},
61     {24, 0, "Apolar", 1.88},  {25, 1, "Polar", 1.64},
62     {26, 0, "Apolar", 1.88},  {27, 0, "Apolar", 1.61},
63     {28, 1, "Polar", 1.42},   {29, 0, "Apolar", 1.88},
64     {30, 0, "Apolar", 1.61},  {31, 0, "Apolar", 1.76},
65     {32, 0, "Apolar", 1.76},  {33, 0, "Apolar", 1.76},
66     {34, 0, "Apolar", 1.76},  {35, 0, "Apolar", 1.76},
67     {36, 1, "Polar", 1.64},   {37, 0, "Apolar", 1.88},
68     {38, 0, "Apolar", 1.61},  {39, 1, "Polar", 1.42},
69     {40, 0, "Apolar", 1.88},  {41, 0, "Apolar", 1.88},
70     {42, 0, "Apolar", 1.88},  {43, 1, "Polar", 1.64},
71     {44, 0, "Apolar", 1.88},  {45, 0, "Apolar", 1.61},
72     {46, 1, "Polar", 1.42},   {47, 0, "Apolar", 1.88},
73     {48, 0, "Apolar", 1.88},  {49, 0, "Apolar", 1.88},
74     {50, 0, "Apolar", 1.88},  {51, 1, "Polar", 1.64},
75     {52, 1, "Polar", 1.64},   {53, 0, "Apolar", 1.88},
76     {54, 0, "Apolar", 1.61},  {55, 1, "Polar", 1.42},
77     {56, 0, "Apolar", 1.88},  {57, 1, "Polar", 1.46},
78     {58, 0, "Apolar", 1.88},  {59, 1, "Polar", 1.64},
79     {60, 0, "Apolar", 1.88},  {61, 0, "Apolar", 1.61},
80     {62, 1, "Polar", 1.42},   {63, 0, "Apolar", 1.88},
81     {64, 0, "Apolar", 1.88},  {65, 0, "Apolar", 1.88},
82     {66, 0, "Apolar", 1.88},  {67, 1, "Polar", 1.64},
83     {68, 0, "Apolar", 1.88},  {69, 0, "Apolar", 1.61},
84     {70, 1, "Polar", 1.42},   {71, 0, "Apolar", 1.88},
85     {72, 1, "Polar", 1.46},   {73, 0, "Apolar", 1.88},
86     {74, 1, "Polar", 1.64},   {75, 0, "Apolar", 1.88},
87     {76, 0, "Apolar", 1.61},  {77, 1, "Polar", 1.42},
88     {78, 1, "Polar", 1.64},   {79, 0, "Apolar", 1.88},
89     {80, 0, "Apolar", 1.61},  {81, 1, "Polar", 1.42},
90     {82, 0, "Apolar", 1.88},  {83, 0, "Apolar", 1.88},
91     {84, 0, "Apolar", 1.88},  {85, 0, "Apolar", 1.88},
92     {86, 1, "Polar", 1.64},   {87, 1, "Polar", 1.64},
93     {88, 0, "Apolar", 1.88},  {89, 0, "Apolar", 1.61},
94     {90, 1, "Polar", 1.42},   {91, 0, "Apolar", 1.88},
95     {92, 1, "Polar", 1.46},   {93, 0, "Apolar", 1.88},
96     {94, 1, "Polar", 1.64},   {95, 0, "Apolar", 1.88},
97     {96, 0, "Apolar", 1.61},  {97, 1, "Polar", 1.42},
98     {98, 0, "Apolar", 1.88},  {99, 0, "Apolar", 1.88},
99     {100, 0, "Apolar", 1.88}, {101, 0, "Apolar", 1.88},
100     {102, 1, "Polar", 1.64},  {103, 0, "Apolar", 1.88},
101     {104, 0, "Apolar", 1.61}, {105, 1, "Polar", 1.42},
102     {106, 0, "Apolar", 1.88}, {107, 1, "Polar", 1.46},
103     {108, 0, "Apolar", 1.88}, {109, 1, "Polar", 1.64},
104     {110, 0, "Apolar", 1.88}, {111, 0, "Apolar", 1.61},
105     {112, 1, "Polar", 1.42},  {113, 0, "Apolar", 1.88},
106     {114, 0, "Apolar", 1.88}, {115, 0, "Apolar", 1.88},
107     {116, 0, "Apolar", 1.88}, {117, 1, "Polar", 1.64},
108     {118, 0, "Apolar", 1.88}, {119, 0, "Apolar", 1.61},
109     {120, 1, "Polar", 1.42},  {121, 0, "Apolar", 1.88},
110     {122, 0, "Apolar", 1.88}, {123, 0, "Apolar", 1.61},
111     {124, 1, "Polar", 1.42},  {125, 1, "Polar", 1.46},
112     {126, 1, "Polar", 1.64},  {127, 0, "Apolar", 1.88},
113     {128, 0, "Apolar", 1.61}, {129, 1, "Polar", 1.42},
114     {130, 0, "Apolar", 1.88}, {131, 0, "Apolar", 1.88},
115     {132, 0, "Apolar", 1.88}, {133, 1, "Polar", 1.64},
116     {134, 0, "Apolar", 1.88}, {135, 0, "Apolar", 1.61},
117     {136, 1, "Polar", 1.42},  {137, 0, "Apolar", 1.88},
118     {138, 0, "Apolar", 1.88}, {139, 0, "Apolar", 1.61},
119     {140, 1, "Polar", 1.42},  {141, 1, "Polar", 1.46},
120     {142, 1, "Polar", 1.64},  {143, 0, "Apolar", 1.88},
121     {144, 0, "Apolar", 1.61}, {145, 1, "Polar", 1.42},
122     {146, 0, "Apolar", 1.88}, {147, 0, "Apolar", 1.88},
123     {148, 0, "Apolar", 1.88}, {149, 1, "Polar", 1.64},
124     {150, 0, "Apolar", 1.88}, {151, 0, "Apolar", 1.61},
125     {152, 1, "Polar", 1.42},  {153, 0, "Apolar", 1.88},
126     {154, 1, "Polar", 1.46},  {155, 1, "Polar", 1.64},
127     {156, 0, "Apolar", 1.88}, {157, 0, "Apolar", 1.61},
128     {158, 1, "Polar", 1.42},  {159, 0, "Apolar", 1.88},
129     {160, 0, "Apolar", 1.61}, {161, 1, "Polar", 1.42},
130     {162, 1, "Polar", 1.46},  {163, 1, "Polar", 1.64},
131     {164, 0, "Apolar", 1.88}, {165, 0, "Apolar", 1.61},
132     {166, 1, "Polar", 1.42},  {167, 0, "Apolar", 1.88},
133     {168, 1, "Polar", 1.46},  {169, 0, "Apolar", 1.88},
134     {170, 1, "Polar", 1.64},  {171, 0, "Apolar", 1.88},
135     {172, 0, "Apolar", 1.61}, {173, 1, "Polar", 1.42},
136     {174, 0, "Apolar", 1.88}, {175, 0, "Apolar", 1.88},
137     {176, 0, "Apolar", 1.88}, {177, 0, "Apolar", 1.88},
138     {178, 1, "Polar", 1.64},  {179, 0, "Apolar", 1.88},
139     {180, 0, "Apolar", 1.61}, {181, 1, "Polar", 1.42},
140     {182, 0, "Apolar", 1.88}, {183, 0, "Apolar", 1.88},
141     {184, 0, "Apolar", 1.61}, {185, 1, "Polar", 1.42},
142     {186, 1, "Polar", 1.46},  {187, 1, "Polar", 1.64},
143     {188, 0, "Apolar", 1.88}, {189, 0, "Apolar", 1.61},
144     {190, 1, "Polar", 1.42},  {191, 0, "Apolar", 1.88},
145     {192, 0, "Apolar", 1.61}, {193, 1, "Polar", 1.42},
146     {194, 1, "Polar", 1.64},  {195, 1, "Polar", 1.64},
147     {196, 0, "Apolar", 1.88}, {197, 0, "Apolar", 1.61},
148     {198, 1, "Polar", 1.42},  {199, 0, "Apolar", 1.88},
149     {200, 0, "Apolar", 1.88}, {201, 0, "Apolar", 1.88},
150     {202, 1, "Polar", 1.64},  {203, 0, "Apolar", 1.88},
151     {204, 0, "Apolar", 1.61}, {205, 1, "Polar", 1.42},
152     {206, 0, "Apolar", 1.88}, {207, 0, "Apolar", 1.88},
153     {208, 0, "Apolar", 1.88}, {209, 0, "Apolar", 1.88},
154     {210, 1, "Polar", 1.64},  {211, 1, "Polar", 1.64},
155     {212, 0, "Apolar", 1.88}, {213, 0, "Apolar", 1.61},
156     {214, 1, "Polar", 1.42},  {215, 0, "Apolar", 1.88},
157     {216, 1, "Polar", 1.64},  {217, 0, "Apolar", 1.88},
158     {218, 0, "Apolar", 1.61}, {219, 1, "Polar", 1.42},
159     {220, 0, "Apolar", 1.88}, {221, 0, "Apolar", 1.88},
160     {222, 0, "Apolar", 1.88}, {223, 0, "Apolar", 1.88},
161     {224, 1, "Polar", 1.64},  {225, 1, "Polar", 1.64},
162     {226, 0, "Apolar", 1.88}, {227, 0, "Apolar", 1.61},
163     {228, 1, "Polar", 1.42},  {229, 0, "Apolar", 1.88},
164     {230, 0, "Apolar", 1.88}, {231, 0, "Apolar", 1.88},
165     {232, 0, "Apolar", 1.88}, {233, 1, "Polar", 1.64},
166     {234, 0, "Apolar", 1.88}, {235, 0, "Apolar", 1.61},
167     {236, 1, "Polar", 1.42},  {237, 0, "Apolar", 1.88},
168     {238, 0, "Apolar", 1.88}, {239, 0, "Apolar", 1.61},
169     {240, 1, "Polar", 1.42},  {241, 1, "Polar", 1.64},
170     {242, 1, "Polar", 1.64},  {243, 0, "Apolar", 1.88},
171     {244, 0, "Apolar", 1.61}, {245, 1, "Polar", 1.42},
172     {246, 0, "Apolar", 1.88}, {247, 0, "Apolar", 1.61},
173     {248, 1, "Polar", 1.42},  {249, 1, "Polar", 1.46},
174     {250, 1, "Polar", 1.64},  {251, 0, "Apolar", 1.88},
175     {252, 0, "Apolar", 1.61}, {253, 1, "Polar", 1.42},
176     {254, 0, "Apolar", 1.88}, {255, 0, "Apolar", 1.88},
177     {256, 0, "Apolar", 1.88}, {257, 0, "Apolar", 1.88},
178     {258, 1, "Polar", 1.64},  {259, 1, "Polar", 1.64},
179     {260, 0, "Apolar", 1.88}, {261, 0, "Apolar", 1.61},
180     {262, 1, "Polar", 1.42},  {263, 0, "Apolar", 1.88},
181     {264, 0, "Apolar", 1.88}, {265, 0, "Apolar", 1.61},
182     {266, 1, "Polar", 1.42},  {267, 1, "Polar", 1.46},
183     {268, 1, "Polar", 1.64},  {269, 0, "Apolar", 1.88},
184     {270, 0, "Apolar", 1.61}, {271, 1, "Polar", 1.42},
185     {272, 1, "Polar", 1.64},  {273, 0, "Apolar", 1.88},
186     {274, 0, "Apolar", 1.61}, {275, 1, "Polar", 1.42},
187     {276, 0, "Apolar", 1.88}, {277, 0, "Apolar", 1.88},
188     {278, 0, "Apolar", 1.88}, {279, 0, "Apolar", 1.88},
189     {280, 1, "Polar", 1.64},  {281, 0, "Apolar", 1.88},
190     {282, 0, "Apolar", 1.61}, {283, 1, "Polar", 1.42},
191     {284, 0, "Apolar", 1.88}, {285, 0, "Apolar", 1.88},
192     {286, 0, "Apolar", 1.88}, {287, 1, "Polar", 1.64},
193     {288, 0, "Apolar", 1.88}, {289, 0, "Apolar", 1.61},
194     {290, 1, "Polar", 1.42},  {291, 0, "Apolar", 1.88},
195     {292, 0, "Apolar", 1.88}, {293, 0, "Apolar", 1.88},
196     {294, 1, "Polar", 1.64},  {295, 0, "Apolar", 1.88},
197     {296, 0, "Apolar", 1.61}, {297, 1, "Polar", 1.42},
198     {298, 0, "Apolar", 1.88}, {299, 0, "Apolar", 1.61},
199     {300, 1, "Polar", 1.42},  {301, 1, "Polar", 1.46},
200     {302, 1, "Polar", 1.64},  {303, 0, "Apolar", 1.88},
201     {304, 0, "Apolar", 1.61}, {305, 1, "Polar", 1.42},
202     {306, 0, "Apolar", 1.88}, {307, 0, "Apolar", 1.88},
203     {308, 0, "Apolar", 1.61}, {309, 1, "Polar", 1.42},
204     {310, 1, "Polar", 1.64},  {311, 1, "Polar", 1.64},
205     {312, 0, "Apolar", 1.88}, {313, 0, "Apolar", 1.61},
206     {314, 1, "Polar", 1.42},  {315, 0, "Apolar", 1.88},
207     {316, 0, "Apolar", 1.88}, {317, 0, "Apolar", 1.61},
208     {318, 1, "Polar", 1.42},  {319, 1, "Polar", 1.64},
209     {320, 1, "Polar", 1.64},  {321, 0, "Apolar", 1.88},
210     {322, 0, "Apolar", 1.61}, {323, 1, "Polar", 1.42},
211     {324, 0, "Apolar", 1.88}, {325, 0, "Apolar", 1.88},
212     {326, 0, "Apolar", 1.88}, {327, 1, "Polar", 1.64},
213     {328, 0, "Apolar", 1.61}, {329, 1, "Polar", 1.64},
214     {330, 1, "Polar", 1.64},  {331, 1, "Polar", 1.64},
215     {332, 0, "Apolar", 1.88}, {333, 0, "Apolar", 1.61},
216     {334, 1, "Polar", 1.42},  {335, 0, "Apolar", 1.88},
217     {336, 0, "Apolar", 1.88}, {337, 0, "Apolar", 1.88},
218     {338, 0, "Apolar", 1.88}, {339, 1, "Polar", 1.64},
219     {340, 0, "Apolar", 1.88}, {341, 0, "Apolar", 1.61},
220     {342, 1, "Polar", 1.42},  {343, 0, "Apolar", 1.88},
221     {344, 0, "Apolar", 1.88}, {345, 0, "Apolar", 1.88},
222     {346, 0, "Apolar", 1.88}, {347, 1, "Polar", 1.64},
223     {348, 0, "Apolar", 1.88}, {349, 0, "Apolar", 1.61},
224     {350, 1, "Polar", 1.42},  {351, 0, "Apolar", 1.88},
225     {352, 0, "Apolar", 1.61}, {353, 0, "Apolar", 1.76},
226     {354, 0, "Apolar", 1.76}, {355, 0, "Apolar", 1.76},
227     {356, 0, "Apolar", 1.76}, {357, 0, "Apolar", 1.76},
228     {358, 1, "Polar", 1.64},  {359, 0, "Apolar", 1.88},
229     {360, 0, "Apolar", 1.61}, {361, 1, "Polar", 1.42},
230     {362, 0, "Apolar", 1.88}, {363, 1, "Polar", 1.64},
231     {364, 0, "Apolar", 1.88}, {365, 0, "Apolar", 1.61},
232     {366, 1, "Polar", 1.42},  {367, 1, "Polar", 1.64},
233     {368, 0, "Apolar", 1.88}, {369, 0, "Apolar", 1.61},
234     {370, 1, "Polar", 1.42},  {371, 0, "Apolar", 1.88},
235     {372, 0, "Apolar", 1.88}, {373, 0, "Apolar", 1.88},
236     {374, 0, "Apolar", 1.88}, {375, 1, "Polar", 1.64},
237     {376, 1, "Polar", 1.64},  {377, 0, "Apolar", 1.88},
238     {378, 0, "Apolar", 1.61}, {379, 1, "Polar", 1.42},
239     {380, 0, "Apolar", 1.88}, {381, 0, "Apolar", 1.88},
240     {382, 0, "Apolar", 1.61}, {383, 1, "Polar", 1.42},
241     {384, 1, "Polar", 1.64},  {385, 1, "Polar", 1.64},
242     {386, 0, "Apolar", 1.88}, {387, 0, "Apolar", 1.61},
243     {388, 1, "Polar", 1.42},  {389, 0, "Apolar", 1.88},
244     {390, 0, "Apolar", 1.88}, {391, 0, "Apolar", 1.88},
245     {392, 0, "Apolar", 1.88}, {393, 1, "Polar", 1.64},
246     {394, 0, "Apolar", 1.88}, {395, 0, "Apolar", 1.61},
247     {396, 1, "Polar", 1.42},  {397, 0, "Apolar", 1.88},
248     {398, 0, "Apolar", 1.88}, {399, 0, "Apolar", 1.61},
249     {400, 1, "Polar", 1.42},  {401, 1, "Polar", 1.46},
250     {402, 1, "Polar", 1.64},  {403, 0, "Apolar", 1.88},
251     {404, 0, "Apolar", 1.61}, {405, 1, "Polar", 1.42},
252     {406, 0, "Apolar", 1.88}, {407, 0, "Apolar", 1.61},
253     {408, 1, "Polar", 1.42},  {409, 1, "Polar", 1.46},
254     {410, 1, "Polar", 1.64},  {411, 0, "Apolar", 1.88},
255     {412, 0, "Apolar", 1.61}, {413, 1, "Polar", 1.42},
256     {414, 1, "Polar", 1.64},  {415, 0, "Apolar", 1.88},
257     {416, 0, "Apolar", 1.61}, {417, 1, "Polar", 1.42},
258     {418, 0, "Apolar", 1.88}, {419, 0, "Apolar", 1.88},
259     {420, 0, "Apolar", 1.88}, {421, 1, "Polar", 1.64},
260     {422, 0, "Apolar", 1.61}, {423, 1, "Polar", 1.64},
261     {424, 1, "Polar", 1.64},  {425, 1, "Polar", 1.64},
262     {426, 0, "Apolar", 1.88}, {427, 0, "Apolar", 1.61},
263     {428, 1, "Polar", 1.42},  {429, 0, "Apolar", 1.88},
264     {430, 1, "Polar", 1.46},  {431, 0, "Apolar", 1.88},
265     {432, 1, "Polar", 1.64},  {433, 0, "Apolar", 1.88},
266     {434, 0, "Apolar", 1.61}, {435, 1, "Polar", 1.42},
267     {436, 0, "Apolar", 1.88}, {437, 0, "Apolar", 1.88},
268     {438, 0, "Apolar", 1.88}, {439, 0, "Apolar", 1.88},
269     {440, 1, "Polar", 1.64},  {441, 0, "Apolar", 1.88},
270     {442, 0, "Apolar", 1.61}, {443, 1, "Polar", 1.42},
271     {444, 0, "Apolar", 1.88}, {445, 1, "Polar", 1.46},
272     {446, 1, "Polar", 1.64},  {447, 0, "Apolar", 1.88},
273     {448, 0, "Apolar", 1.61}, {449, 1, "Polar", 1.42},
274     {450, 0, "Apolar", 1.88}, {451, 0, "Apolar", 1.61},
275     {452, 1, "Polar", 1.42},  {453, 1, "Polar", 1.46},
276     {454, 1, "Polar", 1.64},  {455, 0, "Apolar", 1.88},
277     {456, 0, "Apolar", 1.61}, {457, 1, "Polar", 1.42},
278     {458, 0, "Apolar", 1.88}, {459, 0, "Apolar", 1.61},
279     {460, 0, "Apolar", 1.76}, {461, 0, "Apolar", 1.76},
280     {462, 0, "Apolar", 1.76}, {463, 0, "Apolar", 1.76},
281     {464, 0, "Apolar", 1.61}, {465, 1, "Polar", 1.46},
282     {466, 1, "Polar", 1.64},  {467, 0, "Apolar", 1.88},
283     {468, 0, "Apolar", 1.61}, {469, 1, "Polar", 1.42},
284     {470, 0, "Apolar", 1.88}, {471, 0, "Apolar", 1.61},
285     {472, 1, "Polar", 1.42},  {473, 1, "Polar", 1.64},
286     {474, 1, "Polar", 1.64},  {475, 0, "Apolar", 1.88},
287     {476, 0, "Apolar", 1.61}, {477, 1, "Polar", 1.42},
288     {478, 0, "Apolar", 1.88}, {479, 0, "Apolar", 1.88},
289     {480, 0, "Apolar", 1.88}, {481, 0, "Apolar", 1.88},
290     {482, 1, "Polar", 1.64},  {483, 0, "Apolar", 1.88},
291     {484, 0, "Apolar", 1.61}, {485, 1, "Polar", 1.42},
292     {486, 0, "Apolar", 1.88}, {487, 0, "Apolar", 1.88},
293     {488, 0, "Apolar", 1.61}, {489, 1, "Polar", 1.42},
294     {490, 1, "Polar", 1.64},  {491, 1, "Polar", 1.64},
295     {492, 0, "Apolar", 1.88}, {493, 0, "Apolar", 1.61},
296     {494, 1, "Polar", 1.42},  {495, 0, "Apolar", 1.88},
297     {496, 0, "Apolar", 1.88}, {497, 0, "Apolar", 1.88},
298     {498, 0, "Apolar", 1.88}, {499, 1, "Polar", 1.64},
299     {500, 1, "Polar", 1.64},  {501, 0, "Apolar", 1.88},
300     {502, 0, "Apolar", 1.61}, {503, 1, "Polar", 1.42},
301     {504, 0, "Apolar", 1.88}, {505, 0, "Apolar", 1.88},
302     {506, 0, "Apolar", 1.61}, {507, 1, "Polar", 1.42},
303     {508, 1, "Polar", 1.46},  {509, 1, "Polar", 1.64},
304     {510, 0, "Apolar", 1.88}, {511, 0, "Apolar", 1.61},
305     {512, 1, "Polar", 1.42},  {513, 0, "Apolar", 1.88},
306     {514, 1, "Polar", 1.46},  {515, 1, "Polar", 1.64},
307     {516, 0, "Apolar", 1.88}, {517, 0, "Apolar", 1.61},
308     {518, 1, "Polar", 1.42},  {519, 0, "Apolar", 1.88},
309     {520, 1, "Polar", 1.46},  {521, 0, "Apolar", 1.88},
310     {522, 1, "Polar", 1.64},  {523, 0, "Apolar", 1.88},
311     {524, 0, "Apolar", 1.61}, {525, 1, "Polar", 1.42},
312     {526, 0, "Apolar", 1.88}, {527, 0, "Apolar", 1.88},
313     {528, 0, "Apolar", 1.88}, {529, 0, "Apolar", 1.88},
314     {530, 1, "Polar", 1.64},  {531, 0, "Apolar", 1.88},
315     {532, 0, "Apolar", 1.61}, {533, 1, "Polar", 1.42},
316     {534, 0, "Apolar", 1.88}, {535, 0, "Apolar", 1.61},
317     {536, 1, "Polar", 1.64},  {537, 0, "Apolar", 1.76},
318     {538, 0, "Apolar", 1.76}, {539, 1, "Polar", 1.64},
319     {540, 1, "Polar", 1.64},  {541, 0, "Apolar", 1.88},
320     {542, 0, "Apolar", 1.61}, {543, 1, "Polar", 1.42},
321     {544, 0, "Apolar", 1.88}, {545, 0, "Apolar", 1.88},
322     {546, 0, "Apolar", 1.88}, {547, 0, "Apolar", 1.88},
323     {548, 1, "Polar", 1.64},  {549, 0, "Apolar", 1.88},
324     {550, 0, "Apolar", 1.61}, {551, 1, "Polar", 1.42},
325     {552, 0, "Apolar", 1.88}, {553, 0, "Apolar", 1.88},
326     {554, 0, "Apolar", 1.88}, {555, 1, "Polar", 1.64},
327     {556, 0, "Apolar", 1.88}, {557, 0, "Apolar", 1.61},
328     {558, 1, "Polar", 1.42},  {559, 0, "Apolar", 1.88},
329     {560, 0, "Apolar", 1.88}, {561, 0, "Apolar", 1.88},
330     {562, 0, "Apolar", 1.88}, {563, 1, "Polar", 1.64},
331     {564, 0, "Apolar", 1.88}, {565, 0, "Apolar", 1.61},
332     {566, 1, "Polar", 1.42},  {567, 0, "Apolar", 1.88},
333     {568, 0, "Apolar", 1.88}, {569, 0, "Apolar", 1.88},
334     {570, 1, "Polar", 1.64},  {571, 0, "Apolar", 1.61},
335     {572, 1, "Polar", 1.64},  {573, 1, "Polar", 1.64},
336     {574, 1, "Polar", 1.64},  {575, 0, "Apolar", 1.88},
337     {576, 0, "Apolar", 1.61}, {577, 1, "Polar", 1.42},
338     {578, 0, "Apolar", 1.88}, {579, 0, "Apolar", 1.88},
339     {580, 0, "Apolar", 1.88}, {581, 0, "Apolar", 1.88},
340     {582, 1, "Polar", 1.64},  {583, 0, "Apolar", 1.88},
341     {584, 0, "Apolar", 1.61}, {585, 1, "Polar", 1.42},
342     {586, 0, "Apolar", 1.88}, {587, 0, "Apolar", 1.88},
343     {588, 0, "Apolar", 1.88}, {589, 1, "Polar", 1.64},
344     {590, 0, "Apolar", 1.61}, {591, 1, "Polar", 1.64},
345     {592, 1, "Polar", 1.64},  {593, 1, "Polar", 1.64},
346     {594, 0, "Apolar", 1.88}, {595, 0, "Apolar", 1.61},
347     {596, 1, "Polar", 1.42},  {597, 1, "Polar", 1.64},
348     {598, 0, "Apolar", 1.88}, {599, 0, "Apolar", 1.61},
349     {600, 1, "Polar", 1.42},  {601, 1, "Polar", 1.46}};
350 
testPDB()351 void testPDB() {
352   BOOST_LOG(rdInfoLog) << "-----------------------\n Testing FreeSASA basics"
353                        << std::endl;
354 
355   std::string rdbase = getenv("RDBASE");
356   std::string fName = rdbase += "/External/FreeSASA/test_data/1d3z.pdb";
357 
358   ROMol *m;
359   {
360     const bool sanitize = true;
361     const bool removeHs = true;
362     m = PDBFileToMol(fName, sanitize, removeHs);
363   }
364 
365   std::vector<double> radii;
366   FreeSASA::classifyAtoms(*m, radii);
367   for (ROMol::AtomIterator at = m->beginAtoms(); at != m->endAtoms(); ++at) {
368     Atom *atom = (*at);
369     unsigned int idx = atom->getIdx();
370     TEST_ASSERT(idx == ExpectedProtor1d3z[idx].idx);
371     TEST_ASSERT(atom->getProp<int>(common_properties::Atom::SASAClass) ==
372                 ExpectedProtor1d3z[idx].cls);
373     TEST_ASSERT(
374         atom->getProp<std::string>(common_properties::Atom::SASAClassName) ==
375         ExpectedProtor1d3z[idx].clsname);
376     TEST_ASSERT(radii[idx] == ExpectedProtor1d3z[idx].radius);
377   }
378 
379   {
380     FreeSASA::SASAOpts opts;
381     opts.algorithm = FreeSASA::SASAOpts::ShrakeRupley;
382     double sasa = FreeSASA::calcSASA(*m, radii, -1, nullptr, opts);
383     TEST_ASSERT(fabs(sasa - 5000.340175) < 1e-5);
384   }
385   {
386     FreeSASA::SASAOpts opts;
387     opts.algorithm = FreeSASA::SASAOpts::ShrakeRupley;
388     opts.probeRadius = 2.0;
389     double sasa = FreeSASA::calcSASA(*m, radii, -1, nullptr, opts);
390     TEST_ASSERT(fabs(sasa - 4977.770911) < 1e-5);
391   }
392 
393   delete m;
394   {
395     const bool sanitize = false;
396     const bool removeHs = false;
397     m = PDBFileToMol(fName, sanitize, removeHs);
398   }
399   ROMol *mnoh = MolOps::removeHs(*m);
400   FreeSASA::classifyAtoms(*mnoh, radii);
401   {
402     FreeSASA::SASAOpts opts;
403     opts.algorithm = FreeSASA::SASAOpts::ShrakeRupley;
404     double sasa = FreeSASA::calcSASA(*mnoh, radii, -1, nullptr, opts);
405     TEST_ASSERT(fabs(sasa - 5000.340175) < 1e-5);
406   }
407   {
408     FreeSASA::SASAOpts opts;
409     opts.algorithm = FreeSASA::SASAOpts::ShrakeRupley;
410     opts.probeRadius = 2.0;
411     double sasa = FreeSASA::calcSASA(*mnoh, radii, -1, nullptr, opts);
412     TEST_ASSERT(fabs(sasa - 4977.770911) < 1e-5);
413   }
414 
415   const QueryAtom *apolar = FreeSASA::makeFreeSasaAPolarAtomQuery();
416   const QueryAtom *polar = FreeSASA::makeFreeSasaPolarAtomQuery();
417   {
418     FreeSASA::SASAOpts opts;
419     opts.algorithm = FreeSASA::SASAOpts::ShrakeRupley;
420     double apolard = FreeSASA::calcSASA(*mnoh, radii, -1, apolar, opts);
421     double polard = FreeSASA::calcSASA(*mnoh, radii, -1, polar, opts);
422     std::cerr << " polar " << polard << std::endl;
423     std::cerr << " apolar " << apolard << std::endl;
424     TEST_ASSERT(fabs(polard + apolard - 5000.340175) < 1e-5);
425   }
426 
427   delete polar;
428   delete apolar;
429   delete m;
430   delete mnoh;
431 
432   BOOST_LOG(rdInfoLog) << "Done" << std::endl;
433 }
434 
main()435 int main() {
436   RDLog::InitLogs();
437   testPDB();
438 }
439